diff --git a/.github/workflows/docker_release.yml b/.github/workflows/docker_release.yml index e2c35c578..e6383aead 100644 --- a/.github/workflows/docker_release.yml +++ b/.github/workflows/docker_release.yml @@ -2,7 +2,7 @@ name: Build and Publish DHI release env: app: fuxa - version: 1.2.5 + version: 1.2.7 # for available platforms see output of a previous run - # ie the "Setup Docker BuildX" / "Inspect Builder" section # has eg "node_platforms": "linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6" diff --git a/.github/workflows/docker_snap7.yml b/.github/workflows/docker_snap7.yml index 461ae2372..9989e6b06 100644 --- a/.github/workflows/docker_snap7.yml +++ b/.github/workflows/docker_snap7.yml @@ -2,7 +2,7 @@ name: Build and Publish DHI snap7 env: app: fuxa - version: snap7-1.2.5 + version: snap7-1.2.7 # for available platforms see output of a previous run - # ie the "Setup Docker BuildX" / "Inspect Builder" section # has eg "node_platforms": "linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6" diff --git a/.github/workflows/electron_latest.yml b/.github/workflows/electron_latest.yml index 536990120..8173c55d8 100644 --- a/.github/workflows/electron_latest.yml +++ b/.github/workflows/electron_latest.yml @@ -25,6 +25,9 @@ jobs: with: node-version: '18' + - name: Clear npm cache + run: npm cache clean --force + - name: Install server dependencies run: npm install working-directory: ./server @@ -39,32 +42,30 @@ jobs: - name: Install app dependencies run: npm install - working-directory: ./app + working-directory: ./app/electron - - name: Copy server and client build to app + - name: Copy server and client build to app/electron run: | - mkdir -p app/server - mkdir -p app/client/dist - cp -r server/. app/server/ - cp -r client/dist/. app/client/dist - #ls -R app/server - #ls -R app/client/dist + mkdir -p app/electron/server + mkdir -p app/electron/client/dist + cp -r server/. app/electron/server/ + cp -r client/dist/. app/electron/client/dist shell: bash - name: Package for Windows if: matrix.os == 'windows-latest' && matrix.arch == 'x64' run: npx electron-builder --win nsis --x64 - working-directory: ./app + working-directory: ./app/electron - name: Package for Linux if: matrix.os == 'ubuntu-latest' run: npx electron-builder --linux appimage --${{ matrix.arch }} - working-directory: ./app + working-directory: ./app/electron - name: Package for macOS if: matrix.os == 'macos-latest' run: npx electron-builder --mac dmg --${{ matrix.arch }} - working-directory: ./app + working-directory: ./app/electron - name: Prepare artifacts run: | @@ -80,11 +81,11 @@ jobs: elif [ "${{ matrix.os }}" = "macos-latest" ]; then mv dist/*.dmg artifacts/FUXA-macos-arm64.dmg fi - working-directory: ./app + working-directory: ./app/electron shell: bash - name: Upload artifact uses: actions/upload-artifact@v4 with: name: FUXA-${{ matrix.os }}-${{ matrix.arch }} - path: app/artifacts/* + path: app/electron/artifacts/* diff --git a/Dockerfile b/Dockerfile index 9f61c6dfa..294f441a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,7 +27,28 @@ RUN cp FUXA/odbc/odbcinst.ini /etc/odbcinst.ini # Install Fuxa server WORKDIR /usr/src/app/FUXA/server -RUN npm install + +# More tolerant npm config +ENV NODE_OPTIONS=--dns-result-order=ipv4first +RUN npm config set registry https://registry.npmjs.org/ \ + && npm config set fetch-retries 8 \ + && npm config set fetch-retry-factor 2 \ + && npm config set fetch-retry-mintimeout 30000 \ + && npm config set fetch-retry-maxtimeout 300000 \ + && npm config set audit false \ + && npm config set fund false + +# Retry loop con backoff + timeout alto +RUN bash -lc '\ + for i in 1 2 3 4 5 6 7 8; do \ + echo "npm install - attempt $i/8"; \ + npm install --no-audit --no-fund --prefer-offline --network-timeout=600000 && exit 0; \ + echo "Failed, wait $((10*i))s and try again..."; \ + sleep $((10*i)); \ + done; \ + echo "npm install failed after 8 attempts"; \ + exit 1' + # Install options snap7 RUN if [ "$NODE_SNAP" = "true" ]; then \ diff --git a/README.md b/README.md index d305546f2..7ef821872 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ FUXA is a web-based Process Visualization (SCADA/HMI/Dashboard) software. With F ![fuxa action](/screenshot/feature-action-move.gif) ## Features -- Devices connectivity with Modbus RTU/TCP, Siemens S7 Protocol, OPC-UA, BACnet IP, MQTT, Ethernet/IP (Allen Bradley) +- Devices connectivity with Modbus RTU/TCP, Siemens S7 Protocol, OPC-UA, BACnet IP, MQTT, Ethernet/IP (Allen Bradley), ADSclient, Gpio (Raspberry), WebCam, MELSEC - SCADA/HMI Web-Editor - Engineering and Design completely web-based - Cross-Platform Full-Stack - Backend with NodeJs and Frontend with Web technologies (HTML5, CSS, Javascript, Angular, SVG) @@ -25,6 +25,15 @@ See the Wiki for more details about installing and getting started [Wiki Installing/Building](https://github.com/frangoteam/FUXA/wiki/Installing-and-Running) +### Install using prebuilt Electron Packages + +You will need to be logged into github to access the download button for Electron Action Builds, +click on the workflow and scroll down to Artifacts and click the download icon for you system + +[Electron Action Builds](https://github.com/frangoteam/FUXA/actions/workflows/electron_latest.yml) + +image + ### Running from docker ``` @@ -98,6 +107,15 @@ After following these steps, you will have a standalone Electron application for - Look video from [frangoteam](https://www.youtube.com/@umbertonocelli5301) - Look video from [Fusion Automate - Urvish Nakum](https://youtube.com/playlist?list=PLxrSjjYyzaaK8uY3kVaFzfGnwhVXiCEAO&si=aU1OxgkUvLQ3bXHq) +## Community SVG Widgets + +Looking for ready-made, reusable SVG widgets? +Check out the companion repository **FUXA-SVG-Widgets**: + +- Repository: https://github.com/frangoteam/FUXA-SVG-Widgets +- Authoring guide & examples: see the repo README and the Wiki page: + https://github.com/frangoteam/FUXA/wiki/HowTo-Widgets + ## To Debug (Full Stack) Install and start to serve the frontend ``` diff --git a/app/.gitignore b/app/electron/.gitignore similarity index 100% rename from app/.gitignore rename to app/electron/.gitignore diff --git a/app/icons/fuxa-logo.icns b/app/electron/icons/fuxa-logo.icns similarity index 100% rename from app/icons/fuxa-logo.icns rename to app/electron/icons/fuxa-logo.icns diff --git a/app/icons/fuxa-logo.ico b/app/electron/icons/fuxa-logo.ico similarity index 100% rename from app/icons/fuxa-logo.ico rename to app/electron/icons/fuxa-logo.ico diff --git a/app/icons/fuxa-logo.png b/app/electron/icons/fuxa-logo.png similarity index 100% rename from app/icons/fuxa-logo.png rename to app/electron/icons/fuxa-logo.png diff --git a/app/icons/placeholder b/app/electron/icons/placeholder similarity index 100% rename from app/icons/placeholder rename to app/electron/icons/placeholder diff --git a/app/electron/loading.html b/app/electron/loading.html new file mode 100644 index 000000000..ade2f5c72 --- /dev/null +++ b/app/electron/loading.html @@ -0,0 +1,54 @@ + + + + FUXA - Loading... + + + +
+
+

FUXA

+

Loading...

+
+ + \ No newline at end of file diff --git a/app/electron/main.js b/app/electron/main.js new file mode 100644 index 000000000..7a0a6bbc1 --- /dev/null +++ b/app/electron/main.js @@ -0,0 +1,715 @@ +const { app, BrowserWindow, Menu, dialog, shell, ipcMain } = require('electron'); +const path = require('node:path'); +const fs = require('fs').promises; +const os = require('os'); +const { fork } = require('child_process'); +const { pathToFileURL } = require('url'); + +// Global server process +let serverProcess = null; +// Global main window reference +let mainWindow = null; + +// Helper function to get recent projects menu items +function getRecentProjectsMenuItems(win) { + try { + const config = loadConfigSync(); + const recentProjects = config.recentProjects || []; + + if (recentProjects.length === 0) { + return [{ label: 'No recent projects', enabled: false }]; + } + + return recentProjects.map(project => ({ + label: `${project.name} (${project.path})`, + click: async () => { + try { + const dataDir = path.join(project.path, 'data'); + const appDataDir = path.join(dataDir, '_appdata'); + + // Validate the project still exists and is valid + await fs.access(dataDir); + await fs.access(appDataDir); + + await restartApp(dataDir, win); + } catch (error) { + console.error('Failed to open recent project:', error.message); + await dialog.showErrorBox('FUXA Error', `Failed to open project: ${error.message}`); + + // Remove invalid project from recent list + removeRecentProject(project.path); + } + } + })); + } catch (error) { + console.error('Failed to load recent projects for menu:', error.message); + return [{ label: 'Error loading recent projects', enabled: false }]; + } +} + +// App configuration directory (stores config.json for recent projects) +const appData = process.env.APPDATA || (process.platform === 'darwin' ? os.homedir() + '/Library/Application Support' : os.homedir() + '/.local/share'); +const configDir = path.join(appData, 'fuxa-app'); +const configPath = path.join(configDir, 'config.json'); + +// Ensure config directory exists +async function ensureConfigDir() { + try { + await fs.mkdir(configDir, { recursive: true }); + } catch (error) { + console.error('Failed to create config directory:', error.message); + } +} + +// Load or initialize config synchronously (for menu building) +function loadConfigSync() { + try { + const data = require('fs').readFileSync(configPath, 'utf8'); + const config = JSON.parse(data); + return config; + } catch (error) { + return { recentProjects: [], autoStart: { enabled: false, projectPath: null }, fullscreen: { enabled: false }, rightClick: { enabled: false }, textSelection: { enabled: false } }; + } +} + +// Load or initialize config, validating project paths +async function loadConfig() { + try { + const data = await fs.readFile(configPath, 'utf8'); + const config = JSON.parse(data); + const validProjects = []; + for (const project of config.recentProjects || []) { + try { + await fs.access(project.path); + validProjects.push(project); + } catch (error) { + console.log(`Removing invalid project path: ${project.path}`); + } + } + config.recentProjects = validProjects; + if (validProjects.length !== (config.recentProjects?.length || 0)) { + await saveConfig(config); + } + // Initialize auto-start settings if not present + if (!config.autoStart) { + config.autoStart = { enabled: false, projectPath: null }; + } + // Initialize fullscreen settings if not present + if (!config.fullscreen) { + config.fullscreen = { enabled: false }; + } + // Initialize right-click and text selection settings if not present + if (!config.rightClick) { + config.rightClick = { enabled: false }; + } + if (!config.textSelection) { + config.textSelection = { enabled: false }; + } + return config; + } catch (error) { + return { recentProjects: [], autoStart: { enabled: false, projectPath: null }, fullscreen: { enabled: false }, rightClick: { enabled: false }, textSelection: { enabled: false } }; + } +} + +// Save config +async function saveConfig(config) { + try { + await fs.writeFile(configPath, JSON.stringify(config, null, 2)); + } catch (error) { + console.error('Failed to save config:', error.message); + } +} + +// Add project to recent projects +async function addRecentProject(projectDir, projectName) { + try { + const config = await loadConfig(); + const newProject = { + name: projectName || path.basename(projectDir), + path: projectDir, + createdAt: new Date().toISOString() + }; + config.recentProjects = (config.recentProjects || []).filter(p => p.path !== projectDir); + config.recentProjects.unshift(newProject); + if (config.recentProjects.length > 5) config.recentProjects.pop(); + await saveConfig(config); + } catch (error) { + console.error('Failed to add recent project:', error.message); + } +} + +// Create new project with custom name +async function createNewProject(parentWin) { + try { + const { canceled, filePath } = await dialog.showSaveDialog(parentWin, { + title: 'Create New Project', + defaultPath: path.join(os.homedir(), 'FUXA-Project'), + buttonLabel: 'Create', + filters: [{ name: 'FUXA Project', extensions: [''] }], + properties: ['createDirectory'] + }); + if (canceled || !filePath) return null; + + const projectDir = filePath; + const projectName = path.basename(filePath); + await fs.mkdir(projectDir, { recursive: true }); + const dataDir = path.join(projectDir, 'data'); + await fs.mkdir(dataDir, { recursive: true }); + await addRecentProject(projectDir, projectName); + return dataDir; + } catch (error) { + console.error('Error:', error.message); + await dialog.showErrorBox('FUXA Error', `Failed to create project: ${error.message}`); + return null; + } +} + +// Remove a project from recent projects list +async function removeRecentProject(projectPath) { + try { + const config = await loadConfig(); + config.recentProjects = (config.recentProjects || []).filter(p => p.path !== projectPath); + await saveConfig(config); + } catch (error) { + console.error('Failed to remove recent project:', error.message); + } +} + +// Open existing project +async function openProject(parentWin) { + try { + const { canceled, filePaths } = await dialog.showOpenDialog(parentWin, { + properties: ['openDirectory'], + title: 'Open Project Folder', + defaultPath: os.homedir() + }); + if (canceled || !filePaths[0]) return null; + + const projectDir = filePaths[0]; + const dataDir = path.join(projectDir, 'data'); + const appDataDir = path.join(dataDir, '_appdata'); + + // Check if this is a valid FUXA project + await fs.access(dataDir); + await fs.access(appDataDir); + + await addRecentProject(projectDir, path.basename(projectDir)); + return dataDir; + } catch (error) { + console.error('Failed to open project:', error.message); + await dialog.showErrorBox('FUXA Error', `Invalid project: The selected folder is not a valid FUXA project. Please select a folder containing a 'data/_appdata' directory.`); + return null; + } +} + +// Create project selection window +async function createProjectSelectionWindow(parentWin, errorMessage = null, recentProjects = []) { + const win = new BrowserWindow({ + width: 600, + height: 500, + minWidth: 400, + minHeight: 350, + parent: parentWin, + modal: true, + resizable: true, + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + sandbox: false // Disable renderer sandbox + }, + show: false + }); + win.setMenu(null); + + // Load the HTML file + const htmlPath = getHtmlPath('project-selection.html'); + win.loadURL(pathToFileURL(htmlPath).href); + + win.once('ready-to-show', () => { + win.show(); + + // Send projects data to the window + win.webContents.send('load-projects', recentProjects); + + // Send error message if provided + if (errorMessage) { + win.webContents.send('show-error', errorMessage); + } + }); + + return win; +} + +// Handle project selection +async function selectProject(parentWin, errorMessage = null) { + return new Promise(async (resolve) => { + // Load config first + let recentProjects = []; + try { + const config = await loadConfig(); + recentProjects = config.recentProjects || []; + } catch (error) { + console.error('Failed to load projects:', error.message); + } + + const selectionWin = await createProjectSelectionWindow(parentWin, errorMessage, recentProjects); + + const actionHandler = async (event, action) => { + let dataDir = null; + if (action === 'new' || action === 'open') { + selectionWin.hide(); + if (action === 'new') { + dataDir = await createNewProject(parentWin); + } else { + dataDir = await openProject(parentWin); + } + if (dataDir) { + // Valid project selected + ipcMain.removeListener('project-action', actionHandler); + selectionWin.close(); + resolve(dataDir); + } else { + // User canceled, show window again + selectionWin.show(); + // Keep listening for more actions + } + } else if (action === 'cancel') { + // User explicitly canceled + ipcMain.removeListener('project-action', actionHandler); + selectionWin.close(); + resolve(null); + } + }; + + ipcMain.on('project-action', actionHandler); + + ipcMain.once('project-selected', (event, projectPath) => { + const dataDir = path.join(projectPath, 'data'); + ipcMain.removeListener('project-action', actionHandler); + selectionWin.close(); + resolve(dataDir); + }); + + selectionWin.on('closed', () => { + ipcMain.removeListener('project-action', actionHandler); + ipcMain.removeAllListeners('project-selected'); + resolve(null); + }); + }); +} + +// Create settings window +async function openSettingsWindow(parentWin) { + const settingsWin = new BrowserWindow({ + width: 500, + height: 400, + minWidth: 400, + minHeight: 250, + parent: parentWin, + modal: true, + resizable: true, + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + sandbox: false // Disable renderer sandbox + }, + show: false + }); + + settingsWin.setMenu(null); + + // Load the HTML file + const htmlPath = getHtmlPath('settings.html'); + settingsWin.loadURL(pathToFileURL(htmlPath).href); + + settingsWin.show(); +} + +// Helper function to get HTML file path (works in both dev and production) +function getHtmlPath(filename) { + // HTML files are always in the same directory as main.js (app/) + return require('path').join(__dirname, filename); +} + +function getServerPath() { + // In packaged app, server is at same level as main.js due to files: ["server/**/*"] + const fs = require('fs'); + const prodPath = require('path').join(__dirname, 'server/main.js'); + if (fs.existsSync(prodPath)) { + return prodPath; + } + // Fall back to development path (app/electron is at app/electron, server is at project root) + return require('path').join(__dirname, '../../server/main.js'); +} + +// Create main window +function createWindow() { + const win = new BrowserWindow({ + width: 1024, + height: 768, + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + sandbox: false // Disable renderer sandbox + } + }); + + // Load initial loading screen + const htmlPath = getHtmlPath('loading.html'); + win.loadURL(pathToFileURL(htmlPath).href); + + // Check fullscreen settings + loadConfig().then(config => { + if (config.fullscreen && config.fullscreen.enabled) { + win.setFullScreen(true); + } else { + win.maximize(); // Start window maximized only if not in fullscreen + } + + // Apply right-click and text selection settings + if (config.rightClick && !config.rightClick.enabled) { + applyRightClickSettings(win, false); + } + if (config.textSelection && !config.textSelection.enabled) { + applyTextSelectionSettings(win, false); + } + }).catch(() => { + win.maximize(); // Fallback to maximized if config loading fails + }); + + const menu = Menu.buildFromTemplate([ + { + label: 'File', + submenu: [ + { + label: 'New Project', + click: async () => { + try { + const dataDir = await createNewProject(win); + if (dataDir) { + await restartApp(dataDir, win); + } + } catch (error) { + console.error('New project failed:', error.message); + await dialog.showErrorBox('FUXA Error', `New project failed: ${error.message}`); + } + } + }, + { + label: 'Open Project', + submenu: [ + { + label: 'Browse...', + click: async () => { + try { + const dataDir = await openProject(win); + if (dataDir) { + await restartApp(dataDir, win); + } + } catch (error) { + console.error('Open project failed:', error.message); + await dialog.showErrorBox('FUXA Error', `Open project failed: ${error.message}`); + } + } + }, + { type: 'separator' }, + ...getRecentProjectsMenuItems(win) + ] + }, + { + label: 'Settings', + click: async () => { + await openSettingsWindow(win); + } + }, + { type: 'separator' }, + { role: 'quit' } + ] + }, + { + label: 'View', + submenu: [ + { role: 'reload' }, + { role: 'forceReload' }, + { role: 'toggleDevTools', visible: process.env.NODE_ENV === 'development' }, + { type: 'separator' }, + { role: 'resetZoom' }, + { role: 'zoomIn' }, + { role: 'zoomOut' }, + { type: 'separator' }, + { role: 'togglefullscreen' }, + { role: 'minimize' }, + { role: 'zoom', label: 'Maximize', click: () => win.maximize() } + ] + }, + { + label: 'Help', + submenu: [ + { + label: 'FUXA Documentation', + click: () => shell.openExternal('https://github.com/frangoteam/FUXA/wiki') + } + ] + } + ]); + Menu.setApplicationMenu(menu); + + return win; +} + +// Restart FUXA server with new dataDir +async function restartApp(dataDir, win) { + console.log(`Restarting app with dataDir: ${dataDir}`); + + // Stop existing server process + if (serverProcess) { + console.log('Stopping server process'); + serverProcess.kill('SIGTERM'); + await new Promise(resolve => { + serverProcess.on('close', () => { + console.log('Server process stopped'); + resolve(); + }); + setTimeout(resolve, 1000); // 1-second timeout + }); + serverProcess = null; + } + + // Start new server process + try { + const serverEntry = getServerPath(); + if (!require('fs').existsSync(serverEntry)) { + throw new Error(`Server file not found: ${serverEntry}`); + } + serverProcess = fork(serverEntry, [], { + env: { ...process.env, userDir: dataDir, PORT: 1881 }, + silent: false + }); + serverProcess.on('error', (error) => { + console.error('Server process error:', error.message); + }); + console.log(`Server started with dataDir: ${dataDir}`); + } catch (error) { + console.error(`Failed to start server: ${error.message}`); + await dialog.showErrorBox('FUXA Error', `Failed to start server: ${error.message}`); + return; + } + + // Reload UI + try { + // Update loading screen to show FUXA is loading + const htmlPath = getHtmlPath('loading.html'); + await win.loadURL(pathToFileURL(htmlPath).href); + + // Update loading text + await win.webContents.executeJavaScript(` + document.getElementById('loadingText').textContent = 'Loading application...'; + `); + + await new Promise(resolve => setTimeout(resolve, 5000)); // Wait 5 seconds for server + await win.loadURL('http://localhost:1881'); + console.log('UI loaded: http://localhost:1881'); + + // Store reference to main window for settings + mainWindow = win; + + // Apply settings after page loads + const config = await loadConfig(); + + if (config.rightClick && !config.rightClick.enabled) { + applyRightClickSettings(win, false); + } + if (config.textSelection && !config.textSelection.enabled) { + applyTextSelectionSettings(win, false); + } + } catch (error) { + console.error('Failed to load UI:', error.message); + await dialog.showErrorBox('FUXA Error', `Failed to load UI: ${error.message}`); + } +} + +// Start FUXA server and load UI +async function startApp(dataDir, win) { + await restartApp(dataDir, win); +} + +// IPC handlers for auto-start settings +ipcMain.handle('get-auto-start-settings', async () => { + const config = await loadConfig(); + return config.autoStart; +}); + +ipcMain.handle('set-auto-start-settings', async (event, settings) => { + const config = await loadConfig(); + config.autoStart = settings; + await saveConfig(config); + return true; +}); + +ipcMain.handle('get-fullscreen-settings', async () => { + const config = await loadConfig(); + return config.fullscreen; +}); + +ipcMain.handle('set-fullscreen-settings', async (event, settings) => { + const config = await loadConfig(); + config.fullscreen = settings; + await saveConfig(config); + return true; +}); + +ipcMain.handle('get-right-click-settings', async () => { + const config = await loadConfig(); + return config.rightClick; +}); + +ipcMain.handle('set-right-click-settings', async (event, settings) => { + const config = await loadConfig(); + config.rightClick = settings; + await saveConfig(config); + + // Apply to main window if it exists + if (mainWindow) { + applyRightClickSettings(mainWindow, settings.enabled); + } + + return true; +}); + +ipcMain.handle('get-text-selection-settings', async () => { + const config = await loadConfig(); + return config.textSelection; +}); + +ipcMain.handle('set-text-selection-settings', async (event, settings) => { + const config = await loadConfig(); + config.textSelection = settings; + await saveConfig(config); + + // Apply to main window if it exists + if (mainWindow) { + applyTextSelectionSettings(mainWindow, settings.enabled); + } + + return true; +}); + +ipcMain.handle('get-recent-projects', async () => { + const config = await loadConfig(); + return config.recentProjects || []; +}); + +// Apply right-click settings to a window +function applyRightClickSettings(win, enabled) { + if (!enabled) { + // Disable right-click context menu by preventing default + if (!win._rightClickDisabled) { + win._rightClickDisabledHandler = (event) => { + event.preventDefault(); + }; + win.webContents.on('context-menu', win._rightClickDisabledHandler); + win._rightClickDisabled = true; + } + } else { + // Re-enable right-click + if (win._rightClickDisabled && win._rightClickDisabledHandler) { + win.webContents.removeListener('context-menu', win._rightClickDisabledHandler); + win._rightClickDisabled = false; + } + } +} + +// Apply text selection settings to a window +function applyTextSelectionSettings(win, enabled) { + if (!enabled) { + // Disable text selection using CSS injection + const css = ` + * { + user-select: none !important; + -webkit-user-select: none !important; + -moz-user-select: none !important; + -ms-user-select: none !important; + } + `; + win.webContents.insertCSS(css).catch(err => { + console.error('Failed to inject text selection CSS:', err); + }); + } else { + // Re-enable text selection + const css = ` + * { + user-select: auto !important; + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + -ms-user-select: auto !important; + } + `; + win.webContents.insertCSS(css).catch(err => { + console.error('Failed to re-enable text selection CSS:', err); + }); + } +} + +// App startup +app.whenReady().then(async () => { + console.log('App starting'); + await ensureConfigDir(); + + const args = process.argv.slice(1); + const dataDirArg = args.find(arg => arg.startsWith('--dataDir=')); + let dataDir = dataDirArg ? dataDirArg.split('=')[1] : null; + + const win = createWindow(); + + if (!dataDir) { + // Check auto-start settings + const config = await loadConfig(); + if (config.autoStart && config.autoStart.enabled && config.autoStart.projectPath) { + try { + // Check if the auto-start project exists + const projectDataDir = path.join(config.autoStart.projectPath, 'data'); + await fs.access(projectDataDir); + console.log(`Auto-starting with project: ${config.autoStart.projectPath}`); + dataDir = projectDataDir; + } catch (error) { + console.log(`Auto-start project not found: ${config.autoStart.projectPath}`); + // Show project selector with error + dataDir = await selectProject(win, `Auto-start project not found: ${config.autoStart.projectPath}`); + } + } else { + dataDir = await selectProject(win); + } + } + + if (dataDir) { + await startApp(dataDir, win); + } else { + console.log('No project selected, closing'); + win.close(); + } +}); + +app.on('window-all-closed', () => { + console.log('All windows closed'); + if (serverProcess) { + serverProcess.kill('SIGTERM'); + } + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('activate', () => { + console.log('App activated'); + if (BrowserWindow.getAllWindows().length === 0) { + const win = createWindow(); + selectProject(win).then(dataDir => { + if (dataDir) { + startApp(dataDir, win); + } else { + console.log('No project selected, closing'); + win.close(); + } + }); + } +}); diff --git a/app/electron/package-lock.json b/app/electron/package-lock.json new file mode 100644 index 000000000..39028b540 --- /dev/null +++ b/app/electron/package-lock.json @@ -0,0 +1,4098 @@ +{ + "name": "fuxa", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fuxa", + "version": "0.0.1", + "license": "MIT", + "devDependencies": { + "electron": "^31.0.0", + "electron-builder": "^24.13.0" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", + "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", + "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.2.1", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.5.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.13.1", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "24.13.3", + "electron-builder-squirrel-windows": "24.13.3" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", + "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", + "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/config-file-ts": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", + "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.3.10", + "typescript": "^5.3.3" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", + "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "31.7.7", + "resolved": "https://registry.npmjs.org/electron/-/electron-31.7.7.tgz", + "integrity": "sha512-HZtZg8EHsDGnswFt0QeV8If8B+et63uD6RJ7I4/xhcXqmTIbI08GoubX/wm+HdY0DwcuPe1/xsgqpmYvjdjRoA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^20.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-builder": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", + "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "24.13.3", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "dmg-builder": "24.13.3", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", + "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "24.13.3", + "archiver": "^5.3.1", + "builder-util": "24.13.1", + "fs-extra": "^10.1.0" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-publish": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", + "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "24.13.1", + "builder-util-runtime": "9.2.4", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-config-file": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/app/package.json b/app/electron/package.json similarity index 98% rename from app/package.json rename to app/electron/package.json index afc9b64c6..73c72d45c 100644 --- a/app/package.json +++ b/app/electron/package.json @@ -20,6 +20,7 @@ "asar": false, "files": [ "main.js", + "*.html", "server/**/*", "client/dist/**/*", "icons/**/*" diff --git a/app/electron/project-selection.html b/app/electron/project-selection.html new file mode 100644 index 000000000..24ac8d751 --- /dev/null +++ b/app/electron/project-selection.html @@ -0,0 +1,185 @@ + + + + FUXA Project Selection + + + +

Select a FUXA Project

+
+
+ + + + + + + + + + + +
NamePathCreated
+
+
+ + + +
+ + + \ No newline at end of file diff --git a/app/settings.app.js b/app/electron/settings.app.js similarity index 83% rename from app/settings.app.js rename to app/electron/settings.app.js index 9faeaf5fe..38bd6c60e 100644 --- a/app/settings.app.js +++ b/app/electron/settings.app.js @@ -1,7 +1,7 @@ module.exports = { // Version to manage update - version: 1.1, + version: 1.2, // Standard language (editor) language: 'en', @@ -79,4 +79,17 @@ module.exports = { // Enable GPIO in Raspberry // To enable only by Raspberry Host + // CORS (Cross-Origin Resource Sharing) + // Used to enable CORS for all HTTP request + // "allowedOrigins": ["https://example.com", "https://dashboard.example.com"] + // Default: ["http://localhost", "http://127.0.0.1", "http://192.168.*", "http://10.*"] + "allowedOrigins": ["http://localhost", "http://127.0.0.1", "http://192.168.*", "http://10.*"], + + //Location to output webcam capture + webcamSnapShotsDir: '_webcam_snapshots', + //cleanup old snapshots + //Default: false + webcamSnapShotsCleanup: false, + //snapshots retention in days + webcamSnapShotsRetain: 7, } diff --git a/app/electron/settings.html b/app/electron/settings.html new file mode 100644 index 000000000..71c1f0c4d --- /dev/null +++ b/app/electron/settings.html @@ -0,0 +1,255 @@ + + + + FUXA Settings + + + +

FUXA Settings

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+ + +
+ + + \ No newline at end of file diff --git a/app/main.js b/app/main.js deleted file mode 100644 index 21db77cc1..000000000 --- a/app/main.js +++ /dev/null @@ -1,477 +0,0 @@ -const { app, BrowserWindow, Menu, dialog, shell, ipcMain } = require('electron'); -const path = require('node:path'); -const fs = require('fs').promises; -const os = require('os'); -const { fork } = require('child_process'); - -// Global server process -let serverProcess = null; - -// App configuration directory (stores config.json for recent projects) -const appData = process.env.APPDATA || (process.platform === 'darwin' ? os.homedir() + '/Library/Application Support' : os.homedir() + '/.local/share'); -const configDir = path.join(appData, 'fuxa-app'); -const configPath = path.join(configDir, 'config.json'); - -// Ensure config directory exists -async function ensureConfigDir() { - try { - await fs.mkdir(configDir, { recursive: true }); - } catch (error) { - console.error('Failed to create config directory:', error.message); - } -} - -// Load or initialize config, validating project paths -async function loadConfig() { - try { - const data = await fs.readFile(configPath, 'utf8'); - const config = JSON.parse(data); - const validProjects = []; - for (const project of config.recentProjects || []) { - try { - await fs.access(project.path); - validProjects.push(project); - } catch (error) { - console.log(`Removing invalid project path: ${project.path}`); - } - } - config.recentProjects = validProjects; - if (validProjects.length !== (config.recentProjects?.length || 0)) { - await saveConfig(config); - } - return config; - } catch (error) { - return { recentProjects: [] }; - } -} - -// Save config -async function saveConfig(config) { - try { - await fs.writeFile(configPath, JSON.stringify(config, null, 2)); - } catch (error) { - console.error('Failed to save config:', error.message); - } -} - -// Add project to recent projects -async function addRecentProject(projectDir, projectName) { - try { - const config = await loadConfig(); - const newProject = { - name: projectName || path.basename(projectDir), - path: projectDir, - createdAt: new Date().toISOString() - }; - config.recentProjects = (config.recentProjects || []).filter(p => p.path !== projectDir); - config.recentProjects.unshift(newProject); - if (config.recentProjects.length > 5) config.recentProjects.pop(); - await saveConfig(config); - } catch (error) { - console.error('Failed to add recent project:', error.message); - } -} - -// Create new project with custom name -async function createNewProject(parentWin) { - try { - const { canceled, filePath } = await dialog.showSaveDialog(parentWin, { - title: 'Create New Project', - defaultPath: path.join(os.homedir(), 'FUXA-Project'), - buttonLabel: 'Create', - filters: [{ name: 'FUXA Project', extensions: [''] }], - properties: ['createDirectory'] - }); - if (canceled || !filePath) return null; - - const projectDir = filePath; - const projectName = path.basename(filePath); - await fs.mkdir(projectDir, { recursive: true }); - const dataDir = path.join(projectDir, 'data'); - await fs.mkdir(dataDir, { recursive: true }); - await addRecentProject(projectDir, projectName); - return dataDir; - } catch (error) { - console.error('Error:', error.message); - await dialog.showErrorBox('FUXA Error', `Failed to create project: ${error.message}`); - return null; - } -} - -// Open existing project -async function openProject(parentWin) { - try { - const { canceled, filePaths } = await dialog.showOpenDialog(parentWin, { - properties: ['openDirectory'], - title: 'Open Project Folder' - }); - if (canceled || !filePaths[0]) return null; - - const projectDir = filePaths[0]; - const dataDir = path.join(projectDir, 'data'); - await fs.access(dataDir); - await addRecentProject(projectDir, path.basename(projectDir)); - return dataDir; - } catch (error) { - console.error('Failed to open project:', error.message); - await dialog.showErrorBox('FUXA Error', `Invalid project: ${error.message}`); - return null; - } -} - -// Create project selection window -function createProjectSelectionWindow(parentWin) { - const win = new BrowserWindow({ - width: 600, - height: 400, - parent: parentWin, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - sandbox: false // Disable renderer sandbox - }, - resizable: false - }); - win.setMenu(null); - - const htmlContent = ` - - - - FUXA Project Selection - - - -

Select a FUXA Project

- - - - - - - - - -
NamePathCreated
-
- - - -
- - - - `; - - win.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`); - return win; -} - -// Handle project selection -async function selectProject(parentWin) { - return new Promise((resolve) => { - const selectionWin = createProjectSelectionWindow(parentWin); - - loadConfig().then(config => { - selectionWin.webContents.send('load-projects', config.recentProjects || []); - }).catch(error => { - console.error('Failed to load projects:', error.message); - selectionWin.close(); - resolve(null); - }); - - ipcMain.once('project-action', async (event, action) => { - let dataDir = null; - if (action === 'new' || action === 'open') { - selectionWin.hide(); - if (action === 'new') { - dataDir = await createNewProject(parentWin); - } else { - dataDir = await openProject(parentWin); - } - if (!dataDir) { - selectionWin.show(); - } - } - selectionWin.close(); - resolve(dataDir); - }); - - ipcMain.once('project-selected', (event, projectPath) => { - const dataDir = path.join(projectPath, 'data'); - selectionWin.close(); - resolve(dataDir); - }); - - selectionWin.on('closed', () => { - ipcMain.removeAllListeners('project-action'); - ipcMain.removeAllListeners('project-selected'); - resolve(null); - }); - }); -} - -// Create main window -function createWindow() { - console.log('Creating new window'); - const win = new BrowserWindow({ - width: 1024, - height: 768, - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - sandbox: false // Disable renderer sandbox - } - }); - - win.maximize(); // Start window maximized - - const menu = Menu.buildFromTemplate([ - { - label: 'File', - submenu: [ - { - label: 'New Project', - click: async () => { - console.log('File > New Project clicked'); - try { - const dataDir = await createNewProject(win); - if (dataDir) { - console.log(`New project selected: ${dataDir}`); - await restartApp(dataDir, win); - } - } catch (error) { - console.error('New project failed:', error.message); - await dialog.showErrorBox('FUXA Error', `New project failed: ${error.message}`); - } - } - }, - { - label: 'Open Project', - click: async () => { - console.log('File > Open Project clicked'); - try { - const dataDir = await openProject(win); - if (dataDir) { - console.log(`Open project selected: ${dataDir}`); - await restartApp(dataDir, win); - } - } catch (error) { - console.error('Open project failed:', error.message); - await dialog.showErrorBox('FUXA Error', `Open project failed: ${error.message}`); - } - } - }, - { type: 'separator' }, - { role: 'quit' } - ] - }, - { - label: 'View', - submenu: [ - { role: 'reload' }, - { role: 'forceReload' }, - { role: 'toggleDevTools', visible: process.env.NODE_ENV === 'development' }, - { type: 'separator' }, - { role: 'resetZoom' }, - { role: 'zoomIn' }, - { role: 'zoomOut' }, - { type: 'separator' }, - { role: 'togglefullscreen' }, - { role: 'minimize' }, - { role: 'zoom', label: 'Maximize', click: () => win.maximize() } - ] - }, - { - label: 'Help', - submenu: [ - { - label: 'FUXA Documentation', - click: () => shell.openExternal('https://github.com/frangoteam/FUXA/wiki') - } - ] - } - ]); - Menu.setApplicationMenu(menu); - - return win; -} - -// Restart FUXA server with new dataDir -async function restartApp(dataDir, win) { - console.log(`Restarting app with dataDir: ${dataDir}`); - - // Stop existing server process - if (serverProcess) { - console.log('Stopping server process'); - serverProcess.kill('SIGTERM'); - await new Promise(resolve => { - serverProcess.on('close', () => { - console.log('Server process stopped'); - resolve(); - }); - setTimeout(resolve, 1000); // 1-second timeout - }); - serverProcess = null; - } - - // Start new server process - try { - const serverEntry = path.join(__dirname, 'server/main.js'); - if (!require('fs').existsSync(serverEntry)) { - throw new Error(`Server file not found: ${serverEntry}`); - } - serverProcess = fork(serverEntry, [], { - env: { ...process.env, userDir: dataDir, PORT: 1881 }, - silent: false - }); - serverProcess.on('error', (error) => { - console.error('Server process error:', error.message); - }); - console.log(`Server started with dataDir: ${dataDir}`); - } catch (error) { - console.error(`Failed to start server: ${error.message}`); - await dialog.showErrorBox('FUXA Error', `Failed to start server: ${error.message}`); - return; - } - - // Reload UI - try { - await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2 seconds for server - await win.loadURL('http://localhost:1881'); - console.log('UI loaded: http://localhost:1881'); - } catch (error) { - console.error('Failed to load UI:', error.message); - await dialog.showErrorBox('FUXA Error', `Failed to load UI: ${error.message}`); - } -} - -// Start FUXA server and load UI -async function startApp(dataDir, win) { - await restartApp(dataDir, win); -} - -// App startup -app.whenReady().then(async () => { - console.log('App starting'); - await ensureConfigDir(); - - const args = process.argv.slice(1); - const dataDirArg = args.find(arg => arg.startsWith('--dataDir=')); - let dataDir = dataDirArg ? dataDirArg.split('=')[1] : null; - - const win = createWindow(); - if (!dataDir) { - dataDir = await selectProject(win); - } - - if (dataDir) { - await startApp(dataDir, win); - } else { - console.log('No project selected, closing'); - win.close(); - } -}); - -app.on('window-all-closed', () => { - console.log('All windows closed'); - if (serverProcess) { - serverProcess.kill('SIGTERM'); - } - if (process.platform !== 'darwin') { - app.quit(); - } -}); - -app.on('activate', () => { - console.log('App activated'); - if (BrowserWindow.getAllWindows().length === 0) { - const win = createWindow(); - selectProject(win).then(dataDir => { - if (dataDir) { - startApp(dataDir, win); - } else { - console.log('No project selected, closing'); - win.close(); - } - }); - } -}); diff --git a/client/.eslintrc.json b/client/.eslintrc.json index 846e7ff8b..d5062fc49 100644 --- a/client/.eslintrc.json +++ b/client/.eslintrc.json @@ -44,7 +44,8 @@ "style": "camelCase" } ], - "unused-imports/no-unused-imports": "error" + "unused-imports/no-unused-imports": "error", + "curly": ["error", "multi-line"] } }, { diff --git a/client/angular.json b/client/angular.json index 843c7b0ad..1ce3aa230 100644 --- a/client/angular.json +++ b/client/angular.json @@ -28,7 +28,8 @@ "src/theme.scss", "node_modules/uplot/dist/uPlot.min.css", "node_modules/ngx-toastr/toastr.css", - "node_modules/leaflet/dist/leaflet.css" + "node_modules/leaflet/dist/leaflet.css", + "node_modules/angular2-draggable/css/resizable.min.css" ], "scripts": [ "node_modules/uplot/dist/uPlot.iife.min.js", diff --git a/client/dist/3rdpartylicenses.txt b/client/dist/3rdpartylicenses.txt index 6fa8fbf70..297532df9 100644 --- a/client/dist/3rdpartylicenses.txt +++ b/client/dist/3rdpartylicenses.txt @@ -148,27 +148,7 @@ MIT @ngx-translate/http-loader MIT -after -MIT -Copyright (c) 2011 Raynos. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +@socket.io/component-emitter amator MIT @@ -223,57 +203,6 @@ SOFTWARE. angular2-draggable MIT -arraybuffer.slice -MIT -Copyright (C) 2013 Rase- - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -backo2 -MIT - -base64-arraybuffer -MIT -Copyright (c) 2012 Niklas von Hertzen - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - - bezier-easing MIT Copyright (c) 2014 Gaëtan Renaudeau @@ -300,31 +229,6 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -blob -MIT -MIT License - -Copyright (C) 2014 Rase- - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - chart.js MIT The MIT License (MIT) @@ -378,61 +282,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -component-bind - -component-emitter -MIT -(The MIT License) - -Copyright (c) 2014 Component contributors - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - - -component-inherit - -debug -MIT -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the 'Software'), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - delegate MIT @@ -462,55 +311,8 @@ SOFTWARE. engine.io-client -MIT -(The MIT License) - -Copyright (c) 2014-2015 Automattic - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - engine.io-parser -MIT -(The MIT License) - -Copyright (c) 2016 Guillermo Rauch (@rauchg) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. eventemitter3 MIT @@ -783,38 +585,6 @@ Apache-2.0 See the License for the specific language governing permissions and limitations under the License. -has-binary2 -MIT -The MIT License (MIT) - -Copyright (c) 2014 Kevin Roark - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -has-cors -MIT - -indexof - -isarray -MIT - leaflet BSD-2-Clause BSD 2-Clause License @@ -1128,37 +898,12 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -ms -MIT -The MIT License (MIT) - -Copyright (c) 2016 Zeit, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ng2-charts ISC ngraph.events BSD-3-Clause -Copyright (c) 2013-2022 Andrei Kashcha +Copyright (c) 2013-2025 Andrei Kashcha All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -1240,62 +985,12 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -parseqs -MIT -The MIT License (MIT) - -Copyright (c) 2015 Gal Koren - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -parseuri -MIT -The MIT License (MIT) - -Copyright (c) 2014 Gal Koren - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - pdfmake MIT The MIT License (MIT) Copyright (c) 2014-2015 bpampuch - 2016-2024 liborm85 + 2016-2025 liborm85 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -1522,29 +1217,6 @@ Apache-2.0 socket.io-client -MIT -The MIT License (MIT) - -Copyright (c) 2014 Guillermo Rauch - - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. socket.io-parser MIT @@ -1570,28 +1242,6 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -to-array -MIT -Copyright (c) 2012 Raynos. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - tslib 0BSD Copyright (c) Microsoft Corporation. @@ -1662,37 +1312,11 @@ MIT xgplayer-flv.js MIT -yeast -MIT -The MIT License (MIT) - -Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - - zone.js MIT The MIT License -Copyright (c) 2010-2022 Google LLC. https://angular.io/license +Copyright (c) 2010-2023 Google LLC. https://angular.io/license Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/client/dist/assets/i18n/de.json b/client/dist/assets/i18n/de.json index 1ac79523b..f730dc8b8 100644 --- a/client/dist/assets/i18n/de.json +++ b/client/dist/assets/i18n/de.json @@ -284,7 +284,7 @@ "graph.property-date-last-range": "Datumsbereich", "graph.property-date-group": "Gruppe", "graph.property-offline": "Online", - "graph.property-graph-oriantation": "Ausrichtung", + "graph.property-graph-orientation": "Ausrichtung", "graph.property-ori-vartical": "Vertikal", "graph.property-ori-horizontal": "Horizontal", "graph.property-decimals": "Dezimalstellen", diff --git a/client/dist/assets/i18n/en.json b/client/dist/assets/i18n/en.json index 3ca8646c2..fe5965957 100644 --- a/client/dist/assets/i18n/en.json +++ b/client/dist/assets/i18n/en.json @@ -78,6 +78,11 @@ "dlg.menuitem-address": "Link address", "dlg.menuitem-icons-filter": "Icons Filter", + "dlg.menuitem-submenu": "Submenu", + "dlg.menuitem-add-submenu": "Add Submenu Item", + "dlg.menuitem-submenu-items": "Submenu Items", + "sidenav.new_item": "New Submenu Item", + "dlg.headeritem-title": "Header Item", "dlg.headeritem-icon": "Icon", "dlg.headeritem-icons-filter": "Icons Filter", @@ -88,7 +93,7 @@ "dlg.docproperty-height": "Height", "dlg.docproperty-background": "Background", "dlg.docproperty-size": "Size predefined", - "dlg.docproperty-select": "Select a dimensions", + "dlg.docproperty-select": "Select a dimension", "dlg.docproperty-size-320-240": "320 x 240 pixels", "dlg.docproperty-size-460-360": "460 x 360 pixels", "dlg.docproperty-size-640-480": "640 x 480 pixels", @@ -110,6 +115,7 @@ "dlg.docproperty-gridtype-fixed": "Fixed", "dlg.docproperty-gridtype-verticalFixed": "VerticalFixed", "dlg.docproperty-gridtype-horizontalFixed": "HorizontalFixed", + "dlg.docproperty-renderDelay": "View rendering delay (ms)", "dlg.docname-title": "View name", "dlg.docname-name": "Name", @@ -117,7 +123,7 @@ "dlg.item-title": "Name", "dlg.item-name": "Name", "dlg.item-req-name": "Function name (No spaced or numbers allowed)", - "dlg.item-name-error": "Name exist!", + "dlg.item-name-error": "Name exists!", "dlg.parameter-title": "Parameter", "dlg.tagname-title": "Tag name", @@ -151,6 +157,10 @@ "general.search-up": "SEARCH", "general.close": "Close", + "general.confirm": "Confirm", + "general.yes": "Yes", + "general.no": "No", + "general.delete": "Delete", "general.search": "Search...", "general.search-notfound": "No options found", "general.username": "Username", @@ -185,6 +195,10 @@ "general.sunday-short": "Sun", "general.save-template": "Save as template", "general.import-template": "Import from template", + "general.weekdays": ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"], + "general.weekdays-short": ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"], + "general.months": ["January","February","March","April","May","June","July","August","September","October","November","December"], + "general.months-short": ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"], "tester.title": "Variable", "tester.send": "Send", @@ -258,6 +272,7 @@ "chart.config-interpo-stepAfter": "step after", "chart.config-interpo-stepBefore": "step before", "chart.config-interpo-spline": "spline", + "chart.config-interpo-none": "none (points)", "chart.config-line-width": "Line Width", "chart.config-line-gap": "Fill Gaps", "chart.config-line-add-zone": "Add Zone", @@ -358,7 +373,7 @@ "graph.property-date-last-range": "Date range", "graph.property-date-group": "Group", "graph.property-offline": "Online", - "graph.property-graph-oriantation": "Oriantation", + "graph.property-graph-orientation": "Orientation", "graph.property-ori-vartical": "Vertical", "graph.property-ori-horizontal": "Horizontal", "graph.property-decimals": "Decimals", @@ -411,8 +426,15 @@ "graph.grouptype-days": "Days", "iframe.property-data": "Data", - "iframe.property-address": "Address", - "iframe.property-name": "Name", + "iframe.property-address": "Address (fix)", + "iframe.property-image": "Image", + + "video.property-title": "Video settings", + "video.property-data": "Data", + "video.property-address": "Address", + "video.property-controls": "Show controls", + "video.property-image": "Initial image", + "video.property-image-placeholder": "Select the initial image", "panel.property-data": "Data", "panel.property-view-name": "View name", @@ -483,6 +505,7 @@ "table.cell-column-type": "Column type", "table.cell-row-type": "Row type", "table.cell-ts-format": "Format (DD/MM/YYYY - HH:mm:ss)", + "table.cell-ts-interval": " and rounding interval", "table.cell-value-format": "Format (0.000)", "table.cell-format": "Format", "table.cell-text": "Text", @@ -522,6 +545,7 @@ "editor.view-property": "Property", "editor.view-clone": "Clone", "editor.view-export": "Export", + "editor.view-clean": "Clean", "editor.view-add": "Add View", "editor.image-add": "Add image", "editor.view-import": "Import View", @@ -564,6 +588,89 @@ "editor.controls-image": "Image (link)", "editor.controls-panel": "Panel", "editor.controls-panel-settings": "Panel settings", + "editor.controls-video": "Video", + "editor.controls-video-settings": "Video settings", + "editor.controls-scheduler": "Time Scheduler", + "editor.controls-scheduler-settings": "Time Scheduler settings", + + "scheduler.property-settings-title": "Scheduler settings", + "scheduler.devices": "Devices", + "scheduler.device-name": "Device Name", + "scheduler.friendly-name": "Friendly Name", + "scheduler.add-device": "Add Device", + "scheduler.remove-device": "Remove Device", + "scheduler.colors": "Colors", + "scheduler.background-color": "Background Color", + "scheduler.text-color": "Text Color", + "scheduler.accent-color": "Accent Color", + "scheduler.border-color": "Border Color", + "scheduler.property-settings-devices": "Devices", + "scheduler.property-settings-add-device": "Add Device", + "scheduler.property-settings-device-name": "Device Name", + "scheduler.property-settings-layout": "Appearance", + "scheduler.property-settings-time-format": "Time Format", + "scheduler.property-settings-theme": "Theme", + "scheduler.property-settings-background": "Background", + "scheduler.property-settings-border": "Border", + "scheduler.property-settings-primary-text": "Primary Text", + "scheduler.property-settings-secondary-text": "Secondary Text", + "scheduler.device-selector-overview": "Overview", + "scheduler.device-selector-select-device": "Select Device", + "scheduler.show-disabled": "Show Disabled", + "scheduler.show-active": "Show Active", + "scheduler.clear-all-schedules": "Clear All Schedules", + + "scheduler.col-start": "Start", + "scheduler.col-mode": "Mode", + "scheduler.col-device": "Device", + "scheduler.col-duration": "Duration", + "scheduler.col-status": "Status", + "scheduler.col-remaining": "Remaining", + "scheduler.view-events": "View Events", + "scheduler.empty-device": "Nothing planned for this device", + "scheduler.no-devices": "No devices configured. Configure devices in the properties panel to create schedules.", + "scheduler.no-schedules": "No schedules created yet. Select a device above to add schedules.", + "scheduler.edit-title": "Edit Schedule", + "scheduler.add-title": "Add Schedule", + "scheduler.assign-device": "Assign to Device", + "scheduler.start-time": "Start Time", + "scheduler.end-time": "End Time", + "scheduler.hhmm": "HH:MM", + "scheduler.time.hour": "Hour", + "scheduler.time.minute": "Minute", + "scheduler.time.period": "Period", + "scheduler.time.am": "AM", + "scheduler.time.pm": "PM", + "scheduler.time.interval": "Interval", + "scheduler.time.hours": "Hours", + "scheduler.time.minutes": "Minutes", + "scheduler.time.seconds": "Seconds", + "scheduler.days": "Days", + "scheduler.months": "Months", + "scheduler.recurring": "Recurring", + "scheduler.event-mode": "Event Mode", + "scheduler.time-mode": "Time Mode", + "scheduler.month-mode": "Month Mode", + "scheduler.months-active": "Months Active", + "scheduler.days-of-month": "Days of Month", + "scheduler.days-active": "Days Active", + "scheduler.select-all": "Select All", + "scheduler.deselect-all": "Deselect All", + "scheduler.save": "Save Schedule", + "scheduler.editor-placeholder.title": "Time Scheduler", + "scheduler.editor-placeholder.hint": "Configure in properties panel", + "scheduler.start": "Start", + "scheduler.end": "End", + "scheduler.cancel": "Cancel", + "scheduler.monthly-schedule-details": "Monthly Schedule Details", + "scheduler.unnamed-device": "Unnamed Device", + "scheduler.update-schedule": "Update Schedule", + "scheduler.add-schedule": "Add Schedule", + "scheduler.delete-schedule": "Delete Schedule", + "scheduler.to-remove": "Are you sure you want to delete this schedule for {{value}}?", + "scheduler.clear-schedules": "Clear Schedules", + "scheduler.to-remove-permission": "Are you sure you want to delete {{value}} schedule/s you have permission to modify? This action cannot be undone.", + "scheduler.property-data": "Data", "editor.layout-settings": "Layout settings", @@ -730,11 +837,16 @@ "shapes.action-show": "Show", "shapes.action-blink": "Blink", "shapes.action-stop": "Stop", + "shapes.action-start": "Start", + "shapes.action-pause": "Pause", + "shapes.action-reset": "Reset", "shapes.action-clockwise": "Turn clockwise", "shapes.action-anticlockwise": "Turn anticlockwise", "shapes.action-downup": "Up and down", "shapes.action-rotate": "Rotate", "shapes.action-move": "Move", + "shapes.action-refreshImage": "Refresh image", + "shapes.event-click": "Click", "shapes.event-dblclick": "DoubleClick", "shapes.event-mouseup": "MouseUp", @@ -940,6 +1052,9 @@ "device.template-device": "Template name", "device.template-tags": "Template name", "device.property-socket-reuse": "Socket Reuse", + "device.property-melsec-target": "Address (IP[:port])", + "device.property-melsec-ascii": "ASCII", + "device.property-melsec-octalIO": "Octal I/O", "device.browsetopics-property-title": "Broker Topics to subscribe and publish", "device.browsetopics-property-sub": "Subscribe", @@ -953,6 +1068,7 @@ "device.topic-publish-path": "Topic path", "device.topic-publish": "Publish", "device.topic-subscribe": "Subscribe", + "device.topic-select-all": "Select All", "device.topic-subscription-content": "Content", "device.topic-subscription-name": "Name", "device.topic-subscription-address": "Address", @@ -967,9 +1083,9 @@ "device.topic-type-timestamp": "Timestamp", "device.topic-type-value": "Value (of Topic)", "device.topic-type-static": "Static", - "device.topic-name-exist": "The Topic name '{{value}}' already exist", - "device.topic-subs-address-exist": "The Topic to subscribe with address '{{value}}' already exist", - "device.topic-pubs-address-exist": "The Topic to publish with address '{{value}}' already exist", + "device.topic-name-exist": "The Topic name '{{value}}' already exists", + "device.topic-subs-address-exist": "The Topic to subscribe with address '{{value}}' already exists", + "device.topic-pubs-address-exist": "The Topic to publish with address '{{value}}' already exists", "device.property-mqtt-address": "Address (mqtt://[server]:[port])", "device.tag-property-title": "Tag Property", @@ -1030,6 +1146,17 @@ "device.tag-scale-write-script-tooltip": "Script to transform value before write to client", "device.tag-scale-write-script-params": "Enter Write Script Parameter Values", "device.tag-scale-script-params-tooltip": "JSON formated array of parameters with values to pass to script", + "device.tag-property-webcam-device": "Webcam device", + "device.tag-property-webcam-device-address": "Webcam device ,like(/dev/video0)", + "device.tag-property-webcam-options.width": "width", + "device.tag-property-webcam-options.height": "height", + "device.tag-property-webcam-options.frames": "frames", + "device.tag-property-webcam-options.quality": "quality", + "device.tag-property-webcam-options.outputType": "outputType", + "device.tag-property-webcam-options.callbackReturn": "callbackReturn", + + + "device.edit-placeholder-titel": "Edit Placeholder", @@ -1120,6 +1247,8 @@ "gauges.property-input-type-date": "Date", "gauges.property-input-type-time": "Time", "gauges.property-input-type-datetime": "Date and Time", + "gauges.property-input-type-textarea": "Multiline", + "gauges.property-input-type-password": "Password", "gauges.property-input-time-format": "Time format", "gauges.property-input-time-format-normal": "HH:mm", "gauges.property-input-time-format-seconds": "HH:mm:ss", @@ -1128,6 +1257,8 @@ "gauges.property-input-convertion": "Convertion", "gauges.property-input-convertion-milliseconds": "Milliseconds", "gauges.property-input-convertion-string": "String", + "gauges.property-input-maxlength": "Max length", + "gauges.property-input-readonly": "Readonly", "gauges.property-update-enabled": "Enable update", "gauges.property-update-esc": "ESC update", @@ -1153,6 +1284,7 @@ "gauges.property-tag-label": "Tag", "gauges.property-tag-internal-title": "Set Placeholder of Destination (or Tag of internal device)", "gauges.property-input-range": "Allowed input range", + "gauges.property-input-startText": "Start text", "gauges.property-language-text": "Text or @TextID", "bag.property-ticks": "Ticks", @@ -1264,6 +1396,9 @@ "notification.property-priority": "Priority", "notification.type-alarm": "Alarms", "notification.type-trigger": "Trigger", + "notification.property-mode": "Mode", + "notification.property-mode-alarm-all": "notify all new active alarms", + "notification.property-mode-alarm-single": "notify one for priority", "scripts.list-title": "Scripts settings", "scripts.list-name": "Name", @@ -1305,7 +1440,7 @@ "script.paramtype-tagid": "Tag ID", "script.paramtype-value": "Value (number/string/object)", "script.paramtype-chart": "Chart lines (array)", - "script.param-name-exist": "The parameter name already exist!", + "script.param-name-exist": "The parameter name already exists!", "script.sys-fnc-settag-text": "$setTag (TagID, value)", "script.sys-fnc-settag-tooltip": "System function to set Tag value: $setTag (TagID as string, value as string or number)", "script.sys-fnc-gettag-text": "$getTag (TagID)", @@ -1353,6 +1488,9 @@ "script.sys-fnc-invokeObject-text": "$invokeObject (Object name, Function name, [Parameter])", "script.sys-fnc-invokeObject-tooltip": "System function to call Object function: $invokeObject (Object name as string, function name as string , [parameter])", "script.sys-fnc-invokeObject-params": "'Object name', 'function name', ", + "script.sys-fnc-getObject-text": "$getObject (Object name)", + "script.sys-fnc-getObject-tooltip": "System function to get GUI-Object: $getObject (Object name as string)", + "script.sys-fnc-getObject-params": "'Object name'", "script.sys-fnc-runServerScript-text": "$runServerScript (Script name, [Parameter])", "script.sys-fnc-runServerScript-tooltip": "Client function to call Server script function: $runServerScript (Script name as string, [parameter])", "script.sys-fnc-runServerScript-params": "'Server script name', ", @@ -1380,6 +1518,8 @@ "script.template-chart-data-text": "Customized chart data", "script.template-chart-data-tooltip": "Code template of customized chart data to return", + "script.template-chart-data-touch-text": "Customized chart data with touch event", + "script.template-chart-data-touch-tooltip": "Code template of customized chart data to return and set value with coordinate(x/y) of touch event", "script.template-invoke-chart-update-options-text": "Update Chart options", "script.template-invoke-chart-update-options-tooltip": "Code template to update Chart options (Y-axis scale range). CLIENT mode only!", "script.template-getHistoricalTagsoptions-text": "Get Historical Tags values", @@ -1568,6 +1708,7 @@ "dlg.setup-layout": "Layout", "dlg.setup-plugins": "Plugins", "dlg.setup-scripts": "Scripts", + "dlg.setup-node-red-flows": "Node-RED Flows", "dlg.setup-reports": "Reports", "dlg.setup-settings": "Settings", "dlg.setup-client-access": "Frontend Scripts", @@ -1593,12 +1734,14 @@ "dlg.app-language-ru": "Russian", "dlg.app-language-ua": "Ukrainian", "dlg.app-language-zh-cn": "Chinese", + "dlg.app-language-zh-tw": "Chinese (Traditional)", "dlg.app-language-pt": "Portuguese", - "dlg.app-language-sv": "Swedish", + "dlg.app-language-sv": "Swedish", "dlg.app-language-tr": "Turkish", "dlg.app-language-ko": "Korean", "dlg.app-language-es": "Spanish", "dlg.app-language-fr": "French", + "dlg.app-language-ja": "Japanese", "dlg.app-settings-server-port": "Server is listening on port", "dlg.app-settings-server-log-full": "Log full mode", "dlg.app-settings-alarms": "Alarms", @@ -1643,6 +1786,7 @@ "plugin.group-connection-device": "Connection device", "plugin.group-connection-database": "Connection database", "plugin.group-chart-report": "Chart image for Report", + "plugin.group-service": "Service", "action-settings-title": "Actions Settings", "action-settings-readonly-tag": "Tag", @@ -1651,13 +1795,13 @@ "msg.alarm-ack-all": "Would you like to ACK all alarms?", "msg.alarm-remove": "Would you like to remove Alarm?", "msg.text-remove": "Would you like to remove Text?", - "msg.alarmproperty-error-exist": "Alarm name exist!", + "msg.alarmproperty-error-exist": "Alarm name exists!", "msg.alarmproperty-missing-value": "Some values are missing!", - "msg.textproperty-error-exist": "Text-ID exist!", + "msg.textproperty-error-exist": "Text-ID exists!", "msg.textproperty-missing-value": "Some values are missing!", "msg.device-remove": "Would you like to remove Device?", "msg.device-tag-remove": "Would you like to remove Tag?", - "msg.device-tag-exist": "Tag name exist!", + "msg.device-tag-exist": "Tag name exists!", "msg.device-tag-invalid-char": "The '@' character is not allowed in tag names!", "msg.notification-property-missing-value": "Some values are missing!", "msg.report-property-missing-value": "There are incorrect or missing values!", @@ -1701,15 +1845,15 @@ "msg.chart-with-script": "The defined script receives the list of chart lines as a parameter and then returns the completed list with the data. Code sample in script 'Templates'", "msg.script-name-exist": "Script name exist!", "msg.invalid-script-name": "Invalid script name!", - "msg.templates-exist-ask-overwrite": "The template with name '{{value}}' already exist. Do you want to overwrite it?", + "msg.templates-exist-ask-overwrite": "The template with name '{{value}}' already exists. Do you want to overwrite it?", "msg.templates-save-success": "Template save successful!", - "msg.view-name-exist": "View name exist!", + "msg.view-name-exist": "View name exists!", "msg.notification-name-exist": "Notification name exist!", "msg.file-remove": "Would you like to remove '{{value}}'?", "msg.notification-remove": "Would you like to remove Notification '{{value}}'?", "msg.maps-location-remove": "Would you like to remove Maps Location '{{value}}'?", - "msg.maps-location-name-exist": "The Maps Location name already exist!", - "msg.text-name-exist": "Text name already exist!", + "msg.maps-location-name-exist": "The Maps Location name already exists!", + "msg.text-name-exist": "Text name already exists!", "msg.texts-text-remove": "Would you like to remove Text '{{value}}'?", "msg.operation-unauthorized": "Operation Unauthorized!" } diff --git a/client/dist/assets/i18n/fr.json b/client/dist/assets/i18n/fr.json index a0c87e176..c51af46be 100644 --- a/client/dist/assets/i18n/fr.json +++ b/client/dist/assets/i18n/fr.json @@ -42,33 +42,33 @@ "dlg.layout-lbl-icon": "Icône", "dlg.layout-lbl-sview": "Point de départ", "dlg.layout-lbl-login-start": "Afficher la connexion au début", - "dlg.layout-lbl-login-overlay-color": "Overlay color", + "dlg.layout-lbl-login-overlay-color": "Couleur de superposition", "dlg.layout-lbl-zoom": "Zoom", "dlg.layout-navigation-mode": "Montrer la navigation", - "dlg.layout-connection-message": "Show connection error (Toast)", + "dlg.layout-connection-message": "Afficher l'erreur de connexion (Toast)", "dlg.layout-show-dev": "Afficher le bouton", - "dlg.layout-navigation": "Menu côté navigation", + "dlg.layout-navigation": "Menu de navigation latéral", "dlg.layout-nav-bkcolor": "Couleur de l'arrière plan", "dlg.layout-nav-fgcolor": "Couleur", - "dlg.layout-lbl-smode": "Mode latéral", + "dlg.layout-lbl-smode": "Mode menu latéral", "dlg.layout-lbl-type": "Type", - "dlg.layout-header": "Barre de navigation en tête", + "dlg.layout-header": "Barre de navigation supérieure", "dlg.layout-header-bkcolor": "Couleur de l'arrière plan", "dlg.layout-header-fgcolor": "Couleur", "dlg.layout-lbl-title": "Titre", "dlg.layout-lbl-alarms": "Mode de notification des alarmes", - "dlg.layout-lbl-datetime": "Date and time format (dd/MM/yyyy - hh:mm a)", + "dlg.layout-lbl-datetime": "Format de date et d'heure (dd/MM/yyyy - hh:mm a)", "dlg.layout-lbl-infos": "Mode de notification d'informations", - "dlg.layout-lbl-font": "Font family", - "dlg.layout-lbl-font-size": "Font size", - "dlg.menuitem-title": "Elément du menu", + "dlg.layout-lbl-font": "Famille de police", + "dlg.layout-lbl-font-size": "Taille de police", "dlg.layout-lbl-anchor": "Direction", - "dlg.layout-lbl-margin-left": "Margin left", - "dlg.layout-lbl-margin-right": "Margin right", - "dlg.layout-lbl-login-info": "Login info", - "dlg.layout-lbl-custom-styles": "Custom styles", + "dlg.layout-lbl-margin-left": "Marge gauche", + "dlg.layout-lbl-margin-right": "Marge droite", + "dlg.layout-lbl-login-info": "Informations de connexion", + "dlg.layout-lbl-custom-styles": "Styles personnalisés", + "dlg.layout-lbl-show-language": "Afficher la langue", - "dlg.menuitem-title": "Menu Item", + "dlg.menuitem-title": "Élément du menu", "dlg.menuitem-image": "[Mon image...]", "dlg.menuitem-icon": "Icône", "dlg.menuitem-text": "Texte", @@ -76,9 +76,11 @@ "dlg.menuitem-link": "Lien par clic", "dlg.menuitem-alarms": "Alarmes par clic", "dlg.menuitem-address": "Adresse de liaison", + "dlg.menuitem-icons-filter": "Filtre d'icônes", - "dlg.headeritem-title": "Header Item", - "dlg.headeritem-icon": "Icon", + "dlg.headeritem-title": "Élément d'en-tête", + "dlg.headeritem-icon": "Icône", + "dlg.headeritem-icons-filter": "Filtre d'icônes", "dlg.docproperty-title": "Voir les propriétés", "dlg.docproperty-name": "Nom", @@ -97,24 +99,25 @@ "dlg.docproperty-size-1920-1080": "1920 x 1080 pixels", "dlg.docproperty-margin": "Marge", "dlg.docproperty-align": "Aligner", - "dlg.docproperty-align-placeholder": "Alignment on the page", - "dlg.docproperty-align-topCenter": "Top", - "dlg.docproperty-align-middleCenter": "Middle", - "dlg.docproperty-gridtype": "Grid type", - "dlg.docproperty-gridtype-placeholder": "Grid layout type", - "dlg.docproperty-gridtype-fit": "Fit", - "dlg.docproperty-gridtype-scrollVertical": "ScrollVertical", - "dlg.docproperty-gridtype-scrollHorizontal": "ScrollHorizontal", - "dlg.docproperty-gridtype-fixed": "Fixed", - "dlg.docproperty-gridtype-verticalFixed": "VerticalFixed", - "dlg.docproperty-gridtype-horizontalFixed": "HorizontalFixed", + "dlg.docproperty-align-placeholder": "Alignement sur la page", + "dlg.docproperty-align-topCenter": "Haut", + "dlg.docproperty-align-middleCenter": "Milieu", + "dlg.docproperty-gridtype": "Type de grille", + "dlg.docproperty-gridtype-placeholder": "Type de mise en page de la grille", + "dlg.docproperty-gridtype-fit": "Ajuster", + "dlg.docproperty-gridtype-scrollVertical": "Défilement vertical", + "dlg.docproperty-gridtype-scrollHorizontal": "Défilement horizontal", + "dlg.docproperty-gridtype-fixed": "Fixe", + "dlg.docproperty-gridtype-verticalFixed": "Fixe vertical", + "dlg.docproperty-gridtype-horizontalFixed": "Fixe horizontal", + "dlg.docproperty-renderDelay": "Délai de rendu de la vue (ms)", "dlg.docname-title": "Nom de vue", "dlg.docname-name": "Nom", "dlg.docproperty-type": "Type de vue", "dlg.item-title": "Nom", "dlg.item-name": "Nom", - "dlg.item-req-name": "Nom (pas d'espace ou nombre autorisés)", + "dlg.item-req-name": "Nom de la fonction (pas d'espace ou nombre autorisés)", "dlg.item-name-error": "Le nom existe!", "dlg.parameter-title": "Paramètre", @@ -134,9 +137,10 @@ "dlg.userproperty-title": "Utilisateur", "dlg.userproperty-groups": "Groupes d'autorisation", - "dlg.userproperty-roles": "Authorization Roles", + "dlg.userproperty-roles": "Rôles d'autorisation", "dlg.useraccess-groups": "Autorisation (vide = pour tout le monde)", - "dlg.userproperty-start": "Vue principale", + "dlg.userproperty-language": "Langue", + "dlg.userproperty-start": "Vue de démarrage", "dlg.gauge-permission-title": "Autorisation", "dlg.gauge-permission-label": "(vide = pour tout le monde)", @@ -145,6 +149,7 @@ "date.range-start": "Date de début", "date.range-end": "Date de fin", + "general.search-up": "RECHERCHE", "general.close": "Fermer", "general.search": "Chercher...", @@ -157,7 +162,7 @@ "general.grant-type": "Type d'autorisation", "general.usergroups": "Visionneur, opérateur, ingénieur, superviseur, gestionnaire, F, G, administrateur", "general.enabled": "Activé", - "general.disabled": "Désacivé", + "general.disabled": "Désactivé", "general.align-left": "Gauche", "general.align-center": "Centre", "general.align-right": "Droite", @@ -191,8 +196,9 @@ "item.navsmode-none": "Aucune", "item.navsmode-push": "Pousser", - "item.navsmode-over": "Plus de", + "item.navsmode-over": "Dessus", "item.navsmode-fix": "Fixé", + "item.navtype-icons": "Icônes", "item.navtype-text": "Texte", "item.navtype-icons-text-block": "Icônes et texte (bloc)", @@ -214,9 +220,14 @@ "item.logininfo-type-fullname": "Nom", "item.logininfo-type-both": "Nom et Prénom", + "item.language-show-mode-nothing": "Cacher", + "item.language-show-mode-simple": "Montrer", + "item.language-show-mode-key": "Montrer avec la clé", + "item.language-show-mode-fullname": "Montrer avec le nom complet", + "item.zoommode-disabled": "Désactivé", - "item.zoommode-enabled": "Activé", - "item.zoommode-autoresize": "Taille auto", + "item.zoommode-enabled": "Manuellement", + "item.zoommode-autoresize": "Redimensionnement auto", "item.headerbarmode-hide": "Cacher", "item.headerbarmode-show": "Montrer", @@ -229,11 +240,11 @@ "chart.config-title": "Paramètres des graphiques", "chart.config-charts": "Graphiques", - "chart.config-devices": "Dispositifs", + "chart.config-devices": "Appareils", "chart.config-tags": "Mots clés", "chart.config-lines": "Ligne de graphique", "chart.config-line-name": "Nom", - "chart.config-line-label": "Étiquette", + "chart.config-line-label": "Labels", "chart.config-line-yaxis": "Axe y", "chart.config-line-color": "Couleur", "chart.config-name-title": "Graphique", @@ -241,12 +252,21 @@ "chart.config-rename": "Renommer", "chart.config-delete": "Effacer", "chart.config-addline": "Ajouter une ligne", + "chart.config-addlinePlaceholder": "Ajouter une variable intermédiaire", "chart.config-line-interpolation": "Interpolation", "chart.config-line-fill": "Remplir", "chart.config-interpo-linear": "linéaire", "chart.config-interpo-stepAfter": "pas suivant", "chart.config-interpo-stepBefore": "pas précédent", "chart.config-interpo-spline": "spline", + "chart.config-line-width": "Largeur de ligne", + "chart.config-line-gap": "Remplir les espaces", + "chart.config-line-add-zone": "Ajouter une zone", + "chart.config-line-zone-min": "Min", + "chart.config-line-zone-max": "Max", + "chart.config-line-zone-stroke": "Contour", + "chart.config-line-zone-fill": "Remplir", + "chart.property-data": "Données", "chart.property-props": "Propriété", "chart.property-layout": "Disposition", @@ -254,13 +274,14 @@ "chart.property-chart": "Graphique à montrer", "chart.property-newchart": "Nouveau tableau ...", "chart.property-chart-type": "Mode de présentation", - "chart.property-realtime-max": "Minutes maximales", + "chart.property-realtime-max": "Minutes Max.", "chart.viewtype-realtime1": "Temps réel", - "chart.viewtype-history": "Histoire", + "chart.viewtype-history": "Historique", + "chart.viewtype-custom": "Personnalisé", "chart.property-general": "Général", "chart.property-font": "Police de caractère", - "chart.property-font.titlesize": "Taille du titre", - "chart.property-font.axissize": "Taille de l'axe", + "chart.property-font.titlesize": "Taille titre", + "chart.property-font.axissize": "Taille axes", "chart.property-font.legendsize": "Taille de la légende", "chart.property-theme": "Thème", "chart.property-color.background": "Arrière plan", @@ -269,44 +290,63 @@ "chart.property-color.legend": "Couleur de la légende", "chart.property-legend.mode": "Mode de présentation de la légende", "chart.property-date-last-range": "Plage des dates", + "chart.property-refresh-interval": "Intervalle de rafraîchissement (min.)", + "chart.property-hide-toolbar": "Masquer la barre d'outils", + "chart.property-thouch-zoom": "Zoom tactile", + "chart.property-load-old-values": "Charger l'historique", "chart.property-date.format": "Format de la date", "chart.property-time.format": "Format de l'heure", "chart.property-axis": "Axe", "chart.property-xaxis": "Axe x", - "chart.property-axis-x": "Étiquette", + "chart.property-axis-x": "Label X", "chart.property-yaxis": "Axe y", - "chart.property-axis-y1": "Étiquette Y1", - "chart.property-axis-y2": "Étiquette Y2", - "chart.property-axis-y3": "Étiquette Y3", - "chart.property-axis-y4": "Étiquette Y4", + "chart.property-axis-y1": "Label Y1", + "chart.property-axis-y1-min": "Y1 Min", + "chart.property-axis-y1-max": "Y1 Max", + "chart.property-axis-y2": "Label Y2", + "chart.property-axis-y2-min": "Y2 Min", + "chart.property-axis-y2-max": "Y2 Max", + "chart.property-axis-y3": "Label Y3", + "chart.property-axis-y3-min": "Y3 Min", + "chart.property-axis-y3-max": "Y3 Max", + "chart.property-axis-y4": "Label Y4", + "chart.property-axis-y4-min": "Y4 Min", + "chart.property-axis-y4-max": "Y4 Max", + "chart.property-script": "Source de données du script", + "chart.rangetype-last8h": "8 dernières heures", "chart.rangetype-last1d": "Dernier jour", "chart.rangetype-last3d": "3 derniers jours", - "chart.rangetype-last1w": "La semaine dernière", + "chart.rangetype-last1w": "Semaine dernière", + "chart.legend-always": "toujours", "chart.legend-follow": "suivre", "chart.legend-bottom": "fond", "chart.legend-never": "jamais", - "chart.labels-serie": "En série", + + "chart.labels-serie": "Série", "chart.labels-time": "Temps", "chart.labels-title": "Titre", + "graph.config-title": "Paramètres graphiques", "graph.config-rename": "Renommer", - "graph.config-source-tag": "Ajouter la balise source", + "graph.config-source-tag": "Ajouter le tag source", "graph.config-source-name": "Nom", - "graph.config-source-label": "Étiquette", + "graph.config-source-label": "Labels", "graph.config-category": "Catégorie", - "graph.config-device": "Dispositif", - "graph.config-bar-color": "Frontière", + "graph.config-device": "Appareil", + "graph.config-bar-color": "Bordure", "graph.config-bar-fill": "Remplir", "graph.property-xtype": "Type de catégorie d'axe x", - "graph.property-sources": "Sources (étiquettes)", + "graph.property-sources": "Sources (labels)", "graph.bar-xtype-value": "Valeurs", "graph.bar-xtype-date": "Date et heure", "graph.property-fnctype": "Type de fonction", "graph.bar-date-fnc-value-integral": "Somme (intégrale)", "graph.bar-date-fnc-hour-integral": "Somme d'heure (intégrale)", + "graph.property-data": "Données", + "graph.property-name": "Nom", "graph.property-general": "Générale", "graph.property-title": "Titre", "graph.property-title-font": "Taille de police", @@ -319,61 +359,76 @@ "graph.property-date-last-range": "Plage de dates", "graph.property-date-group": "Groupe", "graph.property-offline": "En ligne", - "graph.property-graph-oriantation": "Orientation", + "graph.property-graph-orientation": "Orientation", "graph.property-ori-vartical": "Verticale", "graph.property-ori-horizontal": "Horizontale", "graph.property-decimals": "Décimales", "graph.property-yaxis-min": "Min", "graph.property-yaxis-max": "Max", - "graph.property-stepsize": "Marquer le pas", - "graph.property-yaxis": "Axe de valeur", + "graph.property-stepsize": "Taille du pas", + "graph.property-yaxis": "Axe des valeurs", "graph.property-yaxis-fontsize": "Taille de police", "graph.property-yaxis-show": "Montrer", "graph.property-yaxis-color": "Évaluer", "graph.property-xaxis-fontsize": "Taille de police", - "graph.property-xaxis": "Axe de catégorie", + "graph.property-xaxis": "Axe des catégories", "graph.property-xaxis-show": "Montrer", "graph.property-xaxis-color": "Catégorie", "graph.property-theme": "Thème", "graph.property-theme-type": "Type", - "graph.property-gridline": "Grille d'exposition", + "graph.property-gridline": "Afficher grille", "graph.property-grid-color": "Grille", "graph.property-theme-owner": "Personnaliser", - "graph.property-theme-light": "Lumière", + "graph.property-theme-light": "Clair", "graph.property-theme-dark": "Sombre", "graph.property-legend": "Légende", "graph.property-legend-display": "Position", "graph.property-legend-top": "Haut", - "graph.property-legend-left": "La gauche", - "graph.property-legend-bottom": "Fond", + "graph.property-legend-left": "Gauche", + "graph.property-legend-bottom": "Bas", "graph.property-legend-right": "Droite", "graph.property-legend-show": "Montrer", - "graph.property-legend-fontsize": "Police de caractère", + "graph.property-legend-fontsize": "Taille de police", "graph.property-legend-align": "Aligner", "graph.property-legend-center": "Centre", - "graph.property-legend-start": "Commencer", + "graph.property-legend-start": "Début", "graph.property-legend-end": "Fin", "graph.property-legend-color": "Légende", "graph.property-border": "Taille de bordure", - "graph.property-tooltip": "Afficher l'influence", - "graph.property-datalabels": "Etiquette de données", - "graph.property-datalabels-color": "Etiquette de données", + "graph.property-tooltip": "Afficher infobulle", + "graph.property-datalabels": "Label des données", + "graph.property-datalabels-color": "Couleur du label des données", "graph.property-datalabels-show": "Montrer", "graph.property-datalabels-fontsize": "Taille de police", "graph.property-datalabels-align": "Aligner", + "graph.rangetype-last1h": "Dernière heure", "graph.rangetype-last1d": "Dernier jour", "graph.rangetype-last3d": "3 derniers jours", - "graph.rangetype-last1w": "La semaine dernière", + "graph.rangetype-last1w": "Semaine dernière", + "graph.rangetype-last1m": "Mois dernier", + "graph.grouptype-hours": "Heures", - "graph.grouptype-days": "Journées", + "graph.grouptype-days": "Jour", + "iframe.property-data": "Données", "iframe.property-address": "Adresse", "iframe.property-name": "Nom", + + "panel.property-data": "Données", + "panel.property-view-name": "Nom de la vue", + "panel.property-name": "Nom", + "panel.property-scalemode": "Mode mise à l'échelle", + "panel.property-scalemode-none": "Aucun", + "panel.property-scalemode-contain": "Contenir", + "panel.property-scalemode-stretch": "Étendre", + "table.property-title": "Paramètres du tableau de données", "table.property-data": "Données", "table.property-date-last-range": "Plage de dates", + "table.property-name": "Nom", "table.property-type": "Type", + "table.property-type-with-realtime": "Temps réel", "table.property-header": "Entête", "table.property-header-height": "Hauteur", "table.property-header-background": "Arrière plan", @@ -384,21 +439,29 @@ "table.property-row-background": "Arrière plan", "table.property-row-color": "Couleur", "table.property-row-fontSize": "Taille de police", + "table.property-selection": "Selection", "table.property-layout": "Disposition", "table.property-filter": "Filtre", "table.property-paginator": "Paginateur", + "table.property-paginator-items-per-page": "items par pages", + "table.property-paginator-next-page": "page suivante", + "table.property-paginator-prev-page": "page précédente", + "table.property-paginator-of-label": "de", "table.property-daterange": "Plage de dates", - "table.property-gridline": "Grille d'exposition", + "table.property-gridline": "Afficher la grille", "table.property-type-data": "Tableau de données", - "table.property-type-history": "Table d'histoire", + "table.property-type-history": "Tableau d'historique", + "table.property-type-alarms": "Tableau des alarmes", + "table.property-type-alarms-history": "Tableau d'historique des alarmes", + "table.property-type-reports": "Tableau des rapports", "table.property-grid-color": "Couleur de grille", "table.property-cols": "Colonnes", "table.property-rows": "Lignes", "table.property-column-type": "Type de colonne", "table.property-column-name": "Nom", - "table.property-column-label": "Étiquette", + "table.property-column-label": "Labels", "table.property-column-variable": "Variable", - "table.property-column-device": "Dispositif", + "table.property-column-device": "Appareils", "table.property-column-timestamp": "Date / heure", "table.property-column-align": "Aligner", "table.property-column-width": "Largeur", @@ -408,6 +471,10 @@ "table.customize-column-edit": "Modifier la colonne", "table.customize-column-add": "Ajouter la colonne", "table.customize-column-remove": "Supprimer la colonne", + "table.customize-column-left": "Déplacer à gauche", + "table.customize-column-right": "Déplacer à droite", + "table.customize-row-up": "Déplacer vers le haut", + "table.customize-row-down": "Déplacer vers le bas", "table.customize-row-edit": "Modifier la ligne", "table.customize-row-add": "Ajouter une rangée", "table.customize-row-remove": "Supprimer la ligne", @@ -423,12 +490,32 @@ "table.cell-align-left": "Gauche", "table.cell-align-center": "Centre", "table.cell-align-right": "Droite", + "table.history-filter": "Filtre", "table.rangetype-last1h": "Dernière heure", "table.rangetype-last1d": "Dernier jour", "table.rangetype-last3d": "3 derniers jours", - "editor.view-svg": "Toile / svg", + + "table.alarms-title": "Tableau des alarmes", + "table.alarms-history-title": "Tableau d'historique des alarmes", + "table.alarm-columns": "Colonnes des alarmes", + "table.alarm-filter": "Filtre d'alarmes", + "table.alarm-priority": "Priorité", + "table.alarm-tags": "Tags", + + "table.reports-title": "Tableau des rapports", + "table.report-columns": "Colonnes des rapports", + "table.report-view-name": "Nom", + "table.report-view-ontime": "Créé", + "table.report-view-download": "Télécharger", + "table.report-view-delete": "Supprimer", + "table.report-filter": "Filtre des rapports", + "table.report-filter-name": "Nom", + "table.report-filter-count": "Max.", + + "editor.view-svg": "Canvas / svg", "editor.view-cards": "Conteneur multi-vues", + "editor.view-maps": "Cartes", "editor.views": "Vues", "editor.resources": "Ressources", "editor.view-delete": "Effacer", @@ -438,48 +525,57 @@ "editor.view-export": "Exporter", "editor.view-add": "Ajouter la vue", "editor.image-add": "Ajouter une image", - "editor.view-import": "Vue d'importation", - "editor.general": "Générale", - "editor.shape": "Forme", + "editor.view-import": "Importer une vue", + "editor.general": "Général", + "editor.shape": "Formes", "editor.processeng": "Proc. Eng.", - "editor.animated": "Animation", - "editor.controls": "Les contrôles", + "editor.animated": "Animations", + "editor.controls": "Contrôles", "editor.controls-input": "Valeur d'entrée", "editor.controls-input-settings": "Paramètres d'entrée", "editor.controls-output": "Valeur de sortie", "editor.controls-output-settings": "Paramètres de sortie", "editor.controls-button": "Bouton", - "editor.controls-button-settings": "Paramètres des bouton", - "editor.controls-select": "Sélectionner la valeur", - "editor.controls-select-settings": "Sélectionner les paramètres", - "editor.controls-progress": "Jauge de barre", - "editor.controls-progress-settings": "Paramètres de jauge de bar", + "editor.controls-button-settings": "Paramètres du bouton", + "editor.controls-select": "Sélecteur de valeur", + "editor.controls-select-settings": "Paramètres du sélecteur", + "editor.controls-progress": "Jauge en barre", + "editor.controls-progress-settings": "Paramètres de la jauge en barre", "editor.controls-semaphore": "Jauge LED", "editor.controls-semaphore-settings": "Paramètres de jauge LED", "editor.controls-chart": "Graphique", "editor.controls-chart-settings": "Paramètres du graphique", - "editor.controls-bag": "Calibre circulaire", + "editor.controls-bag": "Jauge circulaire", "editor.controls-bag-settings": "Paramètres de jauge circulaire", "editor.controls-pipe": "Tuyau", - "editor.controls-pipe-settings": "Réglages de tuyaux", - "editor.controls-slider": "Glissière", - "editor.controls-slider-settings": "Paramètres de curseur", + "editor.controls-pipe-settings": "Paramètres du tuyau", + "editor.controls-slider": "Curseur", + "editor.controls-slider-settings": "Paramètres du curseur", "editor.controls-shape-settings": "Paramètres de forme", - "editor.controls-html-switch-settings": "Paramètres de commutation", - "editor.controls-switch": "Changer", - "editor.controls-graphbar": "Graphique à barres", - "editor.controls-graph-bar-settings": "Paramètres du graphique à barres", - "editor.controls-graph-pie-settings": "Paramètres du graphique à tarte", + "editor.controls-html-switch-settings": "Paramètres de l'interrupteur", + "editor.controls-switch": "Interrupteur", + "editor.controls-graphbar": "Graphique en barres", + "editor.controls-graph-bar-settings": "Paramètres du graphique en barres", + "editor.controls-graphpie": "Graphique circulaire", + "editor.controls-graph-pie-settings": "Paramètres du graphique circulaire", "editor.controls-iframe": "Iframe", - "editor.controls-iframe-settings": "Paramètres IFRAME", - "editor.controls-table": "Table", + "editor.controls-iframe-settings": "Paramètres iframe", + "editor.controls-table": "Tableau", + "editor.header-item-settings": "Paramètres de l'élément d'en-tête", + "editor.controls-image": "Image (lien)", + "editor.controls-panel": "Panneau", + "editor.controls-panel-settings": "Paramètres du panneau", + "editor.layout-settings": "Paramètres de mise en page", + "editor.interactivity": "Interactivité", "editor.interactivity-id": "identifiant:", "editor.interactivity-id-title": "Identifier l'élément", - "editor.interactivity-class": "classer:", + "editor.interactivity-class": "classe:", "editor.interactivity-class-title": "Classe d'élément", - "editor.interactivity-name": "Nom", + "editor.interactivity-name": "nom", + "editor.edit-bind-of-tags": "Modifier les liaisons des variables", + "editor.cmenu-property": "Propriété", "editor.cmenu-cut": "Couper", "editor.cmenu-copy": "Copie", @@ -492,48 +588,51 @@ "editor.cmenu-bring-forward": "En avant", "editor.cmenu-send-backward": "En arrière", "editor.cmenu-send-back": "En arrière", - "editor.cmenu-layer-duplicate": "Calque en double ...", - "editor.cmenu-layer-delete": "Supprimer la couche", + "editor.cmenu-layer-duplicate": "Dupliquer le calque ...", + "editor.cmenu-layer-delete": "Supprimer le calque", "editor.cmenu-layer-marge-down": "Fusionner vers le bas", "editor.cmenu-layer-marge-all": "Fusionner tout", + "editor.cmenu-unlock": "Déverrouiller", + "editor.cmenu-lock": "Verrouiller", + "editor.transform": "Transformer", "editor.transform-x": "X", "editor.transform-x-title": "Changer les coordonnées x", "editor.transform-y": "y", - "editor.transform-y-title": "Changer les coordonnées", + "editor.transform-y-title": "Changer les coordonnées y", "editor.transform-x1": "x1", - "editor.transform-x1-title": "Modifier les coordonnées de démarrage de la ligne", + "editor.transform-x1-title": "Changer les coordonnées x du début de la ligne", "editor.transform-y1": "Y1", - "editor.transform-y1-title": "Changer la coordonnée de démarrage de la ligne", + "editor.transform-y1-title": "Changer les coordonnées y du début de la ligne", "editor.transform-x2": "x2", - "editor.transform-x2-title": "Modifier les coordonnées de démarrage de la ligne", + "editor.transform-x2-title": "Changer les coordonnées x du début de la ligne", "editor.transform-y2": "Y2", - "editor.transform-y2-title": "Changer la coordonnée de démarrage de la ligne", + "editor.transform-y2-title": "Changer les coordonnées y du début de la ligne", "editor.transform-rect-width-title": "Changer la largeur du rectangle", "editor.transform-width": "largeur", "editor.transform-rect-height-title": "Changer la hauteur de rectangle", - "editor.transform-height": "la taille", - "editor.transform-rect-radius-title": "Changer le rayon du coin rectangle", - "editor.transform-radiuscorner": "coin rayon", + "editor.transform-height": "hauteur", + "editor.transform-rect-radius-title": "Changer le rayon des coins du rectangle", + "editor.transform-radiuscorner": "Rayon des coins", "editor.transform-circlecx": "cx", "editor.transform-circlecx-title": "Changer les coordonnées CX du cercle", - "editor.transform-circlecy": "cycle", - "editor.transform-circlecy-title": "Modifier les coordonnées du cycle du cercle", + "editor.transform-circlecy": "cy", + "editor.transform-circlecy-title": "Changer les coordonnées CY du cercle", "editor.transform-circler": "r", "editor.transform-circler-title": "Changer le rayon du cercle", "editor.transform-ellipsecx": "cx", - "editor.transform-ellipsecx-title": "Changer la coordonnée CX d'Ellipse", - "editor.transform-ellipsecy": "cycle", - "editor.transform-ellipsecy-title": "Changer la coordonnée CY d'Ellipse", + "editor.transform-ellipsecx-title": "Changer la coordonnée CX de l'ellipse", + "editor.transform-ellipsecy": "cy", + "editor.transform-ellipsecy-title": "Changer la coordonnée CY de l'ellipse", "editor.transform-ellipserx": "rx", - "editor.transform-ellipserx-title": "Changer le rayon X d'Ellipse", + "editor.transform-ellipserx-title": "Changer le rayon X de l'ellipse", "editor.transform-ellipsery": "ry", - "editor.transform-ellipsery-title": "Changer le rayon Y d'Ellipse", + "editor.transform-ellipsery-title": "Changer le rayon Y de l'ellipse", "editor.transform-fontfamily": "famille de polices", "editor.transform-font-serif": "Serif", "editor.transform-font-sansserif": "Sans-serif", "editor.transform-font-cursive": "Cursive", - "editor.transform-font-fantasy": "Fantaisie", + "editor.transform-font-fantasy": "Fantasy", "editor.transform-font-monospace": "Monospace", "editor.transform-fontsize": "taille de police", "editor.transform-fontsize-title": "Changer la taille de la police", @@ -549,26 +648,31 @@ "editor.transform-change-image-title": "Remarque: cette image ne peut pas être intégrée. Cela dépendra de ce chemin à afficher", "editor.transform-angle": "angle", "editor.transform-angle-title": "Changer l'angle de rotation", + "editor.transform-hide": "Masquer", + "editor.transform-lock": "Verrouiller", + "editor.align": "Aligner", - "editor.align-left-title": "Alignez à gauche", - "editor.align-center-title": "centrer", + "editor.align-left-title": "Aligner à gauche", + "editor.align-center-title": "Aligner au centre", "editor.align-right-title": "Aligner à droite", - "editor.align-top-title": "Aligner au dessus", - "editor.align-middle-title": "Centrer", + "editor.align-top-title": "Aligner en haut", + "editor.align-middle-title": "Aligner au milieu", "editor.align-bottom-title": "Aligner en bas", + "editor.stroke": "Trait", "editor.stroke-width": "largeur du trait", - "editor.stroke-width-title": "Changer la largeur de la course de 1, cliquez sur l'échange pour changer de 0,1", - "editor.stroke-style": "style de course", - "editor.stroke-style-title": "Changer le style de tableau de bord de course", - "editor.stroke-joinmiter-title": "Mitre de ligne", - "editor.stroke-joinround-title": "Rond", - "editor.stroke-joinbevel-title": "Biseau de ligne", - "editor.stroke-capbutt-title": "Butt de linecap", - "editor.stroke-capsquare-title": "Square de linecap", - "editor.stroke-capround-title": "Linecap rond", + "editor.stroke-width-title": "Changer la largeur du trait de 1, shift+clic pour changer de 0,1", + "editor.stroke-style": "style de trait", + "editor.stroke-style-title": "Changer le style de trait", + "editor.stroke-joinmiter-title": "Jonction angulaire", + "editor.stroke-joinround-title": "Jonction arrondie", + "editor.stroke-joinbevel-title": "Jonction biseautée", + "editor.stroke-capbutt-title": "Extrémité droite", + "editor.stroke-capsquare-title": "Extrémité carrée", + "editor.stroke-capround-title": "Extrémité arrondie", "editor.stroke-shadow": "ombre", "editor.stroke-shadow-title": "Avec ombre", + "editor.marker": "Marqueur", "editor.marker-start": "début", "editor.marker-start-title": "Sélectionnez le type de marqueur de démarrage", @@ -576,63 +680,96 @@ "editor.marker-middle-title": "Sélectionner le type de marqueur moyen", "editor.marker-end": "fin", "editor.marker-end-title": "Sélectionner le type de marqueur de fin", + "editor.hyperlink": "Lien hypertexte", "editor.hyperlink-url": "URL", + "editor.tools-launch-title": "Lancez la vue actuelle", - "editor.tools-select": "Sélectionner l'outil", - "editor.tools-pencil": "Outil de crayon", - "editor.tools-line": "Outil de ligne", - "editor.tools-rectangle": "Outil Rectangle", - "editor.tools-circle": "Outil de cercle", - "editor.tools-ellipse": "Outil d'ellipse", - "editor.tools-path": "Outil de chemin", - "editor.tools-text": "Outil de texte", - "editor.tools-image": "Outil d'image", - "editor.tools-zoom-title": "Zoom Tool [Ctrl + Up / Down]", - "editor.tools-grid-title": "Afficher la grille de peau", + "editor.tools-select": "Outil de sélection", + "editor.tools-pencil": "Outil crayon", + "editor.tools-line": "Outil ligne", + "editor.tools-rectangle": "Outil rectangle", + "editor.tools-circle": "Outil cercle", + "editor.tools-ellipse": "Outil ellipse", + "editor.tools-path": "Outil chemin", + "editor.tools-text": "Outil texte", + "editor.tools-image": "Outil image", + + "editor.tools-zoom-title": "Outil zoom [Ctrl + Haut / Bas]", + "editor.tools-grid-title": "Afficher/Masquer la grille", "editor.tools-undo-title": "Annuler [Z]", "editor.tools-redo-title": "Refaire [y]", - "editor.tools-clone-title": "Élément en double [d]", - "editor.tools-delete-title": "Supprimer l'élément [supprimer / backspace]", - "editor.tools-movebottom-title": "Envoyer à l'arrière [Ctrl + Shift + []", - "editor.tools-movetop-title": "Envoyer à l'avant [ctrl + shift +]]", + "editor.tools-clone-title": "Dupliquer [d]", + "editor.tools-delete-title": "Supprimer l'élément [supprimer / espace arrière]", + "editor.tools-movebottom-title": "Envoyer à l'arrière [Ctrl + Shift + [ ]", + "editor.tools-movetop-title": "Envoyer à l'avant [ctrl + shift +] ]", "editor.tools-topath-title": "Convertir en chemin", - "editor.tools-clonemulti-title": "Éléments de clone [C]", - "editor.tools-deletemulti-title": "Supprimer les éléments sélectionnés [supprimer / arrière-espace]", - "editor.tools-group-title": "Éléments de groupe [G]", + "editor.tools-clonemulti-title": "Cloner les éléments [C]", + "editor.tools-deletemulti-title": "Supprimer les éléments sélectionnés [supprimer / espace arrière]", + "editor.tools-group-title": "Grouper les éléments [G]", "editor.tools-alignleft-title": "Alignez à gauche", - "editor.tools-aligncenter-title": "Centrer", + "editor.tools-aligncenter-title": "Aligner au centre", "editor.tools-alignright-title": "Aligner à droite", "editor.tools-aligntop-title": "Aligner au dessus", - "editor.tools-alignmiddle-title": "Centrer", + "editor.tools-alignmiddle-title": "Aligner au milieu", "editor.tools-alignbottom-title": "Aligner en bas", - "editor.tools-ungroup-title": "Éléments de dépassement [G]", + "editor.tools-ungroup-title": "Dégrouper les éléments [G]", "editor.tools-hyperlink-title": "Faire un lien hypertexte", + "editor.tools-svg-selector": "Sélecteur de liste d'éléments", + + "editor.settings-general": "Général", + "editor.settings-events": "Événements", + "editor.settings-actions": "Actions", + + "tags.ids-config-title": "Référence des IDs des tags", + + "svg.selector.property-title": "Voir la liste des éléments", + "tutorial.editor-keyboard-shortcuts": "Raccourcis clavier de l'éditeur", + "shapes.action-hide": "Cacher", "shapes.action-show": "Montrer", "shapes.action-blink": "Clignoter", "shapes.action-stop": "Arrêt", - "shapes.action-clockwise": "Tourne dans le sens horaire", + "shapes.action-clockwise": "Tourner dans le sens horaire", "shapes.action-anticlockwise": "Tourner dans le sens antihoraire", "shapes.action-downup": "Haut et bas", "shapes.action-rotate": "Tourner", - "shapes.event-click": "Cliqué", - "shapes.event-mouseup": "Cliqué relaché", - "shapes.event-mousedown": "Cliqué pressé", - "shapes.event-onpage": "Page ouverte", - "shapes.event-onwindow": "Carte acueille", + "shapes.action-move": "Déplacer", + "shapes.event-click": "Clic", + "shapes.event-dblclick": "Double Clic", + "shapes.event-mouseup": "Clic relâché", + "shapes.event-mousedown": "Clic pressé", + "shapes.event-mouseover": "Survol", + "shapes.event-mouseout": "Fin survol", + "shapes.event-enter": "Entrer", + "shapes.event-select": "Sélectionner", + "shapes.event-onpage": "Ouvrir la page", + "shapes.event-onwindow": "Ouvrir la carte", "shapes.event-ondialog": "Ouvrir la boîte de dialogue", - "shapes.event-oniframe": "Iframe ouvert", - "shapes.event-oncard": "Fenêtre ouverte", - "shapes.event-onsetvalue": "Valeur définie", + "shapes.event-oniframe": "Ouvrir l'iframe", + "shapes.event-oncard": "Ouvrir la fenêtre", + "shapes.event-onopentab": "Ouvrir l'onglet", + "shapes.event-onsetvalue": "Définir la valeur", "shapes.event-ontogglevalue": "Valeur de basculement", "shapes.event-onsetinput": "Définir à partir de l'entrée", - "shapes.event-onclose": "proche", - "shapes.event-onrunscript": "Script de lancement", - "shapes.event-setvalue-set": "Positionner", - "shapes.event-setvalue-add": "augmenter", - "shapes.event-setvalue-remove": "diminuer", + "shapes.event-onclose": "Fermer", + "shapes.event-onopen": "Ouvrir", + "shapes.event-onrunscript": "Lancer le script", + "shapes.event-setvalue-set": "définir", + "shapes.event-setvalue-add": "incrémenter", + "shapes.event-setvalue-remove": "décrémenter", + "shapes.event-address-link": "Lien", + "shapes.event-address-resource": "Ressource", + "shapes.event-onmonitor": "Moniteur", + "shapes.event-onViewToPanel": "Définir la vue sur le panneau", + "shapes.event-onLoad": "Au chargement", + "shapes.event-relativefrom-window": "Fenêtre", + "shapes.event-relativefrom-mouse": "Souris", + + "pipe.property-title": "Paramètres du tuyau", + "pipe.property-data": "Données", + "pipe.property-style": "Style", "pipe.property-props": "Propriété", "pipe.property-border-width": "Largeur de la bordure", "pipe.property-border-color": "Couleur de la bordure", @@ -640,8 +777,13 @@ "pipe.property-pipe-color": "Couleur de tuyau", "pipe.property-content-width": "Largeur de contenu", "pipe.property-content-color": "Couleur de contenu", - "pipe.property-content-space": "Tableau de contenu", + "pipe.property-content-space": "Tiret du contenu", "pipe.action-hide-content": "Cacher le contenu", + "pipe.property-style-animation": "Image d'animation", + "pipe.property-style-animation-image": "Sélectionner l'image (SVG)", + "pipe.property-style-animation-count": "Nombre d'images", + "pipe.property-style-animation-delay": "Délai d'animation (msec.)", + "slider.property-props": "Propriété", "slider.property-horizontal": "Horizontale", "slider.property-vertical": "Verticale", @@ -662,7 +804,7 @@ "slider.property-divisions": "Divisions (%)", "slider.property-divisions-height": "Hauteur", "slider.property-divisions-width": "Largeur", - "slider.property-font-size": "Fonte Echelle", + "slider.property-font-size": "Police de l'échelle", "slider.property-tooltip": "Info-bulle", "slider.property-tooltip-none": "Aucune", "slider.property-tooltip-hide": "Cacher", @@ -670,36 +812,40 @@ "slider.property-tooltip-decimals": "Décimales", "slider.property-tooltip-background": "Arrière plan", "slider.property-tooltip-color": "Couleur de texte", - "slider.property-tooltip-font-size": "FONT DE TOYAL", - "slider.property-slider-color": "Connecter la couleur", + "slider.property-tooltip-font-size": "Taille de police", + "slider.property-slider-color": "Couleur curseur", "slider.property-slider-background": "Couleur de base", "slider.property-slider-handle": "Couleur du pointeur", - "html-switch.property-off-value": "Valeur hors valeur", - "html-switch.property-on-value": "En valeur", - "html-switch.property-on-background": "En arrière-plan", - "html-switch.property-off-background": "Hors de fond", - "html-switch.property-off-text": "Hors texte", - "html-switch.property-on-text": "Sur le texte", - "html-switch.property-on-slider-color": "Sur la couleur du curseur", - "html-switch.property-off-slider-color": "Couleur hors curseur", - "html-switch.property-radius": "Coin rayon", - "html-switch.property-off-text-color": "Couleur du texte hors", - "html-switch.property-on-text-color": "Sur la couleur du texte", + + "html-switch.property-off-value": "Valeur HORS", + "html-switch.property-on-value": "Valeur EN", + "html-switch.property-on-background": "Arrière-plan EN", + "html-switch.property-off-background": "Arrière-plan HORS", + "html-switch.property-off-text": "Texte HORS", + "html-switch.property-on-text": "Texte EN", + "html-switch.property-on-slider-color": "Couleur curseur EN", + "html-switch.property-off-slider-color": "Couleur curseur HORS", + "html-switch.property-radius": "Rayon des coins", + "html-switch.property-off-text-color": "Couleur texte HORS", + "html-switch.property-on-text-color": "Couleur texte EN", "html-switch.property-font-size": "Taille de police", "html-switch.property-font": "Police de caractère", + "html-input.min": "Min", "html-input.max": "Max", - "html-input.out-of-range": "Valeur hors de portée", + "html-input.out-of-range": "Valeur hors plage", "html-input.not-a-number": "La valeur n'est pas un nombre", + "editor.tools-zoomlevel-title": "Le niveau de zoom", - "editor.tools-zoomlevel-fitcanvas": "Ajustement sur cadrillage", + "editor.tools-zoomlevel-fitcanvas": "Ajustement au canvas", "editor.tools-zoomlevel-fitsection": "Ajustement à la sélection", - "editor.tools-zoomlevel-fitcontent": "Ajustez à tous les contenus", + "editor.tools-zoomlevel-fitcontent": "Ajustez à tout le contenu", "editor.tools-fillcolor-title": "Changer la couleur de remplissage", - "editor.tools-strokecolor-title": "Changer la couleur de la course", - "editor.tools-palettecolor-title": "Cliquez pour modifier la couleur de remplissage, cliquez sur un clic pour changer la couleur de la course", - "device.list-title": "Paramètres des appareils", - "device.list-device": "Dispositif", + "editor.tools-strokecolor-title": "Changer la couleur du contour", + "editor.tools-palettecolor-title": "Cliquez pour modifier la couleur de remplissage, shift+clic pour changer la couleur du contour", + + "device.list-title": "Paramètres de connexions des appareils", + "device.list-device": "Appareils", "device.list-filter": "Filtre", "device.list-name": "Nom", "device.list-address": "Adresse", @@ -707,20 +853,30 @@ "device.list-min": "Min", "device.list-max": "Max", "device.list-value": "Valeur", - "device.list-edit": "Modifier la balise", - "device.list-add": "Ajouter une étiquette", - "device.list-remove": "Enlever l'étiquette", - "device.list-remove-all": "Supprimer toutes les balises", - "device.list-options": "Options de balises", - "devices.export": "Dispositifs d'exportation", + "device.list-timestamp": "Horodatage", + "device.list-description": "Description", + "device.list-edit": "Modifier le tag", + "device.list-add": "Ajouter un tag", + "device.list-remove": "Enlever le tag", + "device.list-remove-all": "Supprimer tous les tags", + "device.list-options": "Options du tag", + "device.list-clipboard": "Copier le Tag dans le presse-papiers", + "device.list-direction": "Direction", + + "devices.export": "Exporter les appareils", "devices.export-json": "Json", "devices.export-csv": "CSV", "devices.import": "Importer des appareils", + "device.manage-templates": "Gérer les modèles", + "device.save-tags-to-template": "Enregistrer les tags dans un modèle", + "device.add-tags-from-template": "Ajouter des tags à partir du modèle", + "device.tags-template-name-title": "Nom du modèle de tags", + "devices.import-template": "Importer des appareils avec le modèle", "device.property-client": "Propriété de l'appareil", "device.property-server": "Propriété du serveur FUXA", "device.property-name": "Nom", "device.property-type": "Type", - "device.property-polling": "Appel", + "device.property-polling": "Freq. d'interrogation", "device.property-enable": "Activer", "device.property-subscribe": "S'abonner", "device.property-address": "Adresse (ip ou opc.tcp: // [serveur]: [port])", @@ -729,42 +885,73 @@ "device.property-device-port": "Appareil IP et port (127.0.0.1:47808)", "device.property-address-port": "IP et port d'esclaves (127.0.0.1:502)", "device.property-security": "Protocole de sécurité et de cryptage", - "device.property-tags": "Modifier les balises de périphérique", + "device.property-tags": "Modifier les balises de l'appareil", "device.property-edit": "Modifier la propriété de l'appareil", - "device.property-remove": "Enlevez l'appareil", + "device.property-remove": "Supprimer l'appareil", "device.property-add": "Ajouter un appareil", "device.not-property-security": "Sans sécurité et cryptage", + "device.property-connection-options": "Options de connexion", "device.property-port": "Port", "device.property-slave-id": "Id esclave", "device.property-routing": "Routage", "device.property-tockenized": "Fragmenté", - "device.property-rack": "Étagère", - "device.property-slot": "Insérer", + "device.property-rack": "Rack", + "device.property-slot": "Slot", "device.property-serialport": "Port série", "device.property-baudrate": "Débit", "device.property-databits": "Bits de données", "device.property-stopbits": "Bits d'arrêt", "device.property-parity": "Parité", + "device.property-force-fc16": "Utiliser uniquement Write Multiple Registers", + "device.property-delay": "Delais des trames (msec.)", "device.property-method": "Méthode", "device.property-format": "Format", "device.property-internal": "Frontend uniquement", "device.property-url": "URL (http: // [serveur]: [port])", "device.property-webapi-result": "Résultat de la demande", + "device.property-ads-target": "Target AmsNetId (e.g. 192.168.1.10.1.1:851)", + "device.property-ads-local": "Local AmsNetId (e.g. 192.168.1.10.1.1:32750)", + "device.property-ads-router": "Router Address(e.g. 192.168.1.120:48898)", "device.not-webapi-result": "Configurer le résultat WebAPI", "device.property-show": "Afficher la propriété de l'appareil", "device.property-hide": "Masquer la propriété de l'appareil", + "device.property-interface-address": "Interface et Port", + "device.property-interface-address-ph": "127.0.0.1:47808", + "device.property-broadcast-address": "Broadcast", + "device.property-broadcast-address-ph": "127.0.0.255", + "device.property-adpu-timeout": "Délai d'attente adpu", + "device.property-adpu-timeout-ph": "6000", + "device.property-certificate-section": "Certificat TLS", + "device.property-certificate": "Certificat", + "device.property-certificate-key": "Clé privée", + "device.property-certificate-ca": "Certificat CA", "device.security-none": "Aucune", - "device.security-sign": "Pancarte", + "device.security-sign": "Signe", "device.security-signandencrypt": "Signe et crypte", - "device.browsetopics-property-title": "Sujets de courtier pour vous abonner et publier", + "device.webapi-property-title": "Propriété WebAPI", + "device.webapi-property-gettags": "URL GET Tags", + "device.webapi-property-posttags": "URL POST Tags", + "device.webapi-property-loadtags": "Charger les tags", + "device.property-dsn": "Nom de la source de données (DSN=Nom de la base de données)", + "device.property-odbc-result": "Résultat des tables trouvées", + "device.not-odbc-result": "Résultat des tables de la base de données", + "device.add-device-templates-title": "Modèles d'appareil", + "device.add-tags-templates-title": "Modèles de tags", + "device.add-from-template": "Ajouter un appareil à partir du modèle", + "device.manage-templates-title": "Supprimer les modèles", + "device.template-device": "Nom du modèle", + "device.template-tags": "Nom du modèle", + "device.property-socket-reuse": "Réutilisation de socket", + + "device.browsetopics-property-title": "Topics du broker à publier et souscrire", "device.browsetopics-property-sub": "S'abonner", "device.browsetopics-property-pub": "Publier", - "device.discovery-topics": "Sujets du navigateur sur courtier", - "device.topic-selected": "Sujet sélectionné", + "device.discovery-topics": "Explorer les topics du broker", + "device.topic-selected": "Topic sélectionné", "device.topic-raw": "brute", "device.topic-json": "json", - "device.add-topics": "Publier mes sujets sur le broker", - "device.topic-publish-name": "Nom du sujet", + "device.add-topics": "Publier mes topics sur le broker", + "device.topic-publish-name": "Nom du topic", "device.topic-publish-path": "Chemin", "device.topic-publish": "Publier", "device.topic-subscribe": "S'abonner", @@ -778,19 +965,20 @@ "device.topic-publish-value": "Chemin", "device.topic-publish-static": "Évaluer", "device.topic-publish-content": "Message", - "device.topic-type-tag": "Étiquette", + "device.topic-type-tag": "Labels", "device.topic-type-timestamp": "Horodatage", "device.topic-type-value": "Valeur (du sujet)", "device.topic-type-static": "Statique", "device.topic-name-exist": "Le nom du sujet '{{value}}' existe déjà", "device.topic-subs-address-exist": "Le sujet où s'abonner avec l'adresse '{{value}}' existe déjà", "device.topic-pubs-address-exist": "Le sujet où publier avec l'adresse '{{value}}' existe déjà", + "device.property-mqtt-address": "Adresse (mqtt: // [serveur]: [port])", "device.tag-property-title": "Propriété TAG", "device.browsetag-property-title": "Parcourir les balises dans le serveur", - "device.tag-property-device": "Dispositif", - "device.tag-property-name": "Tagname", - "device.tag-property-register": "S'inscrire", + "device.tag-property-device": "Appareil", + "device.tag-property-name": "Nom du tag", + "device.tag-property-register": "Type de Registre", "device.tag-property-type": "Type", "device.tag-property-address": "Adresse (Ex. DB5.DBB3 DB4.DBX2.0 MB7)", "device.tag-property-address-sample": "Adresse", @@ -803,30 +991,85 @@ "device.tag-property-unit": "Unité", "device.tag-property-digits": "Décimale", "device.tag-property-initvalue": "Valeur d'initialisation", + "device.tag-property-description": "Description", + "device.tag-property-direction": "Direction", + "device.tag-property-edge": "Front", + "device.tag-property-gpio": "Numéro GPIO", + + "device.tag-array-id": "ID de tableau:", - "device.tag-array-value": "Évaluer:", - "device-tag-dialog-title": "Sélection de balises", - "device.tag-options-title": "Options de balises", + "device.tag-array-value": "Valeur:", + "device-tag-dialog-title": "Sélection du tag", + + "device.tag-options-title": "Options du tag", "device.tag-daq-enabled": "Enregistrement activé", - "device.tag-daq-changed": "Enregistrer la valeur si elle est modifiée", - "device.tag-daq-interval": "Enregistrer l'intervalle de valeur (sec.)", + "device.tag-daq-changed": "Enregistrer si modifiée", + "device.tag-daq-interval": "Intervalle d'enregistrement de la valeur (sec.)", + "device.tag-daq-restored": "À restaurer", + + "device.tag-format": "Format du nombre (2 = #.##)", + "device.tag-deadband": "Zone morte", + "device.tag-scale": "Mode mise à l'échelle / Conversion", + "device.tag-scale-mode-undefined": "Pas de mise à l'échelle", + "device.tag-scale-mode-undefined-tooltip": "Valeur du tag", + "device.tag-scale-mode-linear": "Linéraire: ΔS * (Valeur - RL) / ΔR + SL", + "device.tag-scale-mode-linear-tooltip": " ΔS = (Scaled High - Scaled Low)\nΔR = (Raw High - Raw Low)\nRL = Raw Low\nSL = Scaled Low", + "device.tag-scale-mode-script": "Script (Lecture/Écriture)", + "device.tag-raw-low": "Brut Bas", + "device.tag-raw-high": "Brut Haut", + "device.tag-scaled-low": "Échelle Bas", + "device.tag-scaled-high": "Échelle Haut", + "device.tag-convert-datetime": "Millisecondes au format Date et Heure", + "device.tag-convert-datetime-tooltip": "Exemple du format : 'YYYY-MM-DD HH:mm:ss' pour 2023-09-14 08:45:10", + "device.tag-convert-datetime-format": "Format date et heure (YYYY-MM-DD HH:mm:ss)", + "device.tag-convert-ticktime": "Millisecondes au format Heure (Restant ou Durée)", + "device.tag-convert-ticktime-tooltip": "Exemple du format : 'HH:mm:ss' pour 56:45:10", + "device.tag-convert-ticktime-format": "Format Heure (HH:mm:ss)", + "device.tag-scale-read-script": "Script de lecture de mise à l'échelle", + "device.tag-scale-read-script-tooltip": "Script pour transformer la valeur reçue du client", + "device.tag-scale-read-script-params": "Entrez les valeurs des paramètres du script de lecture", + "device.tag-scale-write-script": "Script d'écriture de mise à l'échelle", + "device.tag-scale-write-script-tooltip": "Script pour transformer la valeur avant de l'écrire dans le client", + "device.tag-scale-write-script-params": "Entrez les valeurs des paramètres du script d'écriture", + "device.tag-scale-script-params-tooltip": "Tableau de paramètres formaté en JSON avec les valeurs à passer au script", + + "device.edit-placeholder-titel": "Modifier la variable intermédiaire", + "device.connect-ok": "Connecté", "device.connect-error": "Erreur", "device.connect-failed": "Echec", "device.connect-off": "Eteint", "device.connect-busy": "Occupé", + "devices.mode-map": "Carte des appareils", "devices.mode-list": "Liste des appareils", "devices.list-name": "Nom", "devices.list-address": "Adresse", "devices.list-type": "Type", - "devices.list-polling": "Vote", + "devices.list-polling": "Freq. d'interrogation", "devices.list-enabled": "Activé", "devices.list-status": "Statut", + "users.list-title": "Paramètres des utilisateurs", "users.list-name": "Nom d'utilisateur", "users.list-fullname": "Nom et prénom", "users.list-groups": "Groupes", + "users.list-roles": "Rôles", + "users.list-start": "Vue de démarrage", + + "roles.list-title": "Paramètres des rôles", + "roles.list-index": "Index", + "roles.list-name": "Nom", + "roles.list-description": "Description", + + "user-role-edit-title": "Paramètres du rôle", + "user-role-edit-name": "Nom", + "user-role-edit-index": "Index", + "user-role-edit-description": "Description", + + "events-history.list-title": "Historique des événements", + "events-history.filter-daterange": "Filtre plage de dates", + "gauges.property-props": "Propriété", "gauges.property-events": "Événements", "gauges.property-title": "Propriété", @@ -838,84 +1081,120 @@ "gauges.property-event-type": "Type", "gauges.property-event-action": "Action", "gauges.property-event-destination": "Destination", + "gauges.property-event-destination-relative-from": "Relatif à", + "gauges.property-event-destination-panel": "Panneau", + "gauges.property-event-destination-hide-close": "Masquer Fermer", + "gauges.property-event-destination-target-device": "Appareil Cible", + "gauges.property-event-newtab": "Nouvel Onglet", + "gauges.property-event-single-card": "Carte Unique", "gauges.property-event-value": "Valeur", "gauges.property-event-function": "Fonction", "gauges.property-event-input": "Entrée (entrée uniquement avec le nom)", + "gauges.property-event-address-type": "Type", "gauges.property-event-address": "Lien", + "gauges.property-event-resource": "Ressource", "gauges.property-event-width": "Largeur", "gauges.property-event-height": "Hauteur", "gauges.property-event-scale": "Échelle", "gauges.property-event-script": "Scénario", "gauges.property-event-script-param-name": "Paramètre", "gauges.property-event-script-param-value": "Évaluer", - "gauges.property-head-device": "Dispositif", + "gauges.property-event-script-param-input-value": "laisser vide pour envoyer la valeur de l'entrée", + "gauges.property-head-device": "Appareil", "gauges.property-head-variable": "Variable", - "gauges.property-variable-value": "Évaluer", + "gauges.property-variable-value": "Valeur", "gauges.property-head-alarm": "Alarme", "gauges.property-head-color": "Couleur", "gauges.property-head-mapvariable": "Variable de contexte", "gauges.property-head-tomapvariable": "Définir la variable de contexte", - "gauges.property-head-todevice": "Dispositifs Variables", - "gauges.property-head-value": "Évaluer", + "gauges.property-head-todevice": "Appareils Variables", + "gauges.property-head-value": "Valeur", "gauges.property-input-min": "Min", "gauges.property-input-max": "Max", "gauges.property-input-color": "Remplir", - "gauges.property-input-stroke": "Accident vasculaire cérébral", - "gauges.property-input-value": "Évaluer", - "gauges.property-input-label": "Étiquette", + "gauges.property-input-stroke": "Contour", + "gauges.property-input-value": "Valeur", + "gauges.property-input-label": "Label", "gauges.property-input-unit": "Unité", + "gauges.property-input-type": "Type d'entrée", + "gauges.property-input-type-number": "Nombre", + "gauges.property-input-type-text": "Texte", + "gauges.property-input-type-date": "Date", + "gauges.property-input-type-time": "Heure", + "gauges.property-input-type-datetime": "Date et Heure", + "gauges.property-input-time-format": "Format de l'heure", + "gauges.property-input-time-format-normal": "HH:mm", + "gauges.property-input-time-format-seconds": "HH:mm:ss", + "gauges.property-input-time-format-milliseconds": "HH:mm:ss:fff", + "gauges.property-input-milliseconds": "Conversion en millisecondes", + "gauges.property-input-convertion": "Conversion", + "gauges.property-input-convertion-milliseconds": "Millisecondes", + "gauges.property-input-convertion-string": "Chaîne", + "gauges.property-update-enabled": "Activer la mise à jour", - "gauges.property-numeric-enabled": "Seul nombre", - "gauges.property-format-digits": "Chiffres de format", + "gauges.property-update-esc": "Mise à jour ESC", + "gauges.property-input-esc-action": "Action lors de la sortie", + "gauges.property-action-esc-update": "Mettre à jour (Actualiser)", + "gauges.property-action-esc-enter": "Confirmer (Entrée)", + "gauges.property-select-content-on-click": "Sélectionner le contenu au clic", + "gauges.property-numeric-enabled": "Nombre seulement", + "gauges.property-format-digits": "Format du nombre", "gauges.property-actions": "Actions", "gauges.property-action-type": "Type", "gauges.property-action-param": "ID d'action", "gauges.property-action-minAngle": "Angle min", "gauges.property-action-maxAngle": "Angle maximal", + "gauges.property-action-toX" : "À la position X", + "gauges.property-action-toY" : "À la position Y", + "gauges.property-action-duration" : "Durée", "gauges.property-events-mapping-from": "Variable de contexte", - "gauges.property-map-variable": "Ajouter une variable de contexte pour lier", + "gauges.property-map-variable": "Ajouter une variable de contexte pour la lier", "gauges.property-head-remove-mapvariable": "Retirez la liaison", "gauges.property-tooltip-add-event": "Ajouter un évènement", "gauges.property-interval-msec": "Intervalle (msec.)", - "gauges.property-tag-label": "Étiquette", - "gauges.property-tag-internal-title": "Définir une étiquette de périphérique interne", + "gauges.property-tag-label": "Tag", + "gauges.property-tag-internal-title": "Définir une variable intermédiaire (ou un tag de périphérique interne)", "gauges.property-input-range": "Plage d'entrée autorisée", + "gauges.property-language-text": "Texte ou @TextID", + "bag.property-ticks": "Tic", "bag.property-divisions": "Divisions", "bag.property-subdivisions": "Subdivisions", - "bag.property-divisions-length": "Longueur des divisions", - "bag.property-subdivisions-length": "Longueur de subdivisions", - "bag.property-divisions-width": "Largeur des divisions", - "bag.property-subdivisions-width": "Largeur des subdivisions", - "bag.property-divisions-color": "Divisions Couleur", - "bag.property-subdivisions-color": "Couleur des subdivisions", - "bag.property-divisionfont-size": "Divisions Taille de la police", - "bag.property-divisionfont-color": "Divisions Couleur de police", - "bag.property-divisions-labels": "Divisions étiquettes (Ex. 10; 20; ...)", + "bag.property-divisions-length": "Longueur divisions", + "bag.property-subdivisions-length": "Longueur subdivisions", + "bag.property-divisions-width": "Largeur divisions", + "bag.property-subdivisions-width": "Largeur subdivisions", + "bag.property-divisions-color": "Couleur divisions", + "bag.property-subdivisions-color": "Couleur subdivisions", + "bag.property-divisionfont-size": "Taille de la police subdivisions", + "bag.property-divisionfont-color": "Couleur de police subdivisions", + "bag.property-divisions-labels": "Label divisions (Ex. 10; 20; ...)", "bag.property-current-value": "Valeur actuelle", "bag.property-min": "Min", "bag.property-max": "Max", - "bag.property-bar-width": "Largeur du bar", - "bag.property-animation-speed": "La vitesse d'animation", + "bag.property-bar-width": "Largeur de la barre", + "bag.property-animation-speed": "Vitesse d'animation", "bag.property-angle": "Angle", "bag.property-radius": "Rayon", "bag.property-font": "Police de caractère", "bag.property-font-size": "Taille de police", - "bag.property-textfield-position": "Position de Textfield", + "bag.property-textfield-position": "Position de Champ de texte", "bag.property-pointer-length": "Longueur du pointeur", - "bag.property-pointer-stroke": "Coup de pointeur", + "bag.property-pointer-stroke": "Contour du pointeur", "bag.property-pointer-color": "Couleur du pointeur", - "bag.property-color-start": "Démarrer de la couleur", - "bag.property-color-stop": "Arrêt de couleur", + "bag.property-color-start": "Couleur de début", + "bag.property-color-stop": "Couleur de fin", "bag.property-background": "Arrière plan", - "bag.property-format-digits": "Chiffres de format", + "bag.property-format-digits": "Format du nombre", "bag.property-zones": "Zones", "bag.property-color": "Couleur", + "bag.property-fill": "Remplissage", + "alarms.list-title": "Paramètres d'alarmes", "alarms.list-name": "Nom", "alarms.list-device": "Appareil / variable", "alarms.list-highhigh": "Haut haut", - "alarms.list-high": "Haute", + "alarms.list-high": "Haut", "alarms.list-low": "Bas", "alarms.list-info": "Message", "alarms.list-actions": "Actions", @@ -923,62 +1202,71 @@ "alarm.property-name": "Nom", "alarm.property-permission": "Autorisation", "alarm.property-highhigh": "Haut haut", - "alarm.property-high": "Haute", + "alarm.property-high": "Haut", "alarm.property-low": "Bas", "alarm.property-info": "Message", "alarm.property-action": "Actions", "alarm.property-enabled": "Activé", + "alarm.property-save-event": "Événements", "alarm.property-min": "Min", "alarm.property-max": "Max", "alarm.property-timedelay": "Retard (secondes)", - "alarm.property-checkdelay": "Vérifiez Interall (secondes)", + "alarm.property-checkdelay": "Intervall de vérification (secondes)", "alarm.property-type": "Type", - "alarm.property-ackmode": "Mode ACK", + "alarm.property-ackmode": "Mode d'acquittement", "alarm.property-text": "Texte", "alarm.property-group": "Groupe", "alarm.ack-float": "Flottante", - "alarm.ack-active": "ACK par alarme active autorisée", - "alarm.ack-passive": "Ack uniquement par alarme passive", + "alarm.ack-active": "Ack par alarme active autorisée", + "alarm.ack-passive": "Ack uniquement si alarme passive", "alarms.view-title": "Alarmes", - "alarms.history-title": "Alarmes d'historique", + "alarms.history-title": "Historique d'alarmes", "alarms.view-ontime": "Date / heure", "alarms.view-text": "Texte", "alarms.view-group": "Groupe", "alarms.view-status": "Statut", "alarms.view-type": "Priorité", - "alarms.view-offtime": "Date / heure de sortie", - "alarms.view-acktime": "ACK Date / Heure", - "alarms.view-userack": "Utilisateur ACK", + "alarms.view-offtime": "Date / heure de fin", + "alarms.view-acktime": "Acquittement Date / Heure", + "alarms.view-userack": "Acquittement par", + "alarms.view-ack": "Acquitter", + "alarms.view-ack-all-alarms": "Acquitter toutes les Alarmes", "alarm.status-active": "Active", "alarm.status-passive": "Passive", - "alarm.status-active-ack": "Actif", + "alarm.status-active-ack": "Active (Acquittée)", "alarms.show-current": "Alarmes", - "alarms.show-history": "Alarmes d'historique", + "alarms.show-history": "Historique d'alarmes", "alarm.action-popup": "Montrer la popup", - "alarm.action-onsetview": "Voir la vue", + "alarm.action-onsetview": "Définir la vue", "alarm.action-onsetvalue": "Valeur définie", + "alarm.action-onRunScript": "Exécuter le script", + "alarm.action-toastMessage": "Afficher le message", "alarm.action-sendMsg": "Envoyer le message", "alarm.property-action-type": "Type d'action", - "alarm.property-action-value": "Valeur à régler", - "alarm.property-action-destination": "Voir à montrer", + "alarm.property-action-value": "Valeur à définir", + "alarm.property-action-destination": "Vue à montrer", + "alarm.property-action-toastMessage": "Message à afficher", + "alarm.property-action-toastType": "Type", + "notifications.list-title": "Paramètres de notifications", "notifications.list-name": "Nom", "notifications.list-receiver": "Récepteurs", - "notifications.list-delay": "Retard", + "notifications.list-delay": "Délai", "notifications.list-interval": "Intervalle", "notifications.list-type": "Type", "notifications.list-enabled": "Activé", "notifications.list-subscriptions": "Abonnements", "notification.property-title": "Notification", "notification.property-name": "Nom", - "notification.property-receiver": "Récepteurs (adresse courante ';')", + "notification.property-receiver": "Récepteurs: Adresse (Mail) ';' / WebApi (Telegram https://api.telegram.org/bot...${content})", "notification.property-type": "Type", - "notification.property-delay": "Retard (min.)", + "notification.property-delay": "Délai (min.)", "notification.property-interval": "Intervalle (min.)", - "notification.property-enabled": "Lancée", + "notification.property-enabled": "Activé", "notification.property-priority": "Priorité", "notification.type-alarm": "Alarmes", - "notification.type-trigger": "Gâchette", + "notification.type-trigger": "Déclencheur", + "scripts.list-title": "Paramètres des scripts", "scripts.list-name": "Nom", "scripts.list-type": "Type", @@ -986,44 +1274,130 @@ "scripts.list-params": "Paramètres", "scripts.list-scheduling": "Planification / intervalle", "scripts.list-permission": "Autorisation", - "scripts.list-options": "Options de script", + "scripts.list-options": "Options du script", + "script.permission-title": "Autorisation", - "script.permission-label": "(void = plein pour tout le monde)", + "script.permission-label": "(void = Libre pour tout le monde)", "script.permission-enabled": "Activé", + + "script.create-title": "Créer un script", + "script.mode": "Exécuter le mode", "script.mode-title": "Exécuter le mode", - "script.mode-label": "(Par défaut: serveur)", - "script.property-title": "Scénario", + "script.mode-label": "Exécuter le mode", + "script.mode-CLIENT": "Client (Exécuter dans le navigateur)", + "script.mode-SERVER": "Serveur (Exécuter sur le serveur)", + + "script.property-title": "Script", "script.property-systems": "Fonctions du système", + "script.property-templates": "Modeles", "script.property-test": "Test", "script.property-test-params": "Paramètres de fonction", "script.property-test-console": "Console", - "script.property-test-tag": "Set balise", + "script.property-test-tag": "Définir le tag", "script.property-test-run": "Test d'exécution", "script.property-editname": "Modifier le nom du script", - "script.property-addfnc-param": "Ajouter le paramètre de script", - "script.param-title": "Paramètre de script", + "script.property-name": "Nom", + "script.property-addfnc-param": "Ajouter un paramètre au script", + "script.property-async-function": "Fonction asynchrone", + "script.param-title": "Paramètre du script", "script.param-name": "Nom", "script.param-type": "Type", "script.paramtype": "-", - "script.paramtype-tagid": "Étiquette", - "script.paramtype-value": "Valeur (nombre ou chaîne)", + "script.paramtype-tagid": "ID du tag", + "script.paramtype-value": "Valeur (nombre/chaîne/objet)", + "script.paramtype-chart": "Lignes de tableau (array)", "script.param-name-exist": "Le nom du paramètre existe déjà!", - "script.sys-fnc-settag-text": "$ Settag (tagid, valeur)", - "script.sys-fnc-settag-tooltip": "Fonction système pour définir la valeur de la balise: $ settag (tagid comme chaîne, valeur en tant que chaîne ou numéro)", - "script.sys-fnc-gettag-text": "$ gettag (tagid)", - "script.sys-fnc-gettag-tooltip": "Fonction système pour obtenir la valeur de balise: $ getTag (tagid as String) Retour Valeur en tant que chaîne ou numéro", + "script.sys-fnc-settag-text": "$setTag (TagID, valeur)", + "script.sys-fnc-settag-tooltip": "Fonction système pour définir la valeur du Tag: $setTag (TagID comme chaîne, valeur en tant que chaîne ou nombre)", + "script.sys-fnc-gettag-text": "$getTag (TagID)", + "script.sys-fnc-gettag-tooltip": "Fonction système pour obtenir la valeur du Tag: $getTag (TagID as String) Retour Valeur en tant que chaîne ou numéro", "script.scheduling-title": "Planification de script", - "script.scheduling-interval": "Intervalle en secondes", - "script.sys-fnc-setview-text": "$ setView (nom de vue)", - "script.sys-fnc-setview-tooltip": "Fonction système à définir la vue sur le client: $ setView (nom de vue en tant que chaîne)", - "reports.list-title": "Rapports Paramètres", + "script.scheduling-type": "Type", + "script.scheduling-interval": "Intervalle de la boucle", + "script.scheduling-start": "Seulement au démarrage", + "script.scheduling-add-item": "Ajouter un planificateur", + "script.scheduling-scheduling": "Planification", + "script.scheduling-weekly": "Hebdomadaire", + "script.scheduling-date": "Date", + "script.scheduling-time": "Heure", + "script.scheduling-hour": "Heure", + "script.scheduling-minute": "Minute", + "script.interval": "Intervalle (secondes)", + "script.delay": "Délai (secondes)", + "script.sys-fnc-setview-text": "$setView (nom de vue)", + "script.sys-fnc-setview-tooltip": "Fonction système pour définir la vue sur le client: $setView (nom de vue en tant que chaîne)", + "script.sys-fnc-setview-params": "'Nom de la vue'", + "script.sys-fnc-opencard-text": "$openCard (Nom de la vue)", + "script.sys-fnc-opencard-tooltip": "Fonction système pour ouvrir la carte sur le client: $openCard (nom de vue en tant que chaîne, Options en tant que dict {gauche, haut})", + "script.sys-fnc-opencard-params": "'Nom de la vue'", + "script.sys-fnc-enableDevice-text": "$enableDevice (Nom de l'appareil, activer True/False)", + "script.sys-fnc-enableDevice-tooltip": "Fonction système pour activer la connexion de l'appareil: $enableDevice (nom de l'appareil en tant que chaîne, activer en tant que booléen)", + "script.sys-fnc-enableDevice-params": "'Nom de l'appareil', true", + "script.sys-fnc-getDevice-text": "$getDevice (Nom de l'appareil, interface True/False)", + "script.sys-fnc-getDevice-tooltip": "Fonction système pour obtenir l'objet appareil: $getDevice (Nom de l'appareil en tant que chaîne, obtenir l'interface de communication en tant que booléen)", + "script.sys-fnc-getDevice-params": "'Nom de l'appareil', true", + "script.sys-fnc-setAdapterToDevice-text": "$setAdapterToDevice(Nom de l'adaptateur, Nom de l'appareil)", + "script.sys-fnc-setAdapterToDevice-tooltip": "Fonction système pour lier l'adaptateur (appareil interne) à un appareil: $setAdapterToDevice (Nom de l'adaptateur en tant que chaîne, Nom de l'appareil en tant que chaîne)", + "script.sys-fnc-setAdapterToDevice-params": "'Nom de l'adaptateur', 'Nom de l'appareil'", + "script.sys-fnc-resolveAdapterTagId-text": "$resolveAdapterTagId(TagID)", + "script.sys-fnc-resolveAdapterTagId-tooltip": "Fonction système pour obtenir l'ID de tag de l'appareil lié à l'adaptateur (appareil interne): $resolveAdapterTagId (TagID en tant que chaîne)", + "script.sys-fnc-resolveAdapterTagId-params": "'TagID de l'adaptateur'", + "script.sys-fnc-getTagId-text": "$getTagId (Nom du Tag, [Nom de l'appareil])", + "script.sys-fnc-getTagId-tooltip": "Fonction système pour obtenir l'ID de tag: $getTagId (Nom du Tag en tant que chaîne, [Nom de l'appareil en tant que chaîne facultative])", + "script.sys-fnc-getTagId-params": "'Nom du Tag', ", + "script.sys-fnc-getTagDaqSettings-text": "$getTagDaqSettings (TagID)", + "script.sys-fnc-getTagDaqSettings-tooltip": "Fonction système pour obtenir les paramètres DAQ de la balise: $getTagDaqSettings (TagID en tant que chaîne)", + "script.sys-fnc-getTagDaqSettings-params": "'TagID'", + "script.sys-fnc-setTagDaqSettings-text": "$setTagDaqSettings (TagID, DaqSettings)", + "script.sys-fnc-setTagDaqSettings-tooltip": "Fonction système pour définir les paramètres DAQ de la balise: $setTagDaqSettings (TagID en tant que chaîne, DaqSettings en tant qu'objet {restauré: booléen, activé: booléen, changé: booléen, intervalle: nombre, dernierDaqSauvegardé: nombre} )", + "script.sys-fnc-setTagDaqSettings-params": "'TagID', 'DaqSettings'", + "script.sys-fnc-invokeObject-text": "$invokeObject (Nom de l'objet, Nom de la fonction, [Paramètre])", + "script.sys-fnc-invokeObject-tooltip": "Fonction système pour appeler la fonction d'objet: $invokeObject (Nom de l'objet en tant que chaîne, Nom de la fonction en tant que chaîne, [paramètre])", + "script.sys-fnc-invokeObject-params": "'Nom de l'objet', 'Nom de la fonction', ", + "script.sys-fnc-runServerScript-text": "$runServerScript (Nom du script, [Paramètre])", + "script.sys-fnc-runServerScript-tooltip": "Fonction client pour appeler la fonction de script serveur: $runServerScript (Nom du script en tant que chaîne, [paramètre])", + "script.sys-fnc-runServerScript-params": "'Nom du script serveur', ", + "script.sys-fnc-getDeviceProperty-text": "$getDeviceProperty(Nom de l'appareil)", + "script.sys-fnc-getDeviceProperty-tooltip": "Fonction système pour obtenir la propriété de l'appareil: $getDeviceProperty(Nom de l'appareil en tant que chaîne)", + "script.sys-fnc-getDeviceProperty-params": "'Nom de l'appareil'", + "script.sys-fnc-setDeviceProperty-text": "$setDeviceProperty(Nom de l'appareil, propriété)", + "script.sys-fnc-setDeviceProperty-tooltip": "Fonction système pour définir la propriété de l'appareil: $setDeviceProperty(Nom de l'appareil en tant que chaîne, Propriété en tant qu'objet {adresse, port, ...} )", + "script.sys-fnc-setDeviceProperty-params": "'Nom de l'appareil', 'Propriété'", + "script.sys-fnc-getHistoricalTag-text": "$getHistoricalTags(TagIds array, De msec., à msec.)", + "script.sys-fnc-getHistoricalTag-tooltip":"Obtenir les tags d'historiques par plage de millisecondes: $getHistoricalTags([TagIds] en tant que tableau, à partir en tant que nombre, jusqu'à en tant que nombre)", + "script.sys-fnc-getHistoricalTag-params":"'Tag Ids array', 'De msec.', 'à msec.'", + "script.sys-fnc-sendMessage-text": "$sendMessage(adresse, sujet, message)", + "script.sys-fnc-sendMessage-tooltip": "Fonction système pour envoyer un message (Mail): $sendMessage(adresse en tant que chaîne, sujet en tant que chaîne, message en tant que chaîne)", + "script.sys-fnc-sendMessage-params": "'adresse', 'sujet', 'message'", + "script.sys-fnc-getAlarms-text": "$getAlarms()", + "script.sys-fnc-getAlarms-tooltip": "Fonction système pour obtenir la liste des alarmes (): $getAlarms()", + "script.sys-fnc-getAlarms-params": "", + "script.sys-fnc-getAlarmsHistory-text": "$getAlarmsHistory(de msec., à msec.)", + "script.sys-fnc-getAlarmsHistory-tooltip": "Fonction système pour obtenir la liste de l'historique de l'alarme (): $getAlarmsHistory(à partir en tant que nombre, jusqu'à en tant que nombre)", + "script.sys-fnc-getAlarmsHistory-params": "'De msec.', 'À msec.'", + "script.sys-fnc-ackAlarms-text": "$ackAlarm(Nom de l'alarme, types)", + "script.sys-fnc-ackAlarms-tooltip": "Fonction système pour acquitter l'alarme (): $ackAlarm(Nom de l'alarme en tant que chaîne, [types] 'highhigh|high|low')", + "script.sys-fnc-ackAlarms-params": "'Nom de l'alarme', 'types'", + + "script.template-chart-data-text": "Données de graphique personnalisées", + "script.template-chart-data-tooltip": "Modèle de code des données de graphique personnalisées à retourner", + "script.template-invoke-chart-update-options-text": "Mettre à jour les options de graphique", + "script.template-invoke-chart-update-options-tooltip": "Modèle de code pour mettre à jour les options de graphique (plage d'échelle de l'axe Y). Mode CLIENT uniquement !", + "script.template-getHistoricalTagsoptions-text": "Obtenir les valeurs des tags historiques", + "script.template-getHistoricalTagsoptions-tooltip": "Modèle de code pour obtenir les valeurs des tags historiques.", + + "client.script-access-title": "Accès des scripts client", + "client.script-access-info": "Configurer l'accès aux fonctions système depuis le frontend (par exemple, les widgets) via window.fuxaScriptAPI.", + + "reports.list-title": "Paramètres des rapports", "reports.list-name": "Nom", "reports.list-type": "Type", "reports.list-receiver": "Destinataire", "reports.list-scheduling": "Planification / intervalle", "reports.list-enabled": "Activé", - "report.property-title": "Signaler", + + "report.property-title": "Rapport", "report.property-name": "Nom", "report.property-receiver": "Email des récepteurs", "report.property-scheduling-type": "Planification des rapports", @@ -1034,30 +1408,31 @@ "report.property-page-ori-landscape": "paysage", "report.property-page-ori-portrait": "portrait", "report.property-margin-left": "Marge à gauche", - "report.property-margin-top": "Top à marge", + "report.property-margin-top": "Marge en haut", "report.property-margin-right": "Marge à droite", - "report.property-margin-bottom": "Marge Bottom", + "report.property-margin-bottom": "Marge en bas", "report.scheduling-none": "Désactivé", "report.scheduling-day": "Tous les jours", "report.scheduling-week": "Toutes les semaines", "report.scheduling-month": "Chaque mois", "report.content-addtext": "Ajouter du texte", - "report.content-addtable": "Ajouter le tableau des balises", + "report.content-addtable": "Ajouter un tableau de tags", "report.content-addalarms": "Ajouter l'historique des alarmes", "report.content-addchart": "Ajouter un graphique", "report.content-type-text": "Texte", - "report.content-type-tagstable": "TABLEAU DE TAGS", + "report.content-type-tagstable": "Tableau de tags", "report.content-type-alarmshistory": "Historique des alarmes", "report.content-type-chart": "Graphique", "report.content-fontsizeitem": "Taille de police", "report.content-alignitem": "Alignement du texte", "report.content-edit": "Éditer", "report.content-delete": "Effacer", - "report.item-text-title": "Signaler un texte", + "report.item-text-title": "Texte du rapport", "report.item-text-label": "Texte", - "report.tags-table-title": "Tableau des balises de rapport", - "report.tags-table-column": "TAGNES COLONNES TAGNES", - "report.tags-table-add": "Ajouter une étiquette", + "report.tags-table-title": "Tableau des tags du rapport", + "report.tags-table-column": "Colonnes de tags", + "report.tags-table-add": "Ajouter un tag", + "report.tags-table-setlabel": "Définir le label", "report.table-alignitem": "Aligner", "report.table-delitem": "Supprimer la colonne", "report.item-daterange": "Plage de données", @@ -1066,120 +1441,197 @@ "report.item-daterange-week": "La semaine dernière (lundi-dimanche)", "report.item-daterange-month": "Le mois dernier", "report.item-interval": "Intervalle (période)", - "report.item-interval-hour": "Heure", - "report.item-interval-day": "Jour", + "report.item-interval-min5": "5 minutes", + "report.item-interval-min10": "10 minutes", + "report.item-interval-min30": "30 minutes", + "report.item-interval-hour": "1 heure", + "report.item-interval-day": "1 jour", "report.item-function-type": "Type de fonction", "report.item-function-min": "Min", "report.item-function-max": "Max", "report.item-function-average": "Moyenne", "report.item-function-sum": "Somme", - "report.item-alarms-title": "Signaler les alarmes", + "report.item-alarms-title": "Rapport d'alarmes", "report.alarms-priority": "Priorité des alarmes", "report.alarms-column": "Colonnes d'alarme", + "report.alarms-filter": "Filtre d'alarmes", "report.chart-title": "Graphique de rapport", "report.chart-name": "Nom du graphique", "report.chart-width": "Largeur", "report.chart-height": "Hauteur", + + "maps.locations-list-title": "Paramètres de localisation", + "maps.locations-list-name": "Nom", + "maps.locations-list-view": "Vue", + "maps.locations-list-description": "Description", + "maps.location-property-title": "Emplacement", + "maps.location-property-name": "Nom", + "maps.location-property-description": "Description", + "maps.location-property-latitude": "Latitude", + "maps.location-property-longitude": "Longitude", + "maps.location-property-card": "Carte", + "maps.location-property-view": "Vue", + "maps.location-property-url": "URL", + "maps.edit-add-location": "Ajouter un emplacement", + "maps.edit-import-location": "Importer un emplacement", + "maps.edit-edit-location": "Modifier un emplacement", + "maps.edit-remove-location": "Supprimer un emplacement", + "maps.edit-start-location": "Définir comme emplacement de départ", + "maps.edit-start-location-saved": "Emplacement de départ enregistré", + "maps.close-popups": "Fermer tous les popups", + "maps.location-to-import": "Emplacement à importer", + "maps.location-to-import-input-title": "Sélectionner l'emplacement à importer", + "logs.view-title": "Journaux système", "logs.view-files": "Fichiers de journaux", + "events.view-ontime": "Date / heure", "events.view-type": "Type", - "events.view-source": "La source", + "events.view-source": "Source", "events.view-text": "Texte", + "card.config-title": "Paramètres de carte", "card.config-content-type": "Type de contenu", - "card.config-content-view": "Vue de contenu", - "card.config-content-iframe": "Adresse de liaison", + "card.config-content-view": "Vue du contenu", + "card.config-content-iframe": "Adresse du lien", "card.widget-view": "Voir", "card.widget-alarms": "Alarmes", "card.widget-table": "Table", "card.widget-iframe": "Lien", "card.style-zoom": "Zoom", + + "resources.lib-icons": "Icônes", "resources.lib-images": "Images", - "texts.list-title": "Paramètres de textes", + "resource.list-title": "Liste des ressources", + "resource.list-name": "Nom du fichier", + "resource.list-type": "Type de fichier", + "resource.list-title-fonts": "Liste des polices", + "resources.lib-widgets": "Widgets", + + "widgets.kiosk-title": "Kiosque des widgets", + "widget.remove": "Supprimer le widget", + + "texts.list-title": "Paramètres des langues", "texts.list-filter": "Filtre", "texts.list-filter-group": "Groupe", - "texts.list-id": "IDENTIFIANT", + "texts.list-id": "ID", "texts.list-group": "Groupe", - "texts.list-value": "Texte", - + "texts.list-value": "Texte (Par défaut)", + "texts.list-add-text": "Ajouter un texte", + "texts.list-edit-language": "Modifier la langue", + "language.settings-title": "Paramètres de langue", + "language.settings-add-tooltip": "Ajouter une langue", + "language.settings-id": "Clé", + "language.settings-default-id": "Clé (par défaut)", + "language.settings-id-placeholder": "ex: EN", + "language.settings-name": "Nom", + "language.settings-default-name": "Nom (par défaut)", + "language.settings-name-placeholder": "ex: Anglais", "text.settings-title": "Texte", - "text.settings-id": "IDENTIFIANT", + "text.settings-id": "Nom (Lettres et chiffres autorisés, pas d'espaces)", "text.settings-group": "Groupe", - "text.settings-value": "Texte", + "text.settings-value": "Texte (Par défaut)", "gui.range-number-min": "Min", "gui.range-number-max": "Max", - "gui.range-number-boolean": "Valeur de masque", + "gui.range-number-boolean": "Valeur du masque", "gui.range-number-true": "Vrai [1-1]", "gui.range-number-false": "Faux [0-0]", - "gui.range-number-switcher": "Gamme comme nombre ou booléen", - "dlg.bitmask-title": "Massacre", + "gui.range-number-switcher": "Plage comme nombre ou booléen", + + "dlg.bitmask-title": "Masque de bits", - "dlg.plugins-title": "Plugins", + "dlg.plugins-title": "Plugins du serveur", + "dlg.plugins-info": "Les plugins non installés peuvent être installés manuellement sur le serveur : 'npm install [nom du package]@[version]'", + "dlg.plugins-type": "Type", "dlg.plugins-name": "Nom", "dlg.plugins-version": "Version", "dlg.plugins-current": "Installée", + "dlg.plugins-description": "Description", "dlg.plugins-status-installing": "Installation ...", - "dlg.plugins-status-removing": "Supprimer ...", + "dlg.plugins-status-removing": "Suppression ...", "dlg.plugins-status-installed": "Installation ... OK!", "dlg.plugins-status-removed": "Suppression ... OK!", "dlg.plugins-status-error": "Erreur! Essayez manuellement!", - "dlg.setup-title": "Installer", + + "dlg.setup-title": "Installation", "dlg.setup-gui": "Interface utilisateur", - "dlg.setup-diverse": "Mission", + "dlg.setup-diverse": "Divers", "dlg.setup-logic": "Logique", "dlg.setup-system": "Système", "dlg.setup-views": "Vues", "dlg.setup-connections": "Connexions", - "dlg.setup-users": "Utilisatrices", + "dlg.setup-users": "Utilisateurs", + "dlg.setup-user-roles": "Rôles", "dlg.setup-alarms": "Alarmes", "dlg.setup-line-charts": "Graphiques de ligne", "dlg.setup-bar-charts": "Diagramme à barres", + "dlg.setup-maps-locations": "Emplacements", "dlg.setup-layout": "Disposition", "dlg.setup-plugins": "Plugins", "dlg.setup-scripts": "Scripts", "dlg.setup-reports": "Rapports", "dlg.setup-settings": "Réglages", - "dlg.setup-logs": "Bûches", + "dlg.setup-client-access": "Scripts Frontend", + "dlg.setup-logs": "Journaux", "dlg.setup-notifications": "Notifications", + "dlg.setup-events": "Événements", + "dlg.setup-resources": "Ressources", + "dlg.setup-fonts": "Polices", + "dlg.setup-language": "Langue", "dlg.app-settings-title": "Réglages", "dlg.app-settings-system": "Système", - "dlg.app-settings-smtp": "Smtp", - "dlg.app-settings-smtp-host": "Hôtesse", + "dlg.app-settings-smtp": "SMTP", + "dlg.app-settings-smtp-host": "Hôte SMTP", "dlg.app-settings-smtp-port": "Port", "dlg.app-settings-smtp-mailsender": "Expéditeur de courrier", - "dlg.app-settings-smtp-user": "Utilisateur / apikey", + "dlg.app-settings-smtp-user": "Utilisateur / Clef API", "dlg.app-settings-smtp-password": "Mot de passe", - "dlg.app-settings-smtp-testaddress": "Email pour envoyer un message de test", + "dlg.app-settings-smtp-testaddress": "Envoyer un email de test", "dlg.app-settings-smtp-test": "Test", "dlg.app-settings-language": "Langue", - "dlg.app-language-en": "Anglaise", - "dlg.app-language-ru": "russe", - "dlg.app-language-ua": "Ukrainienne", - "dlg.app-language-zh-cn": "Chinoise", + "dlg.app-language-de": "Allemand", + "dlg.app-language-en": "Anglais", + "dlg.app-language-ru": "Russe", + "dlg.app-language-ua": "Ukrainien", + "dlg.app-language-zh-cn": "Chinois", "dlg.app-language-pt": "Portugais", - "dlg.app-language-tr": "Turque", - "dlg.app-language-ko": "Coréenne", - "dlg.app-language-es": "Espagnole", + "dlg.app-language-sv": "Suédois", + "dlg.app-language-tr": "Turc", + "dlg.app-language-ko": "Coréen", + "dlg.app-language-es": "Espagnol", "dlg.app-language-fr": "Français", "dlg.app-settings-server-port": "Le serveur écoute sur le port", + "dlg.app-settings-server-log-full": "Mode journal complet", + "dlg.app-settings-alarms": "Alarmes", "dlg.app-settings-alarms-clear": "Effacer toutes les alarmes et l'historique", "dlg.app-settings-auth-token": "Authentification avec un jeton", + "dlg.app-settings-auth-only-editor": "Uniquement pour l'éditeur", "dlg.app-auth-disabled": "Désactivé", - "dlg.app-auth-expiration-15m": "Activé avec l'expiration des jetons en 15 min.", - "dlg.app-auth-expiration-1h": "Activé avec l'expiration des jetons en 1 heure.", - "dlg.app-auth-expiration-3h": "Activé avec l'expiration des jetons en 3 heures.", - "dlg.app-auth-expiration-1d": "Activé avec l'expiration des jetons en 1 jour.", - "dlg.app-auth-tooltip": "Par activé, vous disposez d'un compte administrateur «Admin / 123456». N'oubliez pas de le changer", + "dlg.app-auth-expiration-15m": "Activé avec l'expiration des jetons dans 15 min.", + "dlg.app-auth-expiration-1h": "Activé avec l'expiration des jetons dans 1 heure.", + "dlg.app-auth-expiration-3h": "Activé avec l'expiration des jetons dans 3 heures.", + "dlg.app-auth-expiration-1d": "Activé avec l'expiration des jetons dans 1 jour.", + "dlg.app-auth-tooltip": "Activé : vous disposez d'un compte administrateur «Admin / 123456». (N'oubliez pas de le changer). Redémarrage serveur requis !", + "dlg.app-settings-client-broadcast": "Diffuser vers le client (frontend) toutes les valeurs des tags", + "dlg.app-settings-daqstore": "Stockage DAQ", "dlg.app-settings-daqstore-type": "Type de base de données", "dlg.app-settings-daqstore-url": "URL", "dlg.app-settings-daqstore-token": "Jeton", "dlg.app-settings-daqstore-bucket": "Seau", - "dlg.app-settings-daqstore-organization": "Organisme", + "dlg.app-settings-daqstore-organization": "Organisation", "dlg.app-settings-daqstore-retention": "Rétention", - "store.retention-day1": "Un jour", + "dlg.app-settings-daqstore-database": "Nom de la base de données", + "dlg.app-settings-daqstore-username": "Nom d'utilisateur", + "dlg.app-settings-daqstore-password": "Mot de passe", + + "dlg.app-settings-user-group-label": "Type d'autorisation", + "dlg.app-settings-user-group": "Groupes (par défaut)", + "dlg.app-settings-user-roles": "Rôles", + + "store.retention-none": "Désactivé", + "store.retention-day1": "1 jour", "store.retention-days2": "2 jours", "store.retention-days3": "3 jours", "store.retention-days7": "7 jours", @@ -1187,44 +1639,79 @@ "store.retention-days30": "30 jours", "store.retention-days90": "90 jours", "store.retention-year1": "1 an", + "store.retention-year3": "3 ans", + "store.retention-year5": "5 ans", + + "plugin.group-connection-device": "Appareil de connexion", + "plugin.group-connection-database": "Base de données de connexion", + "plugin.group-chart-report": "Image du graphique pour le rapport", + + "action-settings-title": "Paramètres des actions", + "action-settings-readonly-tag": "Tag", + "action-settings-readonly-values": "Valeurs", + + "msg.alarm-ack-all": "Souhaitez-vous acquitter toutes les alarmes ?", "msg.alarm-remove": "Souhaitez-vous supprimer l'alarme", "msg.text-remove": "Souhaitez-vous supprimer du texte", "msg.alarmproperty-error-exist": "Le nom d'alarme existe!", "msg.alarmproperty-missing-value": "Certaines valeurs manquent!", - "msg.textproperty-error-exist": "Text-id existe!", + "msg.textproperty-error-exist": "Texte-id existe!", "msg.textproperty-missing-value": "Certaines valeurs manquent!", "msg.device-remove": "Souhaitez-vous supprimer l'appareil", - "msg.device-tag-remove": "Souhaitez-vous supprimer la balise", - "msg.device-tag-exist": "Le nom de balise existe!", + "msg.device-tag-remove": "Souhaitez-vous supprimer le tag", + "msg.device-tag-exist": "Le nom du tag existe!", + "msg.device-tag-invalid-char": "Le caractère '@' n'est pas autorisé dans les noms de tag!", "msg.notification-property-missing-value": "Certaines valeurs manquent!", "msg.report-property-missing-value": "Il y a des valeurs incorrectes ou manquantes!", + "msg.file-upload-failed": "Échec de l'upload!", + "msg.file-delete-failed": "Échec de la suppression du fichier!", + "msg.home-welcome": "Attendez ... Allez dans l'éditeur, mappez les appareils, concevez votre visualisation et liez les variables d'appareils", + "msg.server-connection-failed": "ECHEC DE LA CONNEXION AU SERVEUR !", "msg.project-load-error": "Impossible de lire '{{value}}'", - "msg.project": "Vous souhaitez enregistrer le changement de projet?", - "msg.tags-remove-all": "Souhaitez-vous supprimer toutes les balises?", - "msg.view-remove": "Souhaitez-vous supprimer la vue '{{value}}'?", - "msg.chart-remove": "Souhaitez-vous supprimer le graphique '{{value}}'?", - "msg.graph-remove": "Souhaitez-vous supprimer le graphique à barres '{{value}}'?", - "msg.script-remove": "Souhaitez-vous supprimer le script '{{value}}'?", - "msg.report-remove": "Souhaitez-vous supprimer le rapport", - "msg.device-connection-error": "Erreur de connexion '{{value}}'!", - "msg.server-connection-error": "La connexion du serveur a échoué!", - "msg.sendmail-success": "Mail Envoyer un succès!", - "msg.sendmail-error": "Envoi du courrier a échoué!", - "msg.users-save-error": "Échec de l'enregistrement de l'utilisateur!", + "msg.project": "Vous souhaitez enregistrer le changement du projet ?", + "msg.tags-remove-all": "Souhaitez-vous supprimer toutes les tags ?", + "msg.view-remove": "Souhaitez-vous supprimer la vue '{{value}}' ?", + "msg.chart-remove": "Souhaitez-vous supprimer le graphique '{{value}}' ?", + "msg.role-remove": "Souhaitez-vous supprimer le rôle '{{value}}' ?", + "msg.graph-remove": "Souhaitez-vous supprimer le graphique en barres '{{value}}' ?", + "msg.script-remove": "Souhaitez-vous supprimer le script '{{value}}' ?", + "msg.report-remove": "Souhaitez-vous supprimer le rapport ?", + "msg.device-connection-error": "Erreur de connexion à l'appareil '{{value}}' !", + "msg.server-connection-error": "La connexion du serveur a échoué !", + "msg.sendmail-success": "Mail envoyé avec succès !", + "msg.sendmail-error": "Envoi du courrier a échoué !", + "msg.users-save-error": "Échec de l'enregistrement de l'utilisateur !", "msg.user-remove": "Souhaitez-vous supprimer l'utilisateur", - "msg.project-save-success": "Project Sauver réussi!", - "msg.project-save-error": "Le projet SAVE a échoué!", - "msg.project-format-error": "Projeter le mauvais format!", - "msg.project-save-unauthorized": "Le projet SAVE a échoué! Non autorisé!", + "msg.project-save-success": "Sauvegarde du projet réussie !", + "msg.project-save-error": "Sauvegarde du projet a échoué !", + "msg.project-format-error": "Mauvais format du projet !", + "msg.view-format-error": "Mauvais format de la vue !", + "msg.project-save-unauthorized": "La sauvegarde du projet a échoué ! Non autorisé !", "msg.project-save-ask": "Vous voulez quitter le projet?", "msg.login-username-required": "Entrez un nom d'utilisateur", "msg.login-password-required": "Entrer un mot de passe", - "msg.signin-failed": "Non autorisé", - "msg.get-project-void": "Projet introuvable!", - "msg.editor-mode-locked": "L'éditeur est déjà ouvert!", - "msg.alarms-clear-success": "Toutes les alarmes ont été annulées!", - "msg.import-devices-error": "Les appareils d'importation ont échoué!", - "msg.report-build-forced": "Envoyer pour construire le rapport réussi", - "msg.report-build-error": "Envoyer un rapport de construction échoué!" + "msg.signin-failed": "Nom d'utilisateur ou mot de passe incorrect !", + "msg.signin-unauthorized": "Non autorisé !", + "msg.get-project-void": "Projet introuvable !", + "msg.editor-mode-locked": "L'éditeur est déjà ouvert !", + "msg.alarms-clear-success": "Toutes les alarmes ont été annulées !", + "msg.import-devices-error": "L'importation des appareils a échoué !", + "msg.report-build-forced": "L'envoi pour construire le rapport réussi !", + "msg.report-build-error": "L'envoi pour construire le rapport a échoué !", + "msg.device-tags-request-result": "Chargement {{value}} sur {{current}}", + "msg.chart-with-script": "Le script défini reçoit la liste des lignes de graphique en tant que paramètre, puis renvoie la liste complète avec les données. Exemple de code dans le script 'Templates'", + "msg.script-name-exist": "Le nom du script existe déjà !", + "msg.invalid-script-name": "Nom de script invalide !", + "msg.templates-exist-ask-overwrite": "Le modèle avec le nom '{{value}}' existe déjà. Voulez-vous le remplacer ?", + "msg.templates-save-success": "Sauvegarde du modèle réussie !", + "msg.view-name-exist": "Le nom de la vue existe déjà !", + "msg.notification-name-exist": "Le nom de la notification existe déjà !", + "msg.file-remove": "Souhaitez-vous supprimer '{{value}}' ?", + "msg.notification-remove": "Souhaitez-vous supprimer la notification '{{value}}' ?", + "msg.maps-location-remove": "Souhaitez-vous supprimer l'emplacement sur la carte '{{value}}' ?", + "msg.maps-location-name-exist": "Le nom de l'emplacement sur la carte existe déjà !", + "msg.text-name-exist": "Le nom du texte existe déjà !", + "msg.texts-text-remove": "Souhaitez-vous supprimer le texte '{{value}}' ?", + "msg.operation-unauthorized": "Opération non autorisée !" } diff --git a/client/dist/assets/i18n/ja.json b/client/dist/assets/i18n/ja.json new file mode 100644 index 000000000..492d96ba3 --- /dev/null +++ b/client/dist/assets/i18n/ja.json @@ -0,0 +1,1751 @@ +{ + "with param": "サンプル {{value}}", + + "app.home": "ホーム", + "app.lab": "実行", + "app.editor": "エディター", + + "header.new-project": "新規プロジェクト", + "header.save-project": "プロジェクトを保存", + "header.save-project-tooltip": "未保存の変更を全て保存", + "header.saveas-project": "名前を付けてプロジェクトを保存...", + "header.rename-project": "プロジェクト名変更", + "header.open-project": "プロジェクトを開く", + "header.edit-project": "プロジェクト編集", + "header.edit-views": "ビューエディター", + "header.edit-devices": "接続設定", + "header.edit-charts": "チャート設定", + "header.edit-layout": "レイアウト設定", + "header.edit-plugins": "プラグイン", + "header.edit-users": "ユーザー設定", + "header.edit-alarms": "アラーム設定", + "header.edit-texts": "テキスト設定", + "header.help": "iFEMS ヘルプ", + "header.help-tutorial": "チュートリアル", + "header.help-info": "About", + "header.change-thema": "テーマ切り替え (beta)", + "header.info-version": "バージョン ", + "header.theme": "テーマ ライト/ダーク", + + "project.name": "プロジェクト名", + + "sidenav.title": "iFEMS", + + "tutorial.title": "iFEMS チュートリアル", + + "dlg.info-title": "iFEMS", + + "dlg.layout-title": "レイアウト設定", + "dlg.layout-general": "一般", + "dlg.layout-lbl-auto-resize": "自動リサイズ", + "dlg.layout-lbl-logo": "ロゴ", + "dlg.layout-lbl-icon": "アイコン", + "dlg.layout-lbl-sview": "開始ビュー", + "dlg.layout-lbl-login-start": "起動時にログインを表示", + "dlg.layout-lbl-login-overlay-color": "オーバーレイ色", + "dlg.layout-lbl-zoom": "ズーム", + "dlg.layout-navigation-mode": "ナビゲーションを表示", + "dlg.layout-connection-message": "接続エラーを表示 (Toast)", + "dlg.layout-show-dev": "ボタンを表示", + "dlg.layout-navigation": "ナビゲーションサイドメニュー" , + "dlg.layout-nav-bkcolor": "背景色", + "dlg.layout-nav-fgcolor": "色", + "dlg.layout-lbl-smode": "サイドモード", + "dlg.layout-lbl-type": "タイプ", + "dlg.layout-header": "ヘッダーナビゲーションバー", + "dlg.layout-header-bkcolor": "背景色", + "dlg.layout-header-fgcolor": "色", + "dlg.layout-lbl-title": "タイトル", + "dlg.layout-lbl-alarms": "アラーム通知モード", + "dlg.layout-lbl-datetime": "日付と時刻の形式 (yyyy/mm/dd - hh:mm a)", + "dlg.layout-lbl-infos": "情報通知モード", + "dlg.layout-lbl-font": "フォントファミリー", + "dlg.layout-lbl-font-size": "フォントサイズ", + "dlg.layout-lbl-anchor": "方向", + "dlg.layout-lbl-margin-left": "左マージン", + "dlg.layout-lbl-margin-right": "右マージン", + "dlg.layout-lbl-login-info": "ログイン情報", + "dlg.layout-lbl-custom-styles": "カスタムスタイル", + "dlg.layout-lbl-show-language": "言語を表示", + + "dlg.menuitem-title": "メニュー項目", + "dlg.menuitem-image": "[マイ画像...]", + "dlg.menuitem-icon": "アイコン", + "dlg.menuitem-text": "テキスト", + "dlg.menuitem-view": "クリックで表示", + "dlg.menuitem-link": "クリックでリンク", + "dlg.menuitem-alarms": " クリックでアラーム", + "dlg.menuitem-address": "リンクアドレス", + "dlg.menuitem-icons-filter": "アイコンフィルター", + + "dlg.menuitem-submenu": "サブメニュー", + "dlg.menuitem-add-submenu": "サブメニュー項目を追加", + "dlg.menuitem-submenu-items": "サブメニュー項目", + "sidenav.new_item": "新しいサブメニュー項目", + + "dlg.headeritem-title": "ヘッダー項目", + "dlg.headeritem-icon": "アイコン", + "dlg.headeritem-icons-filter": "アイコンフィルター", + + "dlg.docproperty-title": "プロパティを表示", + "dlg.docproperty-name": "名前", + "dlg.docproperty-width": "幅", + "dlg.docproperty-height": "高さ", + "dlg.docproperty-background": "背景", + "dlg.docproperty-size": "サイズ(事前定義)", + "dlg.docproperty-select": "サイズを選択", + "dlg.docproperty-size-320-240": "320 x 240 ピクセル", + "dlg.docproperty-size-460-360": "460 x 360 ピクセル", + "dlg.docproperty-size-640-480": "640 x 480 ピクセル", + "dlg.docproperty-size-800-600": "800 x 600 ピクセル", + "dlg.docproperty-size-1024-768": "1024 x 768 ピクセル", + "dlg.docproperty-size-1280-960": "1280 x 960 ピクセル", + "dlg.docproperty-size-1600-1200": "1600 x 1200 ピクセル", + "dlg.docproperty-size-1920-1080": "1920 x 1080 ピクセル", + "dlg.docproperty-margin": "余白", + "dlg.docproperty-align": "配置", + "dlg.docproperty-align-placeholder": "ページ上の配置", + "dlg.docproperty-align-topCenter": "上", + "dlg.docproperty-align-middleCenter": "中央", + "dlg.docproperty-gridtype": "グリッドタイプ", + "dlg.docproperty-gridtype-placeholder": "グリッドレイアウトタイプ", + "dlg.docproperty-gridtype-fit": "フィット", + "dlg.docproperty-gridtype-scrollVertical": "垂直スクロール", + "dlg.docproperty-gridtype-scrollHorizontal": "水平スクロール", + "dlg.docproperty-gridtype-fixed": "固定", + "dlg.docproperty-gridtype-verticalFixed": "垂直固定", + "dlg.docproperty-gridtype-horizontalFixed": "水平固定", + "dlg.docproperty-renderDelay": "ビュー描画遅延 (ms)", + + "dlg.docname-title": "ビュー名", + "dlg.docname-name": "名前", + "dlg.docproperty-type": "ビュータイプ", + "dlg.item-title": "名前", + "dlg.item-name": "名前", + "dlg.item-req-name": "関数名(スペースや数字は使用不可)", + "dlg.item-name-error": "名前が存在します!", + "dlg.parameter-title": "パラメータ", + + "dlg.tagname-title": "タグ名", + "dlg.tagname-name": "名前", + + "dlg.linkproperty-title": "ハイパーリンクを作成", + "dlg.linkproperty-url": "ハイパーリンクURL", + + "dlg.login-title": "サインイン...", + "dlg.logout-btn": "サインアウト", + + "dlg.ok": "OK", + "dlg.cancel": "キャンセル", + "dlg.close": "閉じる", + "dlg.apply": "適用", + + "dlg.userproperty-title": "ユーザー", + "dlg.userproperty-groups": "認証グループ", + "dlg.userproperty-roles": "承認ロール", + "dlg.useraccess-groups": "承認 (空 = 全員に完全アクセス権)", + "dlg.userproperty-language": "言語", + "dlg.userproperty-start": "開始ビュー", + + "dlg.gauge-permission-title": "認証", + "dlg.gauge-permission-label": "(空 = 全員に完全アクセス権)", + "dlg.gauge-permission-show": "表示", + "dlg.gauge-permission-enabled": "有効", + + "date.range-start": "開始日", + "date.range-end": "終了日", + + "general.search-up": "検索", + "general.close": "閉じる", + "general.search": "検索..." , + "general.search-notfound": "該当するオプションが見つかりません", + "general.username": "ユーザー名", + "general.fullname": "フルネーム", + "general.password": "パスワード", + "general.clientId": "クライアントID", + "general.authority": "権限", + "general.grant-type": "権限タイプ", + "general.usergroups": "閲覧者,オペレーター,エンジニア,スーパーバイザー,マネージャー,F,G,管理者", + "general.enabled": "有効", + "general.disabled": "無効", + "general.align-left": "左", + "general.align-center": "中央", + "general.align-right": "右", + "general-left": "左", + "general-top": "上", + "general-x": "X", + "general-y": "Y", + "general.monday": "月曜日", + "general.monday-short": "月曜日", + "general.tuesday": "火曜日", + "general.tuesday-short": "火", + "general.wednesday": "水曜日", + "general.wednesday-short": "水", + "general.thursday": "木曜日", + "general.thursday-short": "木", + "general.friday": "金曜日", + "general.friday-short": "金", + "general.saturday": "土曜日", + " general.saturday-short": "土", + "general.sunday": "日曜日", + "general.sunday-short": "日", + "general.save-template": "テンプレートとして保存", + "general.import-template": "テンプレートからインポート", + + "tester.title": "変数", + "tester.send": "送信", + + "item.overlaycolor-none": "なし", + "item.overlaycolor-black": "黒", + "item.overlaycolor-white": "白", + + "item.navsmode-none": "なし", + "item.navsmode-push": "プッシュ", + "item.navsmode-over": "オーバー", + "item.navsmode-fix": "固定", + + "item.navtype-icons": "アイコン", + "item.navtype-text": "テキスト", + "item.navtype-icons-text-block": "アイコン&テキスト(ブロック)", + "item.navtype-icons-text-inline": "アイコン&テキスト(インライン)", + + "item.headertype-button": "ボタン", + "item.headertype-label": "ラベル", + "item.headertype-image": "画像", + "item.headeranchor-left": "左", + "item.headeranchor-right": "右", + "item.headeranchor-center": "中央", + + "item.notifymode-hide": "非表示", + "item.notifymode-fix": "固定", + "item.notifymode-float": "プッシュ", + + "item.logininfo-type-nothing": "なし", + "item.logininfo-type-username": "ユーザー名", + "item.logininfo-type-fullname": "フルネーム", + "item.logininfo-type-both": "ユーザー名 & フルネーム", + + "item.language-show-mode-nothing": "非表示", + "item.language-show-mode-simple": "表示", + "item.language-show-mode-key": "キー付きで表示", + "item.language-show-mode-fullname": "フルネーム付きで表示", + + "item.zoommode-disabled": "無効", + "item.zoommode-enabled": "手動", + "item.zoommode-autoresize": "自動リサイズ", + + "item.headerbarmode-hide": "非表示", + "item.headerbarmode-show": "表示", + + "dlg.layout-input-dialog": "入力フィールドのダイアログモード", + "item.inputmode-disabled": "無効", + "item.inputmode-enabled": "ダイアログ", + "item.inputmode-keyboard": "仮想キーボード", + "item.inputmode-keyboard-full-screen": "仮想キーボード フルスクリーン", + + "chart.config-title": "チャート設定", + "chart.config-charts": "チャート", + "chart.config-devices": "デバイス", + "chart.config-tags": "タグ", + "chart.config-lines": "チャート 線", + "chart.config-line-name": "名前", + "chart.config-line-label": "ラベル", + "chart.config-line-yaxis": "Y軸", + "chart.config-line-color": "色", + "chart.config-name-title": "チャート", + " chart.config-name": "名前", + "chart.config-rename": "名前変更", + "chart.config-delete": "削除", + "chart.config-addline": "線を追加", + "chart.config-addlinePlaceholder": "プレースホルダーを追加", + "chart.config-line-interpolation": "補間", + "chart.config-line-fill": "塗りつぶし" , + "chart.config-interpo-linear": "線形", + "chart.config-interpo-stepAfter": "次の一歩", + "chart.config-interpo-stepBefore": "一歩手前", + "chart.config-interpo-spline": "スプライン", + "chart.config-line-width": "線幅", + "chart.config-line-gap": "ギャップを埋める", + "chart.config-line-add-zone": "ゾーンを追加", + "chart.config-line-zone-min": "最小", + "chart.config-line-zone-max": "最大", + "chart.config-line-zone-stroke": "ストローク", + "chart.config-line-zone-fill": "塗りつぶし", + + "chart.property-data": "データ", + "chart.property-props": "プロパティ", + "chart.property-layout": "レイアウト", + "chart.property-name": "名前", + "chart.property-chart": "表示するチャート", + "chart.property-newchart": "新しいチャート.. .", + "chart.property-chart-type": "表示モード", + "chart.property-realtime-max": "最大分", + "chart.viewtype-realtime1": "リアルタイム", + "chart.viewtype-history": "履歴", + "chart.viewtype-custom": "カスタム", + "chart.property-general": "一般", + "chart.property-font": "フォント", + "chart.property-font.titlesize": "タイトルサイズ", + "chart.property-font.axissize": "軸サイズ", + "chart.property-font.legendsize": "凡例サイズ", + "chart.property-theme": "テーマ", + "chart.property-color.background": "背景色", + "chart.property-color.text": "文字色", + "chart.property-color.grid": "グリッド色", + "chart.property-color.legend": "凡例色", + "chart.property-legend.mode": "凡例表示モード", + "chart.property-date-last-range": "日付範囲", + "chart.property-refresh-interval": "更新間隔 (分)", + "chart.property-hide-toolbar": "ツールバー非表示", + "chart.property-thouch-zoom": "タッチズーム", + " chart.property-load-old-values": "履歴を読み込む", + "chart.property-date.format": "日付形式", + "chart.property-time.format": "時刻形式", + "chart.property-axis": "軸", + "chart.property-xaxis": "X軸", + "chart.property-axis-x": "ラベル", + "chart.property-yaxis": "Y軸", + "chart.property-axis-y1": "Y1ラベル", + "chart.property-axis-y1-min": "Y1最小値", + "chart.property-axis-y1-max": "Y1最大値", + "chart.property-axis-y2": "Y2ラベル", + "chart.property-axis -y2-min": "Y2 最小値", + "chart.property-axis-y2-max": "Y2 最大値", + "chart.property-axis-y3": "Y3 ラベル", + "chart.property-axis-y3-min": "Y3 最小値", + "chart.property-axis-y3-max": "Y3 最大値", + "chart.property-axis-y4": "Y4 ラベル", + "chart.property-axis-y4-min": "Y4 最小値", + "chart.property-axis-y4-max": "Y4 最大値", + "chart.property-script": "スクリプト データソース", + + "chart.rangetype-last8h": "過去8時間" , + "chart.rangetype-last1d": "過去1日間", + "chart.rangetype-last3d": "過去3日間", + "chart.rangetype-last1w": "過去1週間", + + "chart.legend-always": "常に", + "chart.legend-follow": "追従", + "chart.legend-bottom": "下部", + "chart.legend-never": "非表示", + + "chart.labels-serie": "シリーズ", + "chart.labels-time": "時間", + "chart.labels-title": "タイトル", + + "graph.config-title": "グラフ設定", + "graph.config-rename": "名前変更", + "graph.config-source-tag": "ソースタグ追加", + "graph.config-source-name": "名前", + "graph.config-source-label": "ラベル", + "graph.config-category": "カテゴリ", + "graph.config-device": "デバイス", + "graph.config-bar-color": "境界線", + "graph.config-bar-fill": "塗りつぶし", + "graph.property-xtype": "X軸カテゴリタイプ", + "graph.property-sources": "ソース(タグ)", + "graph.bar-xtype-value": "値", + "graph.bar-xtype-date": "日時", + "graph.property-fnctype": "関数タイプ", + "graph.bar-date-fnc-value-integral": "合計 (積分)", + "graph.bar-date-fnc-hour-integral": "時間合計 (積分)", + + "graph.property-data": "データ", + "graph.property-name": "名前", + "graph.property-general": "一般", + "graph.property-title": "タイトル", + "graph.property-title-font": "フォントサイズ", + "graph.property-title-show": "表示", + "graph.property-title-color": "タイトル", + "graph.property-layout": "レイアウト", + "graph.property-graph": "表示するグラフ", + "graph.property-props": "プロパティ", + "graph.property-newgraph": "新しいグラフ..." , + "graph.property-date-last-range": "日付範囲", + "graph.property-date-group": "グループ", + "graph.property-offline": "オンライン", + "graph.property-graph-orientation": "向き", + "graph.property-ori-vartical": "縦", + "graph.property-ori-horizontal": "横", + "graph.property-decimals": "小数点以下桁数", + "graph.property-yaxis-min": "最小値", + "graph.property-yaxis-max": "最大値", + "graph.property-stepsize": "目盛間隔", + "graph.property-yaxis": "値軸", + "graph.property-yaxis-fontsize": "フォントサイズ", + "graph.property-yaxis-show": "表示", + "graph.property-yaxis-color": "値", + "graph.property-xaxis-fontsize": "フォントサイズ", + "graph.property-xaxis": "カテゴリ軸", + "graph.property-xaxis-show": "表示", + "graph.property-xaxis-color": "カテゴリ", + "graph.property-theme": "テーマ", + "graph.property-theme-type": "タイプ", + "graph.property-gridline": "グリッドを表示", + "graph.property-grid-color": "グリッド", + "graph.property-theme-owner": "カスタマイズ", + "graph.property-theme-light": "ライト", + "graph.property-theme-dark": "ダーク", + "graph.property-legend": "凡例", + "graph.property-legend-display": "表示", + "graph.property-legend-top": "上部", + "graph.property-legend-left": "左", + "graph.property-legend-bottom": "下", + "graph.property-legend-right": "右", + "graph.property-legend-show": "表示", + "graph.property-legend-fontsize": "フォント", + "graph.property-legend-align": "配置", + "graph.property-legend-center": "中央", + "graph.property-legend-start": "開始", + "graph.property-legend-end": "終了", + "graph.property-legend-color": "凡例", + "graph.property-border": "枠線の太さ", + "graph.property-tooltip": "ツールチップを表示", + "graph.property-datalabels": "データラベル", + "graph.property-datalabels-color": "データラベル", + "graph.property-datalabels-show": "表示", + "graph.property-datalabels-fontsize": "フォントサイズ", + "graph.property-datalabels-align": "配置", + + "graph.rangetype-last1h": "過去1時間", + "graph.rangetype-last1d": "過去1日間", + "graph.rangetype-last3d": "過去3日間", + "graph.rangetype-last1w": "過去1週間", + "graph.rangetype-last1m": "過去1か月", + + "graph.grouptype-hours": "時間", + "graph.grouptype-days": "日", + + "iframe.property-data": "データ", + "iframe.property-address": "アドレス (fix)", + "iframe.property-image": "画像", + + "video.property-title": "動画設定", + "video.property-data": "データ", + "video.property-address": "アドレス", + "video.property-controls": "コントロールを表示", + "video.property-image": "初期画像", + "video.property-image-placeholder": "初期画像を選択", + + "panel.property-data": "データ", + "panel.property-view-name": "ビュー名", + "panel.property-name": "名前", + "panel.property-scalemode": "拡大縮小モード", + "panel.property-scalemode-none": "なし", + "panel.property-scalemode-contain": "含める", + "panel.property-scalemode-stretch": "拡大", + + "table.property-title": "データテーブル設定", + "table.property-data": "データ", + "table.property-date-last-range": "日付範囲", + "table.property-name": "名前", + "table.property-type": "タイプ", + "table.property-type-with-realtime": "リアルタイム", + "table.property-header": "ヘッダー", + "table.property-header-height": "高さ", + "table.property-header-background": "背景", + "table.property-header-color": "色", + "table.property-header-fontSize": "フォントサイズ" , + "table.property-row": "行", + "table.property-row-height": "高さ", + "table.property-row-background": "背景", + "table.property-row-color": "色", + "table.property-row-fontSize": "フォントサイズ", + "table.property-selection": "選択", + "table.property-layout": "レイアウト", + "table.property-filter": "フィルター", + "table.property-paginator": "ページネーター", + "table.property-paginator-items-per-page": "ページあたりの項目数", + "table.property-paginator-next-page": "次のページ", + "table.property-paginator-prev-page": "前のページ", + " table.property-paginator-of-label": "の", + "table.property-daterange": "日付範囲", + "table.property-gridline": "グリッドを表示", + "table.property-type-data": "データテーブル", + "table.property-type-history": "履歴テーブル", + "table.property-type-alarms": "アラームテーブル", + "table.property-type-alarms-history": "アラーム履歴テーブル", + "table.property-type-reports": "レポートテーブル", + "table.property-grid-color": "グリッド色", + "table.property-cols": "列", + "table.property-rows": "行", + "table.property-column-type": "列タイプ", + "table.property-column-name": "名前", + "table.property-column-label": "ラベル", + "table.property-column-variable": "変数", + "table.property-column-device": "デバイス", + "table.property-column-timestamp": "日時", + "table.property-column-align": "配置", + "table.property-column-width": "幅", + "table.property-row-type": "行タイプ", + "table.property-customize-tooltip": "テーブルカスタマイザー", + "table.customize-title": "テーブルカスタマイザー", + "table.customize-column-edit": "列を編集", + "table.customize-column-add": "列を追加", + "table.customize-column-remove": "列を削除", + "table.customize-column-left": "左に移動", + "table.customize-column-right": "右に移動", + "table.customize-row-up": "上に移動", + "table.customize-row-down": "下に移動", + "table.customize-row-edit": "行を編集", + "table.customize-row-add": "行を追加", + "table.customize-row-remove": "行を削除", + "table.cell-column-name": "列名", + "table.column-dialog-title": "列", + "table.row-dialog-title": "行", + "table.cell-column-type": "列タイプ", + " table.cell-row-type": "行タイプ", + "table.cell-ts-format": "フォーマット (YYYY/MM/DD - HH:mm:ss)", + "table.cell-value-format": "フォーマット (0.000)", + "table.cell-format": "フォーマット", + "table.cell-text": "テキスト", + "table.cell-align-left": "左", + "table.cell-align-center": "中央", + "table.cell-align-right": "右", + + "table.history-filter": "フィルター", + "table.rangetype-last1h": "過去1時間" , + "table.rangetype-last1d": "過去1日間", + "table.rangetype-last3d": "過去3日間", + + "table.alarms-title": "テーブルアラーム", + "table.alarms-history-title": "テーブルアラーム履歴", + "table.alarm-columns": "アラーム列", + "table.alarm-filter": "アラームフィルター", + "table.alarm-priority": "優先度", + "table.alarm-tags": "タグ", + + "table.reports-title": "テーブルレポート", + "table.report-columns": "レポート列", + "table.report-view-name": "名前", + "table.report-view-ontime": "作成日時" , + "table.report-view-download": "ダウンロード", + "table.report-view-delete": "削除", + "table.report-filter": "レポートフィルター", + "table.report-filter-name": "名前", + "table.report-filter-count": "最大", + + "editor.view-svg": "Canvas/SVG", + "editor.view-cards": "マルチビューコンテナ", + "editor.view-maps": "マップ", + "editor.views": "ビュー", + "editor.resources": "リソース", + "editor.view-delete": "削除", + "editor.view-rename": "名前変更", + "editor.view-property": "プロパティ", + "editor.view-clone": "複製", + "editor.view-export": "エクスポート", + "editor.view-clean": "クリーン", + "editor.view-add": "ビュー追加", + "editor.image-add": "画像を追加", + "editor.view-import": "ビューをインポート", + "editor.general": "一般", + "editor.shape": "シェイプ", + "editor.processeng": "プロセスエンジニアリング", + "editor.animated": "アニメーション", + "editor.controls": "コントロール", + "editor.controls-input": "入力値", + "editor.controls-input-settings": "入力設定", + "editor.controls-output": "出力値", + "editor.controls-output-settings": "出力設定", + "editor.controls-button": "ボタン", + "editor.controls-button-settings": "ボタン設定", + "editor.controls-select": "値選択", + "editor.controls-select-settings": "選択設定", + "editor.controls-progress": "バーゲージ", + "editor.controls-progress-settings": "バーゲージ設定", + "editor.controls-semaphore": "LEDゲージ", + "editor.controls-semaphore-settings": "LEDゲージ設定", + "editor.controls-chart": "チャート", + "editor.controls-chart-settings": "チャート設定", + "editor.controls-bag": "円形ゲージ", + "editor.controls-bag-settings": "円形ゲージ設定", + "editor.controls-pipe": "パイプ", + "editor.controls-pipe-settings": "パイプ設定", + "editor.controls-slider": "スライダー", + "editor.controls-slider-settings": "スライダー設定", + "editor.controls-shape-settings": "シェイプ設定", + "editor.controls-html-switch-settings": "スイッチ設定", + "editor.controls-switch": "スイッチ", + "editor.controls-graphbar": "棒グラフ", + "editor.controls-graph-bar-settings": "棒グラフ設定", + "editor.controls-graphpie": "円グラフ", + "editor.controls-graph-pie-settings": "円グラフ設定", + "editor.controls-iframe": "Iframe", + "editor.controls-iframe-settings": "Iframe設定", + "editor.controls-table": "テーブル", + "editor.header-item-settings": "ヘッダー項目設定", + "editor.controls-image": "画像(リンク)", + "editor.controls-panel": "パネル", + "editor.controls-panel-settings": "パネル設定", + "editor.controls-video": "動画", + "editor.controls-video-settings": "動画設定", + + "editor.layout-settings": "レイアウト設定", + + "editor.interactivity": "インタラクティブ機能", + "editor.interactivity-id": "id:", + "editor.interactivity-id-title": "要素を識別", + "editor.interactivity-class": "class:", + "editor.interactivity-class-title": "要素クラス", + "editor.interactivity-name": "名前", + "editor.edit-bind-of-tags": "タグの編集バインド", + + "editor.cmenu-property": "プロパティ", + "editor.cmenu-cut": "切り取り", + "editor.cmenu-copy": "コピー", + "editor.cmenu-paste": "貼り付け", + "editor.cmenu-paste-place": "元の位置に貼り付け", + "editor.cmenu-delete": "削除", + "editor.cmenu-group": "グループ化" , + "editor.cmenu-ungroup": "グループ解除", + "editor.cmenu-bring-front": "前面へ移動", + "editor.cmenu-bring-forward": "前方へ移動", + "editor.cmenu-send-backward": "後方へ移動", + "editor.cmenu-send-back": "背面へ移動", + "editor.cmenu-layer-duplicate": "レイヤーを複製...", + "editor.cmenu-layer-delete": "レイヤーを削除", + "editor.cmenu-layer-marge-down": "下へ統合", + "editor.cmenu-layer-marge-all": "全て統合", + "editor.cmenu-unlock": "ロック解除", + "editor.cmenu-lock": "ロック", + + "editor.transform": "変換", + "editor.transform-x": "x", + "editor.transform-x-title": "X座標を変更", + "editor.transform-y": "y", + "editor.transform-y-title": "Y座標を変更", + "editor.transform-x1": "x1", + "editor.transform-x1-title": "線の開始x座標を変更", + "editor.transform-y1": "y1", + "editor.transform-y1 -title": "線の開始Y座標を変更", + "editor.transform-x2": "x2", + "editor.transform-x2-title": "線の開始X座標を変更", + "editor.transform-y2": "y2", + "editor.transform-y2-title": "線の開始Y座標を変更", + "editor.transform-rect-width-title": "矩形の幅を変更", + "editor.transform-width": "width", + "editor.transform-rect-height-title": "矩形の高さを変更", + "editor.transform-height": "height", + "editor.transform-rect-radius-title": "矩形の角半径を変更", + "editor.transform-radiuscorner": "半径の隅", + "editor.transform-circlecx": "cx", + "editor.transform-circlecx-title": "円のcx座標を変更", + "editor.transform-circlecy": "cy", + "editor.transform-circlecy-title": "円のcy座標を変更", + "editor.transform-circler": "r", + "editor.transform-circler-title": "円の半径を変更" , + "editor.transform-ellipsecx": "cx", + "editor.transform-ellipsecx-title": "楕円のcx座標を変更", + "editor.transform-ellipsecy": "cy", + "editor.transform-ellipsecy-title": "楕円のcy座標を変更", + "editor.transform-ellipserx": "rx", + "editor.transform-ellipserx-title": "楕円のx半径を変更", + "editor.transform-ellipsery": "ry", + "editor.transform-ellipsery-title": "楕円のy半径を変更", + "editor.transform-fontfamily": "フォントファミリー", + "editor.transform-font-serif": "Serif", + "editor.transform-font-sansserif": "Sans-serif", + "editor.transform-font-cursive": "Cursive", + "editor.transform-font-fantasy": "Fantasy", + "editor.transform-font-monospace": "Monospace", + "editor.transform-fontsize": "フォントサイズ", + "editor.transform-fontsize-title": "フォントサイズを変更", + "editor.transform-textalign": "テキスト配置", + "editor.transform-left": "左", + "editor.transform-center": "中央", + "editor.transform-right": "右", + "editor.transform-image-width-title": "画像幅を変更", + "editor.transform-image-height-title": "画像の高さを変更", + "editor.transform-url": "URL", + "editor.transform-image-url-title": "URLを変更", + "editor.transform-change-image": "画像を変更", + "editor.transform-change-image-title": "注意: この画像は埋め込みできません。表示にはこのパスに依存します", + "editor.transform-angle": "角度", + "editor.transform-angle-title": "回転角度を変更", + "editor.transform-hide": "非表示", + "editor.transform-lock": "ロック", + + "editor.align": "配置", + "editor.align-left-title": "左揃え", + "editor.align-center-title": "中央揃え", + "editor.align-right-title": "右揃え", + "editor.align-top-title": "上揃え", + "editor.align-middle-title": "中央揃え", + "editor.align-bottom-title": "下揃え", + + "editor.stroke": "ストローク", + "editor.stroke-width": "ストローク幅", + "editor.stroke-width-title": "ストローク幅を1ずつ変更、Shiftキーを押しながらクリックで0.1ずつ変更", + "editor.stroke-style": "ストロークスタイル", + "editor.stroke-style-title": "ストロークの破線スタイルを変更", + "editor.stroke-joinmiter-title": "線端接続(Miter)", + "editor.stroke-joinround-title": "線端接続(Round)", + "editor.stroke-joinbevel-title": "線端接続(Bevel)", + "editor.stroke-capbutt-title": "線端形状(Butt)", + "editor.stroke-capsquare-title": "線端形状(Square)", + "editor.stroke-capround-title": "線端形状(Round)", + "editor.stroke-shadow": "影", + "editor.stroke-shadow-title": "影付き", + + "editor.marker": "マーカー", + "editor.marker-start": "開始", + "editor.marker-start-title": "開始マーカータイプを選択", + "editor.marker-middle": "中間 ", + "editor.marker-middle-title": "中間マーカータイプを選択", + "editor.marker-end": "終了", + "editor.marker-end-title": "終了マーカータイプを選択", + + "editor.hyperlink": "ハイパーリンク", + "editor.hyperlink-url": "URL", + + "editor.tools-launch-title": "現在のビューを起動", + "editor.tools-select": "ツールを選択", + "editor.tools-pencil": "鉛筆ツール", + "editor.tools-line": "線ツール", + "editor.tools-rectangle": "四角形ツール", + "editor.tools-circle": "円ツール", + "editor.tools-ellipse": "楕円ツール", + "editor.tools-path": "パスツール", + "editor.tools-text": "テキストツール", + "editor.tools-image": "画像ツール (埋め込み)", + + "editor.tools-zoom-title": "ズームツール [Ctrl+Up/Down]", + "editor.tools-grid-title": "グリッドの表示/非表示", + "editor.tools-undo-title": "元に戻す [Z]" , + "editor.tools-redo-title": "やり直し [Y]", + "editor.tools-clone-title": "要素の複製 [D]", + "editor.tools-delete-title": "要素の削除 [Delete/Backspace]", + "editor.tools-movebottom-title": "最下層に移動 [ Ctrl+Shift+[ ]", + "editor.tools-movetop-title": "最前面に移動 [ Ctrl+Shift+] ]", + "editor.tools-topath-title": "パスに変換", + "editor.tools-clonemulti-title": "要素を複製 [C]", + "editor.tools-deletemulti-title": "選択した要素を削除 [Delete/Backspace]", + "editor.tools-group-title": "要素をグループ化 [G]", + "editor.tools-alignleft-title": "左揃え", + "editor.tools-aligncenter-title": "中央揃え", + "editor.tools-alignright-title": "右揃え", + "editor.tools-aligntop-title": "上揃え", + "editor.tools-alignmiddle-title": "中央揃え", + "editor.tools-alignbottom-title": "下揃え", + "editor.tools-ungroup-title": "要素のグループ解除 [G]", + "editor.tools-hyperlink-title": "ハイパーリンクを作成", + "editor.tools-svg-selector": "アイテムリストセレクター", + + "editor.settings-general": "一般", + "editor.settings-events": "イベント", + "editor.settings-actions": "アクション", + + "tags.ids-config-title": "タグ-IDリファレンス", + + "svg.selector.property-title": "アイテムリストを表示", + + "tutorial.editor-keyboard-shortcuts": "エディタ キーボードショートカット", + + "shapes.action-hide": "非表示", + "shapes.action-show": "表示", + "shapes.action-blink": "点滅", + "shapes.action-stop": "停止", + "shapes.action-start": "開始", + "shapes.action-pause": "一時停止", + "shapes.action-reset": "リセット", + "shapes.action-clockwise": "時計回りに回転", + "shapes.action-anticlockwise": "反時計回りに回転" , + "shapes.action-downup": "上下", + "shapes.action-rotate": "回転", + "shapes.action-move": "移動", + "shapes.action-refreshImage": "画像更新", + + "shapes.event-click": "クリック", + "shapes.event-dblclick": "ダブルクリック", + "shapes. event-mouseup": "マウスアップ", + "shapes.event-mousedown": "マウスダウン", + "shapes.event-mouseover": "マウスオーバー", + "shapes.event-mouseout": "マウスアウト", + "shapes.event-enter": "入力", + "shapes.event-select": "選択", + "shapes.event-onpage": "ページを開く", + "shapes.event-onwindow": "カードを開く", + "shapes.event-ondialog": "ダイアログを開く", + "shapes.event-oniframe": "iframeを開く" , + "shapes.event-oncard": "ウィンドウを開く", + "shapes.event-onopentab": "タブを開く", + "shapes.event-onsetvalue": "値を設定", + "shapes.event-ontogglevalue": "値を切り替え", + "shapes.event-onsetinput": "入力から設定", + "shapes.event-onclose": "閉じる", + "shapes.event-onopen": "開く", + "shapes.event-onrunscript": "スクリプトを実行", + "shapes.event-setvalue-set": "設定", + "shapes.event-setvalue-add": "増加", + "shapes.event-setvalue-remove": "減少", + "shapes.event-address-link": "リンク", + "shapes.event-address-resource": "リソース", + "shapes.event-onmonitor": "モニター", + "shapes.event-onViewToPanel": "ビューをパネルに設定", + "shapes.event-onLoad": "読み込み時", + "shapes.event-relativefrom-window": "ウィンドウ", + "shapes.event-relativefrom-mouse": "マウス", + + "pipe.property-title": "パイプ設定", + "pipe.property-data": "データ", + "pipe.property-style": "スタイル", + "pipe.property-props": "プロパティ", + "pipe.property-border-width": "境界線の幅", + "pipe.property-border-color": "境界線の色", + "pipe.property-pipe-width": "パイプの幅", + "pipe.property-pipe-color": "パイプの色", + "pipe.property-content-width": "コンテンツの幅", + "pipe.property-content-color": "コンテンツの色", + "pipe.property-content-space": "コンテンツのダッシュ", + "pipe.action-hide-content": "コンテンツを非表示", + "pipe.property-style-animation": "アニメーション画像", + "pipe.property-style-animation-image": "画像を選択 (SVG)", + "pipe.property-style-animation-count": "画像数", + "pipe.property-style-animation-delay": "アニメーション遅延 (ミリ秒)", + + "slider.property-props": "プロパティ", + "slider.property-horizontal": "水平", + "slider.property-vertical": "垂直", + "slider.property-orientation": "向き", + "slider.property-direction": "方向", + "slider.property-rtl": "rtl", + "slider.property-ltr": "ltr", + "slider.property-min": "最小値", + "slider.property-max": "最大値", + "slider.property-step": "ステップ", + "slider.property-font": "フォント", + "slider.property-background": "背景", + "slider.property-scala": "スカラー", + "slider.property-marker-color": "マーカー色", + "slider.property-subdivisions": "目盛り分割(%)", + "slider.property-subdivisions-height": "目盛り分割の高さ", + "slider.property-subdivisions-width": "目盛り分割の幅", + "slider.property-divisions": "分割(%)", + "slider.property-divisions-height": "高さ", + "slider.property-divisions-width": "幅", + "slider.property-font-size": "スカラーフォント", + "slider.property-tooltip": "ツールチップ", + "slider.property-tooltip-none": "なし", + "slider.property-tooltip-hide": "非表示", + " slider.property-tooltip-show": "表示", + "slider.property-tooltip-decimals": "小数点以下桁数", + "slider.property-tooltip-background": "背景", + "slider.property-tooltip-color": "文字色", + "slider.property-tooltip-font-size": "ツールチップのフォント", + "slider.property-slider-color": "接続色", + "slider.property-slider-background": "ベースカラー", + "slider.property-slider-handle": "ポインターカラー", + + "html-switch.property-off-value": "オフ値", + "html-switch.property-on-value": "オン値", + "html-switch.property-on-background": "オン時の背景色", + "html-switch.property-off-background": "オフ時の背景色", + "html-switch.property-off-text": "オフ時のテキスト", + "html-switch.property-on-text": "オン時のテキスト", + "html-switch.property-on-slider-color": "オン時のスライダー色" , + "html-switch.property-off-slider-color": "オフ時のスライダー色", + "html-switch.property-radius": "半径の隅", + "html-switch.property-off-text-color": "オフ時のテキスト色", + "html-switch.property-on-text-color": "オン時のテキスト色", + "html-switch.property-font-size": "フォントサイズ", + "html-switch.property-font": "フォント", + + "html-input.min": "最小", + "html-input.max": "最大", + "html-input.out-of-range": "値が範囲外です", + "html-input.not-a-number": "値が数値ではありません", + + "editor.tools-zoomlevel-title": "ズームレベル", + "editor.tools-zoomlevel-fitcanvas": "キャンバスに合わせる", + "editor.tools-zoomlevel-fitsection": "選択範囲に合わせる", + "editor.tools-zoomlevel-fitcontent": "全コンテンツに合わせる", + "editor.tools-fillcolor-title": "塗りつぶし色を変更", + "editor.tools-strokecolor-title": "線の色を変更", + "editor.tools-palettecolor-title": "クリックで塗りつぶし色を変更、Shiftキーを押しながらクリックで線の色を変更", + + "device.list-title": "接続設定", + "device.list-device": "接続", + "device.list-filter": "フィルター", + "device.list-name": "名前", + "device.list-address": "アドレス", + "device.list-type": "タイプ", + "device.list-min": "最小", + "device.list-max": "最大", + "device.list-value": "値", + "device.list-timestamp": "タイムスタンプ", + "device.list-description": "説明", + " device.list-edit": "タグ編集", + "device.list-add": "タグ追加", + "device.list-remove": "タグ削除", + "device.list-remove-all": "全タグ削除", + "device.list-options": "タグオプション", + "device.list-clipboard": "タグオブジェクトをクリップボードにコピー", + "device.list-direction": "方向", + + "devices.export": "接続をエクスポート", + "devices.export-json": "JSON", + "devices.export-csv": "CSV", + "devices.import": "接続をインポート", + "device.manage-templates": "テンプレートを管理", + "device.save-tags-to-template": "タグをテンプレートに保存", + "device.add-tags-from-template": "テンプレートからタグを追加", + "device.tags-template-name-title": "タグテンプレート名", + " devices.import-template": "テンプレートで接続をインポート", + "device.property-client": "接続プロパティ", + "device.property-server": "iFEMSサーバープロパティ", + "device.property-name": "名前", + "device.property-type": "タイプ", + "device.property-polling": "ポーリング", + "device.property-enable": "有効化", + "device.property-subscribe": "サブスクライブ", + "device.property-address": "アドレス (IP または opc.tcp://[server]:[port])", + "device.property-address-opc": "アドレス (opc.tcp://[server]:[port])", + " device.property-address-s7": "IP-Address (IP 127.0.0.1)", + "device.property-device-port": "デバイス IP and Port (127.0.0.1:47808)", + "device.property-address-port": "スレーブ IP and Port (127.0.0.1:502)", + "device.property-security": "セキュリティと暗号化モード", + "device.property-tags": "デバイスタグの編集", + "device.property-edit": "デバイスプロパティの編集", + "device.property-remove": "デバイスの削除", + "device.property-add": "デバイスの追加", + "device.not-property-security": "セキュリティと暗号化モードなし", + "device.property-connection-options": "接続オプション", + "device.property-port": "ポート", + "device.property-slave-id": "スレーブID", + "device.property-routing": "ルーティング", + "device.property-tockenized": "フラグメント化", + "device.property-rack": "ラック", + "device.property-slot": "スロット", + "device.property-serialport": "シリアルポート", + "device.property-baudrate": "ボーレート", + "device.property-databits": "データビット", + "device.property-stopbits": "ストップビット", + "device.property-parity": "パリティ", + "device.property-delay": "フレーム遅延 (ミリ秒)", + "device.property-method": "メソッド", + "device.property-format": "フォーマット", + "device.property-internal": "フロントエンド専用", + "device.property-url": "URL (http://[server]:[port])", + "device.property-webapi-result": "リクエスト結果", + "device.property-ads-target": "ターゲット AmsNetId (例: 192.168.1.10.1.1:851)", + "device.property-ads-local": "ローカル AmsNetId (例: 192.168.1.10.1. 1:32750)", + "device.property-ads-router": "ルーターアドレス(例: 192.168.1.120:48898)", + " device.not-webapi-result": "WebAPI結果の設定", + "device.property-show": "デバイスプロパティを表示", + "device.property-hide": "デバイスプロパティを非表示", + "device.property-interface-address": "インターフェースとポート" , + "device.property-interface-address-ph": "127.0.0.1:47808", + "device.property-broadcast-address": "ブロードキャスト", + "device.property-broadcast-address-ph": "127.0.0.255", + "device.property-adpu-timeout": "adpuタイムアウト", + "device.property-adpu-timeout-ph": "6000", + "device.property-certificate-section": "TLS証明書", + "device.property-certificate": "証明書", + "device.property-certificate-key": "秘密鍵", + "device.property-certificate-ca": "CA証明書", + "device.security-none": "なし", + "device.security-sign": "署名", + "device.security-signandencrypt": "署名と暗号化", + "device.webapi-property-title": "WebAPI プロパティ", + "device.webapi-property-gettags": "URL GET タグ", + "device.webapi-property-posttags": "URL POST タグ", + "device.webapi-property-loadtags": "タグを読み込み", + "device.property-dsn": "データソース名 (DSN=データベース名)", + "device.property-odbc-result": "見つかったテーブルの結果", + "device.not-odbc-result": "データベーステーブルの結果", + "device.add-device-templates-title": "デバイス テンプレート", + "device.add-tags-templates-title": "タグテンプレート", + "device.add-from-template": "テンプレートからデバイスを追加", + "device.manage-templates-title": "テンプレートを削除", + "device.template-device": "テンプレート名", + "device.template-tags": "テンプレート名", + "device.property-socket-reuse": "ソケット再利用", + "device.property-melsec-target": "アドレス (IP[:port])", + "device.property-melsec-ascii": "ASCII", + "device.property-melsec-octalIO": "8進数I/O", + + "device.browsetopics-property-title": "サブスクライブおよび公開するブローカートピック", + "device.browsetopics-property-sub": "サブスクライブ", + "device.browsetopics-property-pub": "公開", + "device.discovery-topics": "ブローカー上のブラウザートピック", + "device.topic-selected": "トピックパス", + "device.topic-raw": "raw", + "device.topic-json": "json", + "device.add-topics": "ブローカーにトピックを公開", + "device.topic-publish-name": "トピック名", + "device.topic-publish-path": "トピックパス", + "device.topic-publish": "公開", + "device. topic-subscribe": "サブスクライブ", + "device.topic-subscription-content": "コンテンツ", + "device.topic-subscription-name": "名前", + "device.topic-subscription-address": "アドレス", + "device.topic-publish-add-item": "ペイロードに属性を追加", + "device.topic-publish-key": "キー", + "device.topic-publish-type": "タイプ", + "device.topic-publish-timestamp": "タイムスタンプ", + "device.topic-publish-value": "トピックパス", + "device.topic-publish-static": "値", + "device.topic-publish-content": "ペイロード", + "device.topic-type-tag": "タグ", + "device.topic-type-timestamp": "タイムスタンプ", + "device.topic-type-value": "値(トピックの)", + "device.topic-type-static": "静的", + "device.topic-name-exist": "トピック名 '{{value}}' は既に存在します" , + "device.topic-subs-address-exist": "アドレス '{{value}}' でサブスクライブするトピックは既に存在します", + "device.topic-pubs-address-exist": "アドレス '{{value}}' で公開するトピックは既に存在します", + + "device.property-mqtt-address": "アドレス (mqtt://[server]: [port])", + "device.tag-property-title": "タグプロパティ", + "device.browsetag-property-title": "サーバー内のタグを閲覧", + "device.tag-property-device": "デバイス", + "device.tag-property-name": "タグ名", + "device.tag-property-register": "登録", + "device.tag-property-type": "タイプ", + "device.tag-property-address": "アドレス (例: db5.dbb3 db4.dbx2.0 MB7)", + "device.tag-property-address-sample": "アドレス", + "device.tag-property-min": " 最小", + "device.tag-property-max": "最大", + "device.tag-property-divisor": "除数", + "device.tag-property-address-offset": "アドレスオフセット (1-65536)", + "device.tag-property-obj-name": "名前", + "device.tag-property-path": "パス", + "device.tag-property-unit": "単位", + "device.tag-property-digits": "10進数", + "device.tag-property-initvalue": "初期値", + "device.tag-property-description": "説明", + "device.tag-property-direction": "方向", + "device.tag-property-edge": "エッジ", + "device.tag-property-gpio": "GPIO番号", + + + "device.tag-array-id": "配列ID:", + "device.tag-array-value": "値:", + "device-tag-dialog-title": "タグ選択", + + "device.tag-options-title": "タグオプション", + "device.tag-daq-enabled": "登録有効", + "device.tag-daq-changed": "変更時保存", + "device. tag-daq-interval": "値保存間隔 (秒)", + "device.tag-daq-restored": "復元対象", + + "device.tag-format": "桁数フォーマット (2 = #.##)", + "device.tag-deadband": "デッドバンド", + "device.tag-scale": "スケーリングモード / 変換", + "device. tag-scale-mode-undefined": "スケーリングなし", + "device.tag-scale-mode-undefined-tooltip": "タグ値", + "device.tag-scale-mode-linear": "線形: ΔS * (値 - RL) / ΔR + SL", + "device.tag-scale-mode-linear-tooltip": "ΔS = (スケール High - スケール Low)\nΔR = (Raw High - Raw Low)\nRL = Raw Low\nSL = スケール Low", + "device.tag-scale-mode-script": "スクリプト (読み取り/書き込み)", + "device.tag-raw-low": "Raw Low", + "device.tag-raw-high": "Raw High", + "device.tag-scaled-low": "スケール Low", + "device.tag-scaled-high": "スケール High", + "device.tag-convert-datetime": "ミリ秒から日付時刻形式への変換", + "device.tag-convert-datetime-tooltip": "例: 'YYYY-MM-DD HH:mm:ss' (2023-09-14 08:45:10 対応)", + "device.tag-convert-datetime-format": "日付時刻形式 (YYYY-MM-DD HH:mm:ss)", + "device.tag-convert-ticktime": "ミリ秒から時間形式 (残り時間または経過時間)", + "device.tag-convert-ticktime-tooltip": "例: 'HH:mm:ss' (56:45:10 対応)", + "device.tag-convert-ticktime-format": "時間形式 (HH:mm:ss)", + "device.tag-scale-read-script": "読み取りスクリプト", + "device.tag-scale-read-script-tooltip": "クライアントから受信した値を変換するスクリプト", + "device.tag-scale-read-script-params": "読み取りスクリプトのパラメータ値を入力", + "device.tag-scale-write-script": "書き込みスクリプト", + "device.tag-scale-write-script-tooltip": "クライアントへの書き込み前に値を変換するスクリプト", + "device.tag-scale-write-script-params": "書き込みスクリプトのパラメータ値を入力", + "device.tag-scale-script-params-tooltip": "スクリプトに渡す値を含むJSON形式のパラメータ配列", + " device.tag-property-webcam-device": "ウェブカメラデバイス", + "device.tag-property-webcam-device-address": "ウェブカメラデバイス ,例(/dev/video0)", + "device.tag-property-webcam-options.width": "幅", + "device.tag-property-webcam-options.height": "高さ", + "device. tag-property-webcam-options.frames": "フレーム数", + "device.tag-property-webcam-options.quality": "画質", + "device.tag-property-webcam-options.outputType": "出力タイプ", + "device.tag-property-webcam-options.callbackReturn": "コールバック戻り値", + + + + + "device.edit-placeholder-titel": "編集用プレースホルダー", + + "device.connect-ok": "接続成功", + "device.connect-error": "接続エラー", + "device.connect-failed": "接続失敗", + "device.connect-off": "オフ", + "device.connect-busy": "ビジー", + + "devices.mode-map": "デバイス図", + "devices. mode-list": "デバイス一覧", + "devices.list-name": "名前", + "devices.list-address": "アドレス", + "devices.list-type": "タイプ", + "devices.list-polling": "ポーリング", + "devices.list-enabled": "有効", + "devices.list-status": "ステータス", + + "users.list-title": "ユーザー設定", + "users.list-name": "ユーザー名", + "users.list-fullname": "フルネーム", + "users.list-groups": "グループ", + "users.list-roles": "ロール", + "users.list-start": "表示開始", + + "roles.list-title": "ロール設定", + "roles.list-index": "インデックス", + "roles.list-name": "名前", + "roles.list-description": "説明", + + "user-role-edit-title": "ロール設定", + "user-role-edit-name": "名前", + "user-role-edit-index": "インデックス", + "user-role-edit-description": "説明", + + "events-history.list-title": "イベント履歴", + "events-history.filter-daterange": "日付範囲フィルター", + + "gauges.property-props": "プロパティ", + "gauges.property-events": "イベント", + "gauges.property-title": "プロパティ", + "gauges.property-name": "名前", + "gauges.property-text": "テキスト", + "gauges.property-permission": "認証", + "gauges.property-mask": "ビットマスク", + "gauges.property-readonly": "読み取り専用", + "gauges.property-event-type": "タイプ", + "gauges.property-event-action": "アクション", + "gauges.property-event-destination": "宛先", + "gauges.property-event-destination-relative-from": "相対位置", + "gauges.property-event-destination-panel": "パネル", + "gauges.property-event-destination-hide-close": "非表示/閉じる", + "gauges.property-event-destination-target-device": "ターゲットデバイス", + "gauges.property-event-newtab": "新規タブ", + "gauges.property-event-single-card": "シングルカード", + "gauges.property-event-value": "値", + "gauges.property-event-function": "関数", + "gauges.property-event-input": "入力(名前付き入力のみ)", + "gauges.property-event-address-type": "タイプ", + "gauges.property-event-address": "リンク", + "gauges.property-event-resource": "リソース", + "gauges.property-event-width": "幅", + "gauges.property-event-height": "高さ", + "gauges.property-event-scale": "スケール" , + "gauges.property-event-script": "スクリプト", + "gauges.property-event-script-param-name": "パラメータ", + "gauges.property-event-script-param-value": "値", + "gauges.property-event-script-param-input-value": "入力値を送信するには空欄のままにする", + "gauges.property-head-device": "デバイス", + "gauges.property-head-variable": "変数", + "gauges.property-variable-value": "値", + "gauges.property-head-alarm": "アラーム", + "gauges.property-head-color": "色", + "gauges.property-head-mapvariable": "コンテキスト変数", + "gauges.property-head-tomapvariable": "コンテキスト変数を定義", + "gauges.property-head-todevice": "デバイス変数", + "gauges.property-head-value": "値", + "gauges.property-input-min": "最小値", + "gauges.property-input-max": "最大値", + "gauges.property-input-color": "塗りつぶし", + "gauges.property-input-stroke": "ストローク", + "gauges.property-input-value": "値", + "gauges.property-input-label": "ラベル", + "gauges.property-input-unit": "単位", + "gauges.property-input-type": "入力タイプ", + "gauges.property-input-type-number": "数値", + "gauges.property-input-type-text": "テキスト", + "gauges.property-input-type-date": "日付", + "gauges.property-input-type-time": "時刻", + "gauges.property-input-type-datetime": "日付と時刻", + "gauges.property-input-time-format": "時間形式", + "gauges.property-input-time-format-normal": "HH:mm", + "gauges.property-input-time-format-seconds": "HH:mm:ss", + "gauges.property-input-time-format-milliseconds": "HH:mm:ss:fff", + " gauges.property-input-milliseconds": "ミリ秒単位での変換", + "gauges.property-input-convertion": "変換", + "gauges.property-input-convertion-milliseconds": "ミリ秒", + "gauges.property-input-convertion-string": "文字列", + + "gauges.property-update-enabled": "更新を有効化", + "gauges.property-update-esc": "ESCで更新", + "gauges.property-input-esc-action": "離脱時のアクション", + "gauges.property-action-esc-update": "更新 (Refresh)", + "gauges.property-action-esc-enter": "確認 (Enter)", + "gauges.property-select-content-on-click": "クリックでコンテンツを選択", + "gauges.property-numeric-enabled": "数値のみ", + "gauges.property-format-digits": "桁のフォーマット", + "gauges.property-actions": "アクション", + "gauges.property-action-type": "タイプ", + "gauges.property-action-param": "アクションID", + "gauges.property-action-minAngle" : "最小角度", + "gauges.property-action-maxAngle" : "最大角度", + "gauges.property-action-toX" : "X位置へ", + "gauges.property-action-toY" : "Y位置へ", + "gauges.property-action-duration" : "持続時間", + "gauges.property-events-mapping-from": "コンテキスト変数", + "gauges.property-map-variable": "バインドするコンテキスト変数を追加", + "gauges.property-head-remove-mapvariable": "バインドを削除", + "gauges.property-tooltip-add-event": "イベントを追加", + "gauges.property-interval-msec": "間隔 (ミリ秒)", + "gauges.property-tag-label": "タグ", + "gauges.property-tag-internal-title": "宛先のプレースホルダー(または内部デバイスのタグ)を設定", + "gauges.property-input-range": "許可された入力範囲" , + "gauges.property-language-text": "テキストまたは @TextID", + + "bag.property-ticks": "目盛", + "bag.property-divisions": "分割", + "bag.property-subdivisions": "細分割", + "bag.property-divisions-length": "分割の長さ", + "bag.property-subdivisions-length": "小目盛りの長さ", + "bag.property-divisions-width": "目盛りの幅", + "bag.property-subdivisions-width": "小目盛りの幅", + "bag.property-divisions-color": "目盛りの色", + "bag.property-subdivisions-color": "小目盛りの色", + "bag.property-divisionfont-size": "目盛りのフォントサイズ", + "bag.property-divisionfont-color": "目盛りのフォント色", + "bag.property-divisions-labels": "目盛りのラベル (例: 10;20;...)", + "bag.property-current-value": "現在の値", + "bag.property-min": "最小値", + "bag.property-max": "最大値", + "bag.property-bar-width": "バーの幅", + "bag.property-animation-speed": "アニメーション速度", + "bag.property-angle": "角度", + "bag.property-radius": "半径", + "bag.property-font": "フォント", + "bag.property-font-size": "フォントサイズ", + "bag.property-textfield-position": "テキストフィールド位置", + "bag.property-pointer-length": "ポインタの長さ", + "bag.property-pointer-stroke": "ポインタのストローク", + "bag.property-pointer-color": "ポインタの色", + "bag.property-color-start": "色の開始点", + "bag.property-color-stop": "カラーストップ", + "bag.property-background": "背景", + "bag.property-format-digits": "数字の書式", + "bag.property-zones": "ゾーン", + "bag.property-color": "色", + "bag.property-fill": "塗りつぶし", + + "alarms.list-title": "アラーム設定", + "alarms.list-name": "名前", + "alarms.list-device": "デバイス / 変数", + "alarms.list-highhigh": "High High", + "alarms.list-high": "High", + "alarms.list-low": "Low", + "alarms.list-info": "メッセージ", + "alarms.list-actions": "アクション", + "alarm.property-title": "アラーム", + "alarm.property-name": "名前", + "alarm.property-permission": "認証", + "alarm.property-highhigh": "High High", + "alarm.property-high": "High", + "alarm.property-low": "Low", + "alarm.property-info": "メッセージ", + "alarm.property-action": "アクション", + "alarm.property-enabled": "有効", + "alarm.property-save-event": "イベント", + "alarm.property-min": "最小", + "alarm.property-max": "最大", + "alarm.property-timedelay": "最小-最大範囲の時間 (秒)", + "alarm.property-checkdelay": "チェック間隔 (秒)", + "alarm.property-type": "タイプ", + "alarm.property-ackmode": "承認モード", + "alarm.property-text": "テキスト", + "alarm.property-group": "グループ", + "alarm.ack-float": "フローティング", + "alarm.ack-active": "アクティブアラームによる承認を許可", + "alarm.ack-passive": "パッシブアラームのみによる承認", + "alarms.view-title": "アラーム", + "alarms.history-title": "履歴アラーム", + "alarms.view-ontime": "日付/時刻", + "alarms.view-text": "テキスト", + "alarms.view-group": "グループ", + "alarms.view-status": "ステータス", + "alarms.view-type": "優先度", + "alarms.view-offtime": "OFF 日時", + "alarms.view-acktime": "ACK 日時", + "alarms.view-userack": "ACK ユーザー", + "alarms.view-ack": "ACK", + "alarms.view-ack-all-alarms": "ACK 全アラーム", + "alarm.status-active": "アクティブ", + "alarm.status-passive": "パッシブ", + "alarm.status-active-ack": "アクティブ-ACK", + "alarms.show-current": "アラーム", + "alarms.show-history": "履歴アラーム", + "alarm.action-popup": "ポップアップ表示", + "alarm.action-onsetview": "ビュー設定", + "alarm.action-onsetvalue": "値を設定", + "alarm.action-onRunScript": "スクリプトを実行" , + "alarm.action-toastMessage": "メッセージを表示", + "alarm.action-sendMsg": "メッセージを送信", + "alarm.property-action-type": "アクションタイプ", + "alarm.property-action-value": "設定する値", + "alarm.property-action-destination": "表示するビュー", + "alarm.property-action-toastMessage": "表示するメッセージ", + "alarm.property-action-toastType": "タイプ", + + "notifications.list-title": "通知設定", + "notifications.list-name": "名前", + "notifications.list-receiver": "受信者", + "notifications.list-delay": "遅延", + "notifications.list-interval": "間隔", + "notifications.list-type": "タイプ", + "notifications.list-enabled": "有効", + "notifications.list-subscriptions": "サブスクリプション", + "notification.property-title": "通知", + "notification.property-name": "名前", + "notification.property-receiver": "受信者: メールアドレス ';' / WebApi (Telegram https://api.telegram.org/bot...${content})" , + "notification.property-type": "タイプ", + "notification.property-delay": "遅延 (分)", + "notification.property-interval": "間隔 (分)", + "notification.property-enabled": "有効", + "notification.property-priority": "優先度", + "notification.type-alarm": "アラーム", + "notification.type-trigger": "トリガー", + + "scripts.list-title": "スクリプト設定", + "scripts.list-name": "名前", + "scripts.list-type": "タイプ", + "scripts.list-mode": "モード", + "scripts.list-params": "パラメータ", + "scripts.list-scheduling": "スケジュール / 間隔", + "scripts.list-permission": "権限", + "scripts.list-options": "スクリプトオプション", + + "script.permission-title": "権限", + "script.permission-label": "(空 = 全員に完全アクセス権)", + "script.permission-enabled": "有効", + + "script.create-title": "スクリプト作成", + + "script.mode": "実行モード", + "script.mode-title": "実行モード", + "script.mode-label": "実行モード", + "script.mode-CLIENT": "クライアント (ブラウザで実行)", + "script.mode-SERVER": "サーバー (サーバーで実行)", + + "script.property-title": "スクリプト", + "script.property-systems": "システム関数", + "script.property-templates": "テンプレート", + "script.property-test": "テスト", + "script.property-test-params": "関数パラメータ", + "script.property-test-console": "コンソール", + "script.property-test-tag": "タグ設定", + "script.property-test-run": "テスト実行", + "script.property-editname": "スクリプト名編集", + "script.property-name": "名前", + "script.property-addfnc-param": "スクリプトパラメータ追加", + "script.property-async-function": "非同期関数", + "script.param-title": "スクリプトパラメータ", + "script.param-name": "名前", + "script.param-type": "タイプ", + "script.paramtype": "", + "script.paramtype-tagid": "タグID", + "script.paramtype-value": "値 (数値/文字列/オブジェクト)", + "script.paramtype-chart": "チャートライン (配列)", + "script.param-name-exist": "パラメータ名が既に存在します!", + "script.sys-fnc-settag-text": "$setTag (TagID, value)", + "script.sys-fnc-settag-tooltip": "タグ値を設定するシステム関数: $setTag (TagID as string, value as string or number)", + " script.sys-fnc-gettag-text": "$getTag (TagID)", + "script.sys-fnc-gettag-tooltip": "タグ値を取得するシステム関数: $getTag (TagID as string) 文字列または数値として値を返す", + "script.scheduling-title": "スクリプトスケジューリング", + "script.scheduling-type": "タイプ" , + "script.scheduling-interval": "間隔でループ", + "script.scheduling-start": "開始時のみ", + "script.scheduling-add-item": "スケジューラを追加", + "script.scheduling-scheduling": "スケジュール", + "script.scheduling-weekly": "毎週", + "script.scheduling-date": "日付", + "script.scheduling-time": "時刻", + "script.scheduling-hour": "時間", + "script.scheduling-minute": "分", + "script.interval": "間隔 (秒)", + "script.delay": "遅延 (秒)", + "script.sys-fnc-setview-text": "$setView (View name)", + "script.sys-fnc-setview-tooltip": "クライアントでビューを設定するシステム関数: $setView (View name as string)", + "script.sys-fnc-setview-params": "'View name'", + "script.sys-fnc-opencard-text": "$openCard (View name)", + "script.sys-fnc-opencard-tooltip": "クライアントでカードを開くシステム関数: $openCard (View name as string, Options as dict {left, top})", + "script.sys-fnc-opencard-params": "'View name'", + "script.sys-fnc-enableDevice-text": "$enableDevice (Device name, enable True/False)", + "script.sys-fnc-enableDevice-tooltip": "デバイス接続を有効化するシステム関数: $enableDevice (Device name as string, enable as boolean)", + "script.sys-fnc-enableDevice-params": "'Device name', true", + "script.sys-fnc-getDevice-text": "$getDevice (Device name, interface True/False)", + "script.sys-fnc-getDevice-tooltip": "デバイスオブジェクトを取得するシステム関数: $getDevice (Device name as string, get Comm Interface as boolean)", + "script.sys-fnc-getDevice-params": "'Device name', true", + "script.sys-fnc-setAdapterToDevice-text": "$setAdapterToDevice(Adapter name, Device name)", + "script.sys-fnc-setAdapterToDevice-tooltip": "アダプター(internal Device)をデバイスにバインドするシステム関数: $setAdapterToDevice (Adapter name as string, Device name as string)", + "script.sys-fnc-setAdapterToDevice-params": "'Adapter name', 'Device name'", + "script.sys-fnc-resolveAdapterTagId-text": "$resolveAdapterTagId(TagID)", + "script.sys-fnc-resolveAdapterTagId-tooltip": "アダプタ(internal Device)にバインドされたデバイスのタグIDを取得するシステム関数: $resolveAdapterTagId (TagID as string)", + "script. sys-fnc-resolveAdapterTagId-params": "'TagID of Adapter'", + "script.sys-fnc-getTagId-text": "$getTagId (Tag name, [Device name])", + "script.sys-fnc-getTagId-tooltip": "タグIDを取得するシステム関数: $getTagId (Tag name as string, [Optional Device name as string])", + "script.sys-fnc-getTagId-params": "'Tag name', ", + "script.sys-fnc-getTagDaqSettings-text": "$getTagDaqSettings (TagID)", + "script.sys-fnc-getTagDaqSettings-tooltip": "タグのDAQ設定を取得するシステム関数: $getTagDaqSettings (TagID as string)", + "script.sys-fnc-getTagDaqSettings-params": "'TagID'", + "script.sys-fnc-setTagDaqSettings-text": "$setTagDaqSettings (TagID, DaqSettings)", + "script.sys-fnc-setTagDaqSettings-tooltip": "タグDAQ設定を設定するシステム関数: $setTagDaqSettings (TagID as string, DaqSettings as object {restored: boolean, enabled: boolean, changed: boolean, interval: number, lastDaqSaved: number} )", + "script.sys-fnc-setTagDaqSettings-params": "'TagID', 'DaqSettings'", + "script.sys-fnc-invokeObject-text": "$invokeObject (Object name, Function name, [Parameter])", + "script.sys-fnc-invokeObject-tooltip": "オブジェクト関数を呼び出すシステム関数: $invokeObject (Object name as string, function name as string , [parameter])", + "script.sys-fnc-invokeObject-params": "'オブジェクト名', 'function name', ", + "script.sys-fnc-runServerScript-text": "$runServerScript (Script name, [Parameter])", + "script.sys-fnc-runServerScript-tooltip": "クライアント関数によるサーバースクリプト関数の呼び出し: $runServerScript (Script name as string, [parameter])", + "script.sys-fnc-runServerScript-params": "'Server script name', ", + "script.sys-fnc-getDeviceProperty-text": "$getDeviceProperty(Device name)", + "script.sys-fnc-getDeviceProperty-tooltip": "デバイスプロパティを取得するシステム関数: $getDeviceProperty(Device name as string)", + "script.sys-fnc-getDeviceProperty-params": "'Device name'", + "script.sys-fnc-setDeviceProperty-text": "$setDeviceProperty(Device name, property)", + "script.sys-fnc-setDeviceProperty-tooltip": "デバイスプロパティを設定するシステム関数: $setDeviceProperty(Device name as string, Property as object {address, port, ...} )", + "script.sys-fnc-setDeviceProperty-params": "'Device name', 'Property'", + "script.sys-fnc-getHistoricalTag-text": "$getHistoricalTags(TagIds array, from msec., to msec.)", + "script.sys-fnc-getHistoricalTag-tooltip":"ミリ秒範囲で履歴タグを取得: $getHistoricalTags([TagIds] as array, from as number, to as number)", + "script.sys-fnc-getHistoricalTag-params":"'タグID配列', '開始ミリ秒', '終了ミリ秒'", + "script.sys-fnc-sendMessage-text": "$sendMessage(address, subject, message)", + "script.sys-fnc-sendMessage-tooltip": "メッセージ(メール)を送信するシステム関数: $sendMessage(address as string, subject as string, message as string)", + "script.sys-fnc-sendMessage-params": "'address', 'subject', 'message'" , + "script.sys-fnc-getAlarms-text": "$getAlarms()", + "script.sys-fnc-getAlarms-tooltip": "アラームリストを取得するシステム関数 (): $getAlarms()", + "script.sys-fnc-getAlarms-params": "", + "script.sys-fnc-getAlarmsHistory-text": "$getAlarmsHistory(from msec., to msec.)", + "script.sys-fnc-getAlarmsHistory-tooltip": "履歴アラームリストを取得するシステム関数 (): $getAlarmsHistory(from as number, to as number)", + "script.sys-fnc-getAlarmsHistory-params": "'From msec.', 'To msec.'" , + "script.sys-fnc-ackAlarms-text": "$ackAlarm(Alarm name, types)", + "script.sys-fnc-ackAlarms-tooltip": "アラームをACKするシステム関数 (): $ackAlarm(Alarm name as string, [types] 'highhigh|high|low')", + "script.sys-fnc-ackAlarms-params": "'Alarm name', 'types'", + + "script.template-chart-data-text": "カスタマイズされたチャートデータ" , + "script.template-chart-data-tooltip": "返すカスタムチャートデータのコードテンプレート", + "script.template-invoke-chart-update-options-text": "チャート更新オプション", + "script.template-invoke-chart-update-options-tooltip": "チャートオプション(Y軸スケール範囲)を更新するコードテンプレート。クライアントモードのみ!", + "script.template-getHistoricalTagsoptions-text": "履歴タグの値を取得", + "script.template-getHistoricalTagsoptions-tooltip": "履歴タグの値を取得するコードテンプレート。", + + "client.script-access-title": "クライアントスクリプトへのアクセス", + "client.script-access-info": "フロントエンド(例:ウィジェット)から window.iFEMSScriptAPI 経由でシステム機能へのアクセスを設定します。", + + "reports.list-title": "レポート設定", + "reports.list-name": "名前", + "reports.list-type": "タイプ", + "reports.list-receiver": "受信者", + "reports.list-scheduling": "スケジュール / 間隔", + "reports.list-enabled": "有効", + + "report.property-title": "レポート", + "report.property-name": "名前", + "report.property-receiver": "受信者メールアドレス", + "report.property-scheduling-type": "レポートスケジュール", + "report.property-content": "内容", + "report.property-page": "ページ設定", + "report.property-page-size": "ページサイズ", + "report.property-page-orientation": "ページ向き", + "report.property-page-ori-landscape": "横向き", + "report.property-page-ori-portrait": "縦向き", + "report.property-margin-left": "左マージン", + "report.property-margin-top": "上マージン", + "report.property-margin-right": "右マージン", + "report.property-margin-bottom": "下マージン", + "report.scheduling-none": "無効", + "report.scheduling-day": "毎日", + "report.scheduling-week": "毎週", + "report.scheduling-month": "毎月", + "report.content-addtext": "テキストを追加", + "report.content-addtable": "タグテーブルを追加", + "report.content-addalarms": "アラーム履歴を追加", + "report.content-addchart": "チャート追加", + "report.content-type-text": "テキスト", + "report.content-type-tagstable": "タグテーブル", + "report.content-type-alarmshistory": "履歴アラーム", + "report.content-type-chart": "チャート", + "report.content-fontsizeitem": "フォントサイズ", + "report.content-alignitem": "テキスト配置", + "report.content-edit": "編集", + "report.content-delete": "削除", + "report.item-text-title": "レポートテキスト", + "report.item-text-label": "テキスト", + "report.tags-table-title": "レポートタグテーブル", + "report.tags-table-column": "テーブル列タグ", + "report. tags-table-add": "タグを追加", + "report.tags-table-setlabel": "ラベルを設定", + "report.table-alignitem": "揃える", + "report.table-delitem": "列を削除", + "report. item-daterange": "データ範囲", + "report.item-daterange-none": "なし", + "report.item-daterange-day": "前日 (0-24)", + "report.item-daterange-week": "先週 (月曜日-日曜日)", + "report.item-daterange-month": "先月", + "report.item-interval": "間隔(期間)", + "report.item-interval-min5": "5分", + "report.item-interval-min10": "10分", + "report.item-interval-min30": "30分", + "report.item-interval-hour": "1時間", + "report.item-interval-day": "1日", + "report.item-function-type": "関数タイプ", + "report.item-function-min": "最小値", + "report.item-function-max": "最大値", + "report.item-function-average": "平均値", + "report.item-function-sum": "合計値", + "report.item-alarms-title": "レポートアラーム", + "report.alarms-priority": "アラーム優先度", + "report.alarms-column": "アラーム列", + "report.alarms-filter": "アラームフィルター", + "report.chart-title": "レポートチャート", + "report.chart-name": "チャート名", + "report.chart-width": "幅", + "report.chart-height": "高さ", + + "maps.locations-list-title": "場所設定", + "maps.locations-list-name": "名前", + "maps.locations-list-view": "表示", + "maps.locations-list-description": "説明", + "maps.location-property-title": "場所", + "maps.location-property-name": "名前", + "maps.location-property-description": "説明", + "maps.location-property-latitude": "緯度", + "maps.location-property-longitude": "経度", + "maps.location-property-card": "カード", + "maps.location-property-view": "表示", + "maps.location-property-url": "URL", + "maps.edit-add-location": "場所を追加", + "maps.edit-import-location": "場所をインポート", + "maps.edit-edit-location": "場所を編集", + "maps.edit-remove-location": "位置情報の削除", + "maps.edit-start-location": "開始位置として設定", + "maps.edit-start-location-saved": "開始位置が保存されました", + "maps.close-popups": "全てのポップアップを閉じる", + "maps.location-to-import": "インポートする位置情報", + "maps.location-to-import-input-title": "インポートする位置情報を選択", + + "logs.view-title": "システムログ", + "logs.view-files": "ログファイル", + + "events.view-ontime": "日付/時刻", + "events.view-type": "タイプ", + "events.view-source": "ソース", + "events.view-text": "テキスト", + + "card.config-title": "カード設定", + "card.config-content-type": "コンテンツタイプ", + "card.config-content-view": "コンテンツ表示", + "card.config-content-iframe": "リンク先アドレス", + "card.widget-view": "表示", + "card.widget-alarms": "アラーム", + "card.widget-table": "テーブル", + "card.widget-iframe": "リンク", + "card.style-zoom": "ズーム", + + "resources.lib-icons": "アイコン", + "resources.lib-images": "画像", + "resource.list-title": "リソース一覧", + "resource.list-name": "ファイル名", + "resource.list-type": "ファイルタイプ", + "resource.list-title-fonts": "フォント一覧", + "resources.lib-widgets": "ウィジェット", + + "widgets.kiosk-title": "ウィジェットキオスク", + "widget.remove": "ウィジェットを削除", + + "texts.list-title": "言語設定", + "texts.list-filter": "フィルター", + "texts.list-filter-group": "グループ", + "texts.list-id": "ID", + "texts.list-group": "グループ", + "texts.list-value": "テキスト(デフォルト)", + "texts.list-add-text": "テキストを追加", + "texts.list-edit-language": "言語を編集", + "language.settings-title": "言語設定", + "language.settings-add-tooltip": "言語を追加", + "language.settings-id": "キー", + "language.settings-default-id": "キー (デフォルト)", + "language.settings-id-placeholder": "例: EN", + "language.settings-name": "名前", + "language.settings-default-name": "名前 (デフォルト)", + "language.settings-name-placeholder": "例: 英語", + "text.settings-title": "テキスト", + "text.settings-id": "名前 (許可される文字と数字、スペース不可)", + "text.settings-group": "グループ", + "text.settings-value": "テキスト (デフォルト)", + + "gui.range-number-min": "最小値", + "gui.range-number-max": "最大値", + "gui.range-number-boolean": "マスク値", + "gui.range-number-true": "真 [1-1]", + "gui.range-number-false": "偽 [0-0]", + "gui.range-number-switcher": "数値またはブール値としての範囲", + + "dlg.bitmask-title": "ビットマスク", + + "dlg.plugins-title": "サーバープラグイン", + "dlg.plugins-info": "インストールされていないプラグインはサーバーで手動インストール可能: 'npm install [package name]@[version]'", + "dlg.plugins-type": "タイプ", + "dlg.plugins-name": "名前", + "dlg.plugins-version": "バージョン", + "dlg.plugins-current": "インストール済み", + "dlg.plugins-description": "説明", + "dlg.plugins-status-installing": "インストール中...", + "dlg.plugins-status-removing": "削除中...", + "dlg.plugins-status-installed": "インストール中...OK!", + "dlg.plugins-status-removed": "削除中...OK!", + "dlg.plugins-status-error": "エラー!手動で試してください!", + + "dlg.setup-title": "セットアップ", + "dlg.setup-gui": "ユーザーインターフェース", + "dlg.setup-diverse": "その他", + "dlg.setup-logic": "ロジック", + "dlg.setup-system": "システム", + "dlg.setup-views": "ビュー", + "dlg.setup-connections": "接続", + "dlg.setup-users": "ユーザー", + "dlg.setup-user-roles": "ロール", + "dlg.setup-alarms": "アラーム", + "dlg.setup-line-charts": "折れ線グラフ", + "dlg.setup-bar-charts": "棒グラフ", + "dlg.setup-maps-locations": "場所", + "dlg.setup-layout": "レイアウト", + "dlg.setup-plugins": "プラグイン", + "dlg.setup-scripts": "スクリプト", + "dlg.setup-reports": "レポート", + "dlg.setup-settings": "設定", + "dlg.setup-client-access": "フロントエンドスクリプト", + "dlg.setup-logs": "ログ", + "dlg.setup-notifications": "通知", + "dlg.setup-events": "イベント", + "dlg.setup-resources": "リソース", + "dlg.setup-fonts": "フォント", + "dlg.setup-language": "言語", + "dlg.app-settings-title": "設定", + "dlg.app-settings-system": "システム", + "dlg.app-settings-smtp": "SMTP", + "dlg.app-settings-smtp-host": "ホスト", + "dlg.app-settings-smtp-port": "ポート", + "dlg.app-settings-smtp-mailsender": "メール送信者", + "dlg.app-settings-smtp-user": "ユーザー/ApiKey", + "dlg.app-settings-smtp-password": "パスワード", + "dlg.app-settings-smtp-testaddress": "テストメッセージ送信先メールアドレス", + "dlg.app-settings-smtp-test": "テスト", + "dlg.app-settings-language": "言語", + "dlg.app-language-de": "ドイツ語", + "dlg.app-language-en": "英語", + "dlg.app-language-ru": "ロシア語", + "dlg.app-language-ua": "ウクライナ語", + "dlg.app-language-zh-cn": "中国語", + "dlg.app-language-pt": "ポルトガル語", + "dlg.app-language-sv": "スウェーデン語", + "dlg.app-language-tr": "トルコ語", + "dlg.app-language-ko": "韓国語", + "dlg.app-language-es": "スペイン語", + "dlg.app-language-fr": "フランス語", + "dlg.app-language-ja": "日本語", + "dlg.app-settings-server-port": "サーバーはポートで待機中", + "dlg.app-settings-server-log-full": "ログ満杯モード", + "dlg.app-settings-alarms": "アラーム", + "dlg.app-settings-alarms-clear": "全てのアラームと履歴をクリア", + "dlg.app-settings-auth-token": "トークンによる認証", + "dlg.app-settings-auth-only-editor": "編集者のみ", + "dlg.app-auth-disabled": "無効", + "dlg.app-auth-expiration-15m": "有効(トークン有効期限15分)", + "dlg.app-auth-expiration-1h": "有効(トークン有効期限:1時間)", + "dlg.app-auth-expiration-3h": "有効(トークン有効期限:3時間)", + "dlg.app-auth-expiration-1d": "有効(トークン有効期限:1日)", + "dlg.app-auth-tooltip": "有効化済み: 管理者アカウント 'admin/123456' が存在します(変更をお忘れなく)。サーバーの再起動が必要です!", + "dlg.app-settings-client-broadcast": "クライアント(フロントエンド)に全タグ値をブロードキャスト", + + "dlg.app-settings-daqstore": "DAQストレージ", + "dlg.app-settings-daqstore-type": "データベースタイプ", + "dlg.app-settings-daqstore-url": "URL", + "dlg.app-settings-daqstore-token": "トークン", + "dlg.app-settings-daqstore-bucket": "バケット", + "dlg.app-settings-daqstore-organization": "組織", + "dlg.app-settings-daqstore-retention": "保持期間", + "dlg.app-settings-daqstore-database": "データベース名", + "dlg.app-settings-daqstore-username": "ユーザー名", + " dlg.app-settings-daqstore-password": "パスワード", + + "dlg.app-settings-user-group-label": "認証タイプ", + "dlg.app-settings-user-group": "グループ (デフォルト)", + "dlg.app-settings-user-roles": "ロール", + + "store.retention-none": "無効", + "store.retention-day1": "1日間", + "store.retention-days2": "2日間", + "store.retention-days3": "3日間", + "store.retention-days7": "7日間", + "store.retention-days14": "14日間", + "store.retention-days30": "30日間", + "store.retention-days90": "90日間", + "store.retention-year1": "1年間", + "store.retention-year3": "3年間", + "store.retention-year5": "5年間", + + "plugin.group-connection-device": "接続デバイス", + "plugin.group-connection-database": "接続データベース", + "plugin.group-chart-report": "レポート用チャート画像", + + "action-settings-title": "アクション設定", + "action-settings-readonly-tag": "タグ", + "action-settings-readonly-values": "値", + + "msg.alarm-ack-all": "全てのアラームを承認しますか?", + "msg.alarm-remove": "アラームを削除しますか?", + "msg.text-remove": "テキストを削除しますか?", + "msg.alarmproperty-error-exist": "アラーム名が存在します!", + "msg.alarmproperty-missing-value": "値が不足しています!", + "msg.textproperty-error-exist": "テキストIDが存在します!", + "msg.textproperty-missing-value": "一部の値が不足しています!", + "msg.device-remove": "デバイスを削除しますか?", + "msg.device-tag-remove": "タグを削除しますか?", + "msg.device-tag-exist": "タグ名が存在します!", + "msg.device-tag-invalid-char": "タグ名に '@' 文字は使用できません!", + "msg.notification-property-missing-value": "一部の値が不足しています!", + "msg.report-property-missing-value": "不正または不足している値があります!", + "msg.file-upload-failed": "アップロードに失敗しました!", + "msg.file-delete-failed": "ファイル削除に失敗しました!", + + "msg.home-welcome": "お待ちください...エディタに移動し、デバイスをマッピングし、可視化を設計し、デバイス変数をバインドしてください", + "msg.server-connection-failed": "サーバー接続に失敗しました!", + "msg.project-load-error": "'{{value}}' を読み取れませんでした", + "msg.project": "プロジェクトの変更を保存しますか?", + "msg.tags-remove-all": "全てのタグを削除しますか?", + "msg.view-remove": "ビュー '{{value}}' を削除しますか?", + "msg.chart-remove": "チャート '{{value}}' を削除しますか?", + "msg.role-remove": "ロール '{{value}}' を削除しますか?", + "msg.graph-remove": "棒グラフ '{{value}}' を削除しますか?", + "msg.script-remove": "スクリプト '{{value}}' を削除しますか?", + "msg.report-remove": "レポート を削除しますか?", + "msg.device-connection-error": "デバイス '{{value}}' の接続エラー!", + "msg.server-connection-error": "サーバー接続に失敗しました!", + "msg.sendmail-success": "メール送信に成功しました!", + "msg.sendmail-error": "メール送信に失敗しました!", + "msg.users-save-error": "ユーザー保存に失敗しました!", + "msg.user-remove": "ユーザー を削除しますか?", + "msg.project-save-success": "プロジェクト保存成功!", + "msg.project-save-error": "プロジェクト保存失敗!", + "msg.project-format-error": "プロジェクト形式不正!", + "msg.view-format-error": "ビュー形式不正!", + "msg.project-save-unauthorized": "プロジェクト保存失敗!権限不足!", + "msg.project-save-ask": "プロジェクトを離れますか?", + "msg.login-username-required": "ユーザー名を入力してください", + "msg.login-password-required": "パスワードを入力してください", + "msg.signin-failed": "ユーザー名またはパスワードが間違っています!", + "msg.signin-unauthorized": "権限がありません!", + "msg.get-project-void": "プロジェクトが見つかりません!", + "msg.editor-mode-locked": "エディターは既に開いています!", + "msg.alarms-clear-success": "全てのアラームがキャンセルされました!", + "msg.import-devices-error": "デバイスのインポートに失敗しました!", + "msg.report-build-forced": "ビルドレポートの送信に成功しました", + "msg.report-build-error": "ビルドレポート送信に失敗しました!", + "msg.device-tags-request-result": "{{current}}件中{{value}}件を読み込み", + "msg.chart-with-script": "定義されたスクリプトはチャート行のリストをパラメータとして受け取り、データを付加した完成リストを返します。コードサンプルはスクリプト 'Templates' 内にあります", + "msg.script-name-exist": " スクリプト名が存在します!", + "msg.invalid-script-name": "無効なスクリプト名です!", + "msg.templates-exist-ask-overwrite": "名前 '{{value}}' のテンプレートは既に存在します。上書きしますか?", + "msg.templates-save-success": "テンプレートの保存に成功しました!", + "msg.view-name-exist": "ビュー名が存在します!", + "msg.notification-name-exist": "通知名が存在します!", + "msg.file-remove": "'{{value}}' を削除しますか?", + "msg.notification-remove": "通知 '{{value}}' を削除しますか?", + "msg.maps-location-remove": "マップ位置 '{{value}}' を削除しますか?", + "msg.maps-location-name-exist": "マップ位置名が既に存在します!", + "msg.text-name-exist": "テキスト名が既に存在します!", + "msg.texts-text-remove": "テキスト '{{value}}' を削除しますか?", + "msg.operation-unauthorized": "操作が許可されていません!" +} \ No newline at end of file diff --git a/client/dist/assets/i18n/ru.json b/client/dist/assets/i18n/ru.json index f64c6adeb..0676f8952 100644 --- a/client/dist/assets/i18n/ru.json +++ b/client/dist/assets/i18n/ru.json @@ -254,7 +254,7 @@ "graph.property-date-last-range": "Диапазон времени", "graph.property-date-group": "Группа", "graph.property-offline": "Онлайн", - "graph.property-graph-oriantation": "Ориентация", + "graph.property-graph-orientation": "Ориентация", "graph.property-ori-vartical": "Вертикальная", "graph.property-ori-horizontal": "Горизонтальная", "graph.property-decimals": "Десятичные", diff --git a/client/dist/assets/i18n/sv.json b/client/dist/assets/i18n/sv.json index 4d6758338..918bd4308 100644 --- a/client/dist/assets/i18n/sv.json +++ b/client/dist/assets/i18n/sv.json @@ -77,6 +77,11 @@ "dlg.menuitem-alarms": "Larm vid klick", "dlg.menuitem-address": "Länkadress", "dlg.menuitem-icons-filter": "Ikonfilter", + + "dlg.menuitem-submenu": "Undermeny", + "dlg.menuitem-add-submenu": "Lägg till undermenyobjekt", + "dlg.menuitem-submenu-items": "Undermenyobjekt", + "sidenav.new_item": "Nytt undermenyobjekt", "dlg.headeritem-title": "Headerobjekt", "dlg.headeritem-icon": "Ikon", @@ -357,7 +362,7 @@ "graph.property-date-last-range": "Datumintervall", "graph.property-date-group": "Grupp", "graph.property-offline": "Online", - "graph.property-graph-oriantation": "Orientering", + "graph.property-graph-orientation": "Orientering", "graph.property-ori-vartical": "Vertikal", "graph.property-ori-horizontal": "Horisontell", "graph.property-decimals": "Decimaler", diff --git a/client/dist/assets/i18n/zh-cn.json b/client/dist/assets/i18n/zh-cn.json index 956a03f53..04b0e768e 100644 --- a/client/dist/assets/i18n/zh-cn.json +++ b/client/dist/assets/i18n/zh-cn.json @@ -23,6 +23,7 @@ "header.help": "FUXA帮助", "header.help-tutorial": "教程", "header.help-info": "关于", + "header.change-thema": "切换主题(beta)", "header.info-version": "版本", "header.theme": "主题 明亮/黑暗", @@ -41,8 +42,10 @@ "dlg.layout-lbl-icon": "图标", "dlg.layout-lbl-sview": "启动视图", "dlg.layout-lbl-login-start": "启动时显示登录", + "dlg.layout-lbl-login-overlay-color": "覆盖颜色", "dlg.layout-lbl-zoom": "缩放", "dlg.layout-navigation-mode": "显示导航", + "dlg.layout-connection-message": "显示连接错误(Toast)", "dlg.layout-show-dev": "显示按钮", "dlg.layout-navigation": "导航侧菜单", "dlg.layout-nav-bkcolor": "背景色", @@ -54,7 +57,16 @@ "dlg.layout-header-fgcolor": "颜色", "dlg.layout-lbl-title": "标题", "dlg.layout-lbl-alarms": "警报通知模式", + "dlg.layout-lbl-datetime": "时间和日期格式(dd/MM/yyyy - hh:mm a)", "dlg.layout-lbl-infos": "信息通知模式", + "dlg.layout-lbl-font": "字体族", + "dlg.layout-lbl-font-size": "字体大小", + "dlg.layout-lbl-anchor": "方向", + "dlg.layout-lbl-margin-left": "左边距", + "dlg.layout-lbl-margin-right": "右边距", + "dlg.layout-lbl-login-info": "登录信息", + "dlg.layout-lbl-custom-styles": "自定义样式", + "dlg.layout-lbl-show-language": "显示语言", "dlg.menuitem-title": "菜单项目", "dlg.menuitem-image": "[我的图片...]", @@ -64,8 +76,14 @@ "dlg.menuitem-link": "通过点击进行链接", "dlg.menuitem-alarms": "通过点击发出警报", "dlg.menuitem-address": "链接地址", + "dlg.menuitem-icons-filter": "图标筛选", + + "dlg.headeritem-title": "页眉项", + "dlg.headeritem-icon": "图标", + "dlg.headeritem-icons-filter": "图标筛选", "dlg.docproperty-title": "查看属性", + "dlg.docproperty-name": "名称", "dlg.docproperty-width": "宽度", "dlg.docproperty-height": "高度", "dlg.docproperty-background": "背景", @@ -80,41 +98,62 @@ "dlg.docproperty-size-1600-1200": "1600 x 1200 像素", "dlg.docproperty-size-1920-1080": "1920 x 1080 像素", "dlg.docproperty-margin": "边距", + "dlg.docproperty-align": "对齐", + "dlg.docproperty-align-placeholder": "页面上的对齐方式", + "dlg.docproperty-align-topCenter": "顶部", + "dlg.docproperty-align-middleCenter": "中间", + "dlg.docproperty-gridtype": "网格类型", + "dlg.docproperty-gridtype-placeholder": "网格布局类型", + "dlg.docproperty-gridtype-fit": "适应", + "dlg.docproperty-gridtype-scrollVertical": "垂直滚动", + "dlg.docproperty-gridtype-scrollHorizontal": "水平滚动", + "dlg.docproperty-gridtype-fixed": "固定", + "dlg.docproperty-gridtype-verticalFixed": "垂直固定", + "dlg.docproperty-gridtype-horizontalFixed": "水平固定", + "dlg.docproperty-renderDelay": "视图渲染延迟(毫秒)", "dlg.docname-title": "视图名称", "dlg.docname-name": "名称", "dlg.docproperty-type": "视图类型", "dlg.item-title": "名称", "dlg.item-name": "名称", - "dlg.item-req-name": "名称(不允许有间隔或数字)", - "dlg.item-name-error": "名称存在!", + "dlg.item-req-name": "名称(不允许有空格或数字)", + "dlg.item-name-error": "名称已存在!", "dlg.parameter-title": "参数", "dlg.tagname-title": "标签名称", "dlg.tagname-name": "标签名称", - "dlg.linkproperty-title": "制作超链接", + "dlg.linkproperty-title": "创建超链接", "dlg.linkproperty-url": "超链接URL", "dlg.login-title": "登录...", - "dlg.logout-btn": "签出", + "dlg.logout-btn": "退出登录", "dlg.ok": "确定", "dlg.cancel": "取消", "dlg.close": "关闭", + "dlg.apply": "应用", "dlg.userproperty-title": "用户", "dlg.userproperty-groups": "授权组", - "dlg.useraccess-groups": "授权 (空 = 对全体授权)", + "dlg.userproperty-roles": "授权角色", + "dlg.useraccess-groups": "授权(空=对所有人授权)", + "dlg.userproperty-language": "语言", + "dlg.userproperty-start": "起始视图", "dlg.gauge-permission-title": "授权", - "dlg.gauge-permission-label": "(空 = 对全体授权)", + "dlg.gauge-permission-label": "(空=对所有人授权)", "dlg.gauge-permission-show": "显示", "dlg.gauge-permission-enabled": "已启用", + "date.range-start": "开始日期", + "date.range-end": "结束日期", + + "general.search-up": "搜索", "general.close": "关闭", "general.search": "搜索...", - "general.search-notfound": "没有找到选项", + "general.search-notfound": "未找到选项", "general.username": "用户名", "general.fullname": "全名", "general.password": "密码", @@ -128,30 +167,67 @@ "general.align-center": "居中", "general.align-right": "右", "general-left": "左", - "General-top": "顶部", - "General-x": "X", + "general-top": "顶部", + "general-x": "X", "general-y": "Y", + "general.monday": "星期一", + "general.monday-short": "周一", + "general.tuesday": "星期二", + "general.tuesday-short": "周二", + "general.wednesday": "星期三", + "general.wednesday-short": "周三", + "general.thursday": "星期四", + "general.thursday-short": "周四", + "general.friday": "星期五", + "general.friday-short": "周五", + "general.saturday": "星期六", + "general.saturday-short": "周六", + "general.sunday": "星期日", + "general.sunday-short": "周日", + "general.save-template": "保存为模板", + "general.import-template": "从模板导入", "tester.title": "变量", "tester.send": "发送", - "item.navsode-none": "无", - "item.navsode-push": "推送", - "item.navsode-over": "结束", - "item.navsode-fix": "固定", + "item.overlaycolor-none": "无", + "item.overlaycolor-black": "黑色", + "item.overlaycolor-white": "白色", + + "item.navsmode-none": "无", + "item.navsmode-push": "推送", + "item.navsmode-over": "结束", + "item.navsmode-fix": "固定", "item.navtype-icons": "图标", "item.navtype-text": "文本", "item.navtype-icons-text-block": "图标和文本(块)", " item.navtype-icons-text-inline": "图标和文本(内联)", + "item.headertype-button": "按钮", + "item.headertype-label": "标签", + "item.headertype-image": "图片", + "item.headeranchor-left": "左", + "item.headeranchor-right": "右", + "item.headeranchor-center": "中间", + "item.notifymode-hide": "隐藏", "item.notifymode-fix": "固定", "item.notifymode-float": "推送", - "item.zoommod-disabled": "禁用的", - "item.zoomode-enabled": "手动", - "item.zoomode-autoresize": "自动调整大小", + "item.logininfo-type-nothing": "无", + "item.logininfo-type-username": "用户名", + "item.logininfo-type-fullname": "全名", + "item.logininfo-type-both": "用户名和全名", + + "item.language-show-mode-nothing": "隐藏", + "item.language-show-mode-simple": "显示", + "item.language-show-mode-key": "显示键值", + "item.language-show-mode-fullname": "显示全名", + + "item.zoommode-disabled": "禁用的", + "item.zoommode-enabled": "手动", + "item.zoommode-autoresize": "自动调整大小", "item.headerbarmode-hide": "隐藏", "item.headerbarmode-show": "显示", @@ -160,6 +236,7 @@ "item.inputmode-disabled": "已禁用", "item.inputmode-enabled": "对话框", "item.inputmode-keyboard": "虚拟键盘", + "item.inputmode-keyboard-full-screen": "虚拟键盘全屏", "chart.config-title": "图表设置", "chart.config-charts": "图表", @@ -175,12 +252,20 @@ "chart.config-rename": "重命名", "chart.config-delete": "删除", "chart.config-addline": "添加线", + "chart.config-addlinePlaceholder": "添加占位符", "chart.config-line-interpolation": "插值", "chart.config-line-fill": "填充", "chart.config-interpo-linear": "线性", "chart.config-interpo-stepAfter": "之后的步骤", "chart.config-interpo-stepBefore": "之前的步骤", - "chart.config-interpo-spline": "spline", + "chart.config-interpo-spline": "样条", + "chart.config-line-width": "线宽", + "chart.config-line-gap": "填充间隙", + "chart.config-line-add-zone": "添加区域", + "chart.config-line-zone-min": "最小", + "chart.config-line-zone-max": "最大", + "chart.config-line-zone-stroke": "描边", + "chart.config-line-zone-fill": "填充", "chart.property-data": "数据", "chart.property-props": "属性", @@ -192,9 +277,10 @@ "chart.property-realtime-max": "最大分钟数", "chart.viewtype-realtime1": "实时", "chart.viewtype-history": "历史", + "chart.viewtype-custom": "自定义", "chart.property-general": "常规", "chart.property-font": "字体", - "chart.property-font.titleize": "标题大小", + "chart.property-font.titlesize": "标题大小", "chart.property-font.axissize": "轴的大小", "chart.property-font.legendsize": "图例大小", "chart.property-theme": "主题", @@ -204,6 +290,10 @@ "chart.property-color.legend": "图例颜色", "chart.property-legend.mode": "图例显示模式", "chart.property-date-last-range": "日期范围", + "chart.property-refresh-interval": "刷新间隔(分钟)", + "chart.property-hide-toolbar": "隐藏工具栏", + "chart.property-thouch-zoom": "触摸缩放", + "chart.property-load-old-values": "加载历史", "chart.property-date.format": "日期格式", "chart.property-time.format": "时间格式", "chart.property-axis": "轴", @@ -211,9 +301,18 @@ "chart.property-axis-x": "标签", "chart.property-yaxis": "Y轴", "chart.property-axis-y1": "Y1标签", + "chart.property-axis-y1-min": "Y1最小", + "chart.property-axis-y1-max": "Y1最大", "chart.property-axis-y2": "Y2标签", + "chart.property-axis-y2-min": "Y2最小", + "chart.property-axis-y2-max": "Y2最大", "chart.property-axis-y3": "Y3标签", + "chart.property-axis-y3-min": "Y3最小", + "chart.property-axis-y3-max": "Y3最大", "chart.property-axis-y4": "Y4标签", + "chart.property-axis-y4-min": "Y4最小", + "chart.property-axis-y4-max": "Y4最大", + "chart.property-script": "脚本数据源", "chart.rangetype-last8h": "最后8小时", "chart.rangetype-last1d": "最后一天", @@ -225,9 +324,9 @@ "chart.legend-bottom": "底部", "chart.legend-never": "从不", - "chart.lags-serie": "Serie", - "chart.lags-time": "时间", - "chart.labsels-title": "标题", + "chart.labels-serie": "系列", + "chart.labels-time": "时间", + "chart.labels-title": "标题", "graph.config-title": "图表设置", "graph.config-rename": "重命名", @@ -247,6 +346,7 @@ "graph.bar-date-fnc-hour-integral": "小时总和(积分)", "graph.property-data": "数据", + "graph.property-name": "名称", "graph.property-general": "常规", "graph.property-title": "标题", "graph.property-title-font": "字体大小", @@ -259,7 +359,7 @@ "graph.property-date-last-range": "日期范围", "graph.property-date-group": "组", "graph.property-offline": "在线", - "graph.property-graph-oriantation": "方向", + "graph.property-graph-orientation": "方向", "graph.property-ori-vartical": "垂直", "graph.property-ori-horizontal": "水平", "graph.property-decimals": "小数", @@ -281,7 +381,7 @@ "graph.property-theme-owner": "自定义", "graph.property-theme-light": "明亮", "graph.property-theme-dark": "黑暗", - "graph.property-legend": "Legend", + "graph.property-legend": "图例", "graph.property-legend-display": "位置", "graph.property-legend-top": "顶部", "graph.property-legend-left": "左", @@ -293,7 +393,7 @@ "graph.property-legend-center": "中心", "graph.property-legend-start": "开始", "graph.property-legend-end": "结束", - "graph.property-legend-color": "Legend", + "graph.property-legend-color": "图例", "graph.property-border": "边框尺寸", "graph.property-tooltip": "显示工具提示", "graph.property-datalabels": "数据标签", @@ -306,6 +406,7 @@ "graph.rangetype-last1d": "最后一天", "graph.rangetype-last3d": "最后3天", "graph.rangetype-last1w": "最近一周", + "graph.rangetype-last1m": "上个月", "graph.grouptype-hours": "小时", "graph.grouptype-days": "天数", @@ -314,11 +415,20 @@ "iframe.property-address": "地址", "iframe.property-name": "名称", + "panel.property-data": "数据", + "panel.property-view-name": "视图名称", + "panel.property-name": "名称", + "panel.property-scalemode": "缩放模式", + "panel.property-scalemode-none": "无", + "panel.property-scalemode-contain": "包含", + "panel.property-scalemode-stretch": "拉伸", + "table.property-title": "数据表设置", "table.property-data": "数据", "table.property-date-last-range": "日期范围", "table.property-name": "名称", "table.property-type": "类型", + "table.property-type-with-realtime": "实时", "table.property-header": "表头", "table.property-header-height": "高度", "table.property-header-background": "背景", @@ -329,6 +439,7 @@ "table.property-row-background": "背景", "table.property-row-color": "颜色", "table.property-row-fontSize": "字体大小", + "table.property-selection": "选择", "table.property-layout": "布局", "table.property-filter": "过滤器", "table.property-paginator": "分页器", @@ -340,6 +451,9 @@ "table.property-gridline": "显示网格", "table.property-type-data": "数据表", "table.property-type-history": "历史表", + "table.property-type-alarms": "警报表", + "table.property-type-alarms-history": "警报历史表", + "table.property-type-reports": "报告表", "table.property-grid-color": "网格颜色", "table.property-cols": "列", "table.property-rows": "行", @@ -357,6 +471,10 @@ "table.customize-column-edit": "编辑列", "table.customize-column-add": "添加列", "table.customize-column-remove": "删除列", + "table.customize-column-left": "左移", + "table.customize-column-right": "右移", + "table.customize-row-up": "上移", + "table.customize-row-down": "下移", "table.customize-row-edit": "编辑行", "table.customize-row-add": "添加行", "table.customize-row-remove": "删除行", @@ -370,7 +488,7 @@ "table.cell-format": "格式", "table.cell-text": "文本", "table.cell-align-left": "左", - "table.cell-align-center": "中心", + "table.cell-align-center": "居中", "table.cell-align-right": "右", "table.history-filter": "过滤器", @@ -378,8 +496,26 @@ "table.rangetype-last1d": "最后一天", "table.rangetype-last3d": "过去3天", + "table.alarms-title": "警报表", + "table.alarms-history-title": "警报历史表", + "table.alarm-columns": "警报列", + "table.alarm-filter": "警报过滤器", + "table.alarm-priority": "优先级", + "table.alarm-tags": "标签", + + "table.reports-title": "报告表", + "table.report-columns": "报告列", + "table.report-view-name": "名称", + "table.report-view-ontime": "创建时间", + "table.report-view-download": "下载", + "table.report-view-delete": "删除", + "table.report-filter": "报告过滤器", + "table.report-filter-name": "名称", + "table.report-filter-count": "最大值", + "editor.view-svg": "画布/SVG", "editor.view-cards": "多视图容器", + "editor.view-maps": "Maps", "editor.views": "视图", "editor.resources": "资源", "editor.view-delete": "删除", @@ -420,11 +556,15 @@ "editor.controls-switch": "开关", "editor.controls-graphbar": "条形图", "editor.controls-graph-bar-settings": "条形图设置", + "editor.controls-graphpie": "Pie Graph", "editor.controls-graph-pie-settings": "饼图设置", "editor.controls-iframe": "内嵌网页", "editor.controls-iframe-settings": "内嵌网页设置", "editor.controls-table": "表", - "editor.controls-webcam": "监控", + "editor.header-item-settings": "页眉项设置", + "editor.controls-image": "图片(链接)", + "editor.controls-panel": "面板", + "editor.controls-panel-settings": "面板设置", "editor.layout-settings": "布局设置", @@ -434,6 +574,7 @@ "editor.interactivity-class": "class:", "editor.interactivity-class-title": "元素类", "editor.interactivity-name": "名称", + "editor.edit-bind-of-tags": "编辑标签绑定", "editor.cmenu-property": "属性", "editor.cmenu-cut": "剪切", @@ -451,6 +592,8 @@ "editor.cmenu-layer-delete": "删除图层", "editor.cmenu-layer-marge-down": "向下合并", "editor.cmenu-layer-marge-all": "全部合并", + "editor.cmenu-unlock": "解锁", + "editor.cmenu-lock": "锁定", "editor.transform": "定位", "editor.transform-x": "x", @@ -505,6 +648,8 @@ "editor.transform-change-image-title": "注意:这个图像不能被嵌入,它将取决于这个路径来显示", "editor.transform-angle": "角度", "editor.transform-angle-title": "改变旋转角度", + "editor.transform-hide": "隐藏", + "editor.transform-lock": "锁定", "editor.align": "对齐", "editor.align-left-title": "向左对齐", @@ -519,12 +664,12 @@ "editor.stroke-width-title": "改变边框宽度为1,按shift键改变为0.1", "editor.stroke-style": "边框风格", "editor.stroke-style-title": "改变边框破折号样式", - "editor.stroke-joinmiter-title": "Linejoin Miter", - "editor.stroke-joinround-title": "Linejoin Round", - "editor.stroke-joinbevel-title": "Linejoin Round", - "editor.stroke-capbutt-title": "Linejoin Bevel", - "editor.stroke-capsquare-title": "Linecap Square", - "editor.stroke-capround-title": "Linecap Round", + "editor.stroke-joinmiter-title": "线连接Miter", + "editor.stroke-joinround-title": "线连接圆", + "editor.stroke-joinbevel-title": "线连接圆", + "editor.stroke-capbutt-title": "线连接圆", + "editor.stroke-capsquare-title": "线连接圆", + "editor.stroke-capround-title": "线连接圆", "editor.stroke-shadow": "阴影", "editor.stroke-shadow-title": "有阴影", @@ -572,37 +717,61 @@ "editor.tools-hyperlink-title": "制作超链接", "editor.tools-svg-selector": "项目列表选择器", + "editor.settings-general": "常规", + "editor.settings-events": "事件", + "editor.settings-actions": "动作", + + "tags.ids-config-title": "标签-Ids参考", + "svg.selector.property-title": "查看项目列表", - "tutorial.editor-keyboard-shortcuts": "编辑器键盘快捷键", + "tutorial.editor-keyboard-shortcuts": "编辑器快捷键", "shapes.action-hide": "隐藏", "shapes.action-show": "显示", - "shapes.action-link": "闪烁", + "shapes.action-blink": "闪烁", "shapes.action-stop": "停止", "shapes.action-clockwise": "顺时针转动", "shapes.action-anticlockwise": "逆时针转弯", "shapes.action-downup": "向上和向下", "shapes.action-rotate": "旋转", + "shapes.action-refreshImage": "更新图像", + + "shapes.action-move": "移动", "shapes.event-click": "点击", + "shapes.event-dblclick": "双击", "shapes.event-mouseup": "鼠标松开", "shapes.event-mousedown": "鼠标按下", + "shapes.event-mouseover": "鼠标悬停", + "shapes.event-mouseout": "鼠标移出", + "shapes.event-enter": "进入", + "shapes.event-select": "选择", "shapes.event-onpage": "打开页面", "shapes.event-onwindow": "打开窗体", "shapes.event-ondialog": "打开对话框", "shapes.event-oniframe": "打开iframe", "shapes.event-oncard": "打开窗口", + "shapes.event-onopentab": "打开标签页", "shapes.event-onsetvalue": "设置值", "shapes.event-ontogglevalue": "切换值", "shapes.event-onsetinput": "从输入设置", "shapes.event-onclose": "关闭", + "shapes.event-onopen": "打开", "shapes.event-onrunscript": "运行脚本", "shapes.event-setvalue-set": "设置", "shapes.event-setvalue-add": "增加", "shapes.event-setvalue-remove": "减少", + "shapes.event-address-link": "链接", + "shapes.event-address-resource": "资源", "shapes.event-onmonitor": "监控", - - + "shapes.event-onViewToPanel": "设置视图到面板", + "shapes.event-onLoad": "加载", + "shapes.event-relativefrom-window": "窗口", + "shapes.event-relativefrom-mouse": "鼠标", + + "pipe.property-title": "管道设置", + "pipe.property-data": "数据", + "pipe.property-style": "样式", "pipe.property-props": "属性", "pipe.property-border-width": "边界宽度", "pipe.property-border-color": "边界颜色", @@ -612,28 +781,32 @@ "pipe.property-content-color": "内容的颜色", "pipe.property-content-space": "内容的破折号", "pipe.action-hide-content": "隐藏内容", + "pipe.property-style-animation": "动画图片", + "pipe.property-style-animation-image": "选择图片(SVG)", + "pipe.property-style-animation-count": "图片数量", + "pipe.property-style-animation-delay": "动画延迟(毫秒)", "slider.property-props": "属性", "slider.property-horizontal": "水平", "slider.property-vertical": "垂直", "slider.property-orientation": "方向", "slider.property-direction": "方向", - "slider.property-rtl": "rtl", - "slider.property-ltr": "ltr", + "slider.property-rtl": "从右到左", + "slider.property-ltr": "从左到右", "slider.property-min": "最小", "slider.property-max": "最大", - "slider.property-step": "步骤", + "slider.property-step": "步长", "slider.property-font": "字体", "slider.property-background": "背景", - "slider.property-scala": "Scala", + "slider.property-scala": "刻度", "slider.property-marker-color": "颜色", - "slider.property-subdivisions": "SubDivisions(%)", + "slider.property-subdivisions": "子分区(%)", "slider.property-subdivisions-height": "高度", "slider.property-subdivisions-width": "宽度", - "slider.property-divisions": "划分(%)", + "slider.property-divisions": "分区(%)", "slider.property-divisions-height": "高度", "slider.property-divisions-width": "宽度", - "slider.property-font-size": "Scala字体", + "slider.property-font-size": "刻度字体", "slider.property-tooltip": "工具提示", "slider.property-tooltip-none": "无", "slider.property-tooltip-hide": "隐藏", @@ -682,20 +855,25 @@ "device.list-min": "最小", "device.list-max": "最大", "device.list-value": "值", + "device.list-timestamp": "时间戳", + "device.list-description": "描述", "device.list-edit": "编辑标签", "device.list-add": "添加标签", "device.list-remove": "删除标签", "device.list-remove-all": "删除所有标签", "device.list-options": "标签选项", - "device.list-timestamp": "时间戳", - "device.list-description": "描述", + "device.list-clipboard": "复制标签对象到剪贴板", "device.list-direction":"方向", "devices.export": "导出设备", "devices.export-json": "JSON", "devices.export-csv": "CSV", "devices.import": "导入设备", - "devices.import-template": "导入设备模板", + "device.manage-templates": "管理模板", + "device.save-tags-to-template": "保存标签到模板", + "device.add-tags-from-template": "添加标签从模板", + "device.tags-template-name-title": "标签模板名称", + "devices.import-template": "导入连接模板", "device.property-client": "设备属性", "device.property-server": "FUXA服务器属性", "device.property-name": "名称", @@ -714,6 +892,7 @@ "device.property-remove": "删除设备", "device.property-add": "添加设备", "device.not-property-security": "没有安全和加密模式", + "device.property-connection-options": "连接选项", "device.property-port": "端口", "device.property-slave-id": "从属ID", "device.property-routing": "路由", @@ -725,14 +904,28 @@ "device.property-databits": "数据位", "device.property-stopbits": "停止位", "device.property-parity": "奇偶性", + "device.property-delay": "帧延迟(毫秒)", "device.property-method": "方法", "device.property-format": "格式", "device.property-internal": "仅限前端", - "device.property-url": "URL(http://[server]:[port])", + "device.property-url": "URL(http://[服务器]:[端口])", "device.property-webapi-result": "请求的结果", + "device.property-ads-target": "目标AmsNetId(例如192.168.1.10.1.1:851)", + "device.property-ads-local": "本地AmsNetId(例如192.168.1.10.1.1:32750)", + "device.property-ads-router": "路由器地址(例如192.168.1.120:48898)", "device.not-webapi-result": "配置WebAPI的结果", "device.property-show": "显示设备属性", "device.property-hide": "隐藏设备属性", + "device.property-interface-address": "接口和端口", + "device.property-interface-address-ph": "127.0.0.1:47808", + "device.property-broadcast-address": "广播", + "device.property-broadcast-address-ph": "127.0.0.255", + "device.property-adpu-timeout": "adpu超时", + "device.property-adpu-timeout-ph": "6000", + "device.property-certificate-section": "TLS证书", + "device.property-certificate": "证书", + "device.property-certificate-key": "私钥", + "device.property-certificate-ca": "CA证书", "device.security-none": "无", "device.security-sign": "签名", "device.security-signandencrypt": "签名和加密", @@ -740,8 +933,16 @@ "device.webapi-property-gettags": "URL GET标签", "device.webapi-property-posttags": "URL POST标签", "device.webapi-property-loadtags": "加载标签", - "device.property-socket-reuse": "Socket复用", - "device.property-socket-serial": "Socket串行", + "device.property-dsn": "数据源名称(DSN=数据库名称)", + "device.property-odbc-result": "找到的表的结果", + "device.not-odbc-result": "数据库表结果", + "device.add-device-templates-title": "设备模板", + "device.add-tags-templates-title": "标签模板", + "device.add-from-template": "从模板添加设备", + "device.manage-templates-title": "删除模板", + "device.template-device": "模板名称", + "device.template-tags": "模板名称", + "device.property-socket-reuse": "Socket重用", "device.browsetopics-property-title": "要订阅和发布的经纪人主题", "device.browsetopics-property-sub": "订阅", @@ -796,24 +997,44 @@ "device.tag-property-edge": "边缘", "device.tag-property-gpio": "GPIO编号", + "device.tag-array-id": "阵列ID:", "device.tag-array-value": "值:", "device-tag-dialog-title": "标签选择", "device.tag-options-title": "标签选项", - "device.tag-daq-enabled": "注册已启用", - "device.tag-daq-changed": "如果改变,保存值", - "device.tag-daq-interval": "保存值的时间间隔(秒)", - "device.tag-format": "格式化数字(2=#.##)", + "device.tag-daq-enabled": "注册启用", + "device.tag-daq-changed": "如果更改则保存", + "device.tag-daq-interval": "保存值间隔(秒)", + "device.tag-daq-restored": "恢复", + + "device.tag-format": "格式化数字(2 = #.##)", + "device.tag-deadband": "死区", "device.tag-scale": "刻度模式", "device.tag-scale-mode-undefined": "无缩放", "device.tag-scale-mode-undefined-tooltip": "标签值", - "device.tag-scale-mode-linear": "Linear: ΔS * (Value - RL) / ΔR + SL", + "device.tag-scale-mode-linear": "线性:ΔS * (Value - RL) / ΔR + SL", "device.tag-scale-mode-linear-tooltip": "ΔS = (Scaled High - Scaled Low)\nΔR = (Raw High - Raw Low)\nRL = Raw Low\nSL = Scaled Low", + "device.tag-scale-mode-script": "脚本(读/写)", "device.tag-raw-low": "原始低", "device.tag-raw-high": "原始高", "device.tag-scaled-low": "按比例的低", "device.tag-scaled-high": "按比例的高", + "device.tag-convert-datetime": "毫秒到日期时间格式", + "device.tag-convert-datetime-tooltip": "示例格式:'YYYY-MM-DD HH:mm:ss' 2023-09-14 08:45:10", + "device.tag-convert-datetime-format": "日期时间格式(YYYY-MM-DD HH:mm:ss)", + "device.tag-convert-ticktime": "毫秒到时间格式(剩余或持续时间)", + "device.tag-convert-ticktime-tooltip": "示例格式:'HH:mm:ss' 56:45:10", + "device.tag-convert-ticktime-format": "时间格式(HH:mm:ss)", + "device.tag-scale-read-script": "读取刻度脚本", + "device.tag-scale-read-script-tooltip": "从客户端接收值的脚本", + "device.tag-scale-read-script-params": "输入读取脚本参数值", + "device.tag-scale-write-script": "写入刻度脚本", + "device.tag-scale-write-script-tooltip": "写入客户端之前的值的脚本", + "device.tag-scale-write-script-params": "输入写入脚本参数值", + "device.tag-scale-script-params-tooltip": "传递给脚本的参数值的JSON格式化数组", + + "device.edit-placeholder-titel": "编辑占位符", "device.connect-ok": "OK", "device.connect-error": "错误", @@ -829,11 +1050,28 @@ "devices.list-polling": "轮询", "devices.list-enabled": "已启用", "devices.list-status": "状态", + "device.list-clipboard": "复制到剪贴板", + "users.list-title": "用户设置", "users.list-name": "用户名", "users.list-fullname": "全名", "users.list-groups": "群体", + "users.list-roles": "角色", + "users.list-start": "开始视图", + + "roles.list-title": "角色设置", + "roles.list-index": "索引", + "roles.list-name": "名称", + "roles.list-description": "描述", + + "user-role-edit-title": "角色设置", + "user-role-edit-name": "名称", + "user-role-edit-index": "索引", + "user-role-edit-description": "描述", + + "events-history.list-title": "事件历史", + "events-history.filter-daterange": "日期范围过滤", "gauges.property-props": "属性", "gauges.property-events": "事件", @@ -846,16 +1084,25 @@ "gauges.property-event-type": "类型", "gauges.property-event-action": "行动", "gauges.property-event-destination": "目的地", + "gauges.property-event-destination-relative-from": "相对位置", + "gauges.property-event-destination-panel": "面板", + "gauges.property-event-destination-hide-close": "隐藏关闭", + "gauges.property-event-destination-target-device": "目标设备", + "gauges.property-event-newtab": "新标签", + "gauges.property-event-single-card": "单个卡片", "gauges.property-event-value": "值", "gauges.property-event-function": "功能", "gauges.property-event-input": "输入(仅指有名称的输入)", + "gauges.property-event-address-type": "类型", "gauges.property-event-address": "链接", + "gauges.property-event-resource": "资源", "gauges.property-event-width": "宽度", "gauges.property-event-height": "高度", "gauges.property-event-scale": "规模", "gauges.property-event-script": "脚本", "gauges.property-event-script-param-name": "参数", "gauges.property-event-script-param-value": "值", + "gauges.property-event-script-param-input-value": "留空以发送输入的值", "gauges.property-head-device": "设备", "gauges.property-head-variable": "变量", "gauges.property-variable-value": "值", @@ -872,7 +1119,27 @@ "gauges.property-input-value": "值", "gauges.property-input-label": "标签", "gauges.property-input-unit": "单位", + "gauges.property-input-type": "输入类型", + "gauges.property-input-type-number": "数字", + "gauges.property-input-type-text": "文本", + "gauges.property-input-type-date": "日期", + "gauges.property-input-type-time": "时间", + "gauges.property-input-type-datetime": "日期和时间", + "gauges.property-input-time-format": "时间格式", + "gauges.property-input-time-format-normal": "HH:mm", + "gauges.property-input-time-format-seconds": "HH:mm:ss", + "gauges.property-input-time-format-milliseconds": "HH:mm:ss:fff", + "gauges.property-input-milliseconds": "转换为毫秒", + "gauges.property-input-convertion": "转换", + "gauges.property-input-convertion-milliseconds": "毫秒", + "gauges.property-input-convertion-string": "字符串", + "gauges.property-update-enabled": "启用更新", + "gauges.property-update-esc": "ESC更新", + "gauges.property-input-esc-action": "离开时执行", + "gauges.property-action-esc-update": "更新(刷新)", + "gauges.property-action-esc-enter": "确认(回车)", + "gauges.property-select-content-on-click": "点击时选择内容", "gauges.property-numeric-enabled": "只有数字", "gauges.property-format-digits": "格式化数字", "gauges.property-actions": "行动", @@ -880,6 +1147,9 @@ "gauges.property-action-param": "行动标识", "gauges.property-action-minAngle" : "最小角度", "gauges.property-action-maxAngle" : "最大角度", + "gauges.property-action-toX" : "到位置X", + "gauges.property-action-toY" : "到位置Y", + "gauges.property-action-duration" : "持续时间", "gauges.property-events-mapping-from": "上下文变量", "gauges.property-map-variable": "添加上下文变量进行绑定", "gauges.property-head-remove-mapvariable": "删除绑定", @@ -888,6 +1158,7 @@ "gauges.property-tag-label": "标签", "gauges.property-tag-internal-title": "设置一个内部设备的标签", "gauges.property-input-range": "允许的输入范围", + "gauges.property-language-text": "文本或@文本ID", "bag.property-ticks": "刻", "bag.property-divisions": "划分", @@ -920,6 +1191,7 @@ "bag.property-format-digits": "小数位数", "bag.property-zones": "区域", "bag.property-color": "颜色", + "bag.property-fill": "Fill", "alarms.list-title": "警报器设置", "alarms.list-name": "名称", @@ -938,6 +1210,7 @@ "alarm.property-info": "信息", "alarm.property-action": "行动", "alarm.property-enabled": "已启用", + "alarm.property-save-event": "事件", "alarm.property-min": "最小", "alarm.property-max": "最大", "alarm.property-timedelay": "时间延迟(秒)", @@ -959,6 +1232,8 @@ "alarms.view-offtime": "关闭日期/时间", "alarms.view-acktime": "ACK日期/时间", "alarms.view-userack": "ACK用户", + "alarms.view-ack": "ACK", + "alarms.view-ack-all-alarms": "ACK所有警报", "alarm.status-active": "活跃", "alarm.status-passive": "被动", "alarm.status-active-ack": "Active-ACK", @@ -967,10 +1242,14 @@ "alarm.action-popup": "显示弹幕", "alarm.action-onsetview": "设置视图", "alarm.action-onsetvalue": "设置值", + "alarm.action-onRunScript": "运行脚本", + "alarm.action-toastMessage": "显示消息", "alarm.action-sendMsg": "发送消息", "alarm.property-action-type": "行动类型", "alarm.property-action-value": "要设置的值", "alarm.property-action-destination": "要显示的视图", + "alarm.property-action-toastMessage": "要显示的消息", + "alarm.property-action-toastType": "类型", "notifications.list-title": "通知设置", "notifications.list-name": "名称", @@ -1004,34 +1283,115 @@ "script.permission-label": "(空 = 对全体)", "script.permission-enabled": "已启用", + "script.create-title": "创建脚本", + "script.mode": "执行模式", "script.mode-title": "执行模式", "script.mode-label": "(默认:服务器)", + "script.mode-CLIENT": "客户端(在浏览器中执行)", + "script.mode-SERVER": "服务器(在服务器中执行)", "script.property-title": "脚本", "script.property-systems": "系统功能", + "script.property-templates": "模板", "script.property-test": "测试", "script.property-test-params": "功能参数", "script.property-test-console": "控制台", "script.property-test-tag": "设置标签", "script.property-test-run": "运行TEST", "script.property-editname": "编辑脚本名称", + "script.property-name": "名称", "script.property-addfnc-param": "添加脚本参数", + "script.property-async-function": "异步函数", "script.param-title": "脚本参数", "script.param-name": "名称", "script.param-type": "类型", "script.paramtype": "", "script.paramtype-tagid": "标签ID", - "script.paramtype-value": "值(数字或字符串)", + "script.paramtype-value": "值(数字/字符串/对象)", + "script.paramtype-chart": "图表线(数组)", "script.param-name-exist": "参数名称已经存在!", "script.sys-fnc-settag-text": "$setTag (TagID, value)", "script.sys-fnc-settag-tooltip": "设置标签值的系统函数:$setTag (TagID为字符串,值为字符串或数字)", "script.sys-fnc-gettag-text": "$getTag (TagID)", "script.sys-fnc-gettag-tooltip": "获取Tag值的系统函数:$getTag (TagID为字符串) 返回值为字符串或数字", "script.scheduling-title": "脚本调度", - "script.scheduling-interval": "间隔时间,以秒为单位", + "script.scheduling-type": "类型", + "script.scheduling-interval": "循环间隔", + "script.scheduling-start": "仅在启动时", + "script.scheduling-add-item": "添加调度器", + "script.scheduling-scheduling": "调度", + "script.scheduling-weekly": "每周", + "script.scheduling-date": "日期", + "script.scheduling-time": "时间", + "script.scheduling-hour": "小时", + "script.scheduling-minute": "分钟", + "script.interval": "间隔(秒)", + "script.delay": "延迟(秒)", "script.sys-fnc-setview-text": "$setView(视图名称)", "script.sys-fnc-setview-tooltip": "在客户端设置视图的系统函数:$setView(视图名称为字符串)", + "script.sys-fnc-setview-params": "'View name'", + "script.sys-fnc-opencard-text": "$openCard (View name)", + "script.sys-fnc-opencard-tooltip": "System function to open Card on client: $openCard (View name as string, Options as dict {left, top})", + "script.sys-fnc-opencard-params": "'View name'", + "script.sys-fnc-enableDevice-text": "$enableDevice (Device name, enable True/False)", + "script.sys-fnc-enableDevice-tooltip": "System function to enable Device connection: $enableDevice (Device name as string, enable as boolean)", + "script.sys-fnc-enableDevice-params": "'Device name', true", + "script.sys-fnc-getDevice-text": "$getDevice (Device name, interface True/False)", + "script.sys-fnc-getDevice-tooltip": "System function to get Device object: $getDevice (Device name as string, get Comm Interface as boolean)", + "script.sys-fnc-getDevice-params": "'Device name', true", + "script.sys-fnc-setAdapterToDevice-text": "$setAdapterToDevice(Adapter name, Device name)", + "script.sys-fnc-setAdapterToDevice-tooltip": "System function to bind Adapter (internal Device) to a Device: $setAdapterToDevice (Adapter name as string, Device name as string)", + "script.sys-fnc-setAdapterToDevice-params": "'Adapter name', 'Device name'", + "script.sys-fnc-resolveAdapterTagId-text": "$resolveAdapterTagId(TagID)", + "script.sys-fnc-resolveAdapterTagId-tooltip": "System function to get Tag ID of Device dind to Adapter (internal Device): $resolveAdapterTagId (TagID as string)", + "script.sys-fnc-resolveAdapterTagId-params": "'TagID of Adapter'", + "script.sys-fnc-getTagId-text": "$getTagId (Tag name, [Device name])", + "script.sys-fnc-getTagId-tooltip": "System function to get Tag ID: $getTagId (Tag name as string, [Optional Device name as string])", + "script.sys-fnc-getTagId-params": "'Tag name', ", + "script.sys-fnc-getTagDaqSettings-text": "$getTagDaqSettings (TagID)", + "script.sys-fnc-getTagDaqSettings-tooltip": "System function to get Tag DAQ settings: $getTagDaqSettings (TagID as string)", + "script.sys-fnc-getTagDaqSettings-params": "'TagID'", + "script.sys-fnc-setTagDaqSettings-text": "$setTagDaqSettings (TagID, DaqSettings)", + "script.sys-fnc-setTagDaqSettings-tooltip": "System function to set Tag DAQ settings: $setTagDaqSettings (TagID as string, DaqSettings as object {restored: boolean, enabled: boolean, changed: boolean, interval: number, lastDaqSaved: number} )", + "script.sys-fnc-setTagDaqSettings-params": "'TagID', 'DaqSettings'", + "script.sys-fnc-invokeObject-text": "$invokeObject (Object name, Function name, [Parameter])", + "script.sys-fnc-invokeObject-tooltip": "System function to call Object function: $invokeObject (Object name as string, function name as string , [parameter])", + "script.sys-fnc-invokeObject-params": "'Object name', 'function name', ", + "script.sys-fnc-runServerScript-text": "$runServerScript (Script name, [Parameter])", + "script.sys-fnc-runServerScript-tooltip": "Client function to call Server script function: $runServerScript (Script name as string, [parameter])", + "script.sys-fnc-runServerScript-params": "'Server script name', ", + "script.sys-fnc-getDeviceProperty-text": "$getDeviceProperty(Device name)", + "script.sys-fnc-getDeviceProperty-tooltip": "System function to get Device property: $getDeviceProperty(Device name as string)", + "script.sys-fnc-getDeviceProperty-params": "'Device name'", + "script.sys-fnc-setDeviceProperty-text": "$setDeviceProperty(Device name, property)", + "script.sys-fnc-setDeviceProperty-tooltip": "System function to set Device property: $setDeviceProperty(Device name as string, Property as object {address, port, ...} )", + "script.sys-fnc-setDeviceProperty-params": "'Device name', 'Property'", + "script.sys-fnc-getHistoricalTag-text": "$getHistoricalTags(TagIds array, from msec., to msec.)", + "script.sys-fnc-getHistoricalTag-tooltip":"get historical tags by milliseconds range: $getHistoricalTags([TagIds] as array, from as number, to as number)", + "script.sys-fnc-getHistoricalTag-params":"'Tag Ids array', 'From msec.', 'To msec.'", + "script.sys-fnc-sendMessage-text": "$sendMessage(address, subject, message)", + "script.sys-fnc-sendMessage-tooltip": "System function to send Message (Mail): $sendMessage(address as string, subject as string, message as string)", + "script.sys-fnc-sendMessage-params": "'address', 'subject', 'message'", + "script.sys-fnc-getAlarms-text": "$getAlarms()", + "script.sys-fnc-getAlarms-tooltip": "System function to get alarms list (): $getAlarms()", + "script.sys-fnc-getAlarms-params": "", + "script.sys-fnc-getAlarmsHistory-text": "$getAlarmsHistory(from msec., to msec.)", + "script.sys-fnc-getAlarmsHistory-tooltip": "System function to get historical alarms list (): $getAlarmsHistory(from as number, to as number)", + "script.sys-fnc-getAlarmsHistory-params": "'From msec.', 'To msec.'", + "script.sys-fnc-ackAlarms-text": "$ackAlarm(Alarm name, types)", + "script.sys-fnc-ackAlarms-tooltip": "System function to ACK alarm (): $ackAlarm(Alarm name as string, [types] 'highhigh|high|low')", + "script.sys-fnc-ackAlarms-params": "'Alarm name', 'types'", + + "script.template-chart-data-text": "自定义图表数据", + "script.template-chart-data-tooltip": "返回自定义图表数据的代码模板", + "script.template-invoke-chart-update-options-text": "更新图表选项", + "script.template-invoke-chart-update-options-tooltip": "更新图表选项(Y轴刻度范围)。仅限客户端模式!", + "script.template-getHistoricalTagsoptions-text": "获取历史标签值", + "script.template-getHistoricalTagsoptions-tooltip": "获取历史标签值的代码模板。", + + "client.script-access-title": "客户端脚本访问", + "client.script-access-info": "通过window.fuxaScriptAPI配置对前端(例如小部件)的系统函数访问。", "reports.list-title": "报告设置", "reports.list-name": "名称", @@ -1097,11 +1457,34 @@ "report.item-alarms-title": "报告报警", "report.alarms-priority": "警报优先级", "report.alarms-column": "警报列", + "report.alarms-filter": "Alarms filter", "report.chart-title": "报告图表", "report.chart-name": "图表名称", "report.chart-width": "宽度", "report.chart-height": "高度", + "maps.locations-list-title": "位置设置", + "maps.locations-list-name": "名称", + "maps.locations-list-view": "视图", + "maps.locations-list-description": "描述", + "maps.location-property-title": "位置", + "maps.location-property-name": "名称", + "maps.location-property-description": "描述", + "maps.location-property-latitude": "纬度", + "maps.location-property-longitude": "经度", + "maps.location-property-card": "卡片", + "maps.location-property-view": "视图", + "maps.location-property-url": "URL", + "maps.edit-add-location": "添加位置", + "maps.edit-import-location": "导入位置", + "maps.edit-edit-location": "编辑位置", + "maps.edit-remove-location": "删除位置", + "maps.edit-start-location": "设为起始位置", + "maps.edit-start-location-saved": "起始位置已保存", + "maps.close-popups": "关闭所有弹窗", + "maps.location-to-import": "要导入的位置", + "maps.location-to-import-input-title": "选择要导入的位置", + "logs.view-title": "系统日志", "logs.view-files": "日志文件", @@ -1120,15 +1503,33 @@ "card.widget-iframe": "链接", "card.style-zoom": "缩放", + "resources.lib-icons": "图标", "resources.lib-images": "图片", - - "text.list-title": "文本设置", - "text.list-filter": "过滤器", - "text.list-filter-group": "组", - "text.list-id": "ID", - "text.list-group": "组", - "text.list-value": "文本", - + "resource.list-title": "资源列表", + "resource.list-name": "文件名称", + "resource.list-type": "文件类型", + "resource.list-title-fonts": "字体列表", + "resources.lib-widgets": "小部件", + + "widgets.kiosk-title": "小部件", + "widget.remove": "删除小部件", + + "texts.list-title": "文本设置", + "texts.list-filter": "过滤器", + "texts.list-filter-group": "组", + "texts.list-id": "ID", + "texts.list-group": "组", + "texts.list-value": "文本", + "texts.list-add-text": "添加文本", + "texts.list-edit-language": "编辑语言", + "language.settings-title": "语言设置", + "language.settings-add-tooltip": "添加语言", + "language.settings-id": "键", + "language.settings-default-id": "键(默认)", + "language.settings-id-placeholder": "例如:EN", + "language.settings-name": "名称", + "language.settings-default-name": "名称(默认)", + "language.settings-name-placeholder": "例如:英语", "text.settings-title": "文本", "text.settings-id": "ID", "text.settings-group": "组", @@ -1141,12 +1542,15 @@ "gui.range-number-false": "假 [0-0]", "gui.range-number-switcher": "范围为数字或布尔值", - "dlg.bitmask-title": "Bitmask", + "dlg.bitmask-title": "位掩码", - "dlg.plugins-title": "插件", + "dlg.plugins-title": "服务器插件", + "dlg.plugins-info": "未安装的插件可以在服务器上手动安装:'npm install [package name]@[version]'", + "dlg.plugins-type": "类型", "dlg.plugins-name": "名称", "dlg.plugins-version": "版本", "dlg.plugins-current": "已安装", + "dlg.plugins-description": "描述", "dlg.plugins-status-installing": "正在安装...", "dlg.plugins-status-removing": "正在删除...", "dlg.plugins-status-installed": "正在安装...OK!", @@ -1161,16 +1565,23 @@ "dlg.setup-views": "视图", "dlg.setup-connections": "连接", "dlg.setup-users": "用户", + "dlg.setup-user-roles": "角色", "dlg.setup-alarms": "警报", "dlg.setup-line-charts": "线形图", "dlg.setup-bar-charts": "条形图", + "dlg.setup-maps-locations": "位置", "dlg.setup-layout": "布局", "dlg.setup-plugins": "插件", "dlg.setup-scripts": "脚本", "dlg.setup-reports": "报告", "dlg.setup-settings": "设置", + "dlg.setup-client-access": "前端脚本", "dlg.setup-logs": "日志", "dlg.setup-notifications": "通知", + "dlg.setup-events": "事件", + "dlg.setup-resources": "资源", + "dlg.setup-fonts": "字体", + "dlg.setup-language": "语言", "dlg.app-settings-title": "设置", "dlg.app-settings-system": "系统", "dlg.app-settings-smtp": "SMTP", @@ -1182,24 +1593,30 @@ "dlg.app-settings-smtp-testaddress": "发送测试信息的电子邮件", "dlg.app-settings-smtp-test": "测试", "dlg.app-settings-language": "语言", + "dlg.app-language-de": "German", "dlg.app-language-en": "English", "dlg.app-language-ru": "Русский", "dlg.app-language-ua": "Українська", "dlg.app-language-zh-cn": "中文", "dlg.app-language-pt": "Português", + "dlg.app-language-sv": "Swedish", "dlg.app-language-tr": "Türkçe", "dlg.app-language-ko": "한국어", "dlg.app-language-es": "Español", "dlg.app-language-fr": "Français", "dlg.app-settings-server-port": "服务器正在监听端口", + "dlg.app-settings-server-log-full": "日志全模式", + "dlg.app-settings-alarms": "警报", "dlg.app-settings-alarms-clear": "清除所有警报和历史记录", "dlg.app-settings-auth-token": "使用令牌进行认证", + "dlg.app-settings-auth-only-editor": "仅用于编辑器", "dlg.app-auth-disabled": "已禁用", "dlg.app-auth-expiration-15m": "已启用,令牌15分钟后失效", "dlg.app-auth-expiration-1h": "已启用,令牌将在1小时后过期,", "dlg.app-auth-expiration-3h": "已启用,令牌将在3小时后过期,", "dlg.app-auth-expiration-1d": "已启用,令牌将在1天内到期,", "dlg.app-auth-tooltip": "已启用: 你有一个管理员账户 'admin/123456' (请不要忘记修改). 需要重新启动服务器!", + "dlg.app-settings-client-broadcast": "广播到客户端(前端)所有标签值", "dlg.app-settings-daqstore": "DAQ存储", "dlg.app-settings-daqstore-type": "数据库类型", @@ -1208,6 +1625,14 @@ "dlg.app-settings-daqstore-bucket": "Bucket", "dlg.app-settings-daqstore-organization": "组织", "dlg.app-settings-daqstore-retention": "保留", + "dlg.app-settings-daqstore-database": "数据库名称", + "dlg.app-settings-daqstore-username": "用户名", + "dlg.app-settings-daqstore-password": "密码", + + "dlg.app-settings-user-group-label": "授权类型", + "dlg.app-settings-user-group": "组(默认)", + "dlg.app-settings-user-roles": "角色", + "store.retention-none": "禁用", "store.retention-day1": "1天", "store.retention-days2": "2天", @@ -1217,7 +1642,18 @@ "store.retention-days30": "30天", "store.retention-days90": "90天", "store.retention-year1": "1年", + "store.retention-year3": "3年", + "store.retention-year5": "5年", + + "plugin.group-connection-device": "连接设备", + "plugin.group-connection-database": "连接数据库", + "plugin.group-chart-report": "报告图表", + + "action-settings-title": "操作设置", + "action-settings-readonly-tag": "标签", + "action-settings-readonly-values": "值", + "msg.alarm-ack-all": "您是否想确认所有警报?", "msg.alarm-remove": "您是否想删除警报", "msg.text-remove": "您是否想删除文本", "msg.alarmproperty-error-exist": "警报名称存在!", @@ -1227,15 +1663,20 @@ "msg.device-remove": "您是否想删除设备", "msg.device-tag-remove": "您是否想删除标签", "msg.device-tag-exist": "标签名称存在!", + "msg.device-tag-invalid-char": "不允许在标签名称中使用'@'字符!", "msg.notification-property-missing-value": "一些数值丢失!", "msg.report-property-missing-value": "有不正确或缺失的值!", + "msg.file-upload-failed": "上传失败!", + "msg.file-delete-failed": "删除文件失败!", - "msg.home-welcome": "等待......去编辑器,映射设备,设计你的可视化并绑定设备的变量", + "msg.home-welcome": "请稍候......去编辑器,映射设备,设计你的可视化并绑定设备的变量", + "msg.server-connection-failed": "服务器连接失败!", "msg.project-load-error": "无法读取'{{value}}'", "msg.project": "您想保存项目的变化吗?", "msg.tags-remove-all": "您想删除所有标签吗?", "msg.view-remove": "您是否想删除视图'{{value}}'?", "msg.chart-remove": "您想删除图表'{{value}}'吗?", + "msg.role-remove": "您是否想删除角色'{{value}}'?", "msg.graph-remove": "您想删除条形图'{{value}}'吗?", "msg.script-remove": "您想删除脚本'{{value}}'吗?", "msg.report-remove": "您是否想删除报告", @@ -1248,16 +1689,32 @@ "msg.project-save-success": "项目保存成功!", "msg.project-save-error": "项目保存失败!", "msg.project-format-error": "项目格式错误!", + "msg.view-format-error": "视图格式错误!", "msg.project-save-unauthorized": "项目保存失败! 未经授权!", "msg.project-save-ask": "你想离开这个项目吗?", "msg.login-username-required": "输入一个用户名", "msg.login-password-required": "输入一个密码", "msg.signin-failed": "未经授权", + "msg.signin-unauthorized": "未经授权!", "msg.get-project-void": "没有找到项目!", "msg.editor-mode-locked": "编辑器已经打开!", "msg.alarms-clear-success": "所有警报已被取消!", "msg.import-devices-error": "导入设备失败!", "msg.report-build-forced": "发送构建报告成功", "msg.report-build-error": "发送构建报告失败!", - "msg.device-tags-request-result": "加载 {{value}} 的 {{current}}" + "msg.device-tags-request-result": "加载 {{current}} / {{value}}", + "msg.chart-with-script": "定义的脚本接收图表线列表作为参数,然后返回带有数据的完成列表。脚本'模板'中的代码示例", + "msg.script-name-exist": "脚本名称存在!", + "msg.invalid-script-name": "无效的脚本名称!", + "msg.templates-exist-ask-overwrite": "名称'{{value}}'的模板已经存在。您是否想覆盖它?", + "msg.templates-save-success": "模板保存成功!", + "msg.view-name-exist": "视图名称存在!", + "msg.notification-name-exist": "通知名称存在!", + "msg.file-remove": "您是否想删除'{{value}}'?", + "msg.notification-remove": "您是否想删除通知'{{value}}'?", + "msg.maps-location-remove": "您是否想删除位置'{{value}}'?", + "msg.maps-location-name-exist": "位置名称已经存在!", + "msg.text-name-exist": "文本名称已经存在!", + "msg.texts-text-remove": "您是否想删除文本'{{value}}'?", + "msg.operation-unauthorized": "操作未经授权!" } diff --git a/client/dist/assets/i18n/zh-tw.json b/client/dist/assets/i18n/zh-tw.json new file mode 100644 index 000000000..7a288cfb0 --- /dev/null +++ b/client/dist/assets/i18n/zh-tw.json @@ -0,0 +1,1718 @@ +{ + "with param": "示例 {{value}}", + + "app.home": "首頁", + "app.lab": "實驗室", + "app.editor": "編輯器", + + "header.new-project": "新建專案", + "header.save-project": "儲存專案", + "header.save-project-tooltip": "儲存所有未完成的專案修改", + "header.saveas-project": "將專案另存為...", + "header.rename-project": "重新命名專案", + "header.open-project": "開啟專案", + "header.edit-project": "編輯專案", + "header.edit-views": "視圖編輯器", + "header.edit-devices": "裝置設定", + "header.edit-charts": "圖表設定", + "header.edit-layout": "版面設定", + "header.edit-plugins": "外掛", + "header.edit-users": "使用者設定", + "header.edit-alarms": "警報設定", + "header.edit-texts": "文字設定", + "header.help": "FUXA 說明", + "header.help-tutorial": "教學", + "header.help-info": "關於", + "header.change-thema": "切換主題(beta)", + "header.info-version": "版本", + "header.theme": "主題 亮/暗", + + "project.name": "專案名稱", + + "sidenav.title": "FUXA", + + "tutorial.title": "FUXA 教學", + + "dlg.info-title": "FUXA", + + "dlg.layout-title": "版面設定", + "dlg.layout-general": "一般", + "dlg.layout-lbl-auto-resize": "自動調整大小", + "dlg.layout-lbl-logo": "Logo", + "dlg.layout-lbl-icon": "圖示", + "dlg.layout-lbl-sview": "啟動視圖", + "dlg.layout-lbl-login-start": "啟動時顯示登入", + "dlg.layout-lbl-login-overlay-color": "覆蓋顏色", + "dlg.layout-lbl-zoom": "縮放", + "dlg.layout-navigation-mode": "顯示導覽", + "dlg.layout-connection-message": "顯示連線錯誤(Toast)", + "dlg.layout-show-dev": "顯示按鈕", + "dlg.layout-navigation": "導覽側選單", + "dlg.layout-nav-bkcolor": "背景色", + "dlg.layout-nav-fgcolor": "前景色", + "dlg.layout-lbl-smode": "側欄模式", + "dlg.layout-lbl-type": "類型", + "dlg.layout-header": "頁首導覽列", + "dlg.layout-header-bkcolor": "背景顏色", + "dlg.layout-header-fgcolor": "顏色", + "dlg.layout-lbl-title": "標題", + "dlg.layout-lbl-alarms": "警報通知模式", + "dlg.layout-lbl-datetime": "時間與日期格式(dd/MM/yyyy - hh:mm a)", + "dlg.layout-lbl-infos": "資訊通知模式", + "dlg.layout-lbl-font": "字型族", + "dlg.layout-lbl-font-size": "字型大小", + "dlg.layout-lbl-anchor": "方向", + "dlg.layout-lbl-margin-left": "左邊距", + "dlg.layout-lbl-margin-right": "右邊距", + "dlg.layout-lbl-login-info": "登入資訊", + "dlg.layout-lbl-custom-styles": "自訂樣式", + "dlg.layout-lbl-show-language": "顯示語言", + + "dlg.menuitem-title": "選單項目", + "dlg.menuitem-image": "[我的圖片...]", + "dlg.menuitem-icon": "圖示", + "dlg.menuitem-text": "文字", + "dlg.menuitem-view": "點擊開啟視圖", + "dlg.menuitem-link": "點擊開啟連結", + "dlg.menuitem-alarms": "點擊顯示警報", + "dlg.menuitem-address": "連結位址", + "dlg.menuitem-icons-filter": "圖示篩選", + + "dlg.headeritem-title": "頁首項目", + "dlg.headeritem-icon": "圖示", + "dlg.headeritem-icons-filter": "圖示篩選", + + "dlg.docproperty-title": "視圖屬性", + "dlg.docproperty-name": "名稱", + "dlg.docproperty-width": "寬度", + "dlg.docproperty-height": "高度", + "dlg.docproperty-background": "背景", + "dlg.docproperty-size": "尺寸預設", + "dlg.docproperty-select": "選擇一個尺寸", + "dlg.docproperty-size-320-240": "320 x 240 像素", + "dlg.docproperty-size-460-360": "460 x 360 像素", + "dlg.docproperty-size-640-480": "640 x 480 像素", + "dlg.docproperty-size-800-600": "800 x 600 像素", + "dlg.docproperty-size-1024-768": "1024 x 768 像素", + "dlg.docproperty-size-1280-960": "1280 x 960 像素", + "dlg.docproperty-size-1600-1200": "1600 x 1200 像素", + "dlg.docproperty-size-1920-1080": "1920 x 1080 像素", + "dlg.docproperty-margin": "邊距", + "dlg.docproperty-align": "對齊", + "dlg.docproperty-align-placeholder": "頁面上的對齊方式", + "dlg.docproperty-align-topCenter": "頂部", + "dlg.docproperty-align-middleCenter": "中間", + "dlg.docproperty-gridtype": "網格類型", + "dlg.docproperty-gridtype-placeholder": "網格版面類型", + "dlg.docproperty-gridtype-fit": "適應", + "dlg.docproperty-gridtype-scrollVertical": "垂直捲動", + "dlg.docproperty-gridtype-scrollHorizontal": "水平捲動", + "dlg.docproperty-gridtype-fixed": "固定", + "dlg.docproperty-gridtype-verticalFixed": "垂直固定", + "dlg.docproperty-gridtype-horizontalFixed": "水平固定", + "dlg.docproperty-renderDelay": "視圖渲染延遲(毫秒)", + + "dlg.docname-title": "視圖名稱", + "dlg.docname-name": "名稱", + "dlg.docproperty-type": "視圖類型", + "dlg.item-title": "名稱", + "dlg.item-name": "名稱", + "dlg.item-req-name": "名稱(不允許有空白或數字)", + "dlg.item-name-error": "名稱已存在!", + "dlg.parameter-title": "參數", + + "dlg.tagname-title": "標籤名稱", + "dlg.tagname-name": "標籤名稱", + + "dlg.linkproperty-title": "建立超連結", + "dlg.linkproperty-url": "超連結 URL", + + "dlg.login-title": "登入...", + "dlg.logout-btn": "登出", + + "dlg.ok": "確定", + "dlg.cancel": "取消", + "dlg.close": "關閉", + "dlg.apply": "套用", + + "dlg.userproperty-title": "使用者", + "dlg.userproperty-groups": "授權群組", + "dlg.userproperty-roles": "授權角色", + "dlg.useraccess-groups": "授權(空白 = 對所有人授權)", + "dlg.userproperty-language": "語言", + "dlg.userproperty-start": "起始視圖", + + "dlg.gauge-permission-title": "授權", + "dlg.gauge-permission-label": "(空白 = 對所有人授權)", + "dlg.gauge-permission-show": "顯示", + "dlg.gauge-permission-enabled": "已啟用", + + "date.range-start": "開始日期", + "date.range-end": "結束日期", + + "general.search-up": "搜尋", + "general.close": "關閉", + "general.search": "搜尋...", + "general.search-notfound": "未找到選項", + "general.username": "使用者名稱", + "general.fullname": "全名", + "general.password": "密碼", + "general.clientId": "用戶端 ID", + "general.authority": "權限", + "general.grant-type": "授權類型", + "general.usergroups": "查看者、操作員、工程師、監督員、經理、F、G、管理員", + "general.enabled": "已啟用", + "general.disabled": "已停用", + "general.align-left": "左", + "general.align-center": "置中", + "general.align-right": "右", + "general-left": "左", + "general-top": "頂部", + "general-x": "X", + "general-y": "Y", + "general.monday": "星期一", + "general.monday-short": "週一", + "general.tuesday": "星期二", + "general.tuesday-short": "週二", + "general.wednesday": "星期三", + "general.wednesday-short": "週三", + "general.thursday": "星期四", + "general.thursday-short": "週四", + "general.friday": "星期五", + "general.friday-short": "週五", + "general.saturday": "星期六", + "general.saturday-short": "週六", + "general.sunday": "星期日", + "general.sunday-short": "週日", + "general.save-template": "儲存為範本", + "general.import-template": "自範本匯入", + + "tester.title": "變數", + "tester.send": "送出", + + "item.overlaycolor-none": "無", + "item.overlaycolor-black": "黑色", + "item.overlaycolor-white": "白色", + + "item.navsmode-none": "無", + "item.navsmode-push": "推入", + "item.navsmode-over": "覆蓋", + "item.navsmode-fix": "固定", + + "item.navtype-icons": "圖示", + "item.navtype-text": "文字", + "item.navtype-icons-text-block": "圖示與文字(區塊)", + " item.navtype-icons-text-inline": "圖示與文字(行內)", + + "item.headertype-button": "按鈕", + "item.headertype-label": "標籤", + "item.headertype-image": "圖片", + "item.headeranchor-left": "左", + "item.headeranchor-right": "右", + "item.headeranchor-center": "中間", + + "item.notifymode-hide": "隱藏", + "item.notifymode-fix": "固定", + "item.notifymode-float": "浮動", + + "item.logininfo-type-nothing": "無", + "item.logininfo-type-username": "使用者名稱", + "item.logininfo-type-fullname": "全名", + "item.logininfo-type-both": "使用者名稱與全名", + + "item.language-show-mode-nothing": "隱藏", + "item.language-show-mode-simple": "顯示", + "item.language-show-mode-key": "顯示鍵值", + "item.language-show-mode-fullname": "顯示全名", + + "item.zoommode-disabled": "停用", + "item.zoommode-enabled": "手動", + "item.zoommode-autoresize": "自動調整大小", + + "item.headerbarmode-hide": "隱藏", + "item.headerbarmode-show": "顯示", + + "dlg.layout-input-dialog": "輸入欄位的對話模式", + "item.inputmode-disabled": "已停用", + "item.inputmode-enabled": "對話框", + "item.inputmode-keyboard": "虛擬鍵盤", + "item.inputmode-keyboard-full-screen": "虛擬鍵盤全螢幕", + + "chart.config-title": "圖表設定", + "chart.config-charts": "圖表", + "chart.config-devices": "裝置", + "chart.config-tags": "標籤", + "chart.config-lines": "圖-線", + "chart.config-line-name": "名稱", + "chart.config-line-label": "標籤", + "chart.config-line-yaxis": "Y 軸", + "chart.config-line-color": "顏色", + "chart.config-name-title": "圖表", + "chart.config-name": "名稱", + "chart.config-rename": "重新命名", + "chart.config-delete": "刪除", + "chart.config-addline": "新增線段", + "chart.config-addlinePlaceholder": "新增佔位符", + "chart.config-line-interpolation": "插值", + "chart.config-line-fill": "填滿", + "chart.config-interpo-linear": "線性", + "chart.config-interpo-stepAfter": "後序步進", + "chart.config-interpo-stepBefore": "前序步進", + "chart.config-interpo-spline": "樣條", + "chart.config-line-width": "線寬", + "chart.config-line-gap": "填滿間隙", + "chart.config-line-add-zone": "新增區域", + "chart.config-line-zone-min": "最小", + "chart.config-line-zone-max": "最大", + "chart.config-line-zone-stroke": "描邊", + "chart.config-line-zone-fill": "填滿", + + "chart.property-data": "資料", + "chart.property-props": "屬性", + "chart.property-layout": "版面", + "chart.property-name": "名稱", + "chart.property-chart": "要顯示的圖表", + "chart.property-newchart": "新圖表...", + "chart.property-chart-type": "顯示模式", + "chart.property-realtime-max": "最大分鐘數", + "chart.viewtype-realtime1": "即時", + "chart.viewtype-history": "歷史", + "chart.viewtype-custom": "自訂", + "chart.property-general": "一般", + "chart.property-font": "字型", + "chart.property-font.titlesize": "標題大小", + "chart.property-font.axissize": "軸尺寸", + "chart.property-font.legendsize": "圖例大小", + "chart.property-theme": "主題", + "chart.property-color.background": "背景", + "chart.property-color.text": "文字顏色", + "chart.property-color.grid": "網格顏色", + "chart.property-color.legend": "圖例顏色", + "chart.property-legend.mode": "圖例顯示模式", + "chart.property-date-last-range": "日期範圍", + "chart.property-refresh-interval": "重新整理間隔(分鐘)", + "chart.property-hide-toolbar": "隱藏工具列", + "chart.property-thouch-zoom": "觸控縮放", + "chart.property-load-old-values": "載入歷史", + "chart.property-date.format": "日期格式", + "chart.property-time.format": "時間格式", + "chart.property-axis": "軸", + "chart.property-xaxis": "X 軸", + "chart.property-axis-x": "標籤", + "chart.property-yaxis": "Y 軸", + "chart.property-axis-y1": "Y1 標籤", + "chart.property-axis-y1-min": "Y1 最小", + "chart.property-axis-y1-max": "Y1 最大", + "chart.property-axis-y2": "Y2 標籤", + "chart.property-axis-y2-min": "Y2 最小", + "chart.property-axis-y2-max": "Y2 最大", + "chart.property-axis-y3": "Y3 標籤", + "chart.property-axis-y3-min": "Y3 最小", + "chart.property-axis-y3-max": "Y3 最大", + "chart.property-axis-y4": "Y4 標籤", + "chart.property-axis-y4-min": "Y4 最小", + "chart.property-axis-y4-max": "Y4 最大", + "chart.property-script": "腳本資料來源", + + "chart.rangetype-last8h": "最近 8 小時", + "chart.rangetype-last1d": "最近一天", + "chart.rangetype-last3d": "最近 3 天", + "chart.rangetype-last1w": "最近一週", + + "chart.legend-always": "總是", + "chart.legend-follow": "跟隨", + "chart.legend-bottom": "底部", + "chart.legend-never": "從不", + + "chart.labels-serie": "序列", + "chart.labels-time": "時間", + "chart.labels-title": "標題", + + "graph.config-title": "圖表設定", + "graph.config-rename": "重新命名", + "graph.config-source-tag": "新增來源標籤", + "graph.config-source-name": "名稱", + "graph.config-source-label": "標籤", + "graph.config-category": "類別", + "graph.config-device": "裝置", + "graph.config-bar-color": "邊框", + "graph.config-bar-fill": "填滿", + "graph.property-xtype": "X 軸分類類型", + "graph.property-sources": "來源(標籤)", + "graph.bar-xtype-value": "數值", + "graph.bar-xtype-date": "日期與時間", + "graph.property-fnctype": "功能類型", + "graph.bar-date-fnc-value-integral": "總和(積分)", + "graph.bar-date-fnc-hour-integral": "每小時總和(積分)", + + "graph.property-data": "資料", + "graph.property-name": "名稱", + "graph.property-general": "一般", + "graph.property-title": "標題", + "graph.property-title-font": "字型大小", + "graph.property-title-show": "顯示", + "graph.property-title-color": "標題", + "graph.property-layout": "版面", + "graph.property-graph": "要顯示的圖形", + "graph.property-props": "屬性", + "graph.property-newgraph": "新圖形...", + "graph.property-date-last-range": "日期範圍", + "graph.property-date-group": "分組", + "graph.property-offline": "線上", + "graph.property-graph-orientation": "方向", + "graph.property-ori-vartical": "垂直", + "graph.property-ori-horizontal": "水平", + "graph.property-decimals": "小數", + "graph.property-yaxis-min": "最小值", + "graph.property-yaxis-max": "最大值", + "graph.property-stepsize": "刻度步長", + "graph.property-yaxis": "數值軸", + "graph.property-yaxis-fontsize": "字型大小", + "graph.property-yaxis-show": "顯示", + "graph.property-yaxis-color": "數值", + "graph.property-xaxis-fontsize": "字型大小", + "graph.property-xaxis": "類別軸", + "graph.property-xaxis-show": "顯示", + "graph.property-xaxis-color": "類別", + "graph.property-theme": "主題", + "graph.property-theme-type": "類型", + "graph.property-gridline": "顯示網格", + "graph.property-grid-color": "網格", + "graph.property-theme-owner": "自訂", + "graph.property-theme-light": "明亮", + "graph.property-theme-dark": "黑暗", + "graph.property-legend": "圖例", + "graph.property-legend-display": "位置", + "graph.property-legend-top": "頂部", + "graph.property-legend-left": "左", + "graph.property-legend-bottom": "底部", + "graph.property-legend-right": "右", + "graph.property-legend-show": "顯示", + "graph.property-legend-fontsize": "字型", + "graph.property-legend-align": "對齊", + "graph.property-legend-center": "置中", + "graph.property-legend-start": "起始", + "graph.property-legend-end": "結束", + "graph.property-legend-color": "圖例", + "graph.property-border": "邊框尺寸", + "graph.property-tooltip": "顯示工具提示", + "graph.property-datalabels": "資料標籤", + "graph.property-datalabels-color": "資料標籤", + "graph.property-datalabels-show": "顯示", + "graph.property-datalabels-fontsize": "字型大小", + "graph.property-datalabels-align": "對齊", + + "graph.rangetype-last1h": "最近一小時", + "graph.rangetype-last1d": "最近一天", + "graph.rangetype-last3d": "最近 3 天", + "graph.rangetype-last1w": "最近一週", + "graph.rangetype-last1m": "上個月", + + "graph.grouptype-hours": "小時", + "graph.grouptype-days": "天數", + + "iframe.property-data": "資料", + "iframe.property-address": "位址", + "iframe.property-name": "名稱", + + "panel.property-data": "資料", + "panel.property-view-name": "視圖名稱", + "panel.property-name": "名稱", + "panel.property-scalemode": "縮放模式", + "panel.property-scalemode-none": "無", + "panel.property-scalemode-contain": "置入", + "panel.property-scalemode-stretch": "延展", + + "table.property-title": "資料表設定", + "table.property-data": "資料", + "table.property-date-last-range": "日期範圍", + "table.property-name": "名稱", + "table.property-type": "類型", + "table.property-type-with-realtime": "即時", + "table.property-header": "表頭", + "table.property-header-height": "高度", + "table.property-header-background": "背景", + "table.property-header-color": "顏色", + "table.property-header-fontSize": "字型大小", + "table.property-row": "列", + "table.property-row-height": "高度", + "table.property-row-background": "背景", + "table.property-row-color": "顏色", + "table.property-row-fontSize": "字型大小", + "table.property-selection": "選取", + "table.property-layout": "版面", + "table.property-filter": "過濾器", + "table.property-paginator": "分頁器", + "table.property-paginator-items-per-page": "每頁項目", + "table.property-paginator-next-page": "下一頁", + "table.property-paginator-prev-page": "上一頁", + "table.property-paginator-of-label": "的", + "table.property-daterange": "日期範圍", + "table.property-gridline": "顯示網格", + "table.property-type-data": "資料表", + "table.property-type-history": "歷史表", + "table.property-type-alarms": "警報表", + "table.property-type-alarms-history": "警報歷史表", + "table.property-type-reports": "報告表", + "table.property-grid-color": "網格顏色", + "table.property-cols": "欄", + "table.property-rows": "列", + "table.property-column-type": "欄位類型", + "table.property-column-name": "名稱", + "table.property-column-label": "標籤", + "table.property-column-variable": "變數", + "table.property-column-device": "裝置", + "table.property-column-timestamp": "日期/時間", + "table.property-column-align": "對齊", + "table.property-column-width": "寬度", + "table.property-row-type": "列類型", + "table.property-customize-tooltip": "表格自訂器", + "table.customize-title": "表格自訂器", + "table.customize-column-edit": "編輯欄", + "table.customize-column-add": "新增欄", + "table.customize-column-remove": "刪除欄", + "table.customize-column-left": "左移", + "table.customize-column-right": "右移", + "table.customize-row-up": "上移", + "table.customize-row-down": "下移", + "table.customize-row-edit": "編輯列", + "table.customize-row-add": "新增列", + "table.customize-row-remove": "刪除列", + "table.cell-column-name": "欄名", + "table.column-dialog-title": "欄", + "table.row-dialog-title": "列", + "table.cell-column-type": "欄位類型", + "table.cell-row-type": "列類型", + "table.cell-ts-format": "格式(DD/MM/YYYY - HH:mm:ss)", + "table.cell-value-format": "格式(0.000)", + "table.cell-format": "格式", + "table.cell-text": "文字", + "table.cell-align-left": "左", + "table.cell-align-center": "置中", + "table.cell-align-right": "右", + + "table.history-filter": "過濾器", + "table.rangetype-last1h": "最近一小時", + "table.rangetype-last1d": "最近一天", + "table.rangetype-last3d": "過去 3 天", + + "table.alarms-title": "警報表", + "table.alarms-history-title": "警報歷史表", + "table.alarm-columns": "警報欄位", + "table.alarm-filter": "警報過濾器", + "table.alarm-priority": "優先順序", + "table.alarm-tags": "標籤", + + "table.reports-title": "報告表", + "table.report-columns": "報告欄位", + "table.report-view-name": "名稱", + "table.report-view-ontime": "建立時間", + "table.report-view-download": "下載", + "table.report-view-delete": "刪除", + "table.report-filter": "報告過濾器", + "table.report-filter-name": "名稱", + "table.report-filter-count": "最大值", + + "editor.view-svg": "畫布/SVG", + "editor.view-cards": "多視圖容器", + "editor.view-maps": "地圖", + "editor.views": "視圖", + "editor.resources": "資源", + "editor.view-delete": "刪除", + "editor.view-rename": "重新命名", + "editor.view-property": "屬性", + "editor.view-clone": "複製", + "editor.view-export": "匯出", + "editor.view-add": "新增視圖", + "editor.image-add": "新增圖片", + "editor.view-import": "匯入視圖", + "editor.general": "一般", + "editor.shape": "圖形", + "editor.processeng": "Proc. Eng.", + "editor.animated": "動畫", + "editor.controls": "控制", + "editor.controls-input": "輸入值", + "editor.controls-input-settings": "輸入設定", + "editor.controls-output": "輸出值", + "editor.controls-output-settings": "輸出設定", + "editor.controls-button": "按鈕", + "editor.controls-button-settings": "按鈕設定", + "editor.controls-select": "選擇值", + "editor.controls-select-settings": "選擇設定", + "editor.controls-progress": "儀表", + "editor.controls-progress-settings": "儀表設定", + "editor.controls-semaphore": "LED 儀錶", + "editor.controls-semaphore-settings": "LED 儀錶設定", + "editor.controls-chart": "圖表", + "editor.controls-chart-settings": "圖表設定", + "editor.controls-bag": "圓形量測儀", + "editor.controls-bag-settings": "圓形量測儀設定", + "editor.controls-pipe": "管道", + "editor.controls-pipe-settings": "管道設定", + "editor.controls-slider": "滑桿", + "editor.controls-slider-settings": "滑桿設定", + "editor.controls-shape-settings": "圖形設定", + "editor.controls-html-switch-settings": "開關設定", + "editor.controls-switch": "開關", + "editor.controls-graphbar": "長條圖", + "editor.controls-graph-bar-settings": "長條圖設定", + "editor.controls-graphpie": "圓餅圖", + "editor.controls-graph-pie-settings": "圓餅圖設定", + "editor.controls-iframe": "內嵌網頁", + "editor.controls-iframe-settings": "內嵌網頁設定", + "editor.controls-table": "表格", + "editor.header-item-settings": "頁首項目設定", + "editor.controls-image": "圖片(連結)", + "editor.controls-panel": "面板", + "editor.controls-panel-settings": "面板設定", + + "editor.layout-settings": "版面設定", + + "editor.interactivity": "互動", + "editor.interactivity-id": "id:", + "editor.interactivity-id-title": "識別此元素", + "editor.interactivity-class": "class:", + "editor.interactivity-class-title": "元素類別", + "editor.interactivity-name": "名稱", + "editor.edit-bind-of-tags": "編輯標籤繫結", + + "editor.cmenu-property": "屬性", + "editor.cmenu-cut": "剪下", + "editor.cmenu-copy": "複製", + "editor.cmenu-paste": "貼上", + "editor.cmenu-paste-place": "原地貼上", + "editor.cmenu-delete": "刪除", + "editor.cmenu-group": "群組", + "editor.cmenu-ungroup": "取消群組", + "editor.cmenu-bring-front": "置於最上層", + "editor.cmenu-bring-forward": "上移一層", + "editor.cmenu-send-backward": "下移一層", + "editor.cmenu-send-back": "置於最後方", + "editor.cmenu-layer-duplicate": "複製圖層...", + "editor.cmenu-layer-delete": "刪除圖層", + "editor.cmenu-layer-marge-down": "向下合併", + "editor.cmenu-layer-marge-all": "全部合併", + "editor.cmenu-unlock": "解除鎖定", + "editor.cmenu-lock": "鎖定", + + "editor.transform": "定位", + "editor.transform-x": "x", + "editor.transform-x-title": "變更 X 座標", + "editor.transform-y": "y", + "editor.transform-y-title": "變更 Y 座標", + "editor.transform-x1": "x1", + "editor.transform-x1-title": "變更線條起始 X 座標", + "editor.transform-y1": "y1", + "editor.transform-y1-title": "變更線條起始 y 座標", + "editor.transform-x2": "x2", + "editor.transform-x2-title": "變更線條結束 X 座標", + "editor.transform-y2": "y2", + "editor.transform-y2-title": "變更線條結束 Y 座標", + "editor.transform-rect-width-title": "變更矩形寬度", + "editor.transform-width": "寬度", + "editor.transform-rect-height-title": "變更矩形高度", + "editor.transform-height": "高度", + "editor.transform-rect-radius-title": "變更矩形圓角半徑", + "editor.transform-radiuscorner": "圓角", + "editor.transform-circlecx": "cx", + "editor.transform-circlecx-title": "變更圓形 cx 座標", + "editor.transform-circlecy": "cy", + "editor.transform-circlecy-title": "變更圓形 cy 座標", + "editor.transform-circler": "r", + "editor.transform-circler-title": "變更圓形半徑", + "editor.transform-ellipsecx": "cx", + "editor.transform-ellipsecx-title": "變更橢圓 cx 座標", + "editor.transform-ellipsecy": "cy", + "editor.transform-ellipsecy-title": "變更橢圓 cy 座標", + "editor.transform-ellipserx": "rx", + "editor.transform-ellipserx-title": "變更橢圓 x 半徑", + "editor.transform-ellipsery": "ry", + "editor.transform-ellipsery-title": "變更橢圓 y 半徑", + "editor.transform-fontfamily": "字型族", + "editor.transform-font-serif": "Serif", + "editor.transform-font-sansserif": "無襯線", + "editor.transform-font-cursive": "草書", + "editor.transform-font-fantasy": "Fantasy", + "editor.transform-font-monospace": "等寬", + "editor.transform-fontsize": "字型大小", + "editor.transform-fontsize-title": "變更字型大小", + "editor.transform-textalign": "文字對齊", + "editor.transform-left": "左", + "editor.transform-center": "置中", + "editor.transform-right": "右", + "editor.transform-image-width-title": "變更影像寬度", + "editor.transform-image-height-title": "變更影像高度", + "editor.transform-url": "url", + "editor.transform-image-url-title": "變更 URL", + "editor.transform-change-image": "變更影像", + "editor.transform-change-image-title": "注意:此影像無法內嵌,顯示將依賴此路徑", + "editor.transform-angle": "角度", + "editor.transform-angle-title": "變更旋轉角度", + "editor.transform-hide": "隱藏", + "editor.transform-lock": "鎖定", + + "editor.align": "對齊", + "editor.align-left-title": "向左對齊", + "editor.align-center-title": "對齊置中", + "editor.align-right-title":"向右對齊", + "editor.align-top-title": "對齊頂部", + "editor.align-middle-title": "對齊中間", + "editor.align-bottom-title": "對齊底部", + + "editor.stroke": "邊框", + "editor.stroke-width": "邊框寬度", + "editor.stroke-width-title": "變更邊框寬度為 1,按 Shift 變更為 0.1", + "editor.stroke-style": "邊框樣式", + "editor.stroke-style-title": "變更邊框虛線樣式", + "editor.stroke-joinmiter-title": "線段連接 Miter", + "editor.stroke-joinround-title": "線段連接 圓角", + "editor.stroke-joinbevel-title": "線段連接 斜角", + "editor.stroke-capbutt-title": "線端 Butt", + "editor.stroke-capsquare-title": "線端 方形", + "editor.stroke-capround-title": "線端 圓形", + "editor.stroke-shadow": "陰影", + "editor.stroke-shadow-title": "啟用陰影", + + "editor.marker": "標記", + "editor.marker-start": "開始", + "editor.marker-start-title": "選擇起始標記類型", + "editor.marker-middle": "中間", + "editor.marker-middle-title": "選擇中間標記類型", + "editor.marker-end": "尾端", + "editor.marker-end-title": "選擇末端標記類型", + + "editor.hyperlink": "超連結", + "editor.hyperlink-url": "url", + + "editor.tools-launch-title": "啟動目前視圖", + "editor.tools-select": "選取工具", + "editor.tools-pencil": "鉛筆工具", + "editor.tools-line": "直線工具", + "editor.tools-rectangle": "矩形工具", + "editor.tools-circle": "圓形工具", + "editor.tools-ellipse": "橢圓工具", + "editor.tools-path": "路徑工具", + "editor.tools-text": "文字工具", + "editor.tools-image": "影像工具", + + "editor.tools-zoom-title": "縮放工具[Ctrl+上/下]", + "editor.tools-grid-title": "顯示/隱藏網格", + "editor.tools-undo-title": "復原 [Z]", + "editor.tools-redo-title": "重做 [Y]", + "editor.tools-clone-title": "複製元素 [D]", + "editor.tools-delete-title": "刪除元素 [Delete/Backspace]", + "editor.tools-movebottom-title": "送至後方 [ Ctrl+Shift+[ ]", + "editor.tools-movetop-title": "帶到前方 [ Ctrl+Shift+] ]", + "editor.tools-topath-title": "轉換為路徑", + "editor.tools-clonemulti-title": "複製元素 [C]", + "editor.tools-deletemulti-title": "刪除選取元素 [Delete/Backspace]", + "editor.tools-group-title": "元素群組 [G]", + "editor.tools-alignleft-title": "向左對齊", + "editor.tools-aligncenter-title": "置中對齊", + "editor.tools-alignright-title": "向右對齊", + "editor.tools-aligntop-title": "對齊頂部", + "editor.tools-alignmiddle-title": "對齊中部", + "editor.tools-alignbottom-title": "對齊底部", + "editor.tools-ungroup-title": "取消群組元素 [G]", + "editor.tools-hyperlink-title": "建立超連結", + "editor.tools-svg-selector": "項目清單選擇器", + + "editor.settings-general": "一般", + "editor.settings-events": "事件", + "editor.settings-actions": "動作", + + "tags.ids-config-title": "標籤-IDs 參考", + + "svg.selector.property-title": "檢視項目清單", + + "tutorial.editor-keyboard-shortcuts": "編輯器快速鍵", + + "shapes.action-hide": "隱藏", + "shapes.action-show": "顯示", + "shapes.action-blink": "閃爍", + "shapes.action-stop": "停止", + "shapes.action-clockwise": "順時針轉動", + "shapes.action-anticlockwise": "逆時針轉動", + "shapes.action-downup": "向上與向下", + "shapes.action-rotate": "旋轉", + "shapes.action-refreshImage": "更新影像", + + "shapes.action-move": "移動", + "shapes.event-click": "點擊", + "shapes.event-dblclick": "雙擊", + "shapes.event-mouseup": "滑鼠放開", + "shapes.event-mousedown": "滑鼠按下", + "shapes.event-mouseover": "滑鼠懸停", + "shapes.event-mouseout": "滑鼠移出", + "shapes.event-enter": "進入", + "shapes.event-select": "選擇", + "shapes.event-onpage": "開啟頁面", + "shapes.event-onwindow": "開啟視窗", + "shapes.event-ondialog": "開啟對話框", + "shapes.event-oniframe": "開啟 iframe", + "shapes.event-oncard": "開啟視窗", + "shapes.event-onopentab": "開啟分頁", + "shapes.event-onsetvalue": "設定值", + "shapes.event-ontogglevalue": "切換值", + "shapes.event-onsetinput": "自輸入設定", + "shapes.event-onclose": "關閉", + "shapes.event-onopen": "開啟", + "shapes.event-onrunscript": "執行腳本", + "shapes.event-setvalue-set": "設定", + "shapes.event-setvalue-add": "增加", + "shapes.event-setvalue-remove": "減少", + "shapes.event-address-link": "連結", + "shapes.event-address-resource": "資源", + "shapes.event-onmonitor": "監控", + "shapes.event-onViewToPanel": "設定視圖至面板", + "shapes.event-onLoad": "載入", + "shapes.event-relativefrom-window": "視窗", + "shapes.event-relativefrom-mouse": "滑鼠", + + "pipe.property-title": "管道設定", + "pipe.property-data": "資料", + "pipe.property-style": "樣式", + "pipe.property-props": "屬性", + "pipe.property-border-width": "邊界寬度", + "pipe.property-border-color": "邊界顏色", + "pipe.property-pipe-width": "管道寬度", + "pipe.property-pipe-color": "管道顏色", + "pipe.property-content-width": "內容寬度", + "pipe.property-content-color": "內容顏色", + "pipe.property-content-space": "內容虛線", + "pipe.action-hide-content": "隱藏內容", + "pipe.property-style-animation": "動畫圖片", + "pipe.property-style-animation-image": "選擇圖片(SVG)", + "pipe.property-style-animation-count": "圖片數量", + "pipe.property-style-animation-delay": "動畫延遲(毫秒)", + + "slider.property-props": "屬性", + "slider.property-horizontal": "水平", + "slider.property-vertical": "垂直", + "slider.property-orientation": "方向", + "slider.property-direction": "方向", + "slider.property-rtl": "由右至左", + "slider.property-ltr": "由左至右", + "slider.property-min": "最小", + "slider.property-max": "最大", + "slider.property-step": "步長", + "slider.property-font": "字型", + "slider.property-background": "背景", + "slider.property-scala": "刻度", + "slider.property-marker-color": "顏色", + "slider.property-subdivisions": "子分區(%)", + "slider.property-subdivisions-height": "高度", + "slider.property-subdivisions-width": "寬度", + "slider.property-divisions": "分區(%)", + "slider.property-divisions-height": "高度", + "slider.property-divisions-width": "寬度", + "slider.property-font-size": "刻度字型", + "slider.property-tooltip": "工具提示", + "slider.property-tooltip-none": "無", + "slider.property-tooltip-hide": "隱藏", + "slider.property-tooltip-show": "顯示", + "slider.property-tooltip-decimals": "小數", + "slider.property-tooltip-background": "背景", + "slider.property-tooltip-color": "文字顏色", + "slider.property-tooltip-font-size": "工具提示字型", + "slider.property-slider-color": "連接顏色", + "slider.property-slider-background": "底色", + "slider.property-slider-handle": "指標顏色", + + "html-switch.property-off-value": "關閉值", + "html-switch.property-on-value": "開啟值", + "html-switch.property-on-background": "開啟背景", + "html-switch.property-off-background": "關閉背景", + "html-switch.property-off-text": "關閉文字", + "html-switch.property-on-text": "開啟文字", + "html-switch.property-on-slider-color": "開啟滑塊顏色", + "html-switch.property-off-slider-color":"關閉滑塊顏色", + "html-switch.property-radius": "圓角", + "html-switch.property-off-text-color": "關閉文字顏色", + "html-switch.property-on-text-color": "開啟文字顏色", + "html-switch.property-font-size":"字型大小", + "html-switch.property-font":"字型", + + "html-input.min": "最小值", + "html-input.max": "最大值", + "html-input.out-of-range": "超出範圍的值", + "html-input.not-a-number": "值不是數字", + + "editor.tools-zoomlevel-title": "縮放等級", + "editor.tools-zoomlevel-fitcanvas": "適合畫布", + "editor.tools-zoomlevel-fitsection": "適合選取", + "editor.tools-zoomlevel-fitcontent": "適合所有內容", + "editor.tools-fillcolor-title": "變更填滿顏色", + "editor.tools-strokecolor-title": "變更描邊顏色", + "editor.tools-palettecolor-title": "點擊變更填滿顏色,按住 Shift 變更描邊顏色", + + "device.list-title": "裝置設定", + "device.list-device": "裝置", + "device.list-filter": "過濾器", + "device.list-name": "名稱", + "device.list-address": "位址", + "device.list-type": "類型", + "device.list-min": "最小", + "device.list-max": "最大", + "device.list-value": "值", + "device.list-timestamp": "時間戳", + "device.list-description": "描述", + "device.list-edit": "編輯標籤", + "device.list-add": "新增標籤", + "device.list-remove": "刪除標籤", + "device.list-remove-all": "刪除所有標籤", + "device.list-options": "標籤選項", + "device.list-clipboard": "複製標籤物件到剪貼簿", + "device.list-direction":"方向", + + "devices.export": "匯出裝置", + "devices.export-json": "JSON", + "devices.export-csv": "CSV", + "devices.import": "匯入裝置", + "device.manage-templates": "管理範本", + "device.save-tags-to-template": "將標籤儲存至範本", + "device.add-tags-from-template": "自範本新增標籤", + "device.tags-template-name-title": "標籤範本名稱", + "devices.import-template": "匯入連線範本", + "device.property-client": "裝置屬性", + "device.property-server": "FUXA 伺服器屬性", + "device.property-name": "名稱", + "device.property-type": "類型", + "device.property-polling": "輪詢", + "device.property-enable": "啟用", + "device.property-subscribe": "訂閱", + "device.property-address": "位址(IP 或 opc.tcp://[伺服器]:[連接埠])", + "device.property-address-opc": "位址(opc.tcp://[伺服器]:[連接埠])", + "device.property-address-s7": "IP 位址(IP 127.0.0.1)", + "device.property-device-port": "裝置 IP 與連接埠(127.0.0.1:47808)", + "device.property-address-port": "從屬 IP 與連接埠(127.0.0.1:502)", + "device.property-security": "安全與加密模式", + "device.property-tags": "編輯裝置標籤", + "device.property-edit": "編輯裝置屬性", + "device.property-remove": "刪除裝置", + "device.property-add": "新增裝置", + "device.not-property-security": "沒有安全與加密模式", + "device.property-connection-options": "連線選項", + "device.property-port": "連接埠", + "device.property-slave-id": "從屬 ID", + "device.property-routing": "路由", + "device.property-tockenized": "權杖化(tokenized)", + "device.property-rack": "機架", + "device.property-slot": "插槽", + "device.property-serialport": "序列埠", + "device.property-baudrate": "鮑率", + "device.property-databits": "資料位元", + "device.property-stopbits": "停止位元", + "device.property-parity": "同位檢查", + "device.property-delay": "幀延遲(毫秒)", + "device.property-method": "方法", + "device.property-format": "格式", + "device.property-internal": "僅限前端", + "device.property-url": "URL(http://[伺服器]:[連接埠])", + "device.property-webapi-result": "請求的結果", + "device.property-ads-target": "目標 AmsNetId(例如 192.168.1.10.1.1:851)", + "device.property-ads-local": "本地 AmsNetId(例如 192.168.1.10.1.1:32750)", + "device.property-ads-router": "路由器位址(例如 192.168.1.120:48898)", + "device.not-webapi-result": "設定 WebAPI 的結果", + "device.property-show": "顯示裝置屬性", + "device.property-hide": "隱藏裝置屬性", + "device.property-interface-address": "介面與連接埠", + "device.property-interface-address-ph": "127.0.0.1:47808", + "device.property-broadcast-address": "廣播", + "device.property-broadcast-address-ph": "127.0.0.255", + "device.property-adpu-timeout": "adpu 逾時", + "device.property-adpu-timeout-ph": "6000", + "device.property-certificate-section": "TLS 憑證", + "device.property-certificate": "憑證", + "device.property-certificate-key": "私鑰", + "device.property-certificate-ca": "CA 憑證", + "device.security-none": "無", + "device.security-sign": "簽章", + "device.security-signandencrypt": "簽章與加密", + "device.webapi-property-title": "WebAPI 屬性", + "device.webapi-property-gettags": "URL GET 標籤", + "device.webapi-property-posttags": "URL POST 標籤", + "device.webapi-property-loadtags": "載入標籤", + "device.property-dsn": "資料來源名稱(DSN=資料庫名稱)", + "device.property-odbc-result": "找到的資料表結果", + "device.not-odbc-result": "資料庫資料表結果", + "device.add-device-templates-title": "裝置範本", + "device.add-tags-templates-title": "標籤範本", + "device.add-from-template": "自範本新增裝置", + "device.manage-templates-title": "刪除範本", + "device.template-device": "範本名稱", + "device.template-tags": "範本名稱", + "device.property-socket-reuse": "Socket 重用", + + "device.browsetopics-property-title": "要訂閱與發佈的 Broker 主題", + "device.browsetopics-property-sub": "訂閱", + "device.browsetopics-property-pub": "發佈", + "device.discovery-topics": "於 Broker 瀏覽主題", + "device.topic-selected": "已選主題", + "device.topic-raw": "原始", + "device.topic-json": "json", + "device.add-topics": "在 broker 上發佈我的主題", + "device.topic-publish-name": "主題名稱", + "device.topic-publish-path": "主題路徑", + "device.topic-publish": "發佈", + "device.topic-subscribe": "訂閱", + "device.topic-subscription-content": "內容", + "device.topic-subscription-name": "名稱", + "device.topic-subscription-address": "位址", + "device.topic-publish-add-item": "向有效載荷新增屬性", + "device.topic-publish-key": "鍵", + "device.topic-publish-type": "類型", + "device.topic-publish-timestamp": "時間戳", + "device.topic-publish-value": "主題路徑", + "device.topic-publish-static": "值", + "device.topic-publish-content": "有效載荷", + "device.topic-type-tag": "標籤", + "device.topic-type-timestamp": "時間戳", + "device.topic-type-value": "值(主題)", + "device.topic-type-static": "靜態", + "device.topic-name-exist": "主題名稱 '{{value}}' 已經存在", + "device.topic-subs-address-exist": "要訂閱位址為 '{{value}}' 的主題已經存在", + "device.topic-pubs-address-exist": "位址為 '{{value}}' 要發佈的主題已經存在", + + "device.property-mqtt-address": "位址(mqtt://[server]:[port])", + "device.tag-property-title": "標籤屬性", + "device.browsetag-property-title": "瀏覽伺服器中的標籤", + "device.tag-property-device": "裝置", + "device.tag-property-name": "Tag 名稱", + "device.tag-property-register": "暫存器", + "device.tag-property-type": "類型", + "device.tag-property-address": "位址(例:db5.dbb3 db4.dbx2.0 MB7)", + "device.tag-property-address-sample": "位址", + "device.tag-property-min": "最小", + "device.tag-property-max": "最大", + "device.tag-property-divisor": "除數", + "device.tag-property-address-offset": "位址位移(1-65536)", + "device.tag-property-obj-name": "名稱", + "device.tag-property-path": "路徑", + "device.tag-property-unit": "單位", + "device.tag-property-digits": "小數位", + "device.tag-property-initvalue": "初始值", + "device.tag-property-description": "描述", + "device.tag-property-direction": "方向", + "device.tag-property-edge": "邊緣", + "device.tag-property-gpio": "GPIO 編號", + + "device.tag-array-id": "陣列 ID:", + "device.tag-array-value": "值:", + "device-tag-dialog-title": "標籤選擇", + + "device.tag-options-title": "標籤選項", + "device.tag-daq-enabled": "註冊啟用", + "device.tag-daq-changed": "變更時儲存", + "device.tag-daq-interval": "儲存值間隔(秒)", + "device.tag-daq-restored": "還原", + + "device.tag-format": "數字格式化(2 = #.##)", + "device.tag-deadband": "死區", + "device.tag-scale": "縮放模式", + "device.tag-scale-mode-undefined": "無縮放", + "device.tag-scale-mode-undefined-tooltip": "標籤值", + "device.tag-scale-mode-linear": "線性:ΔS * (Value - RL) / ΔR + SL", + "device.tag-scale-mode-linear-tooltip": "ΔS = (Scaled High - Scaled Low)\nΔR = (Raw High - Raw Low)\nRL = Raw Low\nSL = Scaled Low", + "device.tag-scale-mode-script": "腳本(讀/寫)", + "device.tag-raw-low": "原始低", + "device.tag-raw-high": "原始高", + "device.tag-scaled-low": "縮放後低", + "device.tag-scaled-high": "縮放後高", + "device.tag-convert-datetime": "毫秒轉日期時間格式", + "device.tag-convert-datetime-tooltip": "範例格式:'YYYY-MM-DD HH:mm:ss' 2023-09-14 08:45:10", + "device.tag-convert-datetime-format": "日期時間格式(YYYY-MM-DD HH:mm:ss)", + "device.tag-convert-ticktime": "毫秒轉時間格式(剩餘或持續時間)", + "device.tag-convert-ticktime-tooltip": "範例格式:'HH:mm:ss' 56:45:10", + "device.tag-convert-ticktime-format": "時間格式(HH:mm:ss)", + "device.tag-scale-read-script": "讀取縮放腳本", + "device.tag-scale-read-script-tooltip": "從用戶端接收值的腳本", + "device.tag-scale-read-script-params": "輸入讀取腳本參數值", + "device.tag-scale-write-script": "寫入縮放腳本", + "device.tag-scale-write-script-tooltip": "寫入至用戶端前的值腳本", + "device.tag-scale-write-script-params": "輸入寫入腳本參數值", + "device.tag-scale-script-params-tooltip": "傳遞給腳本的參數值 JSON 格式化陣列", + + "device.edit-placeholder-titel": "編輯佔位符", + + "device.connect-ok": "OK", + "device.connect-error": "錯誤", + "device.connect-failed": "失敗", + "device.connect-off": "關閉", + "device.connect-busy": "忙碌", + + "devices.mode-map": "裝置圖示", + "devices.mode-list": "裝置清單", + "devices.list-name": "名稱", + "devices.list-address": "位址", + "devices.list-type": "類型", + "devices.list-polling": "輪詢", + "devices.list-enabled": "已啟用", + "devices.list-status": "狀態", + "device.list-clipboard": "複製到剪貼簿", + + "users.list-title": "使用者設定", + "users.list-name": "使用者名稱", + "users.list-fullname": "全名", + "users.list-groups": "群組", + "users.list-roles": "角色", + "users.list-start": "起始視圖", + + "roles.list-title": "角色設定", + "roles.list-index": "索引", + "roles.list-name": "名稱", + "roles.list-description": "描述", + + "user-role-edit-title": "角色設定", + "user-role-edit-name": "名稱", + "user-role-edit-index": "索引", + "user-role-edit-description": "描述", + + "events-history.list-title": "事件歷史", + "events-history.filter-daterange": "日期範圍過濾", + + "gauges.property-props": "屬性", + "gauges.property-events": "事件", + "gauges.property-title": "屬性", + "gauges.property-name": "名稱", + "gauges.property-text": "文字", + "gauges.property-permission": "授權", + "gauges.property-mask": "位元遮罩", + "gauges.property-readonly": "唯讀", + "gauges.property-event-type": "類型", + "gauges.property-event-action": "動作", + "gauges.property-event-destination": "目的地", + "gauges.property-event-destination-relative-from": "相對位置", + "gauges.property-event-destination-panel": "面板", + "gauges.property-event-destination-hide-close": "隱藏關閉", + "gauges.property-event-destination-target-device": "目標裝置", + "gauges.property-event-newtab": "新分頁", + "gauges.property-event-single-card": "單張卡片", + "gauges.property-event-value": "值", + "gauges.property-event-function": "函式", + "gauges.property-event-input": "輸入(僅限命名輸入)", + "gauges.property-event-address-type": "類型", + "gauges.property-event-address": "連結", + "gauges.property-event-resource": "資源", + "gauges.property-event-width": "寬度", + "gauges.property-event-height": "高度", + "gauges.property-event-scale": "縮放", + "gauges.property-event-script": "腳本", + "gauges.property-event-script-param-name": "參數", + "gauges.property-event-script-param-value": "值", + "gauges.property-event-script-param-input-value": "留空以傳送輸入的值", + "gauges.property-head-device": "裝置", + "gauges.property-head-variable": "變數", + "gauges.property-variable-value": "值", + "gauges.property-head-alarm": "警報", + "gauges.property-head-color": "顏色", + "gauges.property-head-mapvariable": "情境變數", + "gauges.property-head-tomapvariable": "定義情境變數", + "gauges.property-head-todevice": "裝置變數", + "gauges.property-head-value": "值", + "gauges.property-input-min": "最小", + "gauges.property-input-max": "最大", + "gauges.property-input-color": "填滿", + "gauges.property-input-stroke": "描邊", + "gauges.property-input-value": "值", + "gauges.property-input-label": "標籤", + "gauges.property-input-unit": "單位", + "gauges.property-input-type": "輸入類型", + "gauges.property-input-type-number": "數字", + "gauges.property-input-type-text": "文字", + "gauges.property-input-type-date": "日期", + "gauges.property-input-type-time": "時間", + "gauges.property-input-type-datetime": "日期與時間", + "gauges.property-input-time-format": "時間格式", + "gauges.property-input-time-format-normal": "HH:mm", + "gauges.property-input-time-format-seconds": "HH:mm:ss", + "gauges.property-input-time-format-milliseconds": "HH:mm:ss:fff", + "gauges.property-input-milliseconds": "轉換為毫秒", + "gauges.property-input-convertion": "轉換", + "gauges.property-input-convertion-milliseconds": "毫秒", + "gauges.property-input-convertion-string": "字串", + + "gauges.property-update-enabled": "啟用更新", + "gauges.property-update-esc": "ESC 更新", + "gauges.property-input-esc-action": "離開時執行", + "gauges.property-action-esc-update": "更新(重新整理)", + "gauges.property-action-esc-enter": "確認(Enter)", + "gauges.property-select-content-on-click": "點擊時選取內容", + "gauges.property-numeric-enabled": "僅允許數字", + "gauges.property-format-digits": "數字格式化", + "gauges.property-actions": "動作", + "gauges.property-action-type": "類型", + "gauges.property-action-param": "動作識別", + "gauges.property-action-minAngle" : "最小角度", + "gauges.property-action-maxAngle" : "最大角度", + "gauges.property-action-toX" : "至位置 X", + "gauges.property-action-toY" : "至位置 Y", + "gauges.property-action-duration" : "持續時間", + "gauges.property-events-mapping-from": "情境變數", + "gauges.property-map-variable": "新增情境變數以進行繫結", + "gauges.property-head-remove-mapvariable": "刪除繫結", + "gauges.property-tooltip-add-event": "新增事件", + "gauges.property-interval-msec": "間隔(毫秒)", + "gauges.property-tag-label": "標籤", + "gauges.property-tag-internal-title": "設定內部裝置的標籤", + "gauges.property-input-range": "允許的輸入範圍", + "gauges.property-language-text": "文字或 @文字 ID", + + "bag.property-ticks": "刻度", + "bag.property-divisions": "分區", + "bag.property-subdivisions": "子分區", + "bag.property-divisions-length": "分區長度", + "bag.property-subdivisions-length": "子分區長度", + "bag.property-divisions-width": "分區寬度", + "bag.property-subdivisions-width": "子分區寬度", + "bag.property-divisions-color": "分區顏色", + "bag.property-subdivisions-color": "子分區顏色", + "bag.property-divisionfont-size": "分區字型大小", + "bag.property-divisionfont-color": "分區字型顏色", + "bag.property-divisions-labels": "分區標籤(例如:10;20;...)", + "bag.property-current-value": "目前值", + "bag.property-min": "最小", + "bag.property-max": "最大", + "bag.property-bar-width": "條形寬度", + "bag.property-animation-speed": "動畫速度", + "bag.property-angle": "角度", + "bag.property-radius": "半徑", + "bag.property-font": "字型", + "bag.property-font-size": "字型大小", + "bag.property-textfield-position": "文字欄位位置", + "bag.property-pointer-length": "指針長度", + "bag.property-pointer-stroke": "指針描邊", + "bag.property-pointer-color": "指針顏色", + "bag.property-color-start": "指針掃過範圍顏色", + "bag.property-color-stop": "指針未掃過範圍顏色", + "bag.property-background": "背景", + "bag.property-format-digits": "小數位數", + "bag.property-zones": "區域", + "bag.property-color": "顏色", + "bag.property-fill": "填滿", + + "alarms.list-title": "警報器設定", + "alarms.list-name": "名稱", + "alarms.list-device": "裝置/變數", + "alarms.list-highhigh": "高高", + "alarms.list-high": "高", + "alarms.list-low": "低", + "alarms.list-info": "資訊", + "alarms.list-actions": "動作", + "alarm.property-title": "警報", + "alarm.property-name": "名稱", + "alarm.property-permission": "授權", + "alarm.property-highhigh": "高 高", + "alarm.property-high": "高", + "alarm.property-low": "低", + "alarm.property-info": "資訊", + "alarm.property-action": "動作", + "alarm.property-enabled": "已啟用", + "alarm.property-save-event": "事件", + "alarm.property-min": "最小", + "alarm.property-max": "最大", + "alarm.property-timedelay": "時間延遲(秒)", + "alarm.property-checkdelay": "檢查間隔(秒)", + "alarm.property-type": "類型", + "alarm.property-ackmode": "Ack 模式", + "alarm.property-text": "文字", + "alarm.property-group": "群組", + "alarm.ack-float": "浮動", + "alarm.ack-active": "允許主動警報 Ack", + "alarm.ack-passive": "僅允許被動警報 Ack", + "alarms.view-title": "警報", + "alarms.history-title": "歷史警報", + "alarms.view-ontime": "日期/時間", + "alarms.view-text": "文字", + "alarms.view-group": "群組", + "alarms.view-status": "狀態", + "alarms.view-type": "優先順序", + "alarms.view-offtime": "關閉日期/時間", + "alarms.view-acktime": "ACK 日期/時間", + "alarms.view-userack": "ACK 使用者", + "alarms.view-ack": "ACK", + "alarms.view-ack-all-alarms": "ACK 所有警報", + "alarm.status-active": "主動", + "alarm.status-passive": "被動", + "alarm.status-active-ack": "主動-ACK", + "alarms.show-current": "警報", + "alarms.show-history": "歷史警報", + "alarm.action-popup": "顯示彈窗", + "alarm.action-onsetview": "設定視圖", + "alarm.action-onsetvalue": "設定值", + "alarm.action-onRunScript": "執行腳本", + "alarm.action-toastMessage": "顯示訊息", + "alarm.action-sendMsg": "傳送訊息", + "alarm.property-action-type": "動作類型", + "alarm.property-action-value": "要設定的值", + "alarm.property-action-destination": "要顯示的視圖", + "alarm.property-action-toastMessage": "要顯示的訊息", + "alarm.property-action-toastType": "類型", + + "notifications.list-title": "通知設定", + "notifications.list-name": "名稱", + "notifications.list-receiver": "收件者", + "notifications.list-delay": "延遲", + "notifications.list-interval": "間隔", + "notifications.list-type": "類型", + "notifications.list-enabled": "已啟用", + "notifications.list-subscriptions": "訂閱", + "notification.property-title": "通知", + "notification.property-name": "名稱", + "notification.property-receiver": "收件者(信箱位址以 ';' 分隔)", + "notification.property-type": "類型", + "notification.property-delay": "延遲(分鐘)", + "notification.property-interval": "間隔(分鐘)", + "notification.property-enabled": "啟用", + "notification.property-priority": "優先順序", + "notification.type-alarm": "警報", + "notification.type-trigger": "觸發", + + "scripts.list-title": "腳本設定", + "scripts.list-name": "名稱", + "scripts.list-type": "類型", + "scripts.list-mode": "模式", + "scripts.list-params": "參數", + "scripts.list-scheduling": "排程 / 間隔", + "scripts.list-permission": "授權", + "scripts.list-options": "腳本選項", + + "script.permission-title": "授權", + "script.permission-label": "(空白 = 對全體)", + "script.permission-enabled": "已啟用", + + "script.create-title": "建立腳本", + + "script.mode": "執行模式", + "script.mode-title": "執行模式", + "script.mode-label": "(預設:伺服器)", + "script.mode-CLIENT": "用戶端(於瀏覽器中執行)", + "script.mode-SERVER": "伺服器(於伺服器中執行)", + + "script.property-title": "腳本", + "script.property-systems": "系統函式", + "script.property-templates": "範本", + "script.property-test": "測試", + "script.property-test-params": "函式參數", + "script.property-test-console": "主控台", + "script.property-test-tag": "設定標籤", + "script.property-test-run": "執行 TEST", + "script.property-editname": "編輯腳本名稱", + "script.property-name": "名稱", + "script.property-addfnc-param": "新增腳本參數", + "script.property-async-function": "非同步函式", + "script.param-title": "腳本參數", + "script.param-name": "名稱", + "script.param-type": "類型", + "script.paramtype": "", + "script.paramtype-tagid": "標籤 ID", + "script.paramtype-value": "值(數字/字串/物件)", + "script.paramtype-chart": "圖表線(陣列)", + "script.param-name-exist": "參數名稱已存在!", + "script.sys-fnc-settag-text": "$setTag (TagID, value)", + "script.sys-fnc-settag-tooltip": "設定標籤值的系統函式:$setTag (TagID 為字串,值為字串或數字)", + "script.sys-fnc-gettag-text": "$getTag (TagID)", + "script.sys-fnc-gettag-tooltip": "取得 Tag 值的系統函式:$getTag (TagID 為字串) 回傳值為字串或數字", + "script.scheduling-title": "腳本排程", + "script.scheduling-type": "類型", + "script.scheduling-interval": "循環間隔", + "script.scheduling-start": "僅在啟動時", + "script.scheduling-add-item": "新增排程器", + "script.scheduling-scheduling": "排程", + "script.scheduling-weekly": "每週", + "script.scheduling-date": "日期", + "script.scheduling-time": "時間", + "script.scheduling-hour": "小時", + "script.scheduling-minute": "分鐘", + "script.interval": "間隔(秒)", + "script.delay": "延遲(秒)", + "script.sys-fnc-setview-text": "$setView(視圖名稱)", + "script.sys-fnc-setview-tooltip": "在用戶端設定視圖的系統函式:$setView(視圖名稱為字串)", + "script.sys-fnc-setview-params": "'View name'", + "script.sys-fnc-opencard-text": "$openCard (View name)", + "script.sys-fnc-opencard-tooltip": "System function to open Card on client: $openCard (View name as string, Options as dict {left, top})", + "script.sys-fnc-opencard-params": "'View name'", + "script.sys-fnc-enableDevice-text": "$enableDevice (Device name, enable True/False)", + "script.sys-fnc-enableDevice-tooltip": "System function to enable Device connection: $enableDevice (Device name as string, enable as boolean)", + "script.sys-fnc-enableDevice-params": "'Device name', true", + "script.sys-fnc-getDevice-text": "$getDevice (Device name, interface True/False)", + "script.sys-fnc-getDevice-tooltip": "System function to get Device object: $getDevice (Device name as string, get Comm Interface as boolean)", + "script.sys-fnc-getDevice-params": "'Device name', true", + "script.sys-fnc-setAdapterToDevice-text": "$setAdapterToDevice(Adapter name, Device name)", + "script.sys-fnc-setAdapterToDevice-tooltip": "System function to bind Adapter (internal Device) to a Device: $setAdapterToDevice (Adapter name as string, Device name as string)", + "script.sys-fnc-setAdapterToDevice-params": "'Adapter name', 'Device name'", + "script.sys-fnc-resolveAdapterTagId-text": "$resolveAdapterTagId(TagID)", + "script.sys-fnc-resolveAdapterTagId-tooltip": "System function to get Tag ID of Device dind to Adapter (internal Device): $resolveAdapterTagId (TagID as string)", + "script.sys-fnc-resolveAdapterTagId-params": "'TagID of Adapter'", + "script.sys-fnc-getTagId-text": "$getTagId (Tag name, [Device name])", + "script.sys-fnc-getTagId-tooltip": "System function to get Tag ID: $getTagId (Tag name as string, [Optional Device name as string])", + "script.sys-fnc-getTagId-params": "'Tag name', ", + "script.sys-fnc-getTagDaqSettings-text": "$getTagDaqSettings (TagID)", + "script.sys-fnc-getTagDaqSettings-tooltip": "System function to get Tag DAQ settings: $getTagDaqSettings (TagID as string)", + "script.sys-fnc-getTagDaqSettings-params": "'TagID'", + "script.sys-fnc-setTagDaqSettings-text": "$setTagDaqSettings (TagID, DaqSettings)", + "script.sys-fnc-setTagDaqSettings-tooltip": "System function to set Tag DAQ settings: $setTagDaqSettings (TagID as string, DaqSettings as object {restored: boolean, enabled: boolean, changed: boolean, interval: number, lastDaqSaved: number} )", + "script.sys-fnc-setTagDaqSettings-params": "'TagID', 'DaqSettings'", + "script.sys-fnc-invokeObject-text": "$invokeObject (Object name, Function name, [Parameter])", + "script.sys-fnc-invokeObject-tooltip": "System function to call Object function: $invokeObject (Object name as string, function name as string , [parameter])", + "script.sys-fnc-invokeObject-params": "'Object name', 'function name', ", + "script.sys-fnc-runServerScript-text": "$runServerScript (Script name, [Parameter])", + "script.sys-fnc-runServerScript-tooltip": "Client function to call Server script function: $runServerScript (Script name as string, [parameter])", + "script.sys-fnc-runServerScript-params": "'Server script name', ", + "script.sys-fnc-getDeviceProperty-text": "$getDeviceProperty(Device name)", + "script.sys-fnc-getDeviceProperty-tooltip": "System function to get Device property: $getDeviceProperty(Device name as string)", + "script.sys-fnc-getDeviceProperty-params": "'Device name'", + "script.sys-fnc-setDeviceProperty-text": "$setDeviceProperty(Device name, property)", + "script.sys-fnc-setDeviceProperty-tooltip": "System function to set Device property: $setDeviceProperty(Device name as string, Property as object {address, port, ...} )", + "script.sys-fnc-setDeviceProperty-params": "'Device name', 'Property'", + "script.sys-fnc-getHistoricalTag-text": "$getHistoricalTags(TagIds array, from msec., to msec.)", + "script.sys-fnc-getHistoricalTag-tooltip":"get historical tags by milliseconds range: $getHistoricalTags([TagIds] as array, from as number, to as number)", + "script.sys-fnc-getHistoricalTag-params":"'Tag Ids array', 'From msec.', 'To msec.'", + "script.sys-fnc-sendMessage-text": "$sendMessage(address, subject, message)", + "script.sys-fnc-sendMessage-tooltip": "System function to send Message (Mail): $sendMessage(address as string, subject as string, message as string)", + "script.sys-fnc-sendMessage-params": "'address', 'subject', 'message'", + "script.sys-fnc-getAlarms-text": "$getAlarms()", + "script.sys-fnc-getAlarms-tooltip": "System function to get alarms list (): $getAlarms()", + "script.sys-fnc-getAlarms-params": "", + "script.sys-fnc-getAlarmsHistory-text": "$getAlarmsHistory(from msec., to msec.)", + "script.sys-fnc-getAlarmsHistory-tooltip": "System function to get historical alarms list (): $getAlarmsHistory(from as number, to as number)", + "script.sys-fnc-getAlarmsHistory-params": "'From msec.', 'To msec.'", + "script.sys-fnc-ackAlarms-text": "$ackAlarm(Alarm name, types)", + "script.sys-fnc-ackAlarms-tooltip": "System function to ACK alarm (): $ackAlarm(Alarm name as string, [types] 'highhigh|high|low')", + "script.sys-fnc-ackAlarms-params": "'Alarm name', 'types'", + + "script.template-chart-data-text": "自訂圖表資料", + "script.template-chart-data-tooltip": "回傳自訂圖表資料的程式碼範本", + "script.template-invoke-chart-update-options-text": "更新圖表選項", + "script.template-invoke-chart-update-options-tooltip": "更新圖表選項(Y 軸刻度範圍)。僅限用戶端模式!", + "script.template-getHistoricalTagsoptions-text": "取得歷史標籤值", + "script.template-getHistoricalTagsoptions-tooltip": "取得歷史標籤值的程式碼範本。", + + "client.script-access-title": "用戶端腳本存取", + "client.script-access-info": "透過 window.fuxaScriptAPI 設定對前端(例如小工具)的系統函式存取。", + + "reports.list-title": "報告設定", + "reports.list-name": "名稱", + "reports.list-type": "類型", + "reports.list-receiver": "收件者", + "reports.list-scheduling": "排程/間隔", + "reports.list-enabled": "已啟用", + + "report.property-title": "報告", + "report.property-name": "名稱", + "report.property-receiver": "收件者電子郵件", + "report.property-scheduling-type": "報告排程", + "report.property-content": "內容", + "report.property-page": "頁面設定", + "report.property-page-size": "頁面大小", + "report.property-page-orientation": "頁面方向", + "report.property-page-ori-landscape": "橫向", + "report.property-page-ori-portrait": "直向", + "report.property-margin-left": "左邊距", + "report.property-margin-top": "上邊距", + "report.property-margin-right": "右邊距", + "report.property-margin-bottom": "下邊距", + "report.scheduling-none": "停用", + "report.scheduling-day": "每日", + "report.scheduling-week": "每週", + "report.scheduling-month": "每月", + "report.content-addtext": "新增文字", + "report.content-addtable": "新增標籤表", + "report.content-addalarms": "新增警報歷史", + "report.content-addchart": "新增圖表", + "report.content-type-text": "文字", + "report.content-type-tagstable": "標籤表", + "report.content-type-alarmshistory": "警報歷史", + "report.content-type-chart": "圖表", + "report.content-fontsizeitem": "字型大小", + "report.content-alignitem": "文字對齊", + "report.content-edit": "編輯", + "report.content-delete": "刪除", + "report.item-text-title": "報告文字", + "report.item-text-label": "文字", + "report.tags-table-title": "報告標籤表", + "report.tags-table-column": "表格欄位標籤", + "report.tags-table-add": "新增標籤", + "report.tags-table-setlabel": "設定標籤", + "report.table-alignitem": "對齊", + "report.table-delitem": "刪除欄", + "report.item-daterange": "資料範圍", + "report.item-daterange-none": "無", + "report.item-daterange-day": "最近一天(0-24)", + "report.item-daterange-week": "上週(週一至週日)", + "report.item-daterange-month": "上個月", + "report.item-interval": "間隔(期間)", + "report.item-interval-min5": "5 分鐘", + "report.item-interval-min10": "10 分鐘", + "report.item-interval-min30": "30 分鐘", + "report.item-interval-hour": "1 小時", + "report.item-interval-day": "1 天", + "report.item-function-type": "功能類型", + "report.item-function-min": "最小", + "report.item-function-max": "最大", + "report.item-function-average": "平均", + "report.item-function-sum": "總和", + "report.item-alarms-title": "報告警報", + "report.alarms-priority": "警報優先順序", + "report.alarms-column": "警報欄位", + "report.alarms-filter": "警報過濾器", + "report.chart-title": "報告圖表", + "report.chart-name": "圖表名稱", + "report.chart-width": "寬度", + "report.chart-height": "高度", + + "maps.locations-list-title": "位置設定", + "maps.locations-list-name": "名稱", + "maps.locations-list-view": "視圖", + "maps.locations-list-description": "描述", + "maps.location-property-title": "位置", + "maps.location-property-name": "名稱", + "maps.location-property-description": "描述", + "maps.location-property-latitude": "緯度", + "maps.location-property-longitude": "經度", + "maps.location-property-card": "卡片", + "maps.location-property-view": "視圖", + "maps.location-property-url": "URL", + "maps.edit-add-location": "新增位置", + "maps.edit-import-location": "匯入位置", + "maps.edit-edit-location": "編輯位置", + "maps.edit-remove-location": "刪除位置", + "maps.edit-start-location": "設為起始位置", + "maps.edit-start-location-saved": "起始位置已儲存", + "maps.close-popups": "關閉所有彈窗", + "maps.location-to-import": "要匯入的位置", + "maps.location-to-import-input-title": "選擇要匯入的位置", + + "logs.view-title": "系統日誌", + "logs.view-files": "日誌檔", + + "events.view-ontime": "日期/時間", + "events.view-type": "類型", + "events.view-source": "來源", + "events.view-text": "文字", + + "card.config-title": "卡片設定", + "card.config-content-type": "內容類型", + "card.config-content-view": "內容視圖", + "card.config-content-iframe": "連結位址", + "card.widget-view": "視圖", + "card.widget-alarms": "警報", + "card.widget-table": "表格", + "card.widget-iframe": "連結", + "card.style-zoom": "縮放", + + "resources.lib-icons": "圖示", + "resources.lib-images": "圖片", + "resource.list-title": "資源清單", + "resource.list-name": "檔案名稱", + "resource.list-type": "檔案類型", + "resource.list-title-fonts": "字型清單", + "resources.lib-widgets": "小工具", + + "widgets.kiosk-title": "小工具", + "widget.remove": "刪除小工具", + + "texts.list-title": "文字設定", + "texts.list-filter": "過濾器", + "texts.list-filter-group": "群組", + "texts.list-id": "ID", + "texts.list-group": "群組", + "texts.list-value": "文字", + "texts.list-add-text": "新增文字", + "texts.list-edit-language": "編輯語言", + "language.settings-title": "語言設定", + "language.settings-add-tooltip": "新增語言", + "language.settings-id": "鍵", + "language.settings-default-id": "鍵(預設)", + "language.settings-id-placeholder": "例如:EN", + "language.settings-name": "名稱", + "language.settings-default-name": "名稱(預設)", + "language.settings-name-placeholder": "例如:English", + "text.settings-title": "文字", + "text.settings-id": "ID", + "text.settings-group": "群組", + "text.settings-value": "文字", + + "gui.range-number-min": "最小值", + "gui.range-number-max": "最大值", + "gui.range-number-boolean": "遮罩值", + "gui.range-number-true": "真 [1-1]", + "gui.range-number-false": "假 [0-0]", + "gui.range-number-switcher": "範圍為數字或布林值", + + "dlg.bitmask-title": "位元遮罩", + + "dlg.plugins-title": "伺服器外掛", + "dlg.plugins-info": "未安裝的外掛可在伺服器上手動安裝:'npm install [package name]@[version]'", + "dlg.plugins-type": "類型", + "dlg.plugins-name": "名稱", + "dlg.plugins-version": "版本", + "dlg.plugins-current": "已安裝", + "dlg.plugins-description": "描述", + "dlg.plugins-status-installing": "正在安裝...", + "dlg.plugins-status-removing": "正在移除...", + "dlg.plugins-status-installed": "正在安裝...OK!", + "dlg.plugins-status-removed": "正在移除...OK!", + "dlg.plugins-status-error": "錯誤!請手動再試!", + + "dlg.setup-title": "設定", + "dlg.setup-gui": "使用者介面", + "dlg.setup-diverse": "雜項", + "dlg.setup-logic": "邏輯", + "dlg.setup-system": "系統", + "dlg.setup-views": "視圖", + "dlg.setup-connections": "連線", + "dlg.setup-users": "使用者", + "dlg.setup-user-roles": "角色", + "dlg.setup-alarms": "警報", + "dlg.setup-line-charts": "折線圖", + "dlg.setup-bar-charts": "長條圖", + "dlg.setup-maps-locations": "位置", + "dlg.setup-layout": "版面", + "dlg.setup-plugins": "外掛", + "dlg.setup-scripts": "腳本", + "dlg.setup-reports": "報告", + "dlg.setup-settings": "設定", + "dlg.setup-client-access": "前端腳本", + "dlg.setup-logs": "日誌", + "dlg.setup-notifications": "通知", + "dlg.setup-events": "事件", + "dlg.setup-resources": "資源", + "dlg.setup-fonts": "字型", + "dlg.setup-language": "語言", + "dlg.app-settings-title": "設定", + "dlg.app-settings-system": "系統", + "dlg.app-settings-smtp": "SMTP", + "dlg.app-settings-smtp-host": "主機", + "dlg.app-settings-smtp-port": "連接埠", + "dlg.app-settings-smtp-mailsender": "郵件寄件者", + "dlg.app-settings-smtp-user": "User/ApiKey", + "dlg.app-settings-smtp-password": "密碼", + "dlg.app-settings-smtp-testaddress": "測試訊息收件的電子郵件", + "dlg.app-settings-smtp-test": "測試", + "dlg.app-settings-language": "語言", + "dlg.app-language-de": "German", + "dlg.app-language-en": "English", + "dlg.app-language-ru": "Русский", + "dlg.app-language-ua": "Українська", + "dlg.app-language-zh-cn": "中文", + "dlg.app-language-pt": "Português", + "dlg.app-language-sv": "Swedish", + "dlg.app-language-tr": "Türkçe", + "dlg.app-language-ko": "한국어", + "dlg.app-language-es": "Español", + "dlg.app-language-fr": "Français", + "dlg.app-settings-server-port": "伺服器監聽連接埠", + "dlg.app-settings-server-log-full": "日誌完整模式", + "dlg.app-settings-alarms": "警報", + "dlg.app-settings-alarms-clear": "清除所有警報與歷史", + "dlg.app-settings-auth-token": "使用權杖進行驗證", + "dlg.app-settings-auth-only-editor": "僅供編輯器", + "dlg.app-auth-disabled": "已停用", + "dlg.app-auth-expiration-15m": "已啟用,權杖 15 分鐘後失效", + "dlg.app-auth-expiration-1h": "已啟用,權杖將於 1 小時後到期,", + "dlg.app-auth-expiration-3h": "已啟用,權杖將於 3 小時後到期,", + "dlg.app-auth-expiration-1d": "已啟用,權杖將於 1 天內到期,", + "dlg.app-auth-tooltip": "已啟用:你有一個管理員帳號 'admin/123456'(請不要忘記修改)。需要重新啟動伺服器!", + "dlg.app-settings-client-broadcast": "廣播至用戶端(前端)所有標籤值", + + "dlg.app-settings-daqstore": "DAQ 儲存", + "dlg.app-settings-daqstore-type": "資料庫類型", + "dlg.app-settings-daqstore-url": "URL", + "dlg.app-settings-daqstore-token":"權杖", + "dlg.app-settings-daqstore-bucket": "Bucket", + "dlg.app-settings-daqstore-organization": "組織", + "dlg.app-settings-daqstore-retention": "保留", + "dlg.app-settings-daqstore-database": "資料庫名稱", + "dlg.app-settings-daqstore-username": "使用者名稱", + "dlg.app-settings-daqstore-password": "密碼", + + "dlg.app-settings-user-group-label": "授權類型", + "dlg.app-settings-user-group": "群組(預設)", + "dlg.app-settings-user-roles": "角色", + + "store.retention-none": "停用", + "store.retention-day1": "1 天", + "store.retention-days2": "2 天", + "store.retention-days3": "3 天", + "store.retention-days7": "7 天", + "store.retention-days14": "14 天", + "store.retention-days30": "30 天", + "store.retention-days90": "90 天", + "store.retention-year1": "1 年", + "store.retention-year3": "3 年", + "store.retention-year5": "5 年", + + "plugin.group-connection-device": "連線裝置", + "plugin.group-connection-database": "連線資料庫", + "plugin.group-chart-report": "報告圖表", + + "action-settings-title": "動作設定", + "action-settings-readonly-tag": "標籤", + "action-settings-readonly-values": "值", + + "msg.alarm-ack-all": "您是否要確認所有警報?", + "msg.alarm-remove": "您是否要刪除警報", + "msg.text-remove": "您是否要刪除文字", + "msg.alarmproperty-error-exist": "警報名稱已存在!", + "msg.alarmproperty-missing-value": "有些數值遺失!", + "msg.textproperty-error-exist": "Text-ID 已經存在!", + "msg.textproperty-missing-value": "有些數值缺失!", + "msg.device-remove": "您是否要刪除裝置", + "msg.device-tag-remove": "您是否要刪除標籤", + "msg.device-tag-exist": "標籤名稱已存在!", + "msg.device-tag-invalid-char": "不允許在標籤名稱中使用 '@' 字元!", + "msg.notification-property-missing-value": "有些數值遺失!", + "msg.report-property-missing-value": "有不正確或缺失的值!", + "msg.file-upload-failed": "上傳失敗!", + "msg.file-delete-failed": "刪除檔案失敗!", + + "msg.home-welcome": "請稍候......前往編輯器,繫結裝置,設計你的可視化並繫結裝置的變數", + "msg.server-connection-failed": "伺服器連線失敗!", + "msg.project-load-error": "無法讀取 '{{value}}'", + "msg.project": "您要儲存專案的變更嗎?", + "msg.tags-remove-all": "您要刪除所有標籤嗎?", + "msg.view-remove": "您是否要刪除視圖 '{{value}}'?", + "msg.chart-remove": "您要刪除圖表 '{{value}}' 嗎?", + "msg.role-remove": "您是否要刪除角色 '{{value}}'?", + "msg.graph-remove": "您要刪除長條圖 '{{value}}' 嗎?", + "msg.script-remove": "您要刪除腳本 '{{value}}' 嗎?", + "msg.report-remove": "您是否要刪除報告", + "msg.device-connection-error": "裝置 '{{value}}' 連線錯誤!", + "msg.server-connection-error": "伺服器連線失敗!", + "msg.sendmail-success": "郵件傳送成功!", + "msg.sendmail-error": "郵件傳送失敗!", + "msg.users-save-error": "使用者儲存失敗!", + "msg.user-remove": "您是否要刪除使用者", + "msg.project-save-success": "專案儲存成功!", + "msg.project-save-error": "專案儲存失敗!", + "msg.project-format-error": "專案格式錯誤!", + "msg.view-format-error": "視圖格式錯誤!", + "msg.project-save-unauthorized": "專案儲存失敗!未授權!", + "msg.project-save-ask": "你想離開此專案嗎?", + "msg.login-username-required": "輸入使用者名稱", + "msg.login-password-required": "輸入密碼", + "msg.signin-failed": "未授權", + "msg.signin-unauthorized": "未授權!", + "msg.get-project-void": "未找到專案!", + "msg.editor-mode-locked": "編輯器已開啟!", + "msg.alarms-clear-success": "所有警報已被清除!", + "msg.import-devices-error": "匯入裝置失敗!", + "msg.report-build-forced": "已成功觸發建置報告傳送", + "msg.report-build-error": "觸發建置報告傳送失敗!", + "msg.device-tags-request-result": "載入 {{current}} / {{value}}", + "msg.chart-with-script": "定義的腳本會接收圖表線清單作為參數,然後回傳附帶資料的完成清單。請參考腳本『範本』中的程式碼範例", + "msg.script-name-exist": "腳本名稱已存在!", + "msg.invalid-script-name": "無效的腳本名稱!", + "msg.templates-exist-ask-overwrite": "名稱 '{{value}}' 的範本已存在。您是否要覆蓋它?", + "msg.templates-save-success": "範本儲存成功!", + "msg.view-name-exist": "視圖名稱已存在!", + "msg.notification-name-exist": "通知名稱已存在!", + "msg.file-remove": "您是否要刪除 '{{value}}'?", + "msg.notification-remove": "您是否要刪除通知 '{{value}}'?", + "msg.maps-location-remove": "您是否要刪除位置 '{{value}}'?", + "msg.maps-location-name-exist": "位置名稱已存在!", + "msg.text-name-exist": "文字名稱已存在!", + "msg.texts-text-remove": "您是否要刪除文字 '{{value}}'?", + "msg.operation-unauthorized": "操作未授權!" +} diff --git a/client/dist/assets/images/nodered-icon.svg b/client/dist/assets/images/nodered-icon.svg new file mode 100644 index 000000000..f6b19d6a3 --- /dev/null +++ b/client/dist/assets/images/nodered-icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/client/dist/assets/lib/svgeditor/extensions/ext-bundle.min.js b/client/dist/assets/lib/svgeditor/extensions/ext-bundle.min.js index 030a7c491..bf646a659 100644 --- a/client/dist/assets/lib/svgeditor/extensions/ext-bundle.min.js +++ b/client/dist/assets/lib/svgeditor/extensions/ext-bundle.min.js @@ -1 +1 @@ -window.extConnector=function(){window.svgEditor&&svgEditor.addExtension("Connector",function(e){var u,v,f,p,m,h,x=e.svgcontent,g=e.svgroot,l=e.getNextId,w=e.getElem,y=e.addSvgElementFromJson,b=e.selectorManager,c=svgEditor.curConfig,k=!1,_=[],C=".se_connector",E=[],A=$.data,t={en:[{id:"mode_connect",title:"Connect two objects"}],fr:[{id:"mode_connect",title:"Connecter deux objets"}]};function S(e,t,r,n){n&&(n-=0,(r=$.extend({},r)).width+=n,r.height+=n,r.x-=n/2,r.y-=n/2);var i,o=r.x+r.width/2,a=r.y+r.height/2,s=e-o,d=t-a;return{x:o+s*(i=Math.abs(d/s)').appendTo("head")),t.text(e?"#tool_clone, #tool_topath, #tool_angle, #xy_panel { display: none !important; }":""),$("#connector_panel").toggle(e)}function M(t,r,n,i,e){var o,a=t.points,s=g.createSVGPoint();s.x=n,s.y=i,"end"===r&&(r=a.numberOfItems-1);try{a.replaceItem(s,r)}catch(e){var d=t.getAttribute("points").split(" ");for(o=0;o\t\t\t
\t\t\t\t
\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t \t\t\t\t\t
\t\t\t\t\t
\t\t\t\t
\t\t\t
\t\t');var o=function(){var e=parseFloat($("#workarea").css("height")),t=parseFloat($("#workarea").css("width")),r=$("#workarea").scrollLeft(),n=$("#workarea").scrollTop(),i=parseFloat($("#svgcanvas").css("width")),o=parseFloat($("#svgcanvas").css("height")),a=$("#overviewMiniView").attr("width"),s=$("#overviewMiniView").attr("height"),d=r/i*a,l=n/o*s,c=t/i*a,g=e/o*s;$("#overview_window_view_box").css("min-width",c+"px"),$("#overview_window_view_box").css("min-height",g+"px"),$("#overview_window_view_box").css("top",l+"px"),$("#overview_window_view_box").css("left",d+"px")};$("#workarea").scroll(function(){t.viewBoxDragging||o()}),$("#workarea").resize(o),o();var e=function(){var e=$("#svgroot").attr("width"),t=$("#svgroot").attr("height"),r=640,n=480;svgedit.browser.isIE()&&(n=r=0);var i=t/e*$("#overviewMiniView").attr("width");$("#overviewMiniView").attr("viewBox",r+" "+n+" "+e+" "+t),$("#overviewMiniView").attr("height",i),o()};e(),t.viewBoxDragging=!1;var l=function(){var e=parseFloat($("#svgcanvas").css("width")),t=parseFloat($("#svgcanvas").css("height")),r=$("#overviewMiniView").attr("width"),n=$("#overviewMiniView").attr("height"),i=parseFloat($("#overview_window_view_box").css("left"))/r*e,o=parseFloat($("#overview_window_view_box").css("top"))/n*t;$("#workarea").scrollLeft(i),$("#workarea").scrollTop(o)};return $("#overview_window_view_box").draggable({containment:"parent",drag:l,start:function(){t.viewBoxDragging=!0},stop:function(){t.viewBoxDragging=!1}}),$("#overviewMiniView").click(function(e){var t=e.offsetX||e.originalEvent.layerX,r=e.offsetY||e.originalEvent.layerY,n=$("#overviewMiniView").attr("width"),i=$("#overviewMiniView").attr("height"),o=parseFloat($("#overview_window_view_box").css("min-width")),a=parseFloat($("#overview_window_view_box").css("min-height")),s=t-.5*o,d=r-.5*a;s<0&&(s=0),d<0&&(d=0),n').appendTo("head")),t.text(e?"#tool_clone, #tool_topath, #tool_angle, #xy_panel { display: none !important; }":""),$("#connector_panel").toggle(e)}function M(t,r,n,i,e){var o,a=t.points,s=g.createSVGPoint();s.x=n,s.y=i,"end"===r&&(r=a.numberOfItems-1);try{a.replaceItem(s,r)}catch(e){var d=t.getAttribute("points").split(" ");for(o=0;o\t\t\t
\t\t\t\t
\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t \t\t\t\t\t
\t\t\t\t\t
\t\t\t\t
\t\t\t
\t\t');var o=function(){var e=parseFloat($("#workarea").css("height")),t=parseFloat($("#workarea").css("width")),r=$("#workarea").scrollLeft(),n=$("#workarea").scrollTop(),i=parseFloat($("#svgcanvas").css("width")),o=parseFloat($("#svgcanvas").css("height")),a=$("#overviewMiniView").attr("width"),s=$("#overviewMiniView").attr("height"),d=r/i*a,l=n/o*s,c=t/i*a,g=e/o*s;$("#overview_window_view_box").css("min-width",c+"px"),$("#overview_window_view_box").css("min-height",g+"px"),$("#overview_window_view_box").css("top",l+"px"),$("#overview_window_view_box").css("left",d+"px")};$("#workarea").scroll(function(){t.viewBoxDragging||o()}),$("#workarea").resize(o),o();var e=function(){var e=$("#svgroot").attr("width"),t=$("#svgroot").attr("height"),r=640,n=480;svgedit.browser.isIE()&&(n=r=0);var i=t/e*$("#overviewMiniView").attr("width");$("#overviewMiniView").attr("viewBox",r+" "+n+" "+e+" "+t),$("#overviewMiniView").attr("height",i),o()};e(),t.viewBoxDragging=!1;var l=function(){var e=parseFloat($("#svgcanvas").css("width")),t=parseFloat($("#svgcanvas").css("height")),r=$("#overviewMiniView").attr("width"),n=$("#overviewMiniView").attr("height"),i=parseFloat($("#overview_window_view_box").css("left"))/r*e,o=parseFloat($("#overview_window_view_box").css("top"))/n*t;$("#workarea").scrollLeft(i),$("#workarea").scrollTop(o)};return $("#overview_window_view_box").draggable({containment:"parent",drag:l,start:function(){t.viewBoxDragging=!0},stop:function(){t.viewBoxDragging=!1}}),$("#overviewMiniView").click(function(e){var t=e.offsetX||e.originalEvent.layerX,r=e.offsetY||e.originalEvent.layerY,n=$("#overviewMiniView").attr("width"),i=$("#overviewMiniView").attr("height"),o=parseFloat($("#overview_window_view_box").css("min-width")),a=parseFloat($("#overview_window_view_box").css("min-height")),s=t-.5*o,d=r-.5*a;s<0&&(s=0),d<0&&(d=0),n1;)u=i[r-1],t=u.multiply(t);return Math.abs(t.a)r&&(e=r,r=i,i=e),f=t.createSVGMatrix(),u=i;u<=r;++u)o=u>=0&&un.x&&t.yn.y}})(); var mysvgutils=function(t){"use strict";return{initSvgutils:function(){function e(t){if(svgedit.browser.supportsHVLineContainerBBox())try{return t.getBBox()}catch(t){}var e,i,r=$.data(t,"ref"),n=null;r?(i=$(r).children().clone().attr("visibility","hidden"),$(l).append(i),n=i.filter("line, path")):n=$(t).find("line, path");var s=!1;if(n.length)if(n.each(function(){var t=this.getBBox();t.width&&t.height||(s=!0)}),s){var o=r?i:$(t).children();e=getStrokedBBox(o)}else e=t.getBBox();else e=t.getBBox();return r&&i.remove(),e}svgedit.utilities||(svgedit.utilities={});var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",r=svgedit.NS,n="a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use",s=n.split(","),o=null,u=null,B=null,l=null;svgedit.utilities.init=function(t){o=t,u=t.getDOMDocument(),B=t.getDOMContainer(),l=t.getSVGRoot()},svgedit.utilities.toXml=function(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/,"'")},svgedit.utilities.fromXml=function(t){return $("

").html(t).text()},svgedit.utilities.encode64=function(t){if(t=svgedit.utilities.encodeUTF8(t),window.btoa)return window.btoa(t);var e,r,n,s,o,u,B,l=[];l.length=4*Math.floor((t.length+2)/3);var a=0,D=0;do{e=t.charCodeAt(a++),r=t.charCodeAt(a++),n=t.charCodeAt(a++),s=e>>2,o=(3&e)<<4|r>>4,u=(15&r)<<2|n>>6,B=63&n,isNaN(r)?u=B=64:isNaN(n)&&(B=64),l[D++]=i.charAt(s),l[D++]=i.charAt(o),l[D++]=i.charAt(u),l[D++]=i.charAt(B)}while(a>4,r=(15&s)<<4|o>>2,B=(3&o)<<6|l,u+=String.fromCharCode(e),64!=o&&(u+=String.fromCharCode(r)),64!=l&&(u+=String.fromCharCode(B)),e=r=B="",n=s=o=l=""}while(a>>8^r;return-1^i},svgedit.utilities.convertToXMLReferences=function(t){var e,i="";for(e=0;e127&&(i+="&#"+r+";")}return i},svgedit.utilities.text2xml=function(t){var e,i;t.indexOf("=0&&(t=t.replace(/<(\/?)svg:/g,"<$1").replace("xmlns:svg","xmlns"));try{i=window.DOMParser?new DOMParser:new ActiveXObject("Microsoft.XMLDOM"),i.async=!1}catch(t){throw new Error("XML Parser could not be instantiated")}try{e=i.loadXML?!!i.loadXML(t)&&i:i.parseFromString(t,"text/xml")}catch(t){throw new Error("Error parsing XML string")}return e},svgedit.utilities.bboxToObj=function(t){return{x:t.x,y:t.y,width:t.width,height:t.height}},svgedit.utilities.walkTree=function(t,e){if(t&&1==t.nodeType){e(t);for(var i=t.childNodes.length;i--;)svgedit.utilities.walkTree(t.childNodes.item(i),e)}},svgedit.utilities.walkTreePost=function(t,e){if(t&&1==t.nodeType){for(var i=t.childNodes.length;i--;)svgedit.utilities.walkTree(t.childNodes.item(i),e);e(t)}},svgedit.utilities.getUrlFromAttr=function(t){if(t){if(0===t.indexOf('url("'))return t.substring(5,t.indexOf('"',6));if(0===t.indexOf("url('"))return t.substring(5,t.indexOf("'",6));if(0===t.indexOf("url("))return t.substring(4,t.indexOf(")"))}return null},svgedit.utilities.getHref=function(t){return t.getAttributeNS(r.XLINK,"href")},svgedit.utilities.setHref=function(t,e){t.setAttributeNS(r.XLINK,"xlink:href",e)},svgedit.utilities.findDefs=function(){var t=o.getSVGContent(),e=t.getElementsByTagNameNS(r.SVG,"defs");return e.length>0?e=e[0]:(e=t.ownerDocument.createElementNS(r.SVG,"defs"),t.firstChild?t.insertBefore(e,t.firstChild.nextSibling):t.appendChild(e)),e},svgedit.utilities.getPathBBox=function(e){var i,r=e.pathSegList,n=r.numberOfItems,s=[[],[]],o=r.getItem(0),u=[o.x,o.y];for(i=0;i|:\\"+(e||"")+"-]","g"),"\\$&")},svgedit.utilities.executeAfterLoads=function(t,e,i){return function(){function r(){i.apply(null,n)}var n=arguments;window[t]?r():e.reduceRight(function(t,e){return function(){$.getScript(e,t)}},r)()}},svgedit.utilities.buildCanvgCallback=function(t){return svgedit.utilities.executeAfterLoads("canvg",["canvg/rgbcolor.js","canvg/canvg.js"],t)},svgedit.utilities.buildJSPDFCallback=function(e){return svgedit.utilities.executeAfterLoads("RGBColor",["canvg/rgbcolor.js"],function(){var i=[];RGBColor&&RGBColor.ok!==t||i.push("canvg/rgbcolor.js"),svgedit.utilities.executeAfterLoads("jsPDF",i.concat("jspdf/underscore-min.js","jspdf/jspdf.min.js","jspdf/jspdf.plugin.svgToPdf.js"),e)()})},svgedit.utilities.takePil=function(){var t=new Date,e=t.getFullYear(),i=t.getDay();Math.floor(3*Math.random());return e%2>0&&Math.floor(i/2),!0},svgedit.utilities.isNullish=function(t){return null==t}}}}(mysvgutils||{}); (function(){"use strict";svgedit.history||(svgedit.history={}),svgedit.history.HistoryEventTypes={BEFORE_APPLY:"before_apply",AFTER_APPLY:"after_apply",BEFORE_UNAPPLY:"before_unapply",AFTER_UNAPPLY:"after_unapply"};svgedit.history.MoveElementCommand=function(t,e,i,n){this.elem=t,this.text=n?"Move "+t.tagName+" to "+n:"Move "+t.tagName,this.oldNextSibling=e,this.oldParent=i,this.newNextSibling=t.nextSibling,this.newParent=t.parentNode},svgedit.history.MoveElementCommand.type=function(){return"svgedit.history.MoveElementCommand"},svgedit.history.MoveElementCommand.prototype.type=svgedit.history.MoveElementCommand.type,svgedit.history.MoveElementCommand.prototype.getText=function(){return this.text},svgedit.history.MoveElementCommand.prototype.apply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY,this),this.elem=this.newParent.insertBefore(this.elem,this.newNextSibling),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY,this)},svgedit.history.MoveElementCommand.prototype.unapply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY,this),this.elem=this.oldParent.insertBefore(this.elem,this.oldNextSibling),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY,this)},svgedit.history.MoveElementCommand.prototype.elements=function(){return[this.elem]},svgedit.history.InsertElementCommand=function(t,e){this.elem=t,this.text=e||"Create "+t.tagName,this.parent=t.parentNode,this.nextSibling=this.elem.nextSibling},svgedit.history.InsertElementCommand.type=function(){return"svgedit.history.InsertElementCommand"},svgedit.history.InsertElementCommand.prototype.type=svgedit.history.InsertElementCommand.type,svgedit.history.InsertElementCommand.prototype.getText=function(){return this.text},svgedit.history.InsertElementCommand.prototype.apply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY,this),this.elem=this.parent.insertBefore(this.elem,this.nextSibling),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY,this)},svgedit.history.InsertElementCommand.prototype.unapply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY,this),this.parent=this.elem.parentNode,this.elem=this.elem.parentNode.removeChild(this.elem),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY,this)},svgedit.history.InsertElementCommand.prototype.elements=function(){return[this.elem]},svgedit.history.RemoveElementCommand=function(t,e,i,n){this.elem=t,this.text=n||"Delete "+t.tagName,this.nextSibling=e,this.parent=i,svgedit.transformlist.removeElementFromListMap(t)},svgedit.history.RemoveElementCommand.type=function(){return"svgedit.history.RemoveElementCommand"},svgedit.history.RemoveElementCommand.prototype.type=svgedit.history.RemoveElementCommand.type,svgedit.history.RemoveElementCommand.prototype.getText=function(){return this.text},svgedit.history.RemoveElementCommand.prototype.apply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY,this),svgedit.transformlist.removeElementFromListMap(this.elem),this.parent=this.elem.parentNode,this.elem=this.parent.removeChild(this.elem),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY,this)},svgedit.history.RemoveElementCommand.prototype.unapply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY,this),svgedit.transformlist.removeElementFromListMap(this.elem),null==this.nextSibling&&window.console&&console.log("Error: reference element was lost"),this.parent.insertBefore(this.elem,this.nextSibling),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY,this)},svgedit.history.RemoveElementCommand.prototype.elements=function(){return[this.elem]},svgedit.history.ChangeElementCommand=function(t,e,i){this.elem=t,this.text=i?"Change "+t.tagName+" "+i:"Change "+t.tagName,this.newValues={},this.oldValues=e;var n;for(n in e)"#text"==n?this.newValues[n]=t.textContent:"#href"==n?this.newValues[n]=svgedit.utilities.getHref(t):this.newValues[n]=t.getAttribute(n)},svgedit.history.ChangeElementCommand.type=function(){return"svgedit.history.ChangeElementCommand"},svgedit.history.ChangeElementCommand.prototype.type=svgedit.history.ChangeElementCommand.type,svgedit.history.ChangeElementCommand.prototype.getText=function(){return this.text},svgedit.history.ChangeElementCommand.prototype.apply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY,this);var e,i=!1;for(e in this.newValues)this.newValues[e]?"#text"==e?this.elem.textContent=this.newValues[e]:"#href"==e?svgedit.utilities.setHref(this.elem,this.newValues[e]):this.elem.setAttribute(e,this.newValues[e]):"#text"==e?this.elem.textContent="":(this.elem.setAttribute(e,""),this.elem.removeAttribute(e)),"transform"==e&&(i=!0);if(!i){var n=svgedit.utilities.getRotationAngle(this.elem);if(n){var s=elem.getBBox(),o=s.x+s.width/2,r=s.y+s.height/2,h=["rotate(",n," ",o,",",r,")"].join("");h!=elem.getAttribute("transform")&&elem.setAttribute("transform",h)}}return t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY,this),!0},svgedit.history.ChangeElementCommand.prototype.unapply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY,this);var e,i=!1;for(e in this.oldValues)this.oldValues[e]?"#text"==e?this.elem.textContent=this.oldValues[e]:"#href"==e?svgedit.utilities.setHref(this.elem,this.oldValues[e]):this.elem.setAttribute(e,this.oldValues[e]):"#text"==e?this.elem.textContent="":this.elem.removeAttribute(e),"transform"==e&&(i=!0);if(!i){var n=svgedit.utilities.getRotationAngle(this.elem);if(n){var s=elem.getBBox(),o=s.x+s.width/2,r=s.y+s.height/2,h=["rotate(",n," ",o,",",r,")"].join("");h!=elem.getAttribute("transform")&&elem.setAttribute("transform",h)}}return svgedit.transformlist.removeElementFromListMap(this.elem),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY,this),!0},svgedit.history.ChangeElementCommand.prototype.elements=function(){return[this.elem]},svgedit.history.BatchCommand=function(t){this.text=t||"Batch Command",this.stack=[]},svgedit.history.BatchCommand.type=function(){return"svgedit.history.BatchCommand"},svgedit.history.BatchCommand.prototype.type=svgedit.history.BatchCommand.type,svgedit.history.BatchCommand.prototype.getText=function(){return this.text},svgedit.history.BatchCommand.prototype.apply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY,this);var e,i=this.stack.length;for(e=0;e=0;e--)this.stack[e].unapply(t);t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY,this)},svgedit.history.BatchCommand.prototype.elements=function(){for(var t=[],e=this.stack.length;e--;)for(var i=this.stack[e].elements(),n=i.length;n--;)t.indexOf(i[n])==-1&&t.push(i[n]);return t},svgedit.history.BatchCommand.prototype.addSubCommand=function(t){this.stack.push(t)},svgedit.history.BatchCommand.prototype.isEmpty=function(){return 0===this.stack.length},svgedit.history.UndoManager=function(t){this.handler_=t||null,this.undoStackPointer=0,this.undoStack=[],this.undoChangeStackPointer=-1,this.undoableChangeStack=[]},svgedit.history.UndoManager.prototype.resetUndoStack=function(){this.undoStack=[],this.undoStackPointer=0},svgedit.history.UndoManager.prototype.getUndoStackSize=function(){return this.undoStackPointer},svgedit.history.UndoManager.prototype.getRedoStackSize=function(){return this.undoStack.length-this.undoStackPointer},svgedit.history.UndoManager.prototype.getNextUndoCommandText=function(){return this.undoStackPointer>0?this.undoStack[this.undoStackPointer-1].getText():""},svgedit.history.UndoManager.prototype.getNextRedoCommandText=function(){return this.undoStackPointer0){var t=this.undoStack[--this.undoStackPointer];t.unapply(this.handler_)}},svgedit.history.UndoManager.prototype.redo=function(){if(this.undoStackPointer0){var t=this.undoStack[this.undoStackPointer++];t.apply(this.handler_)}},svgedit.history.UndoManager.prototype.addCommandToHistory=function(t){this.undoStackPointer0&&(this.undoStack=this.undoStack.splice(0,this.undoStackPointer)),this.undoStack.push(t),this.undoStackPointer=this.undoStack.length},svgedit.history.UndoManager.prototype.beginUndoableChange=function(t,e){for(var i=++this.undoChangeStackPointer,n=e.length,s=new Array(n),o=new Array(n);n--;){var r=e[n];null!=r&&(o[n]=r,s[n]=r.getAttribute(t))}this.undoableChangeStack[i]={attrName:t,oldValues:s,elements:o}},svgedit.history.UndoManager.prototype.finishUndoableChange=function(){for(var t=this.undoChangeStackPointer--,e=this.undoableChangeStack[t],i=e.elements.length,n=e.attrName,s=new svgedit.history.BatchCommand("Change "+n);i--;){var o=e.elements[i];if(null!=o){var r={};r[n]=e.oldValues[i],r[n]!=o.getAttribute(n)&&s.addSubCommand(new svgedit.history.ChangeElementCommand(o,r,n))}}return this.undoableChangeStack[t]=null,s}})(); -(function(){"use strict";svgedit.sanitize||(svgedit.sanitize={});var e=svgedit.NS,t=svgedit.getReverseNS(),i={a:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","id","mask","opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","xlink:href","xlink:title"],circle:["class","clip-path","clip-rule","cx","cy","fill","fill-opacity","fill-rule","filter","id","mask","opacity","r","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],clipPath:["class","clipPathUnits","id"],defs:[],style:["type"],desc:[],ellipse:["class","clip-path","clip-rule","cx","cy","fill","fill-opacity","fill-rule","filter","id","mask","opacity","requiredFeatures","rx","ry","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],feGaussianBlur:["class","color-interpolation-filters","id","requiredFeatures","stdDeviation"],filter:["class","color-interpolation-filters","filterRes","filterUnits","height","id","primitiveUnits","requiredFeatures","width","x","xlink:href","y"],foreignObject:["class","font-size","height","id","opacity","requiredFeatures","style","transform","width","x","y"],g:["type","class","clip-path","clip-rule","id","display","fill","fill-opacity","fill-rule","filter","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","font-family","font-size","font-style","font-weight","text-anchor"],image:["class","clip-path","clip-rule","filter","height","id","mask","opacity","requiredFeatures","style","systemLanguage","transform","width","x","xlink:href","xlink:title","y"],line:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","id","marker-end","marker-mid","marker-start","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","x1","x2","y1","y2"],linearGradient:["class","id","gradientTransform","gradientUnits","requiredFeatures","spreadMethod","systemLanguage","x1","x2","xlink:href","y1","y2"],marker:["id","class","markerHeight","markerUnits","markerWidth","orient","preserveAspectRatio","refX","refY","systemLanguage","viewBox"],mask:["class","height","id","maskContentUnits","maskUnits","width","x","y"],metadata:["class","id"],path:["type","class","clip-path","clip-rule","d","fill","fill-opacity","fill-rule","filter","id","marker-end","marker-mid","marker-start","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],pattern:["class","height","id","patternContentUnits","patternTransform","patternUnits","requiredFeatures","style","systemLanguage","viewBox","width","x","xlink:href","y"],polygon:["class","clip-path","clip-rule","id","fill","fill-opacity","fill-rule","filter","id","class","marker-end","marker-mid","marker-start","mask","opacity","points","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],polyline:["class","clip-path","clip-rule","id","fill","fill-opacity","fill-rule","filter","marker-end","marker-mid","marker-start","mask","opacity","points","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],radialGradient:["class","cx","cy","fx","fy","gradientTransform","gradientUnits","id","r","requiredFeatures","spreadMethod","systemLanguage","xlink:href"],rect:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","height","id","mask","opacity","requiredFeatures","rx","ry","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","width","x","y"],stop:["class","id","offset","requiredFeatures","stop-color","stop-opacity","style","systemLanguage"],svg:["class","clip-path","clip-rule","filter","id","height","mask","preserveAspectRatio","requiredFeatures","style","systemLanguage","viewBox","width","x","xmlns","xmlns:se","xmlns:xlink","y"],switch:["class","id","requiredFeatures","systemLanguage"],symbol:["class","type","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","opacity","preserveAspectRatio","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","viewBox"],text:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","text-anchor","transform","x","xml:space","y"],textPath:["class","id","method","requiredFeatures","spacing","startOffset","style","systemLanguage","transform","xlink:href"],title:[],tspan:["class","clip-path","clip-rule","dx","dy","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","mask","opacity","requiredFeatures","rotate","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","text-anchor","textLength","transform","x","xml:space","y"],use:["class","type","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","height","id","mask","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","transform","width","x","xlink:href","y"],script:[],input:["class","id","type","style","value"],INPUT:["class","id","type","style","value"],select:["class","id","type","style"],SELECT:["class","id","type","style"],option:["value","text"],OPTION:["value","text"],button:["class","color","style","id"],BUTTON:["class","color","style","id"],span:["class","color","style","id"],SPAN:["class","color","style","id"],div:["class","style","id"],DIV:["class","style","id"],label:["class","style","id"],LABEL:["class","style","id"],annotation:["encoding"],"annotation-xml":["encoding"],maction:["actiontype","other","selection"],math:["class","id","display","xmlns"],menclose:["notation"],merror:[],mfrac:["linethickness"],mi:["mathvariant"],mmultiscripts:[],mn:[],mo:["fence","lspace","maxsize","minsize","rspace","stretchy"],mover:[],mpadded:["lspace","width","height","depth","voffset"],mphantom:[],mprescripts:[],mroot:[],mrow:["xlink:href","xlink:type","xmlns:xlink"],mspace:["depth","height","width"],msqrt:[],mstyle:["displaystyle","mathbackground","mathcolor","mathvariant","scriptlevel"],msub:[],msubsup:[],msup:[],mtable:["align","columnalign","columnlines","columnspacing","displaystyle","equalcolumns","equalrows","frame","rowalign","rowlines","rowspacing","width"],mtd:["columnalign","columnspan","rowalign","rowspan"],mtext:[],mtr:["columnalign","rowalign"],munder:[],munderover:[],none:[],semantics:[]},s={};$.each(i,function(t,i){var r={};$.each(i,function(t,i){if(i.indexOf(":")>=0){var s=i.split(":");r[s[1]]=e[s[0].toUpperCase()]}else r[i]="xmlns"==i?e.XMLNS:null}),s[t]=r}),svgedit.sanitize.sanitizeSvg=function(r){if(3==r.nodeType&&(r.nodeValue=r.nodeValue.replace(/^\s+|\s+$/g,""),0===r.nodeValue.length&&r.parentNode.removeChild(r)),1==r.nodeType){var a=r.ownerDocument,l=r.parentNode;if(a&&l){var o=i[r.nodeName],n=s[r.nodeName];if(void 0!==o){if("foreignObject"===l.nodeName||l.parentNode&&"foreignObject"===l.parentNode.nodeName){for(var d=document.createElement(r.tagName),c=r.attributes.length;c--;){var m=r.attributes.item(c);d.setAttribute(m.nodeName,m.value)}d.innerHTML=r.innerHTML,l.removeChild(r),l.appendChild(d),r=d}var f=[];for(c=r.attributes.length;c--;){m=r.attributes.item(c);var p=m.nodeName,y=m.localName,k=m.namespaceURI;if(n.hasOwnProperty(y)&&k==n[y]&&k!=e.XMLNS||k==e.XMLNS&&t[m.value]||(0===p.indexOf("se:")&&f.push([p,m.value]),r.removeAttributeNS(k,y)),svgedit.browser.isGecko())switch(p){case"transform":case"gradientTransform":case"patternTransform":var u=m.value.replace(/(\d)-/g,"$1 -");r.setAttribute(p,u)}if("style"==p&&"foreignObject"!==l.nodeName){for(var h=m.value.split(";"),g=h.length;g--;){var v=h[g].split(":"),x=$.trim(v[0]),w=$.trim(v[1]);o.indexOf(x)>=0&&r.setAttribute(x,w)}r.removeAttribute("style")}}$.each(f,function(t,i){r.setAttributeNS(e.SE,i[0],i[1])});var L=svgedit.utilities.getHref(r);if(L&&["filter","linearGradient","pattern","radialGradient","textPath","use"].indexOf(r.nodeName)>=0&&"#"!=L[0]&&(svgedit.utilities.setHref(r,""),r.removeAttributeNS(e.XLINK,"href")),"use"==r.nodeName&&!svgedit.utilities.getHref(r))return void l.removeChild(r);for($.each(["clip-path","fill","filter","marker-end","marker-mid","marker-start","mask","stroke"],function(e,t){var i=r.getAttribute(t);i&&(i=svgedit.utilities.getUrlFromAttr(i),i&&"#"!==i[0]&&(r.setAttribute(t,""),r.removeAttribute(t)))}),c=r.childNodes.length;c--;)svgedit.sanitize.sanitizeSvg(r.childNodes.item(c))}else{for(var N=[];r.hasChildNodes();)N.push(l.insertBefore(r.firstChild,r));for(l.removeChild(r),c=N.length;c--;)svgedit.sanitize.sanitizeSvg(N[c])}}}}})(); +(function(){"use strict";svgedit.sanitize||(svgedit.sanitize={});var e=svgedit.NS,t=svgedit.getReverseNS(),s={a:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","id","mask","opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","xlink:href","xlink:title"],circle:["class","clip-path","clip-rule","cx","cy","fill","fill-opacity","fill-rule","filter","id","mask","opacity","r","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],clipPath:["class","clipPathUnits","id"],defs:[],style:["type"],desc:[],ellipse:["class","clip-path","clip-rule","cx","cy","fill","fill-opacity","fill-rule","filter","id","mask","opacity","requiredFeatures","rx","ry","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],feGaussianBlur:["class","color-interpolation-filters","id","requiredFeatures","stdDeviation"],filter:["class","color-interpolation-filters","filterRes","filterUnits","height","id","primitiveUnits","requiredFeatures","width","x","xlink:href","y"],foreignObject:["class","font-size","height","id","opacity","requiredFeatures","style","transform","width","x","y"],g:["type","class","clip-path","clip-rule","id","display","fill","fill-opacity","fill-rule","filter","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","font-family","font-size","font-style","font-weight","text-anchor"],image:["class","clip-path","clip-rule","filter","height","id","mask","opacity","requiredFeatures","style","systemLanguage","transform","width","x","xlink:href","xlink:title","y"],line:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","id","marker-end","marker-mid","marker-start","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","x1","x2","y1","y2"],linearGradient:["class","id","gradientTransform","gradientUnits","requiredFeatures","spreadMethod","systemLanguage","x1","x2","xlink:href","y1","y2"],marker:["id","class","markerHeight","markerUnits","markerWidth","orient","preserveAspectRatio","refX","refY","systemLanguage","viewBox"],mask:["class","height","id","maskContentUnits","maskUnits","width","x","y"],metadata:["class","id"],path:["type","class","clip-path","clip-rule","d","fill","fill-opacity","fill-rule","filter","id","marker-end","marker-mid","marker-start","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],pattern:["class","height","id","patternContentUnits","patternTransform","patternUnits","requiredFeatures","style","systemLanguage","viewBox","width","x","xlink:href","y"],polygon:["class","clip-path","clip-rule","id","fill","fill-opacity","fill-rule","filter","id","class","marker-end","marker-mid","marker-start","mask","opacity","points","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],polyline:["class","clip-path","clip-rule","id","fill","fill-opacity","fill-rule","filter","marker-end","marker-mid","marker-start","mask","opacity","points","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],radialGradient:["class","cx","cy","fx","fy","gradientTransform","gradientUnits","id","r","requiredFeatures","spreadMethod","systemLanguage","xlink:href"],rect:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","height","id","mask","opacity","requiredFeatures","rx","ry","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","width","x","y"],stop:["class","id","offset","requiredFeatures","stop-color","stop-opacity","style","systemLanguage"],svg:["class","clip-path","clip-rule","filter","id","height","mask","preserveAspectRatio","requiredFeatures","style","systemLanguage","viewBox","width","x","xmlns","xmlns:se","xmlns:xlink","y"],switch:["class","id","requiredFeatures","systemLanguage"],symbol:["class","type","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","opacity","preserveAspectRatio","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","viewBox"],text:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","text-anchor","transform","x","xml:space","y"],textPath:["class","id","method","requiredFeatures","spacing","startOffset","style","systemLanguage","transform","xlink:href"],title:[],tspan:["class","clip-path","clip-rule","dx","dy","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","mask","opacity","requiredFeatures","rotate","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","text-anchor","textLength","transform","x","xml:space","y"],use:["class","type","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","height","id","mask","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","transform","width","x","xlink:href","y"],script:[],input:["class","id","type","style","value"],INPUT:["class","id","type","style","value"],textarea:["class","id","type","style","value"],TEXTAREA:["class","id","type","style","value"],select:["class","id","type","style"],SELECT:["class","id","type","style"],option:["value","text"],OPTION:["value","text"],button:["class","color","style","id"],BUTTON:["class","color","style","id"],span:["class","color","style","id"],SPAN:["class","color","style","id"],div:["class","style","id"],DIV:["class","style","id"],label:["class","style","id"],LABEL:["class","style","id"],annotation:["encoding"],"annotation-xml":["encoding"],maction:["actiontype","other","selection"],math:["class","id","display","xmlns"],menclose:["notation"],merror:[],mfrac:["linethickness"],mi:["mathvariant"],mmultiscripts:[],mn:[],mo:["fence","lspace","maxsize","minsize","rspace","stretchy"],mover:[],mpadded:["lspace","width","height","depth","voffset"],mphantom:[],mprescripts:[],mroot:[],mrow:["xlink:href","xlink:type","xmlns:xlink"],mspace:["depth","height","width"],msqrt:[],mstyle:["displaystyle","mathbackground","mathcolor","mathvariant","scriptlevel"],msub:[],msubsup:[],msup:[],mtable:["align","columnalign","columnlines","columnspacing","displaystyle","equalcolumns","equalrows","frame","rowalign","rowlines","rowspacing","width"],mtd:["columnalign","columnspan","rowalign","rowspan"],mtext:[],mtr:["columnalign","rowalign"],munder:[],munderover:[],none:[],semantics:[]},i={};$.each(s,function(t,s){var r={};$.each(s,function(t,s){if(s.indexOf(":")>=0){var i=s.split(":");r[i[1]]=e[i[0].toUpperCase()]}else r[s]="xmlns"==s?e.XMLNS:null}),i[t]=r}),svgedit.sanitize.sanitizeSvg=function(r){if(3==r.nodeType&&(r.nodeValue=r.nodeValue.replace(/^\s+|\s+$/g,""),0===r.nodeValue.length&&r.parentNode.removeChild(r)),1==r.nodeType){var a=r.ownerDocument,l=r.parentNode;if(a&&l){var o=s[r.nodeName],n=i[r.nodeName];if(void 0!==o){if("foreignObject"===l.nodeName||l.parentNode&&"foreignObject"===l.parentNode.nodeName){for(var d=document.createElement(r.tagName),c=r.attributes.length;c--;){var m=r.attributes.item(c);d.setAttribute(m.nodeName,m.value)}d.innerHTML=r.innerHTML,l.removeChild(r),l.appendChild(d),r=d}var f=[];for(c=r.attributes.length;c--;){m=r.attributes.item(c);var p=m.nodeName,y=m.localName,u=m.namespaceURI;if(n.hasOwnProperty(y)&&u==n[y]&&u!=e.XMLNS||u==e.XMLNS&&t[m.value]||(0===p.indexOf("se:")&&f.push([p,m.value]),r.removeAttributeNS(u,y)),svgedit.browser.isGecko())switch(p){case"transform":case"gradientTransform":case"patternTransform":var k=m.value.replace(/(\d)-/g,"$1 -");r.setAttribute(p,k)}if("style"==p&&"foreignObject"!==l.nodeName){for(var h=m.value.split(";"),g=h.length;g--;){var v=h[g].split(":"),x=$.trim(v[0]),w=$.trim(v[1]);o.indexOf(x)>=0&&r.setAttribute(x,w)}r.removeAttribute("style")}}$.each(f,function(t,s){r.setAttributeNS(e.SE,s[0],s[1])});var L=svgedit.utilities.getHref(r);if(L&&["filter","linearGradient","pattern","radialGradient","textPath","use"].indexOf(r.nodeName)>=0&&"#"!=L[0]&&(svgedit.utilities.setHref(r,""),r.removeAttributeNS(e.XLINK,"href")),"use"==r.nodeName&&!svgedit.utilities.getHref(r))return void l.removeChild(r);for($.each(["clip-path","fill","filter","marker-end","marker-mid","marker-start","mask","stroke"],function(e,t){var s=r.getAttribute(t);s&&(s=svgedit.utilities.getUrlFromAttr(s),s&&"#"!==s[0]&&(r.setAttribute(t,""),r.removeAttribute(t)))}),c=r.childNodes.length;c--;)svgedit.sanitize.sanitizeSvg(r.childNodes.item(c))}else{for(var N=[];r.hasChildNodes();)N.push(l.insertBefore(r.firstChild,r));for(l.removeChild(r),c=N.length;c--;)svgedit.sanitize.sanitizeSvg(N[c])}}}}})(); var svgedit=svgedit||{};(function(){"use strict";svgedit.coords||(svgedit.coords={});var t=[0,"z","M","m","L","l","C","c","Q","q","A","a","H","h","V","v","S","s","T","t"],n=null;svgedit.coords.init=function(t){n=t};svgedit.coords.remapElement=function(i,r,u){for(var v,h=function(n,t){return svgedit.math.transformPoint(n,t,u)},p=function(n){return u.a*n},w=function(n){return u.d*n},kt=n.getGridSnapping()&&i.parentNode.parentNode.localName==="svg",tt=function(){var n;if(kt)for(n in r)r[n]=svgedit.utilities.snapToGrid(r[n]);svgedit.utilities.assignAttributes(i,r,1e3,!0)},it=svgedit.utilities.getBBox(i),rt,lt,o,at,vt,yt,pt,b,y,k,ft,et,d,s,a,g,c,ot,st,f,ht,ct,nt,wt,bt,l,e=0;e<2;e++)v=e===0?"fill":"stroke",rt=i.getAttribute(v),rt&&rt.indexOf("url(")===0&&(u.a<0||u.d<0)&&(lt=svgedit.utilities.getRefElem(rt),o=lt.cloneNode(!0),u.a<0&&(at=o.getAttribute("x1"),vt=o.getAttribute("x2"),o.setAttribute("x1",-(at-1)),o.setAttribute("x2",-(vt-1))),u.d<0&&(yt=o.getAttribute("y1"),pt=o.getAttribute("y2"),o.setAttribute("y1",-(yt-1)),o.setAttribute("y2",-(pt-1))),o.id=n.getDrawing().getNextId(),svgedit.utilities.findDefs().appendChild(o),i.setAttribute(v,"url(#"+o.id+")"));b=i.tagName;(b==="g"||b==="text"||b=="tspan"||b==="use")&&(u.a==1&&u.b==0&&u.c==0&&u.d==1&&(u.e!=0||u.f!=0)?(ft=svgedit.math.transformListToTransform(i).matrix,et=svgedit.math.matrixMultiply(ft.inverse(),u,ft),r.x=parseFloat(r.x)+et.e,r.y=parseFloat(r.y)+et.f):(y=svgedit.transformlist.getTransformList(i),k=svgroot.createSVGTransform(),k.setMatrix(svgedit.math.matrixMultiply(svgedit.math.transformListToTransform(y).matrix,u)),y.clear(),y.appendItem(k)));switch(b){case"foreignObject":case"rect":case"image":b==="image"&&(u.a<0||u.d<0)?(y=svgedit.transformlist.getTransformList(i),k=svgroot.createSVGTransform(),k.setMatrix(svgedit.math.matrixMultiply(svgedit.math.transformListToTransform(y).matrix,u)),y.clear(),y.appendItem(k)):(a=h(r.x,r.y),r.width=p(r.width),r.height=w(r.height),r.x=a.x+Math.min(0,r.width),r.y=a.y+Math.min(0,r.height),r.width=Math.abs(r.width),r.height=Math.abs(r.height));tt();break;case"ellipse":d=h(r.cx,r.cy);r.cx=d.x;r.cy=d.y;r.rx=p(r.rx);r.ry=w(r.ry);r.rx=Math.abs(r.rx);r.ry=Math.abs(r.ry);tt();break;case"circle":d=h(r.cx,r.cy);r.cx=d.x;r.cy=d.y;var ut=svgedit.math.transformBox(it.x,it.y,it.width,it.height,u),dt=ut.tr.x-ut.tl.x,gt=ut.bl.y-ut.tl.y;r.r=Math.min(dt/2,gt/2);r.r&&(r.r=Math.abs(r.r));tt();break;case"line":a=h(r.x1,r.y1);g=h(r.x2,r.y2);r.x1=a.x;r.y1=a.y;r.x2=g.x;r.y2=g.y;case"text":case"tspan":case"use":tt();break;case"g":ot=$(i).data("gsvg");ot&&svgedit.utilities.assignAttributes(ot,r,1e3,!0);break;case"polyline":case"polygon":for(c=r.points.length,e=0;e0;)s.push(s.shift()),i--;var o=0;for(t in r.selectorGrips)r.selectorGrips[t].setAttribute("style","cursor:"+s[o]+"-resize"),o++},svgedit.select.Selector.prototype.showGrips=function(e){var t=e?"inline":"none";r.selectorGripsGroup.setAttribute("display",t);var s=this.selectedElement;this.hasGrips=e,s&&e&&(this.selectorGroup.appendChild(r.selectorGripsGroup),this.updateGripCursors(svgedit.utilities.getRotationAngle(s)))},svgedit.select.Selector.prototype.resize=function(){var t=this.selectorRect,i=r,o=i.selectorGrips,l=this.selectedElement,n=l.getAttribute("stroke-width"),a=e.currentZoom(),c=1/a;"none"===l.getAttribute("stroke")||isNaN(n)||(c+=n/2);var d=l.tagName;"text"===d&&(c+=2/a);var h=svgedit.transformlist.getTransformList(l),p=svgedit.math.transformListToTransform(h).matrix;p.e*=a,p.f*=a;var u=svgedit.utilities.getBBox(l);if("g"===d&&!$.data(l,"gsvg")){var g=e.getStrokedBBox(l.childNodes);g&&(u=g)}var G=u.x,v=u.y,f=u.width,b=u.height;u={x:G,y:v,width:f,height:b},c*=a;var m=svgedit.math.transformBox(G*a,v*a,f*a,b*a,p),y=m.aabox,x=y.x-c,w=y.y-c,S=y.width+2*c,k=y.height+2*c,C=x+S/2,B=w+k/2,M=svgedit.utilities.getRotationAngle(l);if(M){var A=e.svgRoot().createSVGTransform();A.setRotate(-M,C,B);var E=A.matrix;m.tl=svgedit.math.transformPoint(m.tl.x,m.tl.y,E),m.tr=svgedit.math.transformPoint(m.tr.x,m.tr.y,E),m.bl=svgedit.math.transformPoint(m.bl.x,m.bl.y,E),m.br=svgedit.math.transformPoint(m.br.x,m.br.y,E);var P=m.tl,R=P.x,V=P.y,N=P.x,z=P.y,F=Math.min,T=Math.max;R=F(R,F(m.tr.x,F(m.bl.x,m.br.x)))-c,V=F(V,F(m.tr.y,F(m.bl.y,m.br.y)))-c,N=T(N,T(m.tr.x,T(m.bl.x,m.br.x)))+c,z=T(z,T(m.tr.y,T(m.bl.y,m.br.y)))+c,x=R,w=V,S=N-R,k=z-V}var _=e.svgRoot().suspendRedraw(100),L="M"+x+","+w+" L"+(x+S)+","+w+" "+(x+S)+","+(w+k)+" "+x+","+(w+k)+"z";t.setAttribute("d",L);var j,W=M?"rotate("+[M,C,B].join(",")+")":"";for(j in this.selectorGroup.setAttribute("transform",W),this.gripCoords={nw:[x,w],ne:[x+S,w],sw:[x,w+k],se:[x+S,w+k],n:[x+S/2,w],w:[x,w+k/2],e:[x+S,w+k/2],s:[x+S/2,w+k]},this.gripCoords){var q=this.gripCoords[j];o[j].setAttribute("x",q[0]-3),o[j].setAttribute("y",q[1]-3)}i.rotateGripConnector.setAttribute("x1",x+S/2),i.rotateGripConnector.setAttribute("y1",w),i.rotateGripConnector.setAttribute("x2",x+S/2),i.rotateGripConnector.setAttribute("y2",w-5*s),i.rotateGrip.setAttribute("cx",x+S/2),i.rotateGrip.setAttribute("cy",w-5*s),e.svgRoot().unsuspendRedraw(_)},svgedit.select.SelectorManager=function(){this.selectorParentGroup=null,this.rubberBandBox=null,this.selectors=[],this.selectorMap={},this.selectorGrips={nw:null,n:null,ne:null,e:null,se:null,s:null,sw:null,w:null},this.selectorGripsGroup=null,this.rotateGripConnector=null,this.rotateGrip=null,this.initGroup()},svgedit.select.SelectorManager.prototype.initGroup=function(){var r;for(r in this.selectorParentGroup&&this.selectorParentGroup.parentNode&&this.selectorParentGroup.parentNode.removeChild(this.selectorParentGroup),this.selectorParentGroup=e.createSVGElement({element:"g",attr:{id:"selectorParentGroup"}}),this.selectorGripsGroup=e.createSVGElement({element:"g",attr:{display:"none"}}),this.selectorParentGroup.appendChild(this.selectorGripsGroup),e.svgRoot().appendChild(this.selectorParentGroup),this.selectorMap={},this.selectors=[],this.rubberBandBox=null,this.selectorGrips){var i=e.createSVGElement({element:"rect",attr:{id:"selectorGrip_resize_"+r,width:6,height:6,"stroke-width":1,stroke:"#9ebdff",fill:"#FFF",style:"cursor:"+r+"-resize","pointer-events":"all"}});$.data(i,"dir",r),$.data(i,"type","resize"),this.selectorGrips[r]=this.selectorGripsGroup.appendChild(i)}if(this.rotateGripConnector=this.selectorGripsGroup.appendChild(e.createSVGElement({element:"line",attr:{id:"selectorGrip_rotateconnector",stroke:"#9ebdff","stroke-width":"1"}})),this.rotateGrip=this.selectorGripsGroup.appendChild(e.createSVGElement({element:"circle",attr:{id:"selectorGrip_rotate",fill:"lime",r:s,stroke:"#9ebdff","stroke-width":1}})),$.data(this.rotateGrip,"type","rotate"),!$("#canvasBackground").length){var o=t.dimensions,l=e.createSVGElement({element:"svg",attr:{id:"canvasBackground",width:o[0],height:o[1],x:0,y:0,overflow:svgedit.browser.isWebkit()?"none":"visible",style:"pointer-events:none"}}),n=e.createSVGElement({element:"rect",attr:{width:"100%",height:"100%",x:0,y:0,"stroke-width":1,stroke:"#000",fill:"#FFF",style:"pointer-events:none"}});l.appendChild(n),e.svgRoot().insertBefore(l,e.svgContent())}},svgedit.select.SelectorManager.prototype.requestSelector=function(e){if(null==e)return null;var t,r=this.selectors.length;if("object"==typeof this.selectorMap[e.id])return this.selectorMap[e.id].locked=!0,this.selectorMap[e.id];for(t=0;t=0)return null;var a,s=t.getSVGRoot(),i=svgedit.transformlist.getTransformList(r);if(i&&i.numberOfItems>0){for(a=i.numberOfItems;a--;){var m=i.getItem(a);0===m.type?i.removeItem(a):1===m.type?svgedit.math.isIdentity(m.matrix)&&i.removeItem(a):4===m.type&&0===m.angle&&i.removeItem(a)}if(1===i.numberOfItems&&svgedit.utilities.getRotationAngle(r))return null}if(!i||0==i.numberOfItems)return r.setAttribute("transform",""),r.removeAttribute("transform"),null;if(i){a=i.numberOfItems;for(var n=[];a--;){var m=i.getItem(a);1===m.type?n.push([m.matrix,a]):n.length&&(n=[])}if(2===n.length){var o=s.createSVGTransformFromMatrix(svgedit.math.matrixMultiply(n[1][0],n[0][0]));i.removeItem(n[0][1]),i.removeItem(n[1][1]),i.insertItemBefore(o,n[1][1])}if(a=i.numberOfItems,a>=2&&1===i.getItem(a-2).type&&2===i.getItem(a-1).type){var f=s.createSVGTransform(),v=svgedit.math.matrixMultiply(i.getItem(a-2).matrix,i.getItem(a-1).matrix);f.setMatrix(v),i.removeItem(a-2),i.removeItem(a-2),i.appendItem(f)}}switch(r.tagName){case"line":case"polyline":case"polygon":case"path":break;default:if(1===i.numberOfItems&&1===i.getItem(0).type||2===i.numberOfItems&&1===i.getItem(0).type&&4===i.getItem(0).type)return null}var g=$(r).data("gsvg"),l=new svgedit.history.BatchCommand("Transform"),d={},u=null,c=[];switch(r.tagName){case"line":c=["x1","y1","x2","y2"];break;case"circle":c=["cx","cy","r"];break;case"ellipse":c=["cx","cy","rx","ry"];break;case"foreignObject":case"rect":case"image":c=["width","height","x","y"];break;case"use":case"text":case"tspan":c=["x","y"];break;case"polygon":case"polyline":u={},u.points=r.getAttribute("points");var p=r.points,I=p.numberOfItems;d.points=new Array(I);var x;for(x=0;x1e-10)var O=Math.sin(M)/(1-Math.cos(M));else var O=2/M;var x;for(x=0;x=3&&3==i.getItem(N-2).type&&2==i.getItem(N-3).type&&2==i.getItem(N-1).type){L=3;for(var R=i.getItem(N-3).matrix,w=i.getItem(N-2).matrix,k=i.getItem(N-1).matrix,C=r.childNodes,D=C.length;D--;){var E=C.item(D);if(G=0,V=0,1==E.nodeType){var P=svgedit.transformlist.getTransformList(E);if(!P)continue;var v=svgedit.math.transformListToTransform(P).matrix,j=svgedit.utilities.getRotationAngle(E),F=t.getStartTransform(),U=[];if(t.setStartTransform(E.getAttribute("transform")),j||svgedit.math.hasMatrixTransform(P)){var H=s.createSVGTransform();H.setMatrix(svgedit.math.matrixMultiply(R,w,k,v)),P.clear(),P.appendItem(H),U.push(H)}else{var W=svgedit.math.matrixMultiply(v.inverse(),k,v),q=s.createSVGMatrix();q.e=-W.e,q.f=-W.f;var z=svgedit.math.matrixMultiply(q.inverse(),v.inverse(),R,w,k,v,W.inverse()),J=s.createSVGTransform(),K=s.createSVGTransform(),Q=s.createSVGTransform();J.setTranslate(W.e,W.f),K.setScale(z.a,z.d),Q.setTranslate(q.e,q.f),P.appendItem(Q),P.appendItem(K),P.appendItem(J),U.push(Q),U.push(K),U.push(J)}l.addSubCommand(svgedit.recalculate.recalculateDimensions(E)),t.setStartTransform(F)}}i.removeItem(N-1),i.removeItem(N-2),i.removeItem(N-3)}else if(N>=3&&1==i.getItem(N-1).type){L=3,v=svgedit.math.transformListToTransform(i).matrix;var H=s.createSVGTransform();H.setMatrix(v),i.clear(),i.appendItem(H)}else if((1==N||N>1&&3!=i.getItem(1).type)&&2==i.getItem(0).type){L=2;var X=svgedit.math.transformListToTransform(i).matrix;i.removeItem(0);var Y=svgedit.math.transformListToTransform(i).matrix.inverse(),Z=svgedit.math.matrixMultiply(Y,X);if(G=Z.e,V=Z.f,0!=G||0!=V){for(var C=r.childNodes,D=C.length,_=[];D--;){var E=C.item(D);if(1==E.nodeType){if(E.getAttribute("clip-path")){var tt=E.getAttribute("clip-path");_.indexOf(tt)===-1&&(svgedit.recalculate.updateClipPath(tt,G,V),_.push(tt))}var F=t.getStartTransform();t.setStartTransform(E.getAttribute("transform"));var P=svgedit.transformlist.getTransformList(E);if(P){var et=s.createSVGTransform();et.setTranslate(G,V),P.numberOfItems?P.insertItemBefore(et,0):P.appendItem(et),l.addSubCommand(svgedit.recalculate.recalculateDimensions(E));for(var rt=r.getElementsByTagNameNS(e.SVG,"use"),at="#"+E.id,st=rt.length;st--;){var it=rt.item(st);if(at==svgedit.utilities.getHref(it)){var mt=s.createSVGTransform();mt.setTranslate(-G,-V),svgedit.transformlist.getTransformList(it).insertItemBefore(mt,0),l.addSubCommand(svgedit.recalculate.recalculateDimensions(it))}}t.setStartTransform(F)}}}_=[],t.setStartTransform(F)}}else{if(1!=N||1!=i.getItem(0).type||S){if(S){var nt=s.createSVGTransform();nt.setRotate(S,b.x,b.y),i.numberOfItems?i.insertItemBefore(nt,0):i.appendItem(nt)}return 0==i.numberOfItems&&r.removeAttribute("transform"),null}L=1;for(var v=i.getItem(0).matrix,C=r.childNodes,D=C.length;D--;){var E=C.item(D);if(1==E.nodeType){var F=t.getStartTransform();t.setStartTransform(E.getAttribute("transform"));var P=svgedit.transformlist.getTransformList(E);if(!P)continue;var ot=svgedit.math.matrixMultiply(v,svgedit.math.transformListToTransform(P).matrix),ft=s.createSVGTransform();ft.setMatrix(ot),P.clear(),P.appendItem(ft,0),l.addSubCommand(svgedit.recalculate.recalculateDimensions(E)),t.setStartTransform(F);var vt=E.getAttribute("stroke-width");if("none"!==E.getAttribute("stroke")&&!isNaN(vt)){var gt=(Math.abs(ot.a)+Math.abs(ot.d))/2;E.setAttribute("stroke-width",vt*gt)}}}i.clear()}if(2==L){if(S){b={x:y.x+B.e,y:y.y+B.f};var nt=s.createSVGTransform();nt.setRotate(S,b.x,b.y),i.numberOfItems?i.insertItemBefore(nt,0):i.appendItem(nt)}}else if(3==L){var v=svgedit.math.transformListToTransform(i).matrix,lt=s.createSVGTransform();lt.setRotate(S,y.x,y.y);var dt=lt.matrix,ut=s.createSVGTransform();ut.setRotate(S,b.x,b.y);var ct=ut.matrix.inverse(),pt=v.inverse(),It=svgedit.math.matrixMultiply(pt,ct,dt,v);if(G=It.e,V=It.f,0!=G||0!=V)for(var C=r.childNodes,D=C.length;D--;){var E=C.item(D);if(1==E.nodeType){var F=t.getStartTransform();t.setStartTransform(E.getAttribute("transform"));var P=svgedit.transformlist.getTransformList(E),et=s.createSVGTransform();et.setTranslate(G,V),P.numberOfItems?P.insertItemBefore(et,0):P.appendItem(et),l.addSubCommand(svgedit.recalculate.recalculateDimensions(E)),t.setStartTransform(F)}}S&&(i.numberOfItems?i.insertItemBefore(ut,0):i.appendItem(ut))}}else{var T=svgedit.utilities.getBBox(r);if(!T&&"path"!=r.tagName)return null;var v=s.createSVGMatrix(),j=svgedit.utilities.getRotationAngle(r);if(j){var y={x:T.x+T.width/2,y:T.y+T.height/2},b=svgedit.math.transformPoint(T.x+T.width/2,T.y+T.height/2,svgedit.math.transformListToTransform(i).matrix),M=j*Math.PI/180;if(Math.abs(M)>1e-10)var O=Math.sin(M)/(1-Math.cos(M));else var O=2/M;for(var x=0;x=3&&3==i.getItem(N-2).type&&2==i.getItem(N-3).type&&2==i.getItem(N-1).type)L=3,v=svgedit.math.transformListToTransform(i,N-3,N-1).matrix,i.removeItem(N-1),i.removeItem(N-2),i.removeItem(N-3);else if(4==N&&1==i.getItem(N-1).type){L=3,v=svgedit.math.transformListToTransform(i).matrix;var H=s.createSVGTransform();H.setMatrix(v),i.clear(),i.appendItem(H),v=s.createSVGMatrix()}else if((1==N||N>1&&3!=i.getItem(1).type)&&2==i.getItem(0).type){L=2;var Ot=i.getItem(0).matrix,At=svgedit.math.transformListToTransform(i,1).matrix,Gt=At.inverse();v=svgedit.math.matrixMultiply(Gt,Ot,At),i.removeItem(0)}else{if(1!=N||1!=i.getItem(0).type||j){if(L=4,j){var nt=s.createSVGTransform();nt.setRotate(j,b.x,b.y),i.numberOfItems?i.insertItemBefore(nt,0):i.appendItem(nt)}return 0==i.numberOfItems&&r.removeAttribute("transform"),null}switch(v=svgedit.math.transformListToTransform(i).matrix,r.tagName){case"line":d=$(r).attr(["x1","y1","x2","y2"]);case"polyline":case"polygon":if(d.points=r.getAttribute("points"),d.points){var p=r.points,I=p.numberOfItems;d.points=new Array(I);for(var x=0;x1?(y=Math.ceil(d/g*b*100)/100,x=Math.ceil(u/h*b*100)/100):(y=Math.floor(d/g*b*100)/100,x=Math.floor(u/h*b*100)/100);let S=Math.min(y,x);if(S===t)return;b=S/t;const C=svgedit.math.transformPoint(c,v,Ae),w={x:s.x-(s.x-C.x)/b,y:s.y-(s.y-C.y)/b},_={x:w.x*S,y:w.y*S},N={x:_.x-a+o/2,y:_.y-a+l/2,width:0,height:0,factor:b};V("myZoomed",{center:!1,bbox:N})})})();var Ge=function(e){$(e).click(function(e){e.preventDefault()})};me=o.textActions=function(){function e(e){var t,i=""===m.value;if($(m).focus(),!arguments.length)if(i)e=0;else{if(m.selectionEnd!==m.selectionStart)return;e=m.selectionEnd}if(t=_[e],t){i||m.setSelectionRange(e,e),c=svgedit.utilities.getElem("text_cursor"),c||(c=document.createElementNS(n.SVG,"line"),svgedit.utilities.assignAttributes(c,{id:"text_cursor",stroke:"#333","stroke-width":1}),c=svgedit.utilities.getElem("selectorParentGroup").appendChild(c)),f||(f=setInterval(function(){var e="none"===c.getAttribute("display");c.setAttribute("display",e?"inline":"none")},600));var r=l(t.x,y.y),a=l(t.x,y.y+y.height);svgedit.utilities.assignAttributes(c,{x1:r.x,y1:r.y,x2:a.x,y2:a.y,visibility:"visible",display:"inline"}),v&&v.setAttribute("d","")}}function t(t,i,r){if(t!==i){r||m.setSelectionRange(t,i),v=svgedit.utilities.getElem("text_selectblock"),v||(v=document.createElementNS(n.SVG,"path"),svgedit.utilities.assignAttributes(v,{id:"text_selectblock",fill:"green",opacity:.5,style:"pointer-events:none"}),svgedit.utilities.getElem("selectorParentGroup").appendChild(v));var a=_[t],s=_[i];c.setAttribute("visibility","hidden");var o=l(a.x,y.y),d=l(a.x+(s.x-a.x),y.y),u=l(a.x,y.y+y.height),g=l(a.x+(s.x-a.x),y.y+y.height),h="M"+o.x+","+o.y+" L"+d.x+","+d.y+" "+g.x+","+g.y+" "+u.x+","+u.y+"z";svgedit.utilities.assignAttributes(v,{d:h,display:"inline"})}else e(i)}function i(e,t){var i=h.createSVGPoint();if(i.x=e,i.y=t,1==_.length)return 0;var r=g.getCharNumAtPosition(i);r<0?(r=_.length-2,e<=_[0].x&&(r=0)):r>=_.length-2&&(r=_.length-2);var n=_[r],a=n.x+n.width/2;return e>a&&r++,r}function r(t,r){e(i(t,r))}function a(e,r,n){var a=m.selectionStart,s=i(e,r),o=Math.min(a,s),l=Math.max(a,s);t(o,l,!n)}function s(e,t){var i={x:e,y:t};if(i.x/=p,i.y/=p,x){var r=svgedit.math.transformPoint(i.x,i.y,x.inverse());i.x=r.x,i.y=r.y}return i}function l(e,t){var i={x:e,y:t};if(x){var r=svgedit.math.transformPoint(i.x,i.y,x);i.x=r.x,i.y=r.y}return i.x*=p,i.y*=p,i}function d(e){t(0,g.textContent.length),$(this).unbind(e)}function u(e){if(C&&g){var r=svgedit.math.transformPoint(e.pageX,e.pageY,Ae),n=r.x*p,a=r.y*p,o=s(n,a),l=i(o.x,o.y),u=g.textContent,h=u.substr(0,l).replace(/[a-z0-9]+$/i,"").length,m=u.substr(l).match(/^[a-z0-9]+/i),c=(m?m[0].length:0)+l;t(h,c),$(e.target).click(d),setTimeout(function(){$(e.target).unbind("click",d)},300)}}var g,m,c,v,f,y,x,b,S,C,_=[];return{select:function(e,t,i){g=e,me.toEditMode(t,i)},start:function(e){g=e,me.toEditMode()},mouseDown:function(e,t,i,n){var a=s(i,n);m.focus(),r(a.x,a.y),b=i,S=n},mouseMove:function(e,t){var i=s(e,t);a(i.x,i.y)},mouseUp:function(e,t,i){var r=s(t,i);a(r.x,r.y,!0),e.target!==g&&tb-2&&iS-2&&me.toSelectMode(!0)},setCursor:e,toEditMode:function(t,i){C=!1,current_mode="textedit",Y.requestSelector(g).showGrips(!1);Y.requestSelector(g).selectorRect;if(me.init(),$(g).css("cursor","text"),arguments.length){var n=s(t,i);r(n.x,n.y)}else e();setTimeout(function(){C=!0},300)},toSelectMode:function(e){current_mode="select",clearInterval(f),f=null,v&&$(v).attr("display","none"),c&&$(c).attr("visibility","hidden"),$(g).css("cursor","move"),e&&(ke(),$(g).css("cursor","move"),V("selected",[g]),Ee([g],!0)),g&&!g.textContent.length&&o.deleteSelectedElements(),$(m).blur(),g=!1},setInputElem:function(e){m=e},clear:function(){"textedit"==current_mode&&me.toSelectMode()},init:function(e){if(g){var i,r;g.parentNode||(g=w[0],Y.requestSelector(g).showGrips(!1));var n=g.textContent,a=n.length,s=g.getAttribute("transform");for(y=svgedit.utilities.getBBox(g),x=s?svgedit.math.getMatrix(g):null,_=[],_.length=a,m.focus(),$(g).unbind("dblclick",u).dblclick(u),a||(r={x:y.x+y.width/2,width:0}),i=0;i=0&&this.selected_pts.push(r)}this.selected_pts.sort(),t=this.selected_pts.length;var n=[];for(n.length=t;t--;){var a=this.selected_pts[t];i=this.segs[a],i.select(!0),n[t]=i.ptgrip}ce.canDeleteNodes=!0,ce.closed_subpath=this.subpathIsClosed(this.selected_pts[0]),V("selected",n)},i=null;var u=null,g=!1,h=function(e){var t,i=e.points,r=i.numberOfItems;if(r>=4){var n=i.getItem(0),a=null,s=[];for(s.push(["M",n.x,",",n.y," C"].join("")),t=1;t<=r-4;t+=3){var o=i.getItem(t),l=i.getItem(t+1),d=i.getItem(t+2);if(a){var u=svgedit.path.smoothControlPoints(a,o,n);if(u&&2==u.length){var g=s[s.length-1].split(",");g[2]=u[0].x,g[3]=u[0].y,s[s.length-1]=g.join(","),o=u[1]}}s.push([o.x,o.y,l.x,l.y,d.x,d.y].join(",")),n=d,a=l}for(s.push("L");t=E-N&&v<=E+N&&f>=B-N&&f<=B+N){A=!0;break}}l=ge(),svgedit.path.removePath_(l);var T,G,I=svgedit.utilities.getElem(l),M=S.numberOfItems;if(A){if(w<=1&&M>=2&&"pipe"!==current_mode){var L=S.getItem(0).x,P=S.getItem(0).y;G=y.pathSegList.getItem(1),T=4===G.pathSegType?u.createSVGPathSegLinetoAbs(L,P):u.createSVGPathSegCurvetoCubicAbs(L,P,G.x1/p,G.y1/p,L,P);var O=u.createSVGPathSegClosePath();S.appendItem(T),S.appendItem(O)}else if(M<3&&"pipe"!==current_mode)return b=!1,b;if($(y).remove(),element=I,u=null,started=!1,d){svgedit.path.path.matrix&&svgedit.coords.remapElement(I,{},svgedit.path.path.matrix.inverse());var D=I.getAttribute("d"),R=$(svgedit.path.path.elem).attr("d");return $(svgedit.path.path.elem).attr("d",R+D),$(I).remove(),svgedit.path.path.matrix&&svgedit.path.recalcRotatedPath(),svgedit.path.path.init(),ce.toEditMode(svgedit.path.path.elem),svgedit.path.path.selectPt(),!1}}else{if(!$.contains(e,Te(t)))return console.log("Clicked outside canvas"),!1;var V=u.pathSegList.numberOfItems,U=u.pathSegList.getItem(V-1),z=U.x,F=U.y;if(t.shiftKey){var j=svgedit.math.snapToAngle(z,F,v,f);v=j.x,f=j.y}G=y.pathSegList.getItem(1),T=4===G.pathSegType?u.createSVGPathSegLinetoAbs(de(v),de(f)):u.createSVGPathSegCurvetoCubicAbs(de(v),de(f),G.x1/p,G.y1/p,G.x2/p,G.y2/p),u.pathSegList.appendItem(T),v*=p,f*=p,y.setAttribute("d",["M",v,f,v,f].join(" ")),x=V,d&&(x+=svgedit.path.path.segs.length),svgedit.path.addPointGrip(x,v,f)}}else{if(d_attr="M"+v+","+f+" ",path_attr={d:d_attr,id:he(),opacity:C.opacity/2},"pipe"===current_mode){var H=he().replace("svg_","PIE_");path_attr={d:d_attr,id:H,type:"svg-ext-pipe",fill:"rgba(0,0,0,0)",stroke:"rgba(41,171,226,1)","stroke-width":10,opacity:C.opacity/2}}u=_({element:"path",curStyles:!0,attr:path_attr}),y.setAttribute("d",["M",mouse_x,mouse_y,mouse_x,mouse_y].join(" ")),x=d?svgedit.path.path.segs.length:0,svgedit.path.addPointGrip(x,mouse_x,mouse_y)}}},mouseMove:function(e,t){if(g=!0,"path"!==current_mode&&"pipe"!==current_mode)if(svgedit.path.path.dragging){var i=svgedit.path.getPointFromGrip({x:svgedit.path.path.dragging[0],y:svgedit.path.path.dragging[1]},svgedit.path.path),r=svgedit.path.getPointFromGrip({x:e,y:t},svgedit.path.path),n=r.x-i.x,a=r.y-i.y;svgedit.path.path.dragging=[e,t],svgedit.path.path.dragctrl?svgedit.path.path.moveCtrl(n,a):svgedit.path.path.movePts(n,a)}else svgedit.path.path.selected_pts=[],svgedit.path.path.eachSeg(function(e){var t=this;if(t.next||t.prev){t.item;var i=rubberBox.getBBox(),r=svgedit.path.getGripPt(t),n={x:r.x,y:r.y,width:0,height:0},a=svgedit.math.rectsIntersect(i,n);this.select(a),a&&svgedit.path.path.selected_pts.push(t.index)}});else{if(!u)return;var o=u.pathSegList,d=o.numberOfItems-1;if(s){var h=svgedit.path.addCtrlGrip("1c1"),m=svgedit.path.addCtrlGrip("0c2");h.setAttribute("cx",e),h.setAttribute("cy",t),h.setAttribute("display","inline");var c=s[0],v=s[1],f=(o.getItem(d),e/p),y=t/p,x=c+(c-f),b=v+(v-y);m.setAttribute("cx",x*p),m.setAttribute("cy",b*p),m.setAttribute("display","inline");var S=svgedit.path.getCtrlLine(1);if(svgedit.utilities.assignAttributes(S,{x1:e,y1:t,x2:x*p,y2:b*p,display:"inline"}),0===d)l=[e,t];else{var C=o.getItem(d-1),w=C.x,_=C.y;6===C.pathSegType?(w+=w-C.x2,_+=_-C.y2):l&&(w=l[0]/p,_=l[1]/p),svgedit.path.replacePathSeg(6,d,[c,v,w,_,x,b],u)}}else{var N=svgedit.utilities.getElem("path_stretch_line");if(N){var A=o.getItem(d);if(6===A.pathSegType){var k=A.x+(A.x-A.x2),E=A.y+(A.y-A.y2);svgedit.path.replacePathSeg(6,1,[e,t,k*p,E*p,e,t],N)}else l?svgedit.path.replacePathSeg(6,1,[e,t,l[0],l[1],e,t],N):svgedit.path.replacePathSeg(4,1,[e,t],N)}}}},mouseUp:function(e,t,i,r){if("path"===current_mode||"pipe"===current_mode){if(s=null,!u){var n=ge();"pipe"===current_mode&&(n=n.replace("svg_","PIE_")),t=svgedit.utilities.getElem(n),started=!1,l=null}return{keep:!0,element:t}}if(svgedit.path.path.dragging){var a=svgedit.path.path.cur_pt;svgedit.path.path.dragging=!1,svgedit.path.path.dragctrl=!1,svgedit.path.path.update(),g&&svgedit.path.path.endChanges("Move path point(s)"),e.shiftKey||g||svgedit.path.path.selectPt(a)}else rubberBox&&"none"!=rubberBox.getAttribute("display")?(rubberBox.setAttribute("display","none"),rubberBox.getAttribute("width")<=2&&rubberBox.getAttribute("height")<=2&&ce.toSelectMode(e.target)):ce.toSelectMode(e.target);g=!1},toEditMode:function(e){svgedit.path.path=svgedit.path.getPath_(e),current_mode="pathedit",ke(),svgedit.path.path.show(!0).update(),svgedit.path.path.oldbbox=svgedit.utilities.getBBox(svgedit.path.path.elem),d=!1},toSelectMode:function(e){var t=e==svgedit.path.path.elem;current_mode="select",svgedit.path.path.show(!1),i=!1,ke(),svgedit.path.path.matrix&&svgedit.path.recalcRotatedPath(),t&&(V("selected",[e]),Ee([e],!0))},addSubPath:function(e){e?(current_mode="path",d=!0):(ce.clear(!0),ce.toEditMode(svgedit.path.path.elem))},select:function(e){i===e?(ce.toEditMode(e),current_mode="pathedit"):i=e},reorient:function(){var e=w[0];if(e){var t=svgedit.utilities.getRotationAngle(e);if(0!=t){var i=new svgedit.history.BatchCommand("Reorient path"),r={d:e.getAttribute("d"),transform:e.getAttribute("transform")};i.addSubCommand(new svgedit.history.ChangeElementCommand(e,r)),ke(),this.resetOrientation(e),X(i),svgedit.path.getPath_(e).show(!1).matrix=null,this.clear(),Ee([e],!0),V("changed",w)}}},clear:function(e){if(i=null,u){var t=svgedit.utilities.getElem(ge());$(svgedit.utilities.getElem("path_stretch_line")).remove(),$(t).remove(),$(svgedit.utilities.getElem("pathpointgrip_container")).find("*").attr("display","none"),u=l=null,started=!1}else"pathedit"==current_mode&&this.toSelectMode();svgedit.path.path&&svgedit.path.path.init().show(!1)},resetOrientation:function(e){if(null==e||"path"!=e.nodeName)return!1;var t=svgedit.transformlist.getTransformList(e),i=svgedit.math.transformListToTransform(t).matrix;t.clear(),e.removeAttribute("transform");var n,a=e.pathSegList,s=a.numberOfItems;for(n=0;n0){var o=e.getItem(t-1).pathSegType;if(2===o){i(t-1,1),r();break}if(1===o&&e.numberOfItems-1===t){i(t,1),r();break}}}return!1};if(r(),svgedit.path.path.elem.pathSegList.numberOfItems<=1)return ce.toSelectMode(svgedit.path.path.elem),void o.deleteSelectedElements();if(svgedit.path.path.init(),svgedit.path.path.clearSelection(),window.opera){var n=$(svgedit.path.path.elem);n.attr("d",n.attr("d"))}svgedit.path.path.endChanges("Delete path node(s)")}},smoothPolylineIntoPath:h,setSegType:function(e){svgedit.path.path.setSegType(e)},moveNode:function(e,t){var i=svgedit.path.path.selected_pts;if(i.length){svgedit.path.path.storeD();var r=svgedit.path.path.segs[i[0]],n={x:0,y:0};n[e]=t-r.item[e],r.move(n.x,n.y),svgedit.path.path.endChanges("Move path point")}},fixEnd:function(e){var i,r,n=e.pathSegList,a=n.numberOfItems;for(i=0;i0;);ce.clear(!0),$.each(m.childNodes,function(e,t){e&&8===t.nodeType&&t.data.indexOf("Created with")>=0&&m.insertBefore(t,m.firstChild)}),b&&(De(),Be([b]));var e=[];$(m).find("g:data(gsvg)").each(function(){var t,i=this.attributes,r=i.length;for(t=0;t=0)return i.join("");D(e);var d,u,g=e.attributes,h=e.childNodes;for(u=0;u=0;u--){d=g.item(u);p=r(d.value);if(!(y.indexOf(d.localName)>=0)&&""!=p){if(0===p.indexOf("pointer-events"))continue;if("class"===d.localName&&0===p.indexOf("se_"))continue;if(i.push(" "),"d"===d.localName&&(p=ce.convertPath(e,!1)),isNaN(p)?o.test(p)&&(p=svgedit.units.shortFloat(p)+s):p=svgedit.units.shortFloat(p),save_options.apply&&"image"===e.nodeName&&"href"===d.localName&&save_options.images&&"embed"===save_options.images){var x=re[p];x&&(p=x)}d.namespaceURI&&d.namespaceURI!=n.SVG&&!z[d.namespaceURI]||(i.push(d.nodeName),i.push('="'),i.push(p),i.push('"'))}}}if(e.hasChildNodes()){i.push(">"),t++;var b=!1;for(u=0;u");break;case 8:i.push("\n"),i.push(new Array(t+1).join(" ")),i.push("")}}if(t--,!b)for(i.push("\n"),u=0;u")}else"div"===e.nodeName.toLowerCase()||"span"===e.nodeName.toLowerCase()?(i.push(">"),i.push("")):i.push("/>")}return i.join("")},this.embedImage=function(e,t){$(new Image).load(function(){var i=document.createElement("canvas");i.width=this.width,i.height=this.height,i.getContext("2d").drawImage(this,0,0);try{var r=";svgedit_url="+encodeURIComponent(e);r=i.toDataURL().replace(";base64",r+";base64"),re[e]=r}catch(t){re[e]=!1}ne=e,t&&t(re[e])}).attr("src",e)},this.setGoodImage=function(e){ne=e},this.setGoodSvgImageContent=function(e){last_good_img_content=e},this.open=function(){},this.save=function(e){ke(),e&&$.extend(save_options,e),save_options.apply=!0;var t=this.svgCanvasToString();V("saved",t)},this.rasterExport=function(e,t,r){var n="image/"+e.toLowerCase(),a=i(),s=this.svgCanvasToString();svgedit.utilities.buildCanvgCallback(function(){var i=e||"PNG";$("#export_canvas").length||$("",{id:"export_canvas"}).hide().appendTo("body");var o=$("#export_canvas")[0];o.width=svgCanvas.contentW,o.height=svgCanvas.contentH,canvg(o,s,{renderCallback:function(){var l=("ICO"===i?"BMP":i).toLowerCase(),d=t?o.toDataURL("image/"+l,t):o.toDataURL("image/"+l);V("exported",{datauri:d,svg:s,issues:a,type:e,mimeType:n,quality:t,exportWindowName:r})}})})()},this.exportPDF=function(e,t){var r=this;svgedit.utilities.buildJSPDFCallback(function(){var n=Ve(),a=n.w>n.h?"landscape":"portrait",s="pt",o=jsPDF({orientation:a,unit:s,format:[n.w,n.h]}),l=Ue();o.setProperties({title:l});var d=i(),u=r.svgCanvasToString();o.addSVG(u,0,0);var g={svg:u,issues:d,exportWindowName:e},h=t||"dataurlstring";g[h]=o.output(h),V("exportedPDF",g)})()},this.lockSelection=function(e){d=e},this.getSvgString=function(){return save_options.apply=!1,this.svgCanvasToString()},this.randomizeIds=function(e){arguments.length>0&&0==e?svgedit.draw.randomizeIds(!1,f()):svgedit.draw.randomizeIds(!0,f())};var Me=this.uniquifyElems=function(e){var t,i={},r=["filter","linearGradient","pattern","radialGradient","symbol","textPath","use"];for(t in svgedit.utilities.walkTree(e,function(e){if(1==e.nodeType){e.id&&(e.id in i||(i[e.id]={elem:null,attrs:[],hrefs:[]}),i[e.id].elem=e),$.each(Q,function(t,r){var n=e.getAttributeNode(r);if(n){var a=svgedit.utilities.getUrlFromAttr(n.value),s=a?a.substr(1):null;s&&(s in i||(i[s]={elem:null,attrs:[],hrefs:[]}),i[s].attrs.push(n))}});var t=svgedit.utilities.getHref(e);if(t&&r.indexOf(e.nodeName)>=0){var n=t.substr(1);n&&(n in i||(i[n]={elem:null,attrs:[],hrefs:[]}),i[n].hrefs.push(e))}}}),i)if(t){var n=i[t].elem;if(n){var a=he();n.id=a;for(var s=i[t].attrs,o=s.length;o--;){var l=s[o];l.ownerElement.setAttribute(l.name,"url(#"+a+")")}for(var d=i[t].hrefs,u=d.length;u--;){var g=d[u];svgedit.utilities.setHref(g,"#"+a)}}}},Le=this.setUseData=function(e){var t=$(e);"use"!==e.tagName&&(t=t.find("use")),t.each(function(){var e=I(this).substr(1),t=svgedit.utilities.getElem(e);t&&($(this).data("ref",t),"symbol"!=t.tagName&&"svg"!=t.tagName||$(this).data("symbol",t).data("ref",t))})},$e=this.convertGradients=function(e){var t=$(e).find("linearGradient, radialGradient");!t.length&&svgedit.browser.isWebkit()&&(t=$(e).find("*").filter(function(){return this.tagName.indexOf("Gradient")>=0})),t.each(function(){var e=this;if("userSpaceOnUse"===$(e).attr("gradientUnits")){var t=$(m).find('[fill="url(#'+e.id+')"],[stroke="url(#'+e.id+')"]');if(!t.length)return;var i=svgedit.utilities.getBBox(t[0]);if(!i)return;if("linearGradient"===e.tagName){var r=$(e).attr(["x1","y1","x2","y2"]),n=e.gradientTransform.baseVal;if(n&&n.numberOfItems>0){var a=svgedit.math.transformListToTransform(n).matrix,s=svgedit.math.transformPoint(r.x1,r.y1,a),o=svgedit.math.transformPoint(r.x2,r.y2,a);r.x1=s.x,r.y1=s.y,r.x2=o.x,r.y2=o.y,e.removeAttribute("gradientTransform")}$(e).attr({x1:(r.x1-i.x)/i.width,y1:(r.y1-i.y)/i.height,x2:(r.x2-i.x)/i.width,y2:(r.y2-i.y)/i.height}),e.removeAttribute("gradientUnits")}}})},Pe=this.convertToGroup=function(e){e||(e=w[0]);var t,i=$(e),r=new svgedit.history.BatchCommand;if(i.data("gsvg")){var a=e.firstChild,s=$(a).attr(["x","y"]);$(e.firstChild.firstChild).unwrap(),$(e).removeData("gsvg");var o=svgedit.transformlist.getTransformList(e),l=h.createSVGTransform();l.setTranslate(s.x,s.y),o.appendItem(l),svgedit.recalculate.recalculateDimensions(e),V("selected",[e])}else if(i.data("symbol")){e=i.data("symbol"),t=i.attr("transform");var d=i.attr(["x","y"]),u=e.getAttribute("viewBox");if(u){var c=u.split(" ");d.x-=+c[0],d.y-=+c[1]}t+=" translate("+(d.x||0)+","+(d.y||0)+")";var v=i.prev();r.addSubCommand(new svgedit.history.RemoveElementCommand(i[0],i[0].nextSibling,i[0].parentNode)),i.remove();var f,p=$(m).find("use:data(symbol)").length,y=g.createElementNS(n.SVG,"g"),x=e.childNodes;for(f=0;f0&&t.y>0&&(r=" translate("+t.x+","+t.y+") scale(1) translate(0)");else{var d,u=svgedit.utilities.text2xml(e);this.prepareSvg(u),d=g.adoptNode?g.adoptNode(u.documentElement):g.importNode(u.documentElement,!0),Me(d) ;var h=svgedit.units.convertToNum("width",d.getAttribute("width")),c=svgedit.units.convertToNum("height",d.getAttribute("height")),v=d.getAttribute("viewBox"),p=v?v.split(" "):[0,0,h,c];for(i=0;i<4;++i)p[i]=Number(p[i]);var y=Number(m.getAttribute("height"));r=c>h?"scale("+y/3/p[3]+")":"scale("+y/3/p[2]+")",r=t&&t.x>0&&t.y>0?"translate("+t.x+","+t.y+") scale(1) translate(0)":"translate(0) scale(1) translate(0)",o=g.createElementNS(n.SVG,"symbol");var x=svgedit.utilities.findDefs();if($(d).find("linearGradient, radialGradient, pattern").appendTo(x),!x.firstChild){var S=g.createElementNS(n.SVG,"symbol");S.id=he(),x.appendChild(S)}for(;d.firstChild;){var C=d.firstChild;svgedit.utilities.walkTree(C,function(e){e.id=he()}),o.appendChild(C)}o.id=he(),o.setAttribute("type","svg-ext-shapes-image"),o.childNodes.forEach(e=>{e.getAttribute("transform")&&e.setAttribute("transform","matrix(1, 0, 0, 1, 0, 0)")}),import_ids[a]={symbol:o,xform:r},svgedit.utilities.findDefs().appendChild(o),l.addSubCommand(new svgedit.history.InsertElementCommand(o))}var w=g.createElementNS(n.SVG,"use");w.id=he(),w.setAttribute("type","svg-ext-shapes-image"),M(w,"#"+o.id),(b||f().getCurrentLayer()).appendChild(w),l.addSubCommand(new svgedit.history.InsertElementCommand(w)),ke(),w.setAttribute("transform",r),svgedit.recalculate.recalculateDimensions(w),$(w).data("symbol",o).data("ref",o),Ee([w]),setTimeout(function(){Be([w],!0)},500),X(l),V("changed",[m])}catch(e){return console.log(e),!1}return!0};var Oe=o.identifyLayers=function(){De(),f().identifyLayers()};this.createLayer=function(e){var t=new svgedit.history.BatchCommand("Create Layer"),i=f().createLayer(e);t.addSubCommand(new svgedit.history.InsertElementCommand(i)),X(t),ke(),V("changed",[i])},this.cloneLayer=function(e){var t=new svgedit.history.BatchCommand("Duplicate Layer"),i=g.createElementNS(n.SVG,"g"),r=g.createElementNS(n.SVG,"title");r.textContent=e,i.appendChild(r);var a=f().getCurrentLayer();$(a).after(i);var s,l=a.childNodes;for(s=0;s=0&&et?e1;)e.addSubCommand(o.mergeLayer(!0));ke(),Oe(),V("changed",[m]),X(e)};var De=this.leaveContext=function(){var e,t=disabled_elems.length;if(t){for(e=0;e0&&(i?He(e,t,n):(je(e,t,n),V("changed",n)))};var ze=this.setGradient=function(e){if(cur_properties[e+"_paint"]&&"solidColor"!=cur_properties[e+"_paint"].type){var t=o[e+"Grad"],i=Fe(t),r=svgedit.utilities.findDefs();if(i)t=i;else{t=r.appendChild(g.importNode(t,!0)),t.id=he()}o.setColor(e,"url(#"+t.id+")")}},Fe=function(e){for(var t=svgedit.utilities.findDefs(),i=$(t).find("linearGradient, radialGradient"),r=i.length,a=["r","cx","cy","fx","fy"];r--;){var s=i[r];if("linearGradient"==e.tagName){if(e.getAttribute("x1")!=s.getAttribute("x1")||e.getAttribute("y1")!=s.getAttribute("y1")||e.getAttribute("x2")!=s.getAttribute("x2")||e.getAttribute("y2")!=s.getAttribute("y2"))continue}else{var o=$(e).attr(a),l=$(s).attr(a),d=!1;if($.each(a,function(e,t){o[t]!=l[t]&&(d=!0)}),d)continue}var u=e.getElementsByTagNameNS(n.SVG,"stop"),g=s.getElementsByTagNameNS(n.SVG,"stop");if(u.length==g.length){for(var h=u.length;h--;){var m=u[h],c=g[h];if(m.getAttribute("offset")!=c.getAttribute("offset")||m.getAttribute("stop-opacity")!=c.getAttribute("stop-opacity")||m.getAttribute("stop-color")!=c.getAttribute("stop-color"))break}if(-1==h)return s}}return null};this.setPaint=function(e,t){var i=new $.jGraduate.Paint(t);switch(this.setPaintOpacity(e,i.alpha/100,!0),cur_properties[e+"_paint"]=i,i.type){case"solidColor":-1===i.solidColor.indexOf("rgb")?this.setColor(e,"none"!=i.solidColor?"#"+i.solidColor:"none"):this.setColor(e,i.solidColor);break;case"linearGradient":case"radialGradient":o[e+"Grad"]=i[i.type],ze(e)}},this.setStrokePaint=function(e){this.setPaint("stroke",e)},this.setFillPaint=function(e){this.setPaint("fill",e)},this.getStrokeWidth=function(){return cur_properties.stroke_width},this.setStrokeWidth=function(e){function t(e){"g"!=e.nodeName&&i.push(e)}if(0==e&&["line","path"].indexOf(current_mode)>=0)o.setStrokeWidth(1);else{cur_properties.stroke_width=e;for(var i=[],r=w.length;r--;){var n=w[r];n&&("g"==n.tagName?svgedit.utilities.walkTree(n,t):i.push(n))}i.length>0&&(je("stroke-width",e,i),V("changed",w))}},this.setStrokeAttr=function(e,t){C[e.replace("-","_")]=t;for(var i=[],r=w.length;r--;){var n=w[r];n&&("g"==n.tagName?svgedit.utilities.walkTree(n,function(e){"g"!=e.nodeName&&i.push(e)}):i.push(n))}i.length>0&&(je(e,t,i),V("changed",w))},this.getStyle=function(){return C},this.getOpacity=function(){return C.opacity},this.setOpacity=function(e){C.opacity=e,je("opacity",e)},this.getFillOpacity=function(){return C.fill_opacity},this.getStrokeOpacity=function(){return C.stroke_opacity},this.setPaintOpacity=function(e,t,i){C[e+"_opacity"]=t,i?He(e+"-opacity",t):je(e+"-opacity",t)},this.getPaintOpacity=function(e){return"fill"===e?this.getFillOpacity():this.getStrokeOpacity()},this.getBlur=function(e){var t=0;if(e){var i=e.getAttribute("filter");if(i){var r=svgedit.utilities.getElem(e.id+"_blur");r&&(t=r.firstChild.getAttribute("stdDeviation"))}}return t},function(){function e(){var e=o.undoMgr.finishUndoableChange();t.addSubCommand(e),X(t),t=null,i=null}var t=null,i=null,r=!1;o.setBlurNoUndo=function(e){if(i)if(0===e)He("filter",""),r=!0;else{var t=w[0];r&&He("filter","url(#"+t.id+"_blur)"),svgedit.browser.isWebkit()&&(console.log("e",t),t.removeAttribute("filter"),t.setAttribute("filter","url(#"+t.id+"_blur)")),He("stdDeviation",e,[i.firstChild]),o.setBlurOffsets(i,e)}else o.setBlur(e)},o.setBlurOffsets=function(e,t){t>3?svgedit.utilities.assignAttributes(e,{x:"-50%",y:"-50%",width:"200%",height:"200%"},100):svgedit.browser.isWebkit()||(e.removeAttribute("x"),e.removeAttribute("y"),e.removeAttribute("width"),e.removeAttribute("height"))},o.setBlur=function(r,n){if(t)e();else{var a=w[0],s=a.id;i=svgedit.utilities.getElem(s+"_blur"),r-=0;var l=new svgedit.history.BatchCommand;if(i)0===r&&(i=null);else{var d=_({element:"feGaussianBlur",attr:{in:"SourceGraphic",stdDeviation:r}});i=_({element:"filter",attr:{id:s+"_blur"}}),i.appendChild(d),svgedit.utilities.findDefs().appendChild(i),l.addSubCommand(new svgedit.history.InsertElementCommand(i))}var u={filter:a.getAttribute("filter")};if(0===r)return a.removeAttribute("filter"),void l.addSubCommand(new svgedit.history.ChangeElementCommand(a,u));je("filter","url(#"+s+"_blur)"),l.addSubCommand(new svgedit.history.ChangeElementCommand(a,u)),o.setBlurOffsets(i,r),t=l,o.undoMgr.beginUndoableChange("stdDeviation",[i?i.firstChild:null]),n&&(o.setBlurNoUndo(r),e())}}}(),this.getBold=function(){var e=w[0];return null!=e&&"text"==e.tagName&&null==w[1]&&"bold"==e.getAttribute("font-weight")},this.setBold=function(e){var t=w[0];null!=t&&"text"==t.tagName&&null==w[1]&&je("font-weight",e?"bold":"normal"),w[0].textContent||me.setCursor()},this.getItalic=function(){var e=w[0];return null!=e&&"text"==e.tagName&&null==w[1]&&"italic"==e.getAttribute("font-style")},this.setItalic=function(e){var t=w[0];null!=t&&"text"==t.tagName&&null==w[1]&&je("font-style",e?"italic":"normal"),w[0].textContent||me.setCursor()},this.getFontFamily=function(){return cur_text.font_family},this.setFontFamily=function(e){cur_text.font_family=e,je("font-family",e),w[0]&&!w[0].textContent&&me.setCursor(),ae("setFontAttribute",{elem:w[0],attr:"font-family",value:e})},this.setTextAlign=function(e){cur_text.text_anchor=e,je("text-anchor",e),w[0]&&!w[0].textContent&&me.setCursor(),ae("setFontAttribute",{elem:w[0],attr:"text-anchor",value:e})},this.setFontColor=function(e){cur_text.fill=e,je("fill",e)},this.getFontColor=function(){return cur_text.fill},this.getFontSize=function(){return cur_text.font_size},this.setFontSize=function(e){w[0]&&(cur_text.font_size=e,je("font-size",e),w[0].textContent||me.setCursor(),ae("setFontAttribute",{elem:w[0],attr:"font-size",value:e+"px"}))},this.getExtensionFont=function(e){return oe("getFontAttribute",{elem:e})},this.getText=function(){var e=w[0];return null==e?"":e.textContent},this.setTextContent=function(e){je("#text",e),me.init(e),me.setCursor()},this.setImageURL=function(e){var t=w[0];if(t){var i=$(t).attr(["width","height"]),r=!i.width||!i.height,n=I(t);if(n!==e)r=!0;else if(!r)return;var a=new svgedit.history.BatchCommand("Change Image URL");M(t,e),a.addSubCommand(new svgedit.history.ChangeElementCommand(t,{"#href":n})),r?$(new Image).load(function(){var e=$(t).attr(["width","height"]);$(t).attr({width:this.width,height:this.height}),Y.requestSelector(t).resize(),a.addSubCommand(new svgedit.history.ChangeElementCommand(t,e)),X(a),V("changed",[t])}).attr("src",e):X(a)}},this.setLinkURL=function(e){var t=w[0];if(t){if("a"!==t.tagName){var i=$(t).parents("a");if(!i.length)return;t=i[0]}var r=I(t);if(r!==e){var n=new svgedit.history.BatchCommand("Change Link URL");M(t,e),n.addSubCommand(new svgedit.history.ChangeElementCommand(t,{"#href":r})),X(n)}}},this.setRectRadius=function(e){var t=w[0];if(null!=t&&"rect"==t.tagName){var i=t.getAttribute("rx");i!=e&&(t.setAttribute("rx",e),t.setAttribute("ry",e),X(new svgedit.history.ChangeElementCommand(t,{rx:i,ry:i},"Radius")),V("changed",[t]))}},this.convertToPath=function(e,t){if(null!=e){if(!t)var i=new svgedit.history.BatchCommand("Convert element to Path");var r=t?{}:{fill:C.fill,"fill-opacity":C.fill_opacity,stroke:C.stroke,"stroke-width":C.stroke_width,"stroke-dasharray":C.stroke_dasharray,"stroke-linejoin":C.stroke_linejoin,"stroke-linecap":C.stroke_linecap,"stroke-opacity":C.stroke_opacity,opacity:C.opacity,visibility:"hidden"};$.each(["marker-start","marker-end","marker-mid","filter","clip-path"],function(){e.getAttribute(this)&&(r[this]=e.getAttribute(this))});var n=_({element:"path",attr:r}),a=e.getAttribute("transform");a&&n.setAttribute("transform",a);var s=e.id,l=e.parentNode;e.nextSibling?l.insertBefore(n,e):l.appendChild(n);var d,u,g="",h=function(e){$.each(e,function(e,t){var i,r=t[0],n=t[1];for(g+=r,i=0;i=0&&(i=i[0].childNodes),o.undoMgr.beginUndoableChange(e,i);i.length;He(e,t,i);var r=o.undoMgr.finishUndoableChange();r.isEmpty()||X(r)},He=function(e,t,i){var r=h.suspendRedraw(1e3);"pathedit"==current_mode&&ce.moveNode(e,t),i=i||w;for(var n=i.length,a=["g","polyline","path"],s=["transform","opacity","filter"];n--;){var l=i[n];if(null!=l)if(("x"===e||"y"===e)&&a.indexOf(l.tagName)>=0){var d=getStrokedBBox([l]),u="x"===e?t-d.x:0,g="y"===e?t-d.y:0;o.moveSelectedElements(u*p,g*p,!0)}else{"g"===l.tagName&&s.indexOf(e);var m="#text"===e?l.textContent:l.getAttribute(e);if(null==m&&(m=""),m!==String(t)){if("#text"==e){svgedit.utilities.getBBox(l).width;l.textContent=t,/rotate/.test(l.getAttribute("transform"))&&(l=Se(l))}else"#href"==e?M(l,t):(l.setAttribute(e,t),ae("setGaugeAttribute",{elem:l,attr:e,value:t}));"textedit"===current_mode&&"#text"!==e&&l.textContent.length&&me.toSelectMode(l),svgedit.browser.isGecko()&&"text"===l.nodeName&&/rotate/.test(l.getAttribute("transform"))&&(0===String(t).indexOf("url")||["font-size","font-family","x","y"].indexOf(e)>=0&&l.textContent)&&(l=Se(l)),w.indexOf(l)>=0&&setTimeout(function(){l.parentNode&&Y.requestSelector(l).resize()},0);var c=svgedit.utilities.getRotationAngle(l);if(0!=c&&"transform"!=e)for(var v=svgedit.transformlist.getTransformList(l),f=v.numberOfItems;f--;){var y=v.getItem(f);if(4==y.type){v.removeItem(f);var x=svgedit.utilities.getBBox(l),b=svgedit.math.transformPoint(x.x+x.width/2,x.y+x.height/2,svgedit.math.transformListToTransform(v).matrix),S=b.x,C=b.y,_=h.createSVGTransform();_.setRotate(c,S,C),v.insertItemBefore(_,f);break}}}}}h.unsuspendRedraw(r)};this.deleteSelectedElements=function(){var e,t=new svgedit.history.BatchCommand("Delete Elements"),i=w.length,r=[];for(e=0;e{var t=svgedit.utilities.getElem(e.id);t||d.appendChild(e)}),l.defs&&l.defs.appendTo(d)}else{var u=be(l);a.push(u),(b||f().getCurrentLayer()).appendChild(u),s.addSubCommand(new svgedit.history.InsertElementCommand(u))}}if(Be(a),"in_place"!==e){var g,h;e?"point"===e&&(g=t,h=i):(g=lastClickPoint.x,h=lastClickPoint.y);var m=getStrokedBBox(a),c=g-(m.x+m.width/2),v=h-(m.y+m.height/2),p=[],y=[];$.each(a,function(e,t){p.push(c),y.push(v)});var x=o.moveSelectedElements(p,y,!1);s.addSubCommand(x)}X(s),V("onGaugeCopyPaste",{copy:r,past:a.reverse()}),V("changed",a)}},this.copySelectedElements=function(){o.clipBoard=$.merge([],w),qe()};var qe=function(){for(var e={symbols:[],defs:null},t=0;t{var i=svgedit.utilities.getElem(I(t).substr(1)),r=i.getAttribute("type"),n=t.getAttribute("type");!n&&r&&t.setAttribute("type",r),e.symbols.find(e=>e.id===i.id)||e.symbols.push(i)})}if(e.symbols.length){const t=svgedit.utilities.findDefs();e.defs=$(t).find("linearGradient, radialGradient, pattern"),o.clipBoard.push(e)}};this.groupSelectedElements=function(e,t){e||(e="g");var i="";switch(e){case"a":i="Make hyperlink";var r="";arguments.length>1&&(r=t);break;default:e="g",i="Group Elements"}var n=new svgedit.history.BatchCommand(i),a=_({element:e,attr:{id:he(),target:"_blank",type:"svg-ext-shapes-group"}});"a"===e&&M(a,r),n.addSubCommand(new svgedit.history.InsertElementCommand(a));for(var s=w.length;s--;){var o=w[s];if(null!=o){"a"===o.parentNode.tagName&&1===o.parentNode.childNodes.length&&(o=o.parentNode);var l=o.nextSibling,d=o.parentNode;a.appendChild(o),n.addSubCommand(new svgedit.history.MoveElementCommand(o,l,d))}}n.isEmpty()||X(n),Be([a],!0)};var We=this.pushGroupProperties=function(e,t){var i,r,n,a=e.childNodes,s=a.length,l=e.getAttribute("transform"),d=svgedit.transformlist.getTransformList(e),u=svgedit.math.transformListToTransform(d).matrix,g=new svgedit.history.BatchCommand("Push group properties"),m=0,c=svgedit.utilities.getRotationAngle(e),v=$(e).attr(["filter","opacity"]);for(m=0;mn[i].width)||("t"==e||"m"==e||"b"==e)&&(g==Number.MIN_VALUE||g>n[i].height))&&(a=n[i].x,l=n[i].y,s=n[i].x+n[i].width,d=n[i].y+n[i].height,u=n[i].width,g=n[i].height);break;case"largest":(("l"==e||"c"==e||"r"==e)&&(u==Number.MIN_VALUE||us&&(s=n[i].x+n[i].width),n[i].y+n[i].height>d&&(d=n[i].y+n[i].height)}"page"==t&&(a=0,l=0,s=o.contentW,d=o.contentH);var m=new Array(h),c=new Array(h);for(i=0;ia&&(a=r[t].x+r[t].width),r[t].y+r[t].height>o&&(o=r[t].y+r[t].height),d+=r[t].height,l+=r[t].width;"h"===e?r.sort((e,t)=>e.x>t.x?1:-1):"v"===e&&r.sort((e,t)=>e.y>t.y?1:-1),u--;var h=new Array(r.length),m=new Array(r.length),c=(a-n-l)/u,v=(o-s-d)/u,f=n,p=s ;for(t=0;t0?f>y.x?f-y.x:-(y.x-f):0,f+=y.width+c,m[t].y=0;break;case"v":m[t].y=t>0?p>y.y?p-y.y:-(y.y-p):0,p+=y.height+v,h[t].x=0}}h.sort((e,t)=>e.i>t.i?1:-1),m.sort((e,t)=>e.i>t.i?1:-1),h=h.map(e=>Math.round(100*e.x)/100),m=m.map(e=>Math.round(100*e.y)/100),this.moveSelectedElements(h,m)}},this.contentW=Ve().w,this.contentH=Ve().h,this.updateCanvas=function(e,t){h.setAttribute("width",e),h.setAttribute("height",t);var i=$("#canvasBackground")[0],r=m.getAttribute("x"),n=m.getAttribute("y"),a=e/2-this.contentW*p/2,s=t/2-this.contentH*p/2;svgedit.utilities.assignAttributes(m,{width:this.contentW*p,height:this.contentH*p,x:a,y:s,viewBox:"0 0 "+this.contentW+" "+this.contentH}),svgedit.utilities.assignAttributes(i,{width:m.getAttribute("width"),height:m.getAttribute("height"),x:a,y:s});var o=svgedit.utilities.getElem("background_image");return o&&svgedit.utilities.assignAttributes(o,{width:"100%",height:"100%"}),Y.selectorParentGroup.setAttribute("transform","translate("+a+","+s+")"),ae("canvasUpdated",{new_x:a,new_y:s,old_x:r,old_y:n,d_x:a-r,d_y:s-n}),{x:a,y:s,old_x:r,old_y:n,d_x:a-r,d_y:s-n}},this.setBackground=function(e,t){var i=svgedit.utilities.getElem("canvasBackground"),r=$(i).find("rect")[0],a=svgedit.utilities.getElem("background_image");r.setAttribute("fill",e),t?(a||(a=g.createElementNS(n.SVG,"image"),svgedit.utilities.assignAttributes(a,{id:"background_image",width:"100%",height:"100%",preserveAspectRatio:"xMinYMin",style:"pointer-events:none"})),M(a,t),i.appendChild(a)):a&&a.parentNode.removeChild(a)},this.cycleElement=function(e){var t,i=w[0],r=!1,n=pe(b||f().getCurrentLayer());if(n.length){if(null==i)t=e?n.length-1:0,r=n[t];else for(var a=n.length;a--;)if(n[a]==i){t=e?a-1:a+1,t>=n.length?t=0:t<0&&(t=n.length-1),r=n[t];break}Be([r],!0),V("selected",w)}},this.clear(),this.getExtensionMember=function(e,t){var i=[];return $.each(extensions,function(r,n){n&&e in n&&i.push(n[e](t))}),i},this.getPrivateMethods=function(){var e={addCommandToHistory:X,setGradient:ze,addSvgElementFromJson:_,addSvgGroupFromJson:N,assignAttributes:O,BatchCommand:K,call:V,ChangeElementCommand:W,copyElem:be,ffClone:Se,findDefs:T,findDuplicateGradient:Fe,getElem:P,getId:ge,getIntersectionList:ue,getMouseTarget:Te,getNextId:he,getPathBBox:L,getUrlFromAttr:G,hasMatrixTransform:E,identifyLayers:Oe,InsertElementCommand:H,isIdentity:svgedit.math.isIdentity,logMatrix:Ne,matrixMultiply:k,MoveElementCommand:j,preventClickDefault:Ge,recalculateAllSelectedDimensions:we,recalculateDimensions:U,remapElement:R,RemoveElementCommand:q,removeUnusedDefElems:Ie,round:de,runExtensions:ae,setSpecialsIds:se,runGetExtensions:oe,runExtension:le,sanitizeSvg:F,SVGEditTransformList:svgedit.transformlist.SVGTransformList,toString:toString,transformBox:svgedit.math.transformBox,transformListToTransform:B,transformPoint:A,walkTree:svgedit.utilities.walkTree};return e}}; -var mysvgeditor={initSvgEditor:function(e,t,n,o,i,a,r,l,s){window.svgEditor=function(e){function c(t,n){var o=!1!==d.setSvgString(t);n=n||e.noop,o?n(!0):e.alert(uiStrings.notification.errorLoadingSVG,function(){n(!1)})}var u={};console.log("editor v2.9.9-166"),e(document).unbind("keydown"),u.tool_scale=1,u.exportWindowCt=0,u.langChanged=!1,u.showSaveWarning=!1,u.storagePromptClosed=!1,u.extensionLoadedCallback=n,u.onSelectedElement=t,u.changeColor=o,u.onGaugeAdded=i,u.onGaugeResized=r,u.onGaugeRemoved=a,u.onGaugeCopyPaste=l,u.onGroupChanged=s,u.currentExtensionsInteractivityType=[],u.currentExtensionsPrefixIdType=[],u.shapesGrps={},u.shapesList=[],u.baseSvgTags=["path","line","rect","circle","ellipse","text","image"];var d,f,p=["VAL_","HXI_","HXB_","HXS_"],g=["HXI_","HXB_","HXS_","GXP_","HXC_","BAG_","SLI_","HXT_"],v=["SHE_"],h=svgedit.utilities,m=svgedit.shapes;return isReady=!1,customExportImage=!1,customExportPDF=!1,callbacks=[],defaultPrefs={lang:"",iconsize:"",bkgd_color:"#FFF",bkgd_url:"",img_save:"embed",save_notice_done:!1,export_notice_done:!1},curPrefs={},curConfig={extensions:[],allowedOrigins:[]},defaultExtensions=["ext-overview_window.js","ext-markers.js","ext-connector.js","ext-eyedropper.js","ext-imagelib.js","ext-grid.js","ext-polygon.js","ext-panning.js","ext-storage.js"],defaultConfig={canvasName:"default",canvas_expansion:3,initFill:{color:"FF0000",opacity:1},initStroke:{width:1,color:"000000",opacity:1},initOpacity:1,colorPickerCSS:null,initTool:"select",exportWindowType:"new",wireframe:!1,showlayers:!1,no_save_warning:!1,imgPath:"images/",langPath:"locale/",extPath:"extensions/",jGraduatePath:"jgraduate/images/",shapesPath:"assets/lib/svgeditor/shapes/",dimensions:[640,480],gridSnapping:!0,gridColor:"#000",baseUnit:"px",snappingStep:2,showRulers:!0,preventAllURLConfig:!1,preventURLContentLoading:!1,lockExtensions:!1,noDefaultExtensions:!1,showGrid:!1,noStorageOnLoad:!1,forceStorage:!1,emptyStorageOnDecline:!1},uiStrings=u.uiStrings={common:{ok:"OK",cancel:"Cancel",key_up:"Up",key_down:"Down",key_backspace:"Backspace",key_del:"Del"},layers:{layer:"Layer"},notification:{invalidAttrValGiven:"Invalid value given",noContentToFitTo:"No content to fit to",dupeLayerName:"There is already a layer named that!",enterUniqueLayerName:"Please enter a unique layer name",enterNewLayerName:"Please enter the new layer name",layerHasThatName:"Layer already has that name",QmoveElemsToLayer:"Move selected elements to layer '%s'?",QwantToClear:"Do you want to clear the drawing?\nThis will also erase your undo history!",QwantToOpen:"Do you want to open a new file?\nThis will also erase your undo history!",QerrorsRevertToSource:"There were parsing errors in your SVG source.\nRevert back to original SVG source?",QignoreSourceChanges:"Ignore changes made to SVG source?",featNotSupported:"Feature not supported",enterNewImgURL:"Enter the new image URL",defsFailOnSave:"NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",loadingImage:"Loading image, please wait...",saveFromBrowser:"Select 'Save As...' in your browser to save this image as a %s file.",noteTheseIssues:"Also note the following issues: ",unsavedChanges:"There are unsaved changes.",enterNewLinkURL:"Enter the new hyperlink URL",errorLoadingSVG:"Error: Unable to load SVG data",URLloadFail:"Unable to load from URL",retrieving:"Retrieving '%s' ..."}},e.pref=function(e,t){return t?(curPrefs[e]=t,void(u.curPrefs=curPrefs)):e in curPrefs?curPrefs[e]:defaultPrefs[e]},u.loadContentAndPrefs=function(){if(curConfig.forceStorage||!curConfig.noStorageOnLoad&&document.cookie.match(/(?:^|;\s*)store=(?:prefsAndContent|prefsOnly)/)){if(u.storage&&(curConfig.forceStorage||!curConfig.noStorageOnLoad&&document.cookie.match(/(?:^|;\s*)store=prefsAndContent/))){var e="svgedit-"+curConfig.canvasName,t=u.storage.getItem(e);t&&u.loadFromString(t)}var n;for(n in defaultPrefs)if(defaultPrefs.hasOwnProperty(n)){var o="web-edit-"+n;if(u.storage){var i=u.storage.getItem(o);i&&(defaultPrefs[n]=String(i))}else if(window.widget)defaultPrefs[n]=widget.preferenceForKey(o);else{var a=document.cookie.match(new RegExp("(?:^|;\\s*)"+h.preg_quote(encodeURIComponent(o))+"=([^;]+)"));defaultPrefs[n]=a?decodeURIComponent(a[1]):""}}}},u.setConfig=function(t,n){function o(t,n,o){t[n]&&"object"==typeof t[n]?e.extend(!0,t[n],o):t[n]=o}n=n||{},e.each(t,function(i,a){if(t.hasOwnProperty(i))if(defaultPrefs.hasOwnProperty(i)){if(!1===n.overwrite&&(curConfig.preventAllURLConfig||curPrefs.hasOwnProperty(i)))return;!0===n.allowInitialUserOverride?defaultPrefs[i]=a:e.pref(i,a)}else if(["extensions","allowedOrigins"].indexOf(i)>-1){if(!1===n.overwrite&&(curConfig.preventAllURLConfig||"allowedOrigins"===i||"extensions"===i&&curConfig.lockExtensions))return;curConfig[i]=curConfig[i].concat(a)}else if(defaultConfig.hasOwnProperty(i)){if(!1===n.overwrite&&(curConfig.preventAllURLConfig||curConfig.hasOwnProperty(i)))return;if(curConfig.hasOwnProperty(i)){if(!1===n.overwrite)return;o(curConfig,i,a)}else!0===n.allowInitialUserOverride?o(defaultConfig,i,a):defaultConfig[i]&&"object"==typeof defaultConfig[i]?(curConfig[i]={},e.extend(!0,curConfig[i],a)):curConfig[i]=a}}),u.curConfig=curConfig},u.setCustomHandlers=function(t){u.ready(function(){t.open&&(e('#tool_open > input[type="file"]').remove(),e("#tool_open").show(),d.open=t.open),t.save&&(u.showSaveWarning=!1,d.bind("saved",t.save)),t.exportImage&&(customExportImage=t.exportImage,d.bind("exported",customExportImage)),t.exportPDF&&(customExportPDF=t.exportPDF,d.bind("exportedPDF",customExportPDF))})},u.randomizeIds=function(){d.randomizeIds(arguments)},u.init=function(t){function n(){curPrefs=e.extend(!0,{},defaultPrefs,curPrefs),u.curPrefs=curPrefs}function o(){curConfig=e.extend(!0,{},defaultConfig,curConfig),curConfig.noDefaultExtensions||(curConfig.extensions=curConfig.extensions.concat(defaultExtensions)),e.each(["extensions","allowedOrigins"],function(t,n){curConfig[n]=e.grep(curConfig[n],function(e,t){return t===curConfig[n].indexOf(e)})}),u.curConfig=curConfig}function i(t,n){var o=t.id,i=o.split("_"),a=i[0],r=i[1];n&&d.setStrokeAttr("stroke-"+a,r),pe(),P("#cur_"+a,o,20),e(t).addClass("current").siblings().removeClass("current")}function r(t,n){e.pref("bkgd_color",t),e.pref("bkgd_url",n),d.setBackground(t,n)}function l(){var t=d.getHref(K);if(t=0===t.indexOf("data:")?"":t,u.promptImgURLcallback){var n=u.promptImgURLcallback;n&&he(n)}else e.prompt(uiStrings.notification.enterNewImgURL,t,function(e){e&&he(e)})}function s(t,n){var o,i;n||(n=d.getZoom()),t||(t=e("#svgcanvas"));var a=3e4,r=d.getContentElem(),l=svgedit.units.getTypeMap(),s=l[curConfig.baseUnit];for(o=0;o<2;o++){var c=0===o,u=c?"x":"y",f=c?"width":"height",p=Number(r.getAttribute(u)),g=e("#ruler_"+u+" canvas:first"),v=g.clone();g.replaceWith(v);var h=v[0],m=t[f](),_=m;h.parentNode.style[f]=_+"px";var w,y,b,C=0,x=h.getContext("2d");if(x.fillStyle="#666666",x.fillRect(0,0,h.width,h.height),v.siblings().remove(),m>=a){var k;for(b=parseInt(m/a,10)+1,w=[],w[0]=x,i=1;i=1)L=Math.round(y);else{var I=String(F).split(".")[1].length;L=y.toFixed(I)}if(0!==L&&1e3!==L&&L%1e3==0&&(L=L/1e3+"K"),c)x.fillText(L,A+2,8);else{var N=String(L).split("");for(i=0;im){if(C++,x.stroke(),C>=b){i=10,A=_;continue}x=w[C],A-=a,O=Math.round(A+B*i)+.5}var U=i%2?12:10;c?(x.moveTo(O,15),x.lineTo(O,U)):(x.moveTo(15,O),x.lineTo(U,O))}A+=P}x.strokeStyle="#666666",x.stroke()}}function _(){d.deleteCurrentLayer()&&(ye(),se(),e("#layerlist tr.layer").removeClass("layersel"),e("#layerlist tr.layer:first").addClass("layersel"))}function w(){var t=d.getCurrentDrawing().getCurrentLayerName()+" copy";e.prompt(uiStrings.notification.enterUniqueLayerName,t,function(t){t&&(d.getCurrentDrawing().hasLayer(t)?e.alert(uiStrings.notification.dupeLayerName):(d.cloneLayer(t),ye(),se()))})}function y(){e("#layerlist tr.layersel").index()!=d.getCurrentDrawing().getNumLayers()-1&&(d.mergeLayer(),ye(),se())}function b(t){var n=e("#layerlist tr.layersel").index(),o=d.getCurrentDrawing().getNumLayers();(n>0||n=n;return 0===t?n:n>=24?i?Math.round(1.1*n):Math.round(n/1.1):n<=1?i?2*n:n/2:o}function x(e,t){var n=Number(e.value);if(0===n)return 100;var o=n+t;return 0===t?n:n>=100?o:o>=n?2*n:n/2}function k(e){e.stopPropagation(),e.preventDefault()}function S(e){e.stopPropagation(),e.preventDefault()}function E(e){e.stopPropagation(),e.preventDefault()}try{"localStorage"in window&&(u.storage=localStorage)}catch(e){}var F=[];e("#lang_select option").each(function(){F.push(this.value)}),function(){var t,i;if(f=e.deparam.querystring(!0),e.isEmptyObject(f))o(),u.loadContentAndPrefs(),n();else{if(f.dimensions&&(f.dimensions=f.dimensions.split(",")),f.bkgd_color&&(f.bkgd_color="#"+f.bkgd_color),f.extensions&&(f.extensions=f.extensions.match(/[:\/\\]/)?"":f.extensions.split(",")),e.each(["extPath","imgPath","langPath","jGraduatePath"],function(e){f[e]&&delete f[e]}),u.setConfig(f,{overwrite:!1}),o(),!curConfig.preventURLContentLoading){if(t=f.source,i=e.param.querystring(),t||i.indexOf("source=data:")>=0&&(t=i.match(/source=(data:[^&]*)/)[1]),t)return void(0===t.indexOf("data:")?u.loadFromDataURI(t):u.loadFromString(t));if(f.url)return void u.loadFromURL(f.url)}f.noStorageOnLoad&&!curConfig.forceStorage||u.loadContentAndPrefs(),n()}}(),function(){var e,n=window.opener;if(n)try{e=n.document.createEvent("Event"),e.initEvent("svgEditorReady",!0,!0),n.document.documentElement.dispatchEvent(e)}catch(e){}t&&setTimeout(t,2e3)}();var P=u.setIcon=function(t,n,o){var i="string"==typeof n?e.getSvgIcon(n,!0):n.clone();i&&e(t).empty().append(i)},A=function(){window.extOverview&&window.extOverview(),window.extMarkers&&window.extMarkers(),window.extEyedropper&&window.extEyedropper(),window.extImagelib&&window.extImagelib(),window.extGrid&&window.extGrid(),window.extPanning&&window.extPanning(),window.extStorage&&window.extStorage(),window.extSwitch&&window.extSwitch(),window.extValue&&window.extValue(),window.extHtmlInput&&window.extHtmlInput(),window.extHtmlChart&&window.extHtmlChart(),window.extHtmlGraph&&window.extHtmlGraph(),window.extHtmlSelect&&window.extHtmlSelect(),window.extHtmlButton&&window.extHtmlButton(),window.extGaugeProgress&&window.extGaugeProgress(),window.extGaugeSemaphore&&window.extGaugeSemaphore(),window.extHtmlBag&&window.extHtmlBag(),window.extLinear&&window.extLinear(),window.extPipe&&window.extPipe(),window.extHtmlSlider&&window.extHtmlSlider(),window.extHtmlSwitch&&window.extHtmlSwitch(),window.extOwnCtrl&&window.extOwnCtrl(),u.putLocale&&u.putLocale(null,F)},T=function(e){m.load(curConfig.shapesPath,function(){Object.values(u.shapesGrps).forEach(e=>{for(var t=0;t"+a.replace(/\n/g,"

")+"

").toggleClass("prompt","prompt"==i),n.empty(),d=e('').appendTo(n),"alert"!==i&&e('').appendTo(n).click(function(){t.hide(),r&&r(!1)}),"prompt"===i)f=e('').prependTo(n),f.val(l||""),f.bind("keydown","return",function(){d.click()});else if("select"===i){var g=e('
');if(f=e("').appendTo(v),p.val(u.value),u.tooltip&&v.attr("title",u.tooltip),p.prop("checked",!!u.checked),g.append(e("
").append(v))}e.each(s||[],function(t,n){"object"==typeof n?f.append(e("
+
+ {{'notification.property-mode' | translate}} + + {{'notification.property-mode-alarm-all' | translate}} + {{'notification.property-mode-alarm-single' | translate}} + +
{{'notification.property-priority' | translate}} diff --git a/client/src/app/notifications/notification-property/notification-property.component.ts b/client/src/app/notifications/notification-property/notification-property.component.ts index 6f0908985..fa506052f 100644 --- a/client/src/app/notifications/notification-property/notification-property.component.ts +++ b/client/src/app/notifications/notification-property/notification-property.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit, Inject } from '@angular/core'; import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { AlarmsType } from '../../_models/alarm'; -import { Notification, NotificationsType, NOTIFY_PREFIX } from '../../_models/notification'; +import { Notification, NotificationMode, NotificationsType, NOTIFY_PREFIX } from '../../_models/notification'; import { TranslateService } from '@ngx-translate/core'; import { Utils } from '../../_helpers/utils'; import { AbstractControl, UntypedFormBuilder, UntypedFormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms'; @@ -22,6 +22,8 @@ export class NotificationPropertyComponent implements OnInit { formGroup: UntypedFormGroup; alarmsType = [AlarmsType.HIGH_HIGH, AlarmsType.HIGH, AlarmsType.LOW, AlarmsType.INFO]; + notificationModeAll = NotificationMode.all; + notificationModeSingle = NotificationMode.single; constructor(public dialogRef: MatDialogRef, private fb: UntypedFormBuilder, @@ -39,6 +41,7 @@ export class NotificationPropertyComponent implements OnInit { delay: [this.notification.delay], interval: [this.notification.interval], enabled: [this.notification.enabled], + mode: [this.notification.mode] }); this.formGroup.controls.name.addValidators(this.isValidName()); diff --git a/client/src/app/reports/report-editor/report-editor.component.ts b/client/src/app/reports/report-editor/report-editor.component.ts index 6e2ce84ef..7ae9692db 100644 --- a/client/src/app/reports/report-editor/report-editor.component.ts +++ b/client/src/app/reports/report-editor/report-editor.component.ts @@ -17,7 +17,7 @@ import { map, takeUntil } from 'rxjs/operators'; import { ProjectService } from '../../_services/project.service'; import { PluginService } from '../../_services/plugin.service'; import { PluginGroupType } from '../../_models/plugin'; -pdfMake.vfs = pdfFonts.pdfMake.vfs; +pdfMake.vfs = pdfFonts; @Component({ selector: 'app-report-editor', @@ -128,9 +128,11 @@ export class ReportEditorComponent implements OnInit, AfterViewInit, OnDestroy { const pdfDocGenerator = pdfMake.createPdf(content); pdfDocGenerator.getDataUrl((dataUrl) => { const targetIframe = document.querySelector('iframe'); - targetIframe.src = dataUrl; - targetIframe.style.width = '100%'; - targetIframe.style.height = '100%'; + if (targetIframe) { + targetIframe.src = dataUrl; + targetIframe.style.width = '100%'; + targetIframe.style.height = '100%'; + } }); }); } diff --git a/client/src/app/resources/lib-images/lib-images.component.html b/client/src/app/resources/lib-images/lib-images.component.html index af7ebeabf..d6c12e59f 100644 --- a/client/src/app/resources/lib-images/lib-images.component.html +++ b/client/src/app/resources/lib-images/lib-images.component.html @@ -12,8 +12,21 @@

-
- +
+ + + + + + +
diff --git a/client/src/app/resources/lib-images/lib-images.component.ts b/client/src/app/resources/lib-images/lib-images.component.ts index 4d0332275..31dd233cf 100644 --- a/client/src/app/resources/lib-images/lib-images.component.ts +++ b/client/src/app/resources/lib-images/lib-images.component.ts @@ -53,4 +53,8 @@ export class LibImagesComponent implements AfterViewInit, OnDestroy { onNoClick(): void { this.dialogRef.close(); } + + isVideo(path: string): boolean { + return this.resourcesService.isVideo(path); + } } diff --git a/client/src/app/sidenav/sidenav.component.css b/client/src/app/sidenav/sidenav.component.css deleted file mode 100644 index 0519ecba6..000000000 --- a/client/src/app/sidenav/sidenav.component.css +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/src/app/sidenav/sidenav.component.html b/client/src/app/sidenav/sidenav.component.html index 8fb11b791..79738a347 100644 --- a/client/src/app/sidenav/sidenav.component.html +++ b/client/src/app/sidenav/sidenav.component.html @@ -1,30 +1,65 @@
- + {{'sidenav.title' | translate}} - - - + + + + + + + + + + + -
\ No newline at end of file +
diff --git a/client/src/app/sidenav/sidenav.component.scss b/client/src/app/sidenav/sidenav.component.scss new file mode 100644 index 000000000..7f0dbbaca --- /dev/null +++ b/client/src/app/sidenav/sidenav.component.scss @@ -0,0 +1,23 @@ +:host { + .sidenav-submenu-btn { + position: relative; + } + + .sidenav-submenu-item { + width: unset; + min-height: unset; + height: unset; + } + + .sidenav-submenu-icon { + position: absolute; + right: 12px; + top: 50%; + transform: translateY(-50%); + } + .submenu-list { + padding: 0; + margin: 0; + list-style: none; + } +} \ No newline at end of file diff --git a/client/src/app/sidenav/sidenav.component.ts b/client/src/app/sidenav/sidenav.component.ts index 6d338fac8..f42ebf00a 100644 --- a/client/src/app/sidenav/sidenav.component.ts +++ b/client/src/app/sidenav/sidenav.component.ts @@ -2,7 +2,7 @@ import { Component, Input, Output, EventEmitter, ChangeDetectorRef, AfterContent import { MatSidenav } from '@angular/material/sidenav'; import { Location } from '@angular/common'; -import { LayoutSettings, NaviItem, NavigationSettings, LinkType } from '../_models/hmi'; +import { LayoutSettings, NaviItem, NavigationSettings, LinkType, NaviItemType } from '../_models/hmi'; import { Router } from '@angular/router'; import { ProjectService } from '../_services/project.service'; import { LanguageService } from '../_services/language.service'; @@ -11,7 +11,7 @@ import { Utils } from '../_helpers/utils'; @Component({ selector: 'app-sidenav', templateUrl: './sidenav.component.html', - styleUrls: ['./sidenav.component.css'] + styleUrls: ['./sidenav.component.scss'] }) export class SidenavComponent implements AfterContentChecked { @@ -26,6 +26,8 @@ export class SidenavComponent implements AfterContentChecked { layout: LayoutSettings = null; showSidenav = false; layoutNavigation = new NavigationSettings(); + expandedItems: Set = new Set(); + private expandableNavItems = [Utils.getEnumKey(NaviItemType, NaviItemType.text), Utils.getEnumKey(NaviItemType, NaviItemType.inline)]; constructor(private location: Location, private router: Router, @@ -53,6 +55,25 @@ export class SidenavComponent implements AfterContentChecked { } } + toggleSubMenu(item: NaviItem) { + if (item.id && item.children?.length) { + if (this.expandedItems.has(item.id)) { + this.expandedItems.delete(item.id); + } else { + this.expandedItems.add(item.id); + } + this.changeDetector.detectChanges(); + } + } + + isExpanded(item: NaviItem): boolean { + return item.id ? this.expandedItems.has(item.id) : false; + } + + isExpandable(item: NaviItem): boolean { + return this.expandableNavItems.includes(this.layout.navigation.type) && item.children?.length > 0; + } + public setLayout(layout: LayoutSettings) { this.layout = Utils.clone(layout); if (this.layout.navigation) { @@ -60,6 +81,15 @@ export class SidenavComponent implements AfterContentChecked { this.logo = this.layout.navigation.logo; this.layout.navigation.items?.forEach(item => { item.text = this.languageService.getTranslation(item.text) ?? item.text; + if (!item.id) { + item.id = Utils.getShortGUID(); + } + item.children?.forEach(child => { + child.text = this.languageService.getTranslation(child.text) ?? child.text; + if (!child.id) { + child.id = Utils.getShortGUID(); + } + }); }); } } diff --git a/client/src/app/view/view.component.css b/client/src/app/view/view.component.css deleted file mode 100644 index 211ddac4f..000000000 --- a/client/src/app/view/view.component.css +++ /dev/null @@ -1,13 +0,0 @@ -.view-body { - display: table; - margin: 0 auto; -} - -.view-container { - position: absolute; - left: 0px; - top: 0px; - bottom: 0px; - right: 0px; - overflow: auto; -} \ No newline at end of file diff --git a/client/src/app/view/view.component.scss b/client/src/app/view/view.component.scss new file mode 100644 index 000000000..6af1b66f6 --- /dev/null +++ b/client/src/app/view/view.component.scss @@ -0,0 +1,15 @@ +:host { + .view-body { + display: table; + margin: 0 auto; + } + + .view-container { + position: absolute; + left: 0px; + top: 0px; + bottom: 0px; + right: 0px; + overflow: auto; + } +} diff --git a/client/src/app/view/view.component.ts b/client/src/app/view/view.component.ts index 984758c6d..6e759b56a 100644 --- a/client/src/app/view/view.component.ts +++ b/client/src/app/view/view.component.ts @@ -12,7 +12,7 @@ import panzoom from 'panzoom'; @Component({ selector: 'app-view', templateUrl: './view.component.html', - styleUrls: ['./view.component.css'] + styleUrls: ['./view.component.scss'] }) export class ViewComponent implements OnInit, AfterViewInit, OnDestroy { diff --git a/client/src/assets/i18n/de.json b/client/src/assets/i18n/de.json index 1ac79523b..71d9224e8 100644 --- a/client/src/assets/i18n/de.json +++ b/client/src/assets/i18n/de.json @@ -284,7 +284,7 @@ "graph.property-date-last-range": "Datumsbereich", "graph.property-date-group": "Gruppe", "graph.property-offline": "Online", - "graph.property-graph-oriantation": "Ausrichtung", + "graph.property-graph-orientation": "Ausrichtung", "graph.property-ori-vartical": "Vertikal", "graph.property-ori-horizontal": "Horizontal", "graph.property-decimals": "Dezimalstellen", @@ -726,6 +726,7 @@ "device.property-name": "Name", "device.property-type": "Typ", "device.property-polling": "Abfrage", + "device.property-nopolling": "Ereignisgesteuert", "device.property-enable": "Aktivieren", "device.property-subscribe": "Abonnieren", "device.property-address": "Adresse (IP oder opc.tcp://[Server]:[Port])", @@ -816,6 +817,7 @@ "device.tag-property-type": "Typ", "device.tag-property-address": "Adresse (z. B. db5.dbb3 db4.dbx2.0 MB7)", "device.tag-property-address-sample": "Adresse", + "device.tag-property-address-vistwo": "vistwo-PVname (z.B. /sinus)", "device.tag-property-min": "Min", "device.tag-property-max": "Max", "device.tag-property-divisor": "Divisor", diff --git a/client/src/assets/i18n/en.json b/client/src/assets/i18n/en.json index 3ca8646c2..41b2163a4 100644 --- a/client/src/assets/i18n/en.json +++ b/client/src/assets/i18n/en.json @@ -78,6 +78,11 @@ "dlg.menuitem-address": "Link address", "dlg.menuitem-icons-filter": "Icons Filter", + "dlg.menuitem-submenu": "Submenu", + "dlg.menuitem-add-submenu": "Add Submenu Item", + "dlg.menuitem-submenu-items": "Submenu Items", + "sidenav.new_item": "New Submenu Item", + "dlg.headeritem-title": "Header Item", "dlg.headeritem-icon": "Icon", "dlg.headeritem-icons-filter": "Icons Filter", @@ -88,7 +93,7 @@ "dlg.docproperty-height": "Height", "dlg.docproperty-background": "Background", "dlg.docproperty-size": "Size predefined", - "dlg.docproperty-select": "Select a dimensions", + "dlg.docproperty-select": "Select a dimension", "dlg.docproperty-size-320-240": "320 x 240 pixels", "dlg.docproperty-size-460-360": "460 x 360 pixels", "dlg.docproperty-size-640-480": "640 x 480 pixels", @@ -110,6 +115,7 @@ "dlg.docproperty-gridtype-fixed": "Fixed", "dlg.docproperty-gridtype-verticalFixed": "VerticalFixed", "dlg.docproperty-gridtype-horizontalFixed": "HorizontalFixed", + "dlg.docproperty-renderDelay": "View rendering delay (ms)", "dlg.docname-title": "View name", "dlg.docname-name": "Name", @@ -117,7 +123,7 @@ "dlg.item-title": "Name", "dlg.item-name": "Name", "dlg.item-req-name": "Function name (No spaced or numbers allowed)", - "dlg.item-name-error": "Name exist!", + "dlg.item-name-error": "Name exists!", "dlg.parameter-title": "Parameter", "dlg.tagname-title": "Tag name", @@ -151,6 +157,10 @@ "general.search-up": "SEARCH", "general.close": "Close", + "general.confirm": "Confirm", + "general.yes": "Yes", + "general.no": "No", + "general.delete": "Delete", "general.search": "Search...", "general.search-notfound": "No options found", "general.username": "Username", @@ -185,6 +195,10 @@ "general.sunday-short": "Sun", "general.save-template": "Save as template", "general.import-template": "Import from template", + "general.weekdays": ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], + "general.weekdays-short": ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"], + "general.months": ["January","February","March","April","May","June","July","August","September","October","November","December"], + "general.months-short": ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"], "tester.title": "Variable", "tester.send": "Send", @@ -258,6 +272,7 @@ "chart.config-interpo-stepAfter": "step after", "chart.config-interpo-stepBefore": "step before", "chart.config-interpo-spline": "spline", + "chart.config-interpo-none": "none (points)", "chart.config-line-width": "Line Width", "chart.config-line-gap": "Fill Gaps", "chart.config-line-add-zone": "Add Zone", @@ -358,7 +373,7 @@ "graph.property-date-last-range": "Date range", "graph.property-date-group": "Group", "graph.property-offline": "Online", - "graph.property-graph-oriantation": "Oriantation", + "graph.property-graph-orientation": "Orientation", "graph.property-ori-vartical": "Vertical", "graph.property-ori-horizontal": "Horizontal", "graph.property-decimals": "Decimals", @@ -411,8 +426,15 @@ "graph.grouptype-days": "Days", "iframe.property-data": "Data", - "iframe.property-address": "Address", - "iframe.property-name": "Name", + "iframe.property-address": "Address (fix)", + "iframe.property-image": "Image", + + "video.property-title": "Video settings", + "video.property-data": "Data", + "video.property-address": "Address", + "video.property-controls": "Show controls", + "video.property-image": "Initial image", + "video.property-image-placeholder": "Select the initial image", "panel.property-data": "Data", "panel.property-view-name": "View name", @@ -483,6 +505,7 @@ "table.cell-column-type": "Column type", "table.cell-row-type": "Row type", "table.cell-ts-format": "Format (DD/MM/YYYY - HH:mm:ss)", + "table.cell-ts-interval": " and rounding interval", "table.cell-value-format": "Format (0.000)", "table.cell-format": "Format", "table.cell-text": "Text", @@ -522,6 +545,7 @@ "editor.view-property": "Property", "editor.view-clone": "Clone", "editor.view-export": "Export", + "editor.view-clean": "Clean", "editor.view-add": "Add View", "editor.image-add": "Add image", "editor.view-import": "Import View", @@ -564,6 +588,90 @@ "editor.controls-image": "Image (link)", "editor.controls-panel": "Panel", "editor.controls-panel-settings": "Panel settings", + "editor.controls-video": "Video", + "editor.controls-video-settings": "Video settings", + "editor.controls-scheduler": "Time Scheduler", + "editor.controls-scheduler-settings": "Time Scheduler settings", + + "scheduler.property-settings-title": "Scheduler settings", + "scheduler.devices": "Devices", + "scheduler.device-name": "Device Name", + "scheduler.friendly-name": "Friendly Name", + "scheduler.add-device": "Add Device", + "scheduler.remove-device": "Remove Device", + "scheduler.colors": "Colors", + "scheduler.background-color": "Background Color", + "scheduler.text-color": "Text Color", + "scheduler.accent-color": "Accent Color", + "scheduler.border-color": "Border Color", + "scheduler.property-settings-devices": "Devices", + "scheduler.property-settings-add-device": "Add Device", + "scheduler.property-settings-device-name": "Device Name", + "scheduler.property-settings-layout": "Appearance", + "scheduler.property-settings-time-format": "Time Format", + "scheduler.property-settings-theme": "Theme", + "scheduler.property-settings-background": "Background", + "scheduler.property-settings-border": "Border", + "scheduler.property-settings-primary-text": "Primary Text", + "scheduler.property-settings-secondary-text": "Secondary Text", + "scheduler.device-selector-overview": "Overview", + "scheduler.device-selector-select-device": "Select Device", + "scheduler.show-disabled": "Show Disabled", + "scheduler.show-active": "Show Active", + "scheduler.clear-all-schedules": "Clear All Schedules", + + "scheduler.col-start": "Start", + "scheduler.col-mode": "Mode", + "scheduler.col-device": "Device", + "scheduler.col-duration": "Duration", + "scheduler.col-status": "Status", + "scheduler.col-remaining": "Remaining", + "scheduler.view-events": "View Events", + "scheduler.empty-device": "Nothing planned for this device", + "scheduler.no-devices": "No devices configured. Configure devices in the properties panel to create schedules.", + "scheduler.no-schedules": "No schedules created yet. Select a device above to add schedules.", + "scheduler.edit-title": "Edit Schedule", + "scheduler.add-title": "Add Schedule", + "scheduler.assign-device": "Assign to Device", + "scheduler.start-time": "Start Time", + "scheduler.end-time": "End Time", + "scheduler.hhmm": "HH:MM", + "scheduler.time.hour": "Hour", + "scheduler.time.minute": "Minute", + "scheduler.time.period": "Period", + "scheduler.time.am": "AM", + "scheduler.time.pm": "PM", + "scheduler.time.interval": "Interval", + "scheduler.time.hours": "Hours", + "scheduler.time.minutes": "Minutes", + "scheduler.time.seconds": "Seconds", + "scheduler.days": "Days", + "scheduler.months": "Months", + "scheduler.recurring": "Recurring", + "scheduler.event-mode": "Event Mode", + "scheduler.time-mode": "Time Mode", + "scheduler.month-mode": "Month Mode", + "scheduler.all-day": "All Day", + "scheduler.months-active": "Months Active", + "scheduler.days-of-month": "Days of Month", + "scheduler.days-active": "Days Active", + "scheduler.select-all": "Select All", + "scheduler.deselect-all": "Deselect All", + "scheduler.save": "Save Schedule", + "scheduler.editor-placeholder.title": "Time Scheduler", + "scheduler.editor-placeholder.hint": "Configure in properties panel", + "scheduler.start": "Start", + "scheduler.end": "End", + "scheduler.cancel": "Cancel", + "scheduler.monthly-schedule-details": "Monthly Schedule Details", + "scheduler.unnamed-device": "Unnamed Device", + "scheduler.update-schedule": "Update Schedule", + "scheduler.add-schedule": "Add Schedule", + "scheduler.delete-schedule": "Delete Schedule", + "scheduler.to-remove": "Are you sure you want to delete this schedule for {{value}}?", + "scheduler.clear-schedules": "Clear Schedules", + "scheduler.to-remove-permission": "Are you sure you want to delete {{value}} schedule/s you have permission to modify? This action cannot be undone.", + "scheduler.property-data": "Data", "editor.layout-settings": "Layout settings", @@ -730,11 +838,16 @@ "shapes.action-show": "Show", "shapes.action-blink": "Blink", "shapes.action-stop": "Stop", + "shapes.action-start": "Start", + "shapes.action-pause": "Pause", + "shapes.action-reset": "Reset", "shapes.action-clockwise": "Turn clockwise", "shapes.action-anticlockwise": "Turn anticlockwise", "shapes.action-downup": "Up and down", "shapes.action-rotate": "Rotate", "shapes.action-move": "Move", + "shapes.action-refreshImage": "Refresh image", + "shapes.event-click": "Click", "shapes.event-dblclick": "DoubleClick", "shapes.event-mouseup": "MouseUp", @@ -876,6 +989,7 @@ "device.property-name": "Name", "device.property-type": "Type", "device.property-polling": "Polling", + "device.property-nopolling": "Event driven", "device.property-enable": "Enable", "device.property-subscribe": "Subscribe", "device.property-address": "Address (IP or opc.tcp://[server]:[port])", @@ -940,6 +1054,9 @@ "device.template-device": "Template name", "device.template-tags": "Template name", "device.property-socket-reuse": "Socket Reuse", + "device.property-melsec-target": "Address (IP[:port])", + "device.property-melsec-ascii": "ASCII", + "device.property-melsec-octalIO": "Octal I/O", "device.browsetopics-property-title": "Broker Topics to subscribe and publish", "device.browsetopics-property-sub": "Subscribe", @@ -953,6 +1070,7 @@ "device.topic-publish-path": "Topic path", "device.topic-publish": "Publish", "device.topic-subscribe": "Subscribe", + "device.topic-select-all": "Select All", "device.topic-subscription-content": "Content", "device.topic-subscription-name": "Name", "device.topic-subscription-address": "Address", @@ -967,9 +1085,9 @@ "device.topic-type-timestamp": "Timestamp", "device.topic-type-value": "Value (of Topic)", "device.topic-type-static": "Static", - "device.topic-name-exist": "The Topic name '{{value}}' already exist", - "device.topic-subs-address-exist": "The Topic to subscribe with address '{{value}}' already exist", - "device.topic-pubs-address-exist": "The Topic to publish with address '{{value}}' already exist", + "device.topic-name-exist": "The Topic name '{{value}}' already exists", + "device.topic-subs-address-exist": "The Topic to subscribe with address '{{value}}' already exists", + "device.topic-pubs-address-exist": "The Topic to publish with address '{{value}}' already exists", "device.property-mqtt-address": "Address (mqtt://[server]:[port])", "device.tag-property-title": "Tag Property", @@ -980,6 +1098,7 @@ "device.tag-property-type": "Type", "device.tag-property-address": "Address (ex. db5.dbb3 db4.dbx2.0 MB7)", "device.tag-property-address-sample": "Address", + "device.tag-property-address-vistwo": "vistwo tag name (f.e. /sinus)", "device.tag-property-min": "Min", "device.tag-property-max": "Max", "device.tag-property-divisor": "Divisor", @@ -1013,6 +1132,10 @@ "device.tag-scale-mode-linear": "Linear: ΔS * (Value - RL) / ΔR + SL", "device.tag-scale-mode-linear-tooltip": "ΔS = (Scaled High - Scaled Low)\nΔR = (Raw High - Raw Low)\nRL = Raw Low\nSL = Scaled Low", "device.tag-scale-mode-script": "Script (Read/Write)", + "device.tag-scale-mode-expression": "Expression", + "device.tag-scale-mode-expression-tooltip": "JavaScript expression where 'this' refers to the tag value", + "device.tag-scale-read-expression": "Read Expression ( this / 1000 )", + "device.tag-scale-write-expression": "Write Expression ( this * 1000 )", "device.tag-raw-low": "Raw Low", "device.tag-raw-high": "Raw High", "device.tag-scaled-low": "Scaled Low", @@ -1030,6 +1153,17 @@ "device.tag-scale-write-script-tooltip": "Script to transform value before write to client", "device.tag-scale-write-script-params": "Enter Write Script Parameter Values", "device.tag-scale-script-params-tooltip": "JSON formated array of parameters with values to pass to script", + "device.tag-property-webcam-device": "Webcam device", + "device.tag-property-webcam-device-address": "Webcam device ,like(/dev/video0)", + "device.tag-property-webcam-options.width": "width", + "device.tag-property-webcam-options.height": "height", + "device.tag-property-webcam-options.frames": "frames", + "device.tag-property-webcam-options.quality": "quality", + "device.tag-property-webcam-options.outputType": "outputType", + "device.tag-property-webcam-options.callbackReturn": "callbackReturn", + + + "device.edit-placeholder-titel": "Edit Placeholder", @@ -1120,6 +1254,8 @@ "gauges.property-input-type-date": "Date", "gauges.property-input-type-time": "Time", "gauges.property-input-type-datetime": "Date and Time", + "gauges.property-input-type-textarea": "Multiline", + "gauges.property-input-type-password": "Password", "gauges.property-input-time-format": "Time format", "gauges.property-input-time-format-normal": "HH:mm", "gauges.property-input-time-format-seconds": "HH:mm:ss", @@ -1128,6 +1264,8 @@ "gauges.property-input-convertion": "Convertion", "gauges.property-input-convertion-milliseconds": "Milliseconds", "gauges.property-input-convertion-string": "String", + "gauges.property-input-maxlength": "Max length", + "gauges.property-input-readonly": "Readonly", "gauges.property-update-enabled": "Enable update", "gauges.property-update-esc": "ESC update", @@ -1153,6 +1291,7 @@ "gauges.property-tag-label": "Tag", "gauges.property-tag-internal-title": "Set Placeholder of Destination (or Tag of internal device)", "gauges.property-input-range": "Allowed input range", + "gauges.property-input-startText": "Start text", "gauges.property-language-text": "Text or @TextID", "bag.property-ticks": "Ticks", @@ -1264,6 +1403,9 @@ "notification.property-priority": "Priority", "notification.type-alarm": "Alarms", "notification.type-trigger": "Trigger", + "notification.property-mode": "Mode", + "notification.property-mode-alarm-all": "notify all new active alarms", + "notification.property-mode-alarm-single": "notify one for priority", "scripts.list-title": "Scripts settings", "scripts.list-name": "Name", @@ -1305,7 +1447,7 @@ "script.paramtype-tagid": "Tag ID", "script.paramtype-value": "Value (number/string/object)", "script.paramtype-chart": "Chart lines (array)", - "script.param-name-exist": "The parameter name already exist!", + "script.param-name-exist": "The parameter name already exists!", "script.sys-fnc-settag-text": "$setTag (TagID, value)", "script.sys-fnc-settag-tooltip": "System function to set Tag value: $setTag (TagID as string, value as string or number)", "script.sys-fnc-gettag-text": "$getTag (TagID)", @@ -1353,6 +1495,9 @@ "script.sys-fnc-invokeObject-text": "$invokeObject (Object name, Function name, [Parameter])", "script.sys-fnc-invokeObject-tooltip": "System function to call Object function: $invokeObject (Object name as string, function name as string , [parameter])", "script.sys-fnc-invokeObject-params": "'Object name', 'function name', ", + "script.sys-fnc-getObject-text": "$getObject (Object name)", + "script.sys-fnc-getObject-tooltip": "System function to get GUI-Object: $getObject (Object name as string)", + "script.sys-fnc-getObject-params": "'Object name'", "script.sys-fnc-runServerScript-text": "$runServerScript (Script name, [Parameter])", "script.sys-fnc-runServerScript-tooltip": "Client function to call Server script function: $runServerScript (Script name as string, [parameter])", "script.sys-fnc-runServerScript-params": "'Server script name', ", @@ -1380,6 +1525,8 @@ "script.template-chart-data-text": "Customized chart data", "script.template-chart-data-tooltip": "Code template of customized chart data to return", + "script.template-chart-data-touch-text": "Customized chart data with touch event", + "script.template-chart-data-touch-tooltip": "Code template of customized chart data to return and set value with coordinate(x/y) of touch event", "script.template-invoke-chart-update-options-text": "Update Chart options", "script.template-invoke-chart-update-options-tooltip": "Code template to update Chart options (Y-axis scale range). CLIENT mode only!", "script.template-getHistoricalTagsoptions-text": "Get Historical Tags values", @@ -1568,6 +1715,7 @@ "dlg.setup-layout": "Layout", "dlg.setup-plugins": "Plugins", "dlg.setup-scripts": "Scripts", + "dlg.setup-node-red-flows": "Node-RED Flows", "dlg.setup-reports": "Reports", "dlg.setup-settings": "Settings", "dlg.setup-client-access": "Frontend Scripts", @@ -1593,16 +1741,19 @@ "dlg.app-language-ru": "Russian", "dlg.app-language-ua": "Ukrainian", "dlg.app-language-zh-cn": "Chinese", + "dlg.app-language-zh-tw": "Chinese (Traditional)", "dlg.app-language-pt": "Portuguese", - "dlg.app-language-sv": "Swedish", + "dlg.app-language-sv": "Swedish", "dlg.app-language-tr": "Turkish", "dlg.app-language-ko": "Korean", "dlg.app-language-es": "Spanish", "dlg.app-language-fr": "French", + "dlg.app-language-ja": "Japanese", "dlg.app-settings-server-port": "Server is listening on port", "dlg.app-settings-server-log-full": "Log full mode", "dlg.app-settings-alarms": "Alarms", "dlg.app-settings-alarms-clear": "Clear all alarms and history", + "dlg.app-settings-logs": "Logs", "dlg.app-settings-auth-token": "Authentication with Token", "dlg.app-settings-auth-only-editor": "Only for Editor", "dlg.app-auth-disabled": "Disabled", @@ -1643,6 +1794,7 @@ "plugin.group-connection-device": "Connection device", "plugin.group-connection-database": "Connection database", "plugin.group-chart-report": "Chart image for Report", + "plugin.group-service": "Service", "action-settings-title": "Actions Settings", "action-settings-readonly-tag": "Tag", @@ -1651,13 +1803,13 @@ "msg.alarm-ack-all": "Would you like to ACK all alarms?", "msg.alarm-remove": "Would you like to remove Alarm?", "msg.text-remove": "Would you like to remove Text?", - "msg.alarmproperty-error-exist": "Alarm name exist!", + "msg.alarmproperty-error-exist": "Alarm name exists!", "msg.alarmproperty-missing-value": "Some values are missing!", - "msg.textproperty-error-exist": "Text-ID exist!", + "msg.textproperty-error-exist": "Text-ID exists!", "msg.textproperty-missing-value": "Some values are missing!", "msg.device-remove": "Would you like to remove Device?", "msg.device-tag-remove": "Would you like to remove Tag?", - "msg.device-tag-exist": "Tag name exist!", + "msg.device-tag-exist": "Tag name exists!", "msg.device-tag-invalid-char": "The '@' character is not allowed in tag names!", "msg.notification-property-missing-value": "Some values are missing!", "msg.report-property-missing-value": "There are incorrect or missing values!", @@ -1701,15 +1853,15 @@ "msg.chart-with-script": "The defined script receives the list of chart lines as a parameter and then returns the completed list with the data. Code sample in script 'Templates'", "msg.script-name-exist": "Script name exist!", "msg.invalid-script-name": "Invalid script name!", - "msg.templates-exist-ask-overwrite": "The template with name '{{value}}' already exist. Do you want to overwrite it?", + "msg.templates-exist-ask-overwrite": "The template with name '{{value}}' already exists. Do you want to overwrite it?", "msg.templates-save-success": "Template save successful!", - "msg.view-name-exist": "View name exist!", + "msg.view-name-exist": "View name exists!", "msg.notification-name-exist": "Notification name exist!", "msg.file-remove": "Would you like to remove '{{value}}'?", "msg.notification-remove": "Would you like to remove Notification '{{value}}'?", "msg.maps-location-remove": "Would you like to remove Maps Location '{{value}}'?", - "msg.maps-location-name-exist": "The Maps Location name already exist!", - "msg.text-name-exist": "Text name already exist!", + "msg.maps-location-name-exist": "The Maps Location name already exists!", + "msg.text-name-exist": "Text name already exists!", "msg.texts-text-remove": "Would you like to remove Text '{{value}}'?", "msg.operation-unauthorized": "Operation Unauthorized!" } diff --git a/client/src/assets/i18n/fr.json b/client/src/assets/i18n/fr.json index a0c87e176..c51af46be 100755 --- a/client/src/assets/i18n/fr.json +++ b/client/src/assets/i18n/fr.json @@ -42,33 +42,33 @@ "dlg.layout-lbl-icon": "Icône", "dlg.layout-lbl-sview": "Point de départ", "dlg.layout-lbl-login-start": "Afficher la connexion au début", - "dlg.layout-lbl-login-overlay-color": "Overlay color", + "dlg.layout-lbl-login-overlay-color": "Couleur de superposition", "dlg.layout-lbl-zoom": "Zoom", "dlg.layout-navigation-mode": "Montrer la navigation", - "dlg.layout-connection-message": "Show connection error (Toast)", + "dlg.layout-connection-message": "Afficher l'erreur de connexion (Toast)", "dlg.layout-show-dev": "Afficher le bouton", - "dlg.layout-navigation": "Menu côté navigation", + "dlg.layout-navigation": "Menu de navigation latéral", "dlg.layout-nav-bkcolor": "Couleur de l'arrière plan", "dlg.layout-nav-fgcolor": "Couleur", - "dlg.layout-lbl-smode": "Mode latéral", + "dlg.layout-lbl-smode": "Mode menu latéral", "dlg.layout-lbl-type": "Type", - "dlg.layout-header": "Barre de navigation en tête", + "dlg.layout-header": "Barre de navigation supérieure", "dlg.layout-header-bkcolor": "Couleur de l'arrière plan", "dlg.layout-header-fgcolor": "Couleur", "dlg.layout-lbl-title": "Titre", "dlg.layout-lbl-alarms": "Mode de notification des alarmes", - "dlg.layout-lbl-datetime": "Date and time format (dd/MM/yyyy - hh:mm a)", + "dlg.layout-lbl-datetime": "Format de date et d'heure (dd/MM/yyyy - hh:mm a)", "dlg.layout-lbl-infos": "Mode de notification d'informations", - "dlg.layout-lbl-font": "Font family", - "dlg.layout-lbl-font-size": "Font size", - "dlg.menuitem-title": "Elément du menu", + "dlg.layout-lbl-font": "Famille de police", + "dlg.layout-lbl-font-size": "Taille de police", "dlg.layout-lbl-anchor": "Direction", - "dlg.layout-lbl-margin-left": "Margin left", - "dlg.layout-lbl-margin-right": "Margin right", - "dlg.layout-lbl-login-info": "Login info", - "dlg.layout-lbl-custom-styles": "Custom styles", + "dlg.layout-lbl-margin-left": "Marge gauche", + "dlg.layout-lbl-margin-right": "Marge droite", + "dlg.layout-lbl-login-info": "Informations de connexion", + "dlg.layout-lbl-custom-styles": "Styles personnalisés", + "dlg.layout-lbl-show-language": "Afficher la langue", - "dlg.menuitem-title": "Menu Item", + "dlg.menuitem-title": "Élément du menu", "dlg.menuitem-image": "[Mon image...]", "dlg.menuitem-icon": "Icône", "dlg.menuitem-text": "Texte", @@ -76,9 +76,11 @@ "dlg.menuitem-link": "Lien par clic", "dlg.menuitem-alarms": "Alarmes par clic", "dlg.menuitem-address": "Adresse de liaison", + "dlg.menuitem-icons-filter": "Filtre d'icônes", - "dlg.headeritem-title": "Header Item", - "dlg.headeritem-icon": "Icon", + "dlg.headeritem-title": "Élément d'en-tête", + "dlg.headeritem-icon": "Icône", + "dlg.headeritem-icons-filter": "Filtre d'icônes", "dlg.docproperty-title": "Voir les propriétés", "dlg.docproperty-name": "Nom", @@ -97,24 +99,25 @@ "dlg.docproperty-size-1920-1080": "1920 x 1080 pixels", "dlg.docproperty-margin": "Marge", "dlg.docproperty-align": "Aligner", - "dlg.docproperty-align-placeholder": "Alignment on the page", - "dlg.docproperty-align-topCenter": "Top", - "dlg.docproperty-align-middleCenter": "Middle", - "dlg.docproperty-gridtype": "Grid type", - "dlg.docproperty-gridtype-placeholder": "Grid layout type", - "dlg.docproperty-gridtype-fit": "Fit", - "dlg.docproperty-gridtype-scrollVertical": "ScrollVertical", - "dlg.docproperty-gridtype-scrollHorizontal": "ScrollHorizontal", - "dlg.docproperty-gridtype-fixed": "Fixed", - "dlg.docproperty-gridtype-verticalFixed": "VerticalFixed", - "dlg.docproperty-gridtype-horizontalFixed": "HorizontalFixed", + "dlg.docproperty-align-placeholder": "Alignement sur la page", + "dlg.docproperty-align-topCenter": "Haut", + "dlg.docproperty-align-middleCenter": "Milieu", + "dlg.docproperty-gridtype": "Type de grille", + "dlg.docproperty-gridtype-placeholder": "Type de mise en page de la grille", + "dlg.docproperty-gridtype-fit": "Ajuster", + "dlg.docproperty-gridtype-scrollVertical": "Défilement vertical", + "dlg.docproperty-gridtype-scrollHorizontal": "Défilement horizontal", + "dlg.docproperty-gridtype-fixed": "Fixe", + "dlg.docproperty-gridtype-verticalFixed": "Fixe vertical", + "dlg.docproperty-gridtype-horizontalFixed": "Fixe horizontal", + "dlg.docproperty-renderDelay": "Délai de rendu de la vue (ms)", "dlg.docname-title": "Nom de vue", "dlg.docname-name": "Nom", "dlg.docproperty-type": "Type de vue", "dlg.item-title": "Nom", "dlg.item-name": "Nom", - "dlg.item-req-name": "Nom (pas d'espace ou nombre autorisés)", + "dlg.item-req-name": "Nom de la fonction (pas d'espace ou nombre autorisés)", "dlg.item-name-error": "Le nom existe!", "dlg.parameter-title": "Paramètre", @@ -134,9 +137,10 @@ "dlg.userproperty-title": "Utilisateur", "dlg.userproperty-groups": "Groupes d'autorisation", - "dlg.userproperty-roles": "Authorization Roles", + "dlg.userproperty-roles": "Rôles d'autorisation", "dlg.useraccess-groups": "Autorisation (vide = pour tout le monde)", - "dlg.userproperty-start": "Vue principale", + "dlg.userproperty-language": "Langue", + "dlg.userproperty-start": "Vue de démarrage", "dlg.gauge-permission-title": "Autorisation", "dlg.gauge-permission-label": "(vide = pour tout le monde)", @@ -145,6 +149,7 @@ "date.range-start": "Date de début", "date.range-end": "Date de fin", + "general.search-up": "RECHERCHE", "general.close": "Fermer", "general.search": "Chercher...", @@ -157,7 +162,7 @@ "general.grant-type": "Type d'autorisation", "general.usergroups": "Visionneur, opérateur, ingénieur, superviseur, gestionnaire, F, G, administrateur", "general.enabled": "Activé", - "general.disabled": "Désacivé", + "general.disabled": "Désactivé", "general.align-left": "Gauche", "general.align-center": "Centre", "general.align-right": "Droite", @@ -191,8 +196,9 @@ "item.navsmode-none": "Aucune", "item.navsmode-push": "Pousser", - "item.navsmode-over": "Plus de", + "item.navsmode-over": "Dessus", "item.navsmode-fix": "Fixé", + "item.navtype-icons": "Icônes", "item.navtype-text": "Texte", "item.navtype-icons-text-block": "Icônes et texte (bloc)", @@ -214,9 +220,14 @@ "item.logininfo-type-fullname": "Nom", "item.logininfo-type-both": "Nom et Prénom", + "item.language-show-mode-nothing": "Cacher", + "item.language-show-mode-simple": "Montrer", + "item.language-show-mode-key": "Montrer avec la clé", + "item.language-show-mode-fullname": "Montrer avec le nom complet", + "item.zoommode-disabled": "Désactivé", - "item.zoommode-enabled": "Activé", - "item.zoommode-autoresize": "Taille auto", + "item.zoommode-enabled": "Manuellement", + "item.zoommode-autoresize": "Redimensionnement auto", "item.headerbarmode-hide": "Cacher", "item.headerbarmode-show": "Montrer", @@ -229,11 +240,11 @@ "chart.config-title": "Paramètres des graphiques", "chart.config-charts": "Graphiques", - "chart.config-devices": "Dispositifs", + "chart.config-devices": "Appareils", "chart.config-tags": "Mots clés", "chart.config-lines": "Ligne de graphique", "chart.config-line-name": "Nom", - "chart.config-line-label": "Étiquette", + "chart.config-line-label": "Labels", "chart.config-line-yaxis": "Axe y", "chart.config-line-color": "Couleur", "chart.config-name-title": "Graphique", @@ -241,12 +252,21 @@ "chart.config-rename": "Renommer", "chart.config-delete": "Effacer", "chart.config-addline": "Ajouter une ligne", + "chart.config-addlinePlaceholder": "Ajouter une variable intermédiaire", "chart.config-line-interpolation": "Interpolation", "chart.config-line-fill": "Remplir", "chart.config-interpo-linear": "linéaire", "chart.config-interpo-stepAfter": "pas suivant", "chart.config-interpo-stepBefore": "pas précédent", "chart.config-interpo-spline": "spline", + "chart.config-line-width": "Largeur de ligne", + "chart.config-line-gap": "Remplir les espaces", + "chart.config-line-add-zone": "Ajouter une zone", + "chart.config-line-zone-min": "Min", + "chart.config-line-zone-max": "Max", + "chart.config-line-zone-stroke": "Contour", + "chart.config-line-zone-fill": "Remplir", + "chart.property-data": "Données", "chart.property-props": "Propriété", "chart.property-layout": "Disposition", @@ -254,13 +274,14 @@ "chart.property-chart": "Graphique à montrer", "chart.property-newchart": "Nouveau tableau ...", "chart.property-chart-type": "Mode de présentation", - "chart.property-realtime-max": "Minutes maximales", + "chart.property-realtime-max": "Minutes Max.", "chart.viewtype-realtime1": "Temps réel", - "chart.viewtype-history": "Histoire", + "chart.viewtype-history": "Historique", + "chart.viewtype-custom": "Personnalisé", "chart.property-general": "Général", "chart.property-font": "Police de caractère", - "chart.property-font.titlesize": "Taille du titre", - "chart.property-font.axissize": "Taille de l'axe", + "chart.property-font.titlesize": "Taille titre", + "chart.property-font.axissize": "Taille axes", "chart.property-font.legendsize": "Taille de la légende", "chart.property-theme": "Thème", "chart.property-color.background": "Arrière plan", @@ -269,44 +290,63 @@ "chart.property-color.legend": "Couleur de la légende", "chart.property-legend.mode": "Mode de présentation de la légende", "chart.property-date-last-range": "Plage des dates", + "chart.property-refresh-interval": "Intervalle de rafraîchissement (min.)", + "chart.property-hide-toolbar": "Masquer la barre d'outils", + "chart.property-thouch-zoom": "Zoom tactile", + "chart.property-load-old-values": "Charger l'historique", "chart.property-date.format": "Format de la date", "chart.property-time.format": "Format de l'heure", "chart.property-axis": "Axe", "chart.property-xaxis": "Axe x", - "chart.property-axis-x": "Étiquette", + "chart.property-axis-x": "Label X", "chart.property-yaxis": "Axe y", - "chart.property-axis-y1": "Étiquette Y1", - "chart.property-axis-y2": "Étiquette Y2", - "chart.property-axis-y3": "Étiquette Y3", - "chart.property-axis-y4": "Étiquette Y4", + "chart.property-axis-y1": "Label Y1", + "chart.property-axis-y1-min": "Y1 Min", + "chart.property-axis-y1-max": "Y1 Max", + "chart.property-axis-y2": "Label Y2", + "chart.property-axis-y2-min": "Y2 Min", + "chart.property-axis-y2-max": "Y2 Max", + "chart.property-axis-y3": "Label Y3", + "chart.property-axis-y3-min": "Y3 Min", + "chart.property-axis-y3-max": "Y3 Max", + "chart.property-axis-y4": "Label Y4", + "chart.property-axis-y4-min": "Y4 Min", + "chart.property-axis-y4-max": "Y4 Max", + "chart.property-script": "Source de données du script", + "chart.rangetype-last8h": "8 dernières heures", "chart.rangetype-last1d": "Dernier jour", "chart.rangetype-last3d": "3 derniers jours", - "chart.rangetype-last1w": "La semaine dernière", + "chart.rangetype-last1w": "Semaine dernière", + "chart.legend-always": "toujours", "chart.legend-follow": "suivre", "chart.legend-bottom": "fond", "chart.legend-never": "jamais", - "chart.labels-serie": "En série", + + "chart.labels-serie": "Série", "chart.labels-time": "Temps", "chart.labels-title": "Titre", + "graph.config-title": "Paramètres graphiques", "graph.config-rename": "Renommer", - "graph.config-source-tag": "Ajouter la balise source", + "graph.config-source-tag": "Ajouter le tag source", "graph.config-source-name": "Nom", - "graph.config-source-label": "Étiquette", + "graph.config-source-label": "Labels", "graph.config-category": "Catégorie", - "graph.config-device": "Dispositif", - "graph.config-bar-color": "Frontière", + "graph.config-device": "Appareil", + "graph.config-bar-color": "Bordure", "graph.config-bar-fill": "Remplir", "graph.property-xtype": "Type de catégorie d'axe x", - "graph.property-sources": "Sources (étiquettes)", + "graph.property-sources": "Sources (labels)", "graph.bar-xtype-value": "Valeurs", "graph.bar-xtype-date": "Date et heure", "graph.property-fnctype": "Type de fonction", "graph.bar-date-fnc-value-integral": "Somme (intégrale)", "graph.bar-date-fnc-hour-integral": "Somme d'heure (intégrale)", + "graph.property-data": "Données", + "graph.property-name": "Nom", "graph.property-general": "Générale", "graph.property-title": "Titre", "graph.property-title-font": "Taille de police", @@ -319,61 +359,76 @@ "graph.property-date-last-range": "Plage de dates", "graph.property-date-group": "Groupe", "graph.property-offline": "En ligne", - "graph.property-graph-oriantation": "Orientation", + "graph.property-graph-orientation": "Orientation", "graph.property-ori-vartical": "Verticale", "graph.property-ori-horizontal": "Horizontale", "graph.property-decimals": "Décimales", "graph.property-yaxis-min": "Min", "graph.property-yaxis-max": "Max", - "graph.property-stepsize": "Marquer le pas", - "graph.property-yaxis": "Axe de valeur", + "graph.property-stepsize": "Taille du pas", + "graph.property-yaxis": "Axe des valeurs", "graph.property-yaxis-fontsize": "Taille de police", "graph.property-yaxis-show": "Montrer", "graph.property-yaxis-color": "Évaluer", "graph.property-xaxis-fontsize": "Taille de police", - "graph.property-xaxis": "Axe de catégorie", + "graph.property-xaxis": "Axe des catégories", "graph.property-xaxis-show": "Montrer", "graph.property-xaxis-color": "Catégorie", "graph.property-theme": "Thème", "graph.property-theme-type": "Type", - "graph.property-gridline": "Grille d'exposition", + "graph.property-gridline": "Afficher grille", "graph.property-grid-color": "Grille", "graph.property-theme-owner": "Personnaliser", - "graph.property-theme-light": "Lumière", + "graph.property-theme-light": "Clair", "graph.property-theme-dark": "Sombre", "graph.property-legend": "Légende", "graph.property-legend-display": "Position", "graph.property-legend-top": "Haut", - "graph.property-legend-left": "La gauche", - "graph.property-legend-bottom": "Fond", + "graph.property-legend-left": "Gauche", + "graph.property-legend-bottom": "Bas", "graph.property-legend-right": "Droite", "graph.property-legend-show": "Montrer", - "graph.property-legend-fontsize": "Police de caractère", + "graph.property-legend-fontsize": "Taille de police", "graph.property-legend-align": "Aligner", "graph.property-legend-center": "Centre", - "graph.property-legend-start": "Commencer", + "graph.property-legend-start": "Début", "graph.property-legend-end": "Fin", "graph.property-legend-color": "Légende", "graph.property-border": "Taille de bordure", - "graph.property-tooltip": "Afficher l'influence", - "graph.property-datalabels": "Etiquette de données", - "graph.property-datalabels-color": "Etiquette de données", + "graph.property-tooltip": "Afficher infobulle", + "graph.property-datalabels": "Label des données", + "graph.property-datalabels-color": "Couleur du label des données", "graph.property-datalabels-show": "Montrer", "graph.property-datalabels-fontsize": "Taille de police", "graph.property-datalabels-align": "Aligner", + "graph.rangetype-last1h": "Dernière heure", "graph.rangetype-last1d": "Dernier jour", "graph.rangetype-last3d": "3 derniers jours", - "graph.rangetype-last1w": "La semaine dernière", + "graph.rangetype-last1w": "Semaine dernière", + "graph.rangetype-last1m": "Mois dernier", + "graph.grouptype-hours": "Heures", - "graph.grouptype-days": "Journées", + "graph.grouptype-days": "Jour", + "iframe.property-data": "Données", "iframe.property-address": "Adresse", "iframe.property-name": "Nom", + + "panel.property-data": "Données", + "panel.property-view-name": "Nom de la vue", + "panel.property-name": "Nom", + "panel.property-scalemode": "Mode mise à l'échelle", + "panel.property-scalemode-none": "Aucun", + "panel.property-scalemode-contain": "Contenir", + "panel.property-scalemode-stretch": "Étendre", + "table.property-title": "Paramètres du tableau de données", "table.property-data": "Données", "table.property-date-last-range": "Plage de dates", + "table.property-name": "Nom", "table.property-type": "Type", + "table.property-type-with-realtime": "Temps réel", "table.property-header": "Entête", "table.property-header-height": "Hauteur", "table.property-header-background": "Arrière plan", @@ -384,21 +439,29 @@ "table.property-row-background": "Arrière plan", "table.property-row-color": "Couleur", "table.property-row-fontSize": "Taille de police", + "table.property-selection": "Selection", "table.property-layout": "Disposition", "table.property-filter": "Filtre", "table.property-paginator": "Paginateur", + "table.property-paginator-items-per-page": "items par pages", + "table.property-paginator-next-page": "page suivante", + "table.property-paginator-prev-page": "page précédente", + "table.property-paginator-of-label": "de", "table.property-daterange": "Plage de dates", - "table.property-gridline": "Grille d'exposition", + "table.property-gridline": "Afficher la grille", "table.property-type-data": "Tableau de données", - "table.property-type-history": "Table d'histoire", + "table.property-type-history": "Tableau d'historique", + "table.property-type-alarms": "Tableau des alarmes", + "table.property-type-alarms-history": "Tableau d'historique des alarmes", + "table.property-type-reports": "Tableau des rapports", "table.property-grid-color": "Couleur de grille", "table.property-cols": "Colonnes", "table.property-rows": "Lignes", "table.property-column-type": "Type de colonne", "table.property-column-name": "Nom", - "table.property-column-label": "Étiquette", + "table.property-column-label": "Labels", "table.property-column-variable": "Variable", - "table.property-column-device": "Dispositif", + "table.property-column-device": "Appareils", "table.property-column-timestamp": "Date / heure", "table.property-column-align": "Aligner", "table.property-column-width": "Largeur", @@ -408,6 +471,10 @@ "table.customize-column-edit": "Modifier la colonne", "table.customize-column-add": "Ajouter la colonne", "table.customize-column-remove": "Supprimer la colonne", + "table.customize-column-left": "Déplacer à gauche", + "table.customize-column-right": "Déplacer à droite", + "table.customize-row-up": "Déplacer vers le haut", + "table.customize-row-down": "Déplacer vers le bas", "table.customize-row-edit": "Modifier la ligne", "table.customize-row-add": "Ajouter une rangée", "table.customize-row-remove": "Supprimer la ligne", @@ -423,12 +490,32 @@ "table.cell-align-left": "Gauche", "table.cell-align-center": "Centre", "table.cell-align-right": "Droite", + "table.history-filter": "Filtre", "table.rangetype-last1h": "Dernière heure", "table.rangetype-last1d": "Dernier jour", "table.rangetype-last3d": "3 derniers jours", - "editor.view-svg": "Toile / svg", + + "table.alarms-title": "Tableau des alarmes", + "table.alarms-history-title": "Tableau d'historique des alarmes", + "table.alarm-columns": "Colonnes des alarmes", + "table.alarm-filter": "Filtre d'alarmes", + "table.alarm-priority": "Priorité", + "table.alarm-tags": "Tags", + + "table.reports-title": "Tableau des rapports", + "table.report-columns": "Colonnes des rapports", + "table.report-view-name": "Nom", + "table.report-view-ontime": "Créé", + "table.report-view-download": "Télécharger", + "table.report-view-delete": "Supprimer", + "table.report-filter": "Filtre des rapports", + "table.report-filter-name": "Nom", + "table.report-filter-count": "Max.", + + "editor.view-svg": "Canvas / svg", "editor.view-cards": "Conteneur multi-vues", + "editor.view-maps": "Cartes", "editor.views": "Vues", "editor.resources": "Ressources", "editor.view-delete": "Effacer", @@ -438,48 +525,57 @@ "editor.view-export": "Exporter", "editor.view-add": "Ajouter la vue", "editor.image-add": "Ajouter une image", - "editor.view-import": "Vue d'importation", - "editor.general": "Générale", - "editor.shape": "Forme", + "editor.view-import": "Importer une vue", + "editor.general": "Général", + "editor.shape": "Formes", "editor.processeng": "Proc. Eng.", - "editor.animated": "Animation", - "editor.controls": "Les contrôles", + "editor.animated": "Animations", + "editor.controls": "Contrôles", "editor.controls-input": "Valeur d'entrée", "editor.controls-input-settings": "Paramètres d'entrée", "editor.controls-output": "Valeur de sortie", "editor.controls-output-settings": "Paramètres de sortie", "editor.controls-button": "Bouton", - "editor.controls-button-settings": "Paramètres des bouton", - "editor.controls-select": "Sélectionner la valeur", - "editor.controls-select-settings": "Sélectionner les paramètres", - "editor.controls-progress": "Jauge de barre", - "editor.controls-progress-settings": "Paramètres de jauge de bar", + "editor.controls-button-settings": "Paramètres du bouton", + "editor.controls-select": "Sélecteur de valeur", + "editor.controls-select-settings": "Paramètres du sélecteur", + "editor.controls-progress": "Jauge en barre", + "editor.controls-progress-settings": "Paramètres de la jauge en barre", "editor.controls-semaphore": "Jauge LED", "editor.controls-semaphore-settings": "Paramètres de jauge LED", "editor.controls-chart": "Graphique", "editor.controls-chart-settings": "Paramètres du graphique", - "editor.controls-bag": "Calibre circulaire", + "editor.controls-bag": "Jauge circulaire", "editor.controls-bag-settings": "Paramètres de jauge circulaire", "editor.controls-pipe": "Tuyau", - "editor.controls-pipe-settings": "Réglages de tuyaux", - "editor.controls-slider": "Glissière", - "editor.controls-slider-settings": "Paramètres de curseur", + "editor.controls-pipe-settings": "Paramètres du tuyau", + "editor.controls-slider": "Curseur", + "editor.controls-slider-settings": "Paramètres du curseur", "editor.controls-shape-settings": "Paramètres de forme", - "editor.controls-html-switch-settings": "Paramètres de commutation", - "editor.controls-switch": "Changer", - "editor.controls-graphbar": "Graphique à barres", - "editor.controls-graph-bar-settings": "Paramètres du graphique à barres", - "editor.controls-graph-pie-settings": "Paramètres du graphique à tarte", + "editor.controls-html-switch-settings": "Paramètres de l'interrupteur", + "editor.controls-switch": "Interrupteur", + "editor.controls-graphbar": "Graphique en barres", + "editor.controls-graph-bar-settings": "Paramètres du graphique en barres", + "editor.controls-graphpie": "Graphique circulaire", + "editor.controls-graph-pie-settings": "Paramètres du graphique circulaire", "editor.controls-iframe": "Iframe", - "editor.controls-iframe-settings": "Paramètres IFRAME", - "editor.controls-table": "Table", + "editor.controls-iframe-settings": "Paramètres iframe", + "editor.controls-table": "Tableau", + "editor.header-item-settings": "Paramètres de l'élément d'en-tête", + "editor.controls-image": "Image (lien)", + "editor.controls-panel": "Panneau", + "editor.controls-panel-settings": "Paramètres du panneau", + "editor.layout-settings": "Paramètres de mise en page", + "editor.interactivity": "Interactivité", "editor.interactivity-id": "identifiant:", "editor.interactivity-id-title": "Identifier l'élément", - "editor.interactivity-class": "classer:", + "editor.interactivity-class": "classe:", "editor.interactivity-class-title": "Classe d'élément", - "editor.interactivity-name": "Nom", + "editor.interactivity-name": "nom", + "editor.edit-bind-of-tags": "Modifier les liaisons des variables", + "editor.cmenu-property": "Propriété", "editor.cmenu-cut": "Couper", "editor.cmenu-copy": "Copie", @@ -492,48 +588,51 @@ "editor.cmenu-bring-forward": "En avant", "editor.cmenu-send-backward": "En arrière", "editor.cmenu-send-back": "En arrière", - "editor.cmenu-layer-duplicate": "Calque en double ...", - "editor.cmenu-layer-delete": "Supprimer la couche", + "editor.cmenu-layer-duplicate": "Dupliquer le calque ...", + "editor.cmenu-layer-delete": "Supprimer le calque", "editor.cmenu-layer-marge-down": "Fusionner vers le bas", "editor.cmenu-layer-marge-all": "Fusionner tout", + "editor.cmenu-unlock": "Déverrouiller", + "editor.cmenu-lock": "Verrouiller", + "editor.transform": "Transformer", "editor.transform-x": "X", "editor.transform-x-title": "Changer les coordonnées x", "editor.transform-y": "y", - "editor.transform-y-title": "Changer les coordonnées", + "editor.transform-y-title": "Changer les coordonnées y", "editor.transform-x1": "x1", - "editor.transform-x1-title": "Modifier les coordonnées de démarrage de la ligne", + "editor.transform-x1-title": "Changer les coordonnées x du début de la ligne", "editor.transform-y1": "Y1", - "editor.transform-y1-title": "Changer la coordonnée de démarrage de la ligne", + "editor.transform-y1-title": "Changer les coordonnées y du début de la ligne", "editor.transform-x2": "x2", - "editor.transform-x2-title": "Modifier les coordonnées de démarrage de la ligne", + "editor.transform-x2-title": "Changer les coordonnées x du début de la ligne", "editor.transform-y2": "Y2", - "editor.transform-y2-title": "Changer la coordonnée de démarrage de la ligne", + "editor.transform-y2-title": "Changer les coordonnées y du début de la ligne", "editor.transform-rect-width-title": "Changer la largeur du rectangle", "editor.transform-width": "largeur", "editor.transform-rect-height-title": "Changer la hauteur de rectangle", - "editor.transform-height": "la taille", - "editor.transform-rect-radius-title": "Changer le rayon du coin rectangle", - "editor.transform-radiuscorner": "coin rayon", + "editor.transform-height": "hauteur", + "editor.transform-rect-radius-title": "Changer le rayon des coins du rectangle", + "editor.transform-radiuscorner": "Rayon des coins", "editor.transform-circlecx": "cx", "editor.transform-circlecx-title": "Changer les coordonnées CX du cercle", - "editor.transform-circlecy": "cycle", - "editor.transform-circlecy-title": "Modifier les coordonnées du cycle du cercle", + "editor.transform-circlecy": "cy", + "editor.transform-circlecy-title": "Changer les coordonnées CY du cercle", "editor.transform-circler": "r", "editor.transform-circler-title": "Changer le rayon du cercle", "editor.transform-ellipsecx": "cx", - "editor.transform-ellipsecx-title": "Changer la coordonnée CX d'Ellipse", - "editor.transform-ellipsecy": "cycle", - "editor.transform-ellipsecy-title": "Changer la coordonnée CY d'Ellipse", + "editor.transform-ellipsecx-title": "Changer la coordonnée CX de l'ellipse", + "editor.transform-ellipsecy": "cy", + "editor.transform-ellipsecy-title": "Changer la coordonnée CY de l'ellipse", "editor.transform-ellipserx": "rx", - "editor.transform-ellipserx-title": "Changer le rayon X d'Ellipse", + "editor.transform-ellipserx-title": "Changer le rayon X de l'ellipse", "editor.transform-ellipsery": "ry", - "editor.transform-ellipsery-title": "Changer le rayon Y d'Ellipse", + "editor.transform-ellipsery-title": "Changer le rayon Y de l'ellipse", "editor.transform-fontfamily": "famille de polices", "editor.transform-font-serif": "Serif", "editor.transform-font-sansserif": "Sans-serif", "editor.transform-font-cursive": "Cursive", - "editor.transform-font-fantasy": "Fantaisie", + "editor.transform-font-fantasy": "Fantasy", "editor.transform-font-monospace": "Monospace", "editor.transform-fontsize": "taille de police", "editor.transform-fontsize-title": "Changer la taille de la police", @@ -549,26 +648,31 @@ "editor.transform-change-image-title": "Remarque: cette image ne peut pas être intégrée. Cela dépendra de ce chemin à afficher", "editor.transform-angle": "angle", "editor.transform-angle-title": "Changer l'angle de rotation", + "editor.transform-hide": "Masquer", + "editor.transform-lock": "Verrouiller", + "editor.align": "Aligner", - "editor.align-left-title": "Alignez à gauche", - "editor.align-center-title": "centrer", + "editor.align-left-title": "Aligner à gauche", + "editor.align-center-title": "Aligner au centre", "editor.align-right-title": "Aligner à droite", - "editor.align-top-title": "Aligner au dessus", - "editor.align-middle-title": "Centrer", + "editor.align-top-title": "Aligner en haut", + "editor.align-middle-title": "Aligner au milieu", "editor.align-bottom-title": "Aligner en bas", + "editor.stroke": "Trait", "editor.stroke-width": "largeur du trait", - "editor.stroke-width-title": "Changer la largeur de la course de 1, cliquez sur l'échange pour changer de 0,1", - "editor.stroke-style": "style de course", - "editor.stroke-style-title": "Changer le style de tableau de bord de course", - "editor.stroke-joinmiter-title": "Mitre de ligne", - "editor.stroke-joinround-title": "Rond", - "editor.stroke-joinbevel-title": "Biseau de ligne", - "editor.stroke-capbutt-title": "Butt de linecap", - "editor.stroke-capsquare-title": "Square de linecap", - "editor.stroke-capround-title": "Linecap rond", + "editor.stroke-width-title": "Changer la largeur du trait de 1, shift+clic pour changer de 0,1", + "editor.stroke-style": "style de trait", + "editor.stroke-style-title": "Changer le style de trait", + "editor.stroke-joinmiter-title": "Jonction angulaire", + "editor.stroke-joinround-title": "Jonction arrondie", + "editor.stroke-joinbevel-title": "Jonction biseautée", + "editor.stroke-capbutt-title": "Extrémité droite", + "editor.stroke-capsquare-title": "Extrémité carrée", + "editor.stroke-capround-title": "Extrémité arrondie", "editor.stroke-shadow": "ombre", "editor.stroke-shadow-title": "Avec ombre", + "editor.marker": "Marqueur", "editor.marker-start": "début", "editor.marker-start-title": "Sélectionnez le type de marqueur de démarrage", @@ -576,63 +680,96 @@ "editor.marker-middle-title": "Sélectionner le type de marqueur moyen", "editor.marker-end": "fin", "editor.marker-end-title": "Sélectionner le type de marqueur de fin", + "editor.hyperlink": "Lien hypertexte", "editor.hyperlink-url": "URL", + "editor.tools-launch-title": "Lancez la vue actuelle", - "editor.tools-select": "Sélectionner l'outil", - "editor.tools-pencil": "Outil de crayon", - "editor.tools-line": "Outil de ligne", - "editor.tools-rectangle": "Outil Rectangle", - "editor.tools-circle": "Outil de cercle", - "editor.tools-ellipse": "Outil d'ellipse", - "editor.tools-path": "Outil de chemin", - "editor.tools-text": "Outil de texte", - "editor.tools-image": "Outil d'image", - "editor.tools-zoom-title": "Zoom Tool [Ctrl + Up / Down]", - "editor.tools-grid-title": "Afficher la grille de peau", + "editor.tools-select": "Outil de sélection", + "editor.tools-pencil": "Outil crayon", + "editor.tools-line": "Outil ligne", + "editor.tools-rectangle": "Outil rectangle", + "editor.tools-circle": "Outil cercle", + "editor.tools-ellipse": "Outil ellipse", + "editor.tools-path": "Outil chemin", + "editor.tools-text": "Outil texte", + "editor.tools-image": "Outil image", + + "editor.tools-zoom-title": "Outil zoom [Ctrl + Haut / Bas]", + "editor.tools-grid-title": "Afficher/Masquer la grille", "editor.tools-undo-title": "Annuler [Z]", "editor.tools-redo-title": "Refaire [y]", - "editor.tools-clone-title": "Élément en double [d]", - "editor.tools-delete-title": "Supprimer l'élément [supprimer / backspace]", - "editor.tools-movebottom-title": "Envoyer à l'arrière [Ctrl + Shift + []", - "editor.tools-movetop-title": "Envoyer à l'avant [ctrl + shift +]]", + "editor.tools-clone-title": "Dupliquer [d]", + "editor.tools-delete-title": "Supprimer l'élément [supprimer / espace arrière]", + "editor.tools-movebottom-title": "Envoyer à l'arrière [Ctrl + Shift + [ ]", + "editor.tools-movetop-title": "Envoyer à l'avant [ctrl + shift +] ]", "editor.tools-topath-title": "Convertir en chemin", - "editor.tools-clonemulti-title": "Éléments de clone [C]", - "editor.tools-deletemulti-title": "Supprimer les éléments sélectionnés [supprimer / arrière-espace]", - "editor.tools-group-title": "Éléments de groupe [G]", + "editor.tools-clonemulti-title": "Cloner les éléments [C]", + "editor.tools-deletemulti-title": "Supprimer les éléments sélectionnés [supprimer / espace arrière]", + "editor.tools-group-title": "Grouper les éléments [G]", "editor.tools-alignleft-title": "Alignez à gauche", - "editor.tools-aligncenter-title": "Centrer", + "editor.tools-aligncenter-title": "Aligner au centre", "editor.tools-alignright-title": "Aligner à droite", "editor.tools-aligntop-title": "Aligner au dessus", - "editor.tools-alignmiddle-title": "Centrer", + "editor.tools-alignmiddle-title": "Aligner au milieu", "editor.tools-alignbottom-title": "Aligner en bas", - "editor.tools-ungroup-title": "Éléments de dépassement [G]", + "editor.tools-ungroup-title": "Dégrouper les éléments [G]", "editor.tools-hyperlink-title": "Faire un lien hypertexte", + "editor.tools-svg-selector": "Sélecteur de liste d'éléments", + + "editor.settings-general": "Général", + "editor.settings-events": "Événements", + "editor.settings-actions": "Actions", + + "tags.ids-config-title": "Référence des IDs des tags", + + "svg.selector.property-title": "Voir la liste des éléments", + "tutorial.editor-keyboard-shortcuts": "Raccourcis clavier de l'éditeur", + "shapes.action-hide": "Cacher", "shapes.action-show": "Montrer", "shapes.action-blink": "Clignoter", "shapes.action-stop": "Arrêt", - "shapes.action-clockwise": "Tourne dans le sens horaire", + "shapes.action-clockwise": "Tourner dans le sens horaire", "shapes.action-anticlockwise": "Tourner dans le sens antihoraire", "shapes.action-downup": "Haut et bas", "shapes.action-rotate": "Tourner", - "shapes.event-click": "Cliqué", - "shapes.event-mouseup": "Cliqué relaché", - "shapes.event-mousedown": "Cliqué pressé", - "shapes.event-onpage": "Page ouverte", - "shapes.event-onwindow": "Carte acueille", + "shapes.action-move": "Déplacer", + "shapes.event-click": "Clic", + "shapes.event-dblclick": "Double Clic", + "shapes.event-mouseup": "Clic relâché", + "shapes.event-mousedown": "Clic pressé", + "shapes.event-mouseover": "Survol", + "shapes.event-mouseout": "Fin survol", + "shapes.event-enter": "Entrer", + "shapes.event-select": "Sélectionner", + "shapes.event-onpage": "Ouvrir la page", + "shapes.event-onwindow": "Ouvrir la carte", "shapes.event-ondialog": "Ouvrir la boîte de dialogue", - "shapes.event-oniframe": "Iframe ouvert", - "shapes.event-oncard": "Fenêtre ouverte", - "shapes.event-onsetvalue": "Valeur définie", + "shapes.event-oniframe": "Ouvrir l'iframe", + "shapes.event-oncard": "Ouvrir la fenêtre", + "shapes.event-onopentab": "Ouvrir l'onglet", + "shapes.event-onsetvalue": "Définir la valeur", "shapes.event-ontogglevalue": "Valeur de basculement", "shapes.event-onsetinput": "Définir à partir de l'entrée", - "shapes.event-onclose": "proche", - "shapes.event-onrunscript": "Script de lancement", - "shapes.event-setvalue-set": "Positionner", - "shapes.event-setvalue-add": "augmenter", - "shapes.event-setvalue-remove": "diminuer", + "shapes.event-onclose": "Fermer", + "shapes.event-onopen": "Ouvrir", + "shapes.event-onrunscript": "Lancer le script", + "shapes.event-setvalue-set": "définir", + "shapes.event-setvalue-add": "incrémenter", + "shapes.event-setvalue-remove": "décrémenter", + "shapes.event-address-link": "Lien", + "shapes.event-address-resource": "Ressource", + "shapes.event-onmonitor": "Moniteur", + "shapes.event-onViewToPanel": "Définir la vue sur le panneau", + "shapes.event-onLoad": "Au chargement", + "shapes.event-relativefrom-window": "Fenêtre", + "shapes.event-relativefrom-mouse": "Souris", + + "pipe.property-title": "Paramètres du tuyau", + "pipe.property-data": "Données", + "pipe.property-style": "Style", "pipe.property-props": "Propriété", "pipe.property-border-width": "Largeur de la bordure", "pipe.property-border-color": "Couleur de la bordure", @@ -640,8 +777,13 @@ "pipe.property-pipe-color": "Couleur de tuyau", "pipe.property-content-width": "Largeur de contenu", "pipe.property-content-color": "Couleur de contenu", - "pipe.property-content-space": "Tableau de contenu", + "pipe.property-content-space": "Tiret du contenu", "pipe.action-hide-content": "Cacher le contenu", + "pipe.property-style-animation": "Image d'animation", + "pipe.property-style-animation-image": "Sélectionner l'image (SVG)", + "pipe.property-style-animation-count": "Nombre d'images", + "pipe.property-style-animation-delay": "Délai d'animation (msec.)", + "slider.property-props": "Propriété", "slider.property-horizontal": "Horizontale", "slider.property-vertical": "Verticale", @@ -662,7 +804,7 @@ "slider.property-divisions": "Divisions (%)", "slider.property-divisions-height": "Hauteur", "slider.property-divisions-width": "Largeur", - "slider.property-font-size": "Fonte Echelle", + "slider.property-font-size": "Police de l'échelle", "slider.property-tooltip": "Info-bulle", "slider.property-tooltip-none": "Aucune", "slider.property-tooltip-hide": "Cacher", @@ -670,36 +812,40 @@ "slider.property-tooltip-decimals": "Décimales", "slider.property-tooltip-background": "Arrière plan", "slider.property-tooltip-color": "Couleur de texte", - "slider.property-tooltip-font-size": "FONT DE TOYAL", - "slider.property-slider-color": "Connecter la couleur", + "slider.property-tooltip-font-size": "Taille de police", + "slider.property-slider-color": "Couleur curseur", "slider.property-slider-background": "Couleur de base", "slider.property-slider-handle": "Couleur du pointeur", - "html-switch.property-off-value": "Valeur hors valeur", - "html-switch.property-on-value": "En valeur", - "html-switch.property-on-background": "En arrière-plan", - "html-switch.property-off-background": "Hors de fond", - "html-switch.property-off-text": "Hors texte", - "html-switch.property-on-text": "Sur le texte", - "html-switch.property-on-slider-color": "Sur la couleur du curseur", - "html-switch.property-off-slider-color": "Couleur hors curseur", - "html-switch.property-radius": "Coin rayon", - "html-switch.property-off-text-color": "Couleur du texte hors", - "html-switch.property-on-text-color": "Sur la couleur du texte", + + "html-switch.property-off-value": "Valeur HORS", + "html-switch.property-on-value": "Valeur EN", + "html-switch.property-on-background": "Arrière-plan EN", + "html-switch.property-off-background": "Arrière-plan HORS", + "html-switch.property-off-text": "Texte HORS", + "html-switch.property-on-text": "Texte EN", + "html-switch.property-on-slider-color": "Couleur curseur EN", + "html-switch.property-off-slider-color": "Couleur curseur HORS", + "html-switch.property-radius": "Rayon des coins", + "html-switch.property-off-text-color": "Couleur texte HORS", + "html-switch.property-on-text-color": "Couleur texte EN", "html-switch.property-font-size": "Taille de police", "html-switch.property-font": "Police de caractère", + "html-input.min": "Min", "html-input.max": "Max", - "html-input.out-of-range": "Valeur hors de portée", + "html-input.out-of-range": "Valeur hors plage", "html-input.not-a-number": "La valeur n'est pas un nombre", + "editor.tools-zoomlevel-title": "Le niveau de zoom", - "editor.tools-zoomlevel-fitcanvas": "Ajustement sur cadrillage", + "editor.tools-zoomlevel-fitcanvas": "Ajustement au canvas", "editor.tools-zoomlevel-fitsection": "Ajustement à la sélection", - "editor.tools-zoomlevel-fitcontent": "Ajustez à tous les contenus", + "editor.tools-zoomlevel-fitcontent": "Ajustez à tout le contenu", "editor.tools-fillcolor-title": "Changer la couleur de remplissage", - "editor.tools-strokecolor-title": "Changer la couleur de la course", - "editor.tools-palettecolor-title": "Cliquez pour modifier la couleur de remplissage, cliquez sur un clic pour changer la couleur de la course", - "device.list-title": "Paramètres des appareils", - "device.list-device": "Dispositif", + "editor.tools-strokecolor-title": "Changer la couleur du contour", + "editor.tools-palettecolor-title": "Cliquez pour modifier la couleur de remplissage, shift+clic pour changer la couleur du contour", + + "device.list-title": "Paramètres de connexions des appareils", + "device.list-device": "Appareils", "device.list-filter": "Filtre", "device.list-name": "Nom", "device.list-address": "Adresse", @@ -707,20 +853,30 @@ "device.list-min": "Min", "device.list-max": "Max", "device.list-value": "Valeur", - "device.list-edit": "Modifier la balise", - "device.list-add": "Ajouter une étiquette", - "device.list-remove": "Enlever l'étiquette", - "device.list-remove-all": "Supprimer toutes les balises", - "device.list-options": "Options de balises", - "devices.export": "Dispositifs d'exportation", + "device.list-timestamp": "Horodatage", + "device.list-description": "Description", + "device.list-edit": "Modifier le tag", + "device.list-add": "Ajouter un tag", + "device.list-remove": "Enlever le tag", + "device.list-remove-all": "Supprimer tous les tags", + "device.list-options": "Options du tag", + "device.list-clipboard": "Copier le Tag dans le presse-papiers", + "device.list-direction": "Direction", + + "devices.export": "Exporter les appareils", "devices.export-json": "Json", "devices.export-csv": "CSV", "devices.import": "Importer des appareils", + "device.manage-templates": "Gérer les modèles", + "device.save-tags-to-template": "Enregistrer les tags dans un modèle", + "device.add-tags-from-template": "Ajouter des tags à partir du modèle", + "device.tags-template-name-title": "Nom du modèle de tags", + "devices.import-template": "Importer des appareils avec le modèle", "device.property-client": "Propriété de l'appareil", "device.property-server": "Propriété du serveur FUXA", "device.property-name": "Nom", "device.property-type": "Type", - "device.property-polling": "Appel", + "device.property-polling": "Freq. d'interrogation", "device.property-enable": "Activer", "device.property-subscribe": "S'abonner", "device.property-address": "Adresse (ip ou opc.tcp: // [serveur]: [port])", @@ -729,42 +885,73 @@ "device.property-device-port": "Appareil IP et port (127.0.0.1:47808)", "device.property-address-port": "IP et port d'esclaves (127.0.0.1:502)", "device.property-security": "Protocole de sécurité et de cryptage", - "device.property-tags": "Modifier les balises de périphérique", + "device.property-tags": "Modifier les balises de l'appareil", "device.property-edit": "Modifier la propriété de l'appareil", - "device.property-remove": "Enlevez l'appareil", + "device.property-remove": "Supprimer l'appareil", "device.property-add": "Ajouter un appareil", "device.not-property-security": "Sans sécurité et cryptage", + "device.property-connection-options": "Options de connexion", "device.property-port": "Port", "device.property-slave-id": "Id esclave", "device.property-routing": "Routage", "device.property-tockenized": "Fragmenté", - "device.property-rack": "Étagère", - "device.property-slot": "Insérer", + "device.property-rack": "Rack", + "device.property-slot": "Slot", "device.property-serialport": "Port série", "device.property-baudrate": "Débit", "device.property-databits": "Bits de données", "device.property-stopbits": "Bits d'arrêt", "device.property-parity": "Parité", + "device.property-force-fc16": "Utiliser uniquement Write Multiple Registers", + "device.property-delay": "Delais des trames (msec.)", "device.property-method": "Méthode", "device.property-format": "Format", "device.property-internal": "Frontend uniquement", "device.property-url": "URL (http: // [serveur]: [port])", "device.property-webapi-result": "Résultat de la demande", + "device.property-ads-target": "Target AmsNetId (e.g. 192.168.1.10.1.1:851)", + "device.property-ads-local": "Local AmsNetId (e.g. 192.168.1.10.1.1:32750)", + "device.property-ads-router": "Router Address(e.g. 192.168.1.120:48898)", "device.not-webapi-result": "Configurer le résultat WebAPI", "device.property-show": "Afficher la propriété de l'appareil", "device.property-hide": "Masquer la propriété de l'appareil", + "device.property-interface-address": "Interface et Port", + "device.property-interface-address-ph": "127.0.0.1:47808", + "device.property-broadcast-address": "Broadcast", + "device.property-broadcast-address-ph": "127.0.0.255", + "device.property-adpu-timeout": "Délai d'attente adpu", + "device.property-adpu-timeout-ph": "6000", + "device.property-certificate-section": "Certificat TLS", + "device.property-certificate": "Certificat", + "device.property-certificate-key": "Clé privée", + "device.property-certificate-ca": "Certificat CA", "device.security-none": "Aucune", - "device.security-sign": "Pancarte", + "device.security-sign": "Signe", "device.security-signandencrypt": "Signe et crypte", - "device.browsetopics-property-title": "Sujets de courtier pour vous abonner et publier", + "device.webapi-property-title": "Propriété WebAPI", + "device.webapi-property-gettags": "URL GET Tags", + "device.webapi-property-posttags": "URL POST Tags", + "device.webapi-property-loadtags": "Charger les tags", + "device.property-dsn": "Nom de la source de données (DSN=Nom de la base de données)", + "device.property-odbc-result": "Résultat des tables trouvées", + "device.not-odbc-result": "Résultat des tables de la base de données", + "device.add-device-templates-title": "Modèles d'appareil", + "device.add-tags-templates-title": "Modèles de tags", + "device.add-from-template": "Ajouter un appareil à partir du modèle", + "device.manage-templates-title": "Supprimer les modèles", + "device.template-device": "Nom du modèle", + "device.template-tags": "Nom du modèle", + "device.property-socket-reuse": "Réutilisation de socket", + + "device.browsetopics-property-title": "Topics du broker à publier et souscrire", "device.browsetopics-property-sub": "S'abonner", "device.browsetopics-property-pub": "Publier", - "device.discovery-topics": "Sujets du navigateur sur courtier", - "device.topic-selected": "Sujet sélectionné", + "device.discovery-topics": "Explorer les topics du broker", + "device.topic-selected": "Topic sélectionné", "device.topic-raw": "brute", "device.topic-json": "json", - "device.add-topics": "Publier mes sujets sur le broker", - "device.topic-publish-name": "Nom du sujet", + "device.add-topics": "Publier mes topics sur le broker", + "device.topic-publish-name": "Nom du topic", "device.topic-publish-path": "Chemin", "device.topic-publish": "Publier", "device.topic-subscribe": "S'abonner", @@ -778,19 +965,20 @@ "device.topic-publish-value": "Chemin", "device.topic-publish-static": "Évaluer", "device.topic-publish-content": "Message", - "device.topic-type-tag": "Étiquette", + "device.topic-type-tag": "Labels", "device.topic-type-timestamp": "Horodatage", "device.topic-type-value": "Valeur (du sujet)", "device.topic-type-static": "Statique", "device.topic-name-exist": "Le nom du sujet '{{value}}' existe déjà", "device.topic-subs-address-exist": "Le sujet où s'abonner avec l'adresse '{{value}}' existe déjà", "device.topic-pubs-address-exist": "Le sujet où publier avec l'adresse '{{value}}' existe déjà", + "device.property-mqtt-address": "Adresse (mqtt: // [serveur]: [port])", "device.tag-property-title": "Propriété TAG", "device.browsetag-property-title": "Parcourir les balises dans le serveur", - "device.tag-property-device": "Dispositif", - "device.tag-property-name": "Tagname", - "device.tag-property-register": "S'inscrire", + "device.tag-property-device": "Appareil", + "device.tag-property-name": "Nom du tag", + "device.tag-property-register": "Type de Registre", "device.tag-property-type": "Type", "device.tag-property-address": "Adresse (Ex. DB5.DBB3 DB4.DBX2.0 MB7)", "device.tag-property-address-sample": "Adresse", @@ -803,30 +991,85 @@ "device.tag-property-unit": "Unité", "device.tag-property-digits": "Décimale", "device.tag-property-initvalue": "Valeur d'initialisation", + "device.tag-property-description": "Description", + "device.tag-property-direction": "Direction", + "device.tag-property-edge": "Front", + "device.tag-property-gpio": "Numéro GPIO", + + "device.tag-array-id": "ID de tableau:", - "device.tag-array-value": "Évaluer:", - "device-tag-dialog-title": "Sélection de balises", - "device.tag-options-title": "Options de balises", + "device.tag-array-value": "Valeur:", + "device-tag-dialog-title": "Sélection du tag", + + "device.tag-options-title": "Options du tag", "device.tag-daq-enabled": "Enregistrement activé", - "device.tag-daq-changed": "Enregistrer la valeur si elle est modifiée", - "device.tag-daq-interval": "Enregistrer l'intervalle de valeur (sec.)", + "device.tag-daq-changed": "Enregistrer si modifiée", + "device.tag-daq-interval": "Intervalle d'enregistrement de la valeur (sec.)", + "device.tag-daq-restored": "À restaurer", + + "device.tag-format": "Format du nombre (2 = #.##)", + "device.tag-deadband": "Zone morte", + "device.tag-scale": "Mode mise à l'échelle / Conversion", + "device.tag-scale-mode-undefined": "Pas de mise à l'échelle", + "device.tag-scale-mode-undefined-tooltip": "Valeur du tag", + "device.tag-scale-mode-linear": "Linéraire: ΔS * (Valeur - RL) / ΔR + SL", + "device.tag-scale-mode-linear-tooltip": " ΔS = (Scaled High - Scaled Low)\nΔR = (Raw High - Raw Low)\nRL = Raw Low\nSL = Scaled Low", + "device.tag-scale-mode-script": "Script (Lecture/Écriture)", + "device.tag-raw-low": "Brut Bas", + "device.tag-raw-high": "Brut Haut", + "device.tag-scaled-low": "Échelle Bas", + "device.tag-scaled-high": "Échelle Haut", + "device.tag-convert-datetime": "Millisecondes au format Date et Heure", + "device.tag-convert-datetime-tooltip": "Exemple du format : 'YYYY-MM-DD HH:mm:ss' pour 2023-09-14 08:45:10", + "device.tag-convert-datetime-format": "Format date et heure (YYYY-MM-DD HH:mm:ss)", + "device.tag-convert-ticktime": "Millisecondes au format Heure (Restant ou Durée)", + "device.tag-convert-ticktime-tooltip": "Exemple du format : 'HH:mm:ss' pour 56:45:10", + "device.tag-convert-ticktime-format": "Format Heure (HH:mm:ss)", + "device.tag-scale-read-script": "Script de lecture de mise à l'échelle", + "device.tag-scale-read-script-tooltip": "Script pour transformer la valeur reçue du client", + "device.tag-scale-read-script-params": "Entrez les valeurs des paramètres du script de lecture", + "device.tag-scale-write-script": "Script d'écriture de mise à l'échelle", + "device.tag-scale-write-script-tooltip": "Script pour transformer la valeur avant de l'écrire dans le client", + "device.tag-scale-write-script-params": "Entrez les valeurs des paramètres du script d'écriture", + "device.tag-scale-script-params-tooltip": "Tableau de paramètres formaté en JSON avec les valeurs à passer au script", + + "device.edit-placeholder-titel": "Modifier la variable intermédiaire", + "device.connect-ok": "Connecté", "device.connect-error": "Erreur", "device.connect-failed": "Echec", "device.connect-off": "Eteint", "device.connect-busy": "Occupé", + "devices.mode-map": "Carte des appareils", "devices.mode-list": "Liste des appareils", "devices.list-name": "Nom", "devices.list-address": "Adresse", "devices.list-type": "Type", - "devices.list-polling": "Vote", + "devices.list-polling": "Freq. d'interrogation", "devices.list-enabled": "Activé", "devices.list-status": "Statut", + "users.list-title": "Paramètres des utilisateurs", "users.list-name": "Nom d'utilisateur", "users.list-fullname": "Nom et prénom", "users.list-groups": "Groupes", + "users.list-roles": "Rôles", + "users.list-start": "Vue de démarrage", + + "roles.list-title": "Paramètres des rôles", + "roles.list-index": "Index", + "roles.list-name": "Nom", + "roles.list-description": "Description", + + "user-role-edit-title": "Paramètres du rôle", + "user-role-edit-name": "Nom", + "user-role-edit-index": "Index", + "user-role-edit-description": "Description", + + "events-history.list-title": "Historique des événements", + "events-history.filter-daterange": "Filtre plage de dates", + "gauges.property-props": "Propriété", "gauges.property-events": "Événements", "gauges.property-title": "Propriété", @@ -838,84 +1081,120 @@ "gauges.property-event-type": "Type", "gauges.property-event-action": "Action", "gauges.property-event-destination": "Destination", + "gauges.property-event-destination-relative-from": "Relatif à", + "gauges.property-event-destination-panel": "Panneau", + "gauges.property-event-destination-hide-close": "Masquer Fermer", + "gauges.property-event-destination-target-device": "Appareil Cible", + "gauges.property-event-newtab": "Nouvel Onglet", + "gauges.property-event-single-card": "Carte Unique", "gauges.property-event-value": "Valeur", "gauges.property-event-function": "Fonction", "gauges.property-event-input": "Entrée (entrée uniquement avec le nom)", + "gauges.property-event-address-type": "Type", "gauges.property-event-address": "Lien", + "gauges.property-event-resource": "Ressource", "gauges.property-event-width": "Largeur", "gauges.property-event-height": "Hauteur", "gauges.property-event-scale": "Échelle", "gauges.property-event-script": "Scénario", "gauges.property-event-script-param-name": "Paramètre", "gauges.property-event-script-param-value": "Évaluer", - "gauges.property-head-device": "Dispositif", + "gauges.property-event-script-param-input-value": "laisser vide pour envoyer la valeur de l'entrée", + "gauges.property-head-device": "Appareil", "gauges.property-head-variable": "Variable", - "gauges.property-variable-value": "Évaluer", + "gauges.property-variable-value": "Valeur", "gauges.property-head-alarm": "Alarme", "gauges.property-head-color": "Couleur", "gauges.property-head-mapvariable": "Variable de contexte", "gauges.property-head-tomapvariable": "Définir la variable de contexte", - "gauges.property-head-todevice": "Dispositifs Variables", - "gauges.property-head-value": "Évaluer", + "gauges.property-head-todevice": "Appareils Variables", + "gauges.property-head-value": "Valeur", "gauges.property-input-min": "Min", "gauges.property-input-max": "Max", "gauges.property-input-color": "Remplir", - "gauges.property-input-stroke": "Accident vasculaire cérébral", - "gauges.property-input-value": "Évaluer", - "gauges.property-input-label": "Étiquette", + "gauges.property-input-stroke": "Contour", + "gauges.property-input-value": "Valeur", + "gauges.property-input-label": "Label", "gauges.property-input-unit": "Unité", + "gauges.property-input-type": "Type d'entrée", + "gauges.property-input-type-number": "Nombre", + "gauges.property-input-type-text": "Texte", + "gauges.property-input-type-date": "Date", + "gauges.property-input-type-time": "Heure", + "gauges.property-input-type-datetime": "Date et Heure", + "gauges.property-input-time-format": "Format de l'heure", + "gauges.property-input-time-format-normal": "HH:mm", + "gauges.property-input-time-format-seconds": "HH:mm:ss", + "gauges.property-input-time-format-milliseconds": "HH:mm:ss:fff", + "gauges.property-input-milliseconds": "Conversion en millisecondes", + "gauges.property-input-convertion": "Conversion", + "gauges.property-input-convertion-milliseconds": "Millisecondes", + "gauges.property-input-convertion-string": "Chaîne", + "gauges.property-update-enabled": "Activer la mise à jour", - "gauges.property-numeric-enabled": "Seul nombre", - "gauges.property-format-digits": "Chiffres de format", + "gauges.property-update-esc": "Mise à jour ESC", + "gauges.property-input-esc-action": "Action lors de la sortie", + "gauges.property-action-esc-update": "Mettre à jour (Actualiser)", + "gauges.property-action-esc-enter": "Confirmer (Entrée)", + "gauges.property-select-content-on-click": "Sélectionner le contenu au clic", + "gauges.property-numeric-enabled": "Nombre seulement", + "gauges.property-format-digits": "Format du nombre", "gauges.property-actions": "Actions", "gauges.property-action-type": "Type", "gauges.property-action-param": "ID d'action", "gauges.property-action-minAngle": "Angle min", "gauges.property-action-maxAngle": "Angle maximal", + "gauges.property-action-toX" : "À la position X", + "gauges.property-action-toY" : "À la position Y", + "gauges.property-action-duration" : "Durée", "gauges.property-events-mapping-from": "Variable de contexte", - "gauges.property-map-variable": "Ajouter une variable de contexte pour lier", + "gauges.property-map-variable": "Ajouter une variable de contexte pour la lier", "gauges.property-head-remove-mapvariable": "Retirez la liaison", "gauges.property-tooltip-add-event": "Ajouter un évènement", "gauges.property-interval-msec": "Intervalle (msec.)", - "gauges.property-tag-label": "Étiquette", - "gauges.property-tag-internal-title": "Définir une étiquette de périphérique interne", + "gauges.property-tag-label": "Tag", + "gauges.property-tag-internal-title": "Définir une variable intermédiaire (ou un tag de périphérique interne)", "gauges.property-input-range": "Plage d'entrée autorisée", + "gauges.property-language-text": "Texte ou @TextID", + "bag.property-ticks": "Tic", "bag.property-divisions": "Divisions", "bag.property-subdivisions": "Subdivisions", - "bag.property-divisions-length": "Longueur des divisions", - "bag.property-subdivisions-length": "Longueur de subdivisions", - "bag.property-divisions-width": "Largeur des divisions", - "bag.property-subdivisions-width": "Largeur des subdivisions", - "bag.property-divisions-color": "Divisions Couleur", - "bag.property-subdivisions-color": "Couleur des subdivisions", - "bag.property-divisionfont-size": "Divisions Taille de la police", - "bag.property-divisionfont-color": "Divisions Couleur de police", - "bag.property-divisions-labels": "Divisions étiquettes (Ex. 10; 20; ...)", + "bag.property-divisions-length": "Longueur divisions", + "bag.property-subdivisions-length": "Longueur subdivisions", + "bag.property-divisions-width": "Largeur divisions", + "bag.property-subdivisions-width": "Largeur subdivisions", + "bag.property-divisions-color": "Couleur divisions", + "bag.property-subdivisions-color": "Couleur subdivisions", + "bag.property-divisionfont-size": "Taille de la police subdivisions", + "bag.property-divisionfont-color": "Couleur de police subdivisions", + "bag.property-divisions-labels": "Label divisions (Ex. 10; 20; ...)", "bag.property-current-value": "Valeur actuelle", "bag.property-min": "Min", "bag.property-max": "Max", - "bag.property-bar-width": "Largeur du bar", - "bag.property-animation-speed": "La vitesse d'animation", + "bag.property-bar-width": "Largeur de la barre", + "bag.property-animation-speed": "Vitesse d'animation", "bag.property-angle": "Angle", "bag.property-radius": "Rayon", "bag.property-font": "Police de caractère", "bag.property-font-size": "Taille de police", - "bag.property-textfield-position": "Position de Textfield", + "bag.property-textfield-position": "Position de Champ de texte", "bag.property-pointer-length": "Longueur du pointeur", - "bag.property-pointer-stroke": "Coup de pointeur", + "bag.property-pointer-stroke": "Contour du pointeur", "bag.property-pointer-color": "Couleur du pointeur", - "bag.property-color-start": "Démarrer de la couleur", - "bag.property-color-stop": "Arrêt de couleur", + "bag.property-color-start": "Couleur de début", + "bag.property-color-stop": "Couleur de fin", "bag.property-background": "Arrière plan", - "bag.property-format-digits": "Chiffres de format", + "bag.property-format-digits": "Format du nombre", "bag.property-zones": "Zones", "bag.property-color": "Couleur", + "bag.property-fill": "Remplissage", + "alarms.list-title": "Paramètres d'alarmes", "alarms.list-name": "Nom", "alarms.list-device": "Appareil / variable", "alarms.list-highhigh": "Haut haut", - "alarms.list-high": "Haute", + "alarms.list-high": "Haut", "alarms.list-low": "Bas", "alarms.list-info": "Message", "alarms.list-actions": "Actions", @@ -923,62 +1202,71 @@ "alarm.property-name": "Nom", "alarm.property-permission": "Autorisation", "alarm.property-highhigh": "Haut haut", - "alarm.property-high": "Haute", + "alarm.property-high": "Haut", "alarm.property-low": "Bas", "alarm.property-info": "Message", "alarm.property-action": "Actions", "alarm.property-enabled": "Activé", + "alarm.property-save-event": "Événements", "alarm.property-min": "Min", "alarm.property-max": "Max", "alarm.property-timedelay": "Retard (secondes)", - "alarm.property-checkdelay": "Vérifiez Interall (secondes)", + "alarm.property-checkdelay": "Intervall de vérification (secondes)", "alarm.property-type": "Type", - "alarm.property-ackmode": "Mode ACK", + "alarm.property-ackmode": "Mode d'acquittement", "alarm.property-text": "Texte", "alarm.property-group": "Groupe", "alarm.ack-float": "Flottante", - "alarm.ack-active": "ACK par alarme active autorisée", - "alarm.ack-passive": "Ack uniquement par alarme passive", + "alarm.ack-active": "Ack par alarme active autorisée", + "alarm.ack-passive": "Ack uniquement si alarme passive", "alarms.view-title": "Alarmes", - "alarms.history-title": "Alarmes d'historique", + "alarms.history-title": "Historique d'alarmes", "alarms.view-ontime": "Date / heure", "alarms.view-text": "Texte", "alarms.view-group": "Groupe", "alarms.view-status": "Statut", "alarms.view-type": "Priorité", - "alarms.view-offtime": "Date / heure de sortie", - "alarms.view-acktime": "ACK Date / Heure", - "alarms.view-userack": "Utilisateur ACK", + "alarms.view-offtime": "Date / heure de fin", + "alarms.view-acktime": "Acquittement Date / Heure", + "alarms.view-userack": "Acquittement par", + "alarms.view-ack": "Acquitter", + "alarms.view-ack-all-alarms": "Acquitter toutes les Alarmes", "alarm.status-active": "Active", "alarm.status-passive": "Passive", - "alarm.status-active-ack": "Actif", + "alarm.status-active-ack": "Active (Acquittée)", "alarms.show-current": "Alarmes", - "alarms.show-history": "Alarmes d'historique", + "alarms.show-history": "Historique d'alarmes", "alarm.action-popup": "Montrer la popup", - "alarm.action-onsetview": "Voir la vue", + "alarm.action-onsetview": "Définir la vue", "alarm.action-onsetvalue": "Valeur définie", + "alarm.action-onRunScript": "Exécuter le script", + "alarm.action-toastMessage": "Afficher le message", "alarm.action-sendMsg": "Envoyer le message", "alarm.property-action-type": "Type d'action", - "alarm.property-action-value": "Valeur à régler", - "alarm.property-action-destination": "Voir à montrer", + "alarm.property-action-value": "Valeur à définir", + "alarm.property-action-destination": "Vue à montrer", + "alarm.property-action-toastMessage": "Message à afficher", + "alarm.property-action-toastType": "Type", + "notifications.list-title": "Paramètres de notifications", "notifications.list-name": "Nom", "notifications.list-receiver": "Récepteurs", - "notifications.list-delay": "Retard", + "notifications.list-delay": "Délai", "notifications.list-interval": "Intervalle", "notifications.list-type": "Type", "notifications.list-enabled": "Activé", "notifications.list-subscriptions": "Abonnements", "notification.property-title": "Notification", "notification.property-name": "Nom", - "notification.property-receiver": "Récepteurs (adresse courante ';')", + "notification.property-receiver": "Récepteurs: Adresse (Mail) ';' / WebApi (Telegram https://api.telegram.org/bot...${content})", "notification.property-type": "Type", - "notification.property-delay": "Retard (min.)", + "notification.property-delay": "Délai (min.)", "notification.property-interval": "Intervalle (min.)", - "notification.property-enabled": "Lancée", + "notification.property-enabled": "Activé", "notification.property-priority": "Priorité", "notification.type-alarm": "Alarmes", - "notification.type-trigger": "Gâchette", + "notification.type-trigger": "Déclencheur", + "scripts.list-title": "Paramètres des scripts", "scripts.list-name": "Nom", "scripts.list-type": "Type", @@ -986,44 +1274,130 @@ "scripts.list-params": "Paramètres", "scripts.list-scheduling": "Planification / intervalle", "scripts.list-permission": "Autorisation", - "scripts.list-options": "Options de script", + "scripts.list-options": "Options du script", + "script.permission-title": "Autorisation", - "script.permission-label": "(void = plein pour tout le monde)", + "script.permission-label": "(void = Libre pour tout le monde)", "script.permission-enabled": "Activé", + + "script.create-title": "Créer un script", + "script.mode": "Exécuter le mode", "script.mode-title": "Exécuter le mode", - "script.mode-label": "(Par défaut: serveur)", - "script.property-title": "Scénario", + "script.mode-label": "Exécuter le mode", + "script.mode-CLIENT": "Client (Exécuter dans le navigateur)", + "script.mode-SERVER": "Serveur (Exécuter sur le serveur)", + + "script.property-title": "Script", "script.property-systems": "Fonctions du système", + "script.property-templates": "Modeles", "script.property-test": "Test", "script.property-test-params": "Paramètres de fonction", "script.property-test-console": "Console", - "script.property-test-tag": "Set balise", + "script.property-test-tag": "Définir le tag", "script.property-test-run": "Test d'exécution", "script.property-editname": "Modifier le nom du script", - "script.property-addfnc-param": "Ajouter le paramètre de script", - "script.param-title": "Paramètre de script", + "script.property-name": "Nom", + "script.property-addfnc-param": "Ajouter un paramètre au script", + "script.property-async-function": "Fonction asynchrone", + "script.param-title": "Paramètre du script", "script.param-name": "Nom", "script.param-type": "Type", "script.paramtype": "-", - "script.paramtype-tagid": "Étiquette", - "script.paramtype-value": "Valeur (nombre ou chaîne)", + "script.paramtype-tagid": "ID du tag", + "script.paramtype-value": "Valeur (nombre/chaîne/objet)", + "script.paramtype-chart": "Lignes de tableau (array)", "script.param-name-exist": "Le nom du paramètre existe déjà!", - "script.sys-fnc-settag-text": "$ Settag (tagid, valeur)", - "script.sys-fnc-settag-tooltip": "Fonction système pour définir la valeur de la balise: $ settag (tagid comme chaîne, valeur en tant que chaîne ou numéro)", - "script.sys-fnc-gettag-text": "$ gettag (tagid)", - "script.sys-fnc-gettag-tooltip": "Fonction système pour obtenir la valeur de balise: $ getTag (tagid as String) Retour Valeur en tant que chaîne ou numéro", + "script.sys-fnc-settag-text": "$setTag (TagID, valeur)", + "script.sys-fnc-settag-tooltip": "Fonction système pour définir la valeur du Tag: $setTag (TagID comme chaîne, valeur en tant que chaîne ou nombre)", + "script.sys-fnc-gettag-text": "$getTag (TagID)", + "script.sys-fnc-gettag-tooltip": "Fonction système pour obtenir la valeur du Tag: $getTag (TagID as String) Retour Valeur en tant que chaîne ou numéro", "script.scheduling-title": "Planification de script", - "script.scheduling-interval": "Intervalle en secondes", - "script.sys-fnc-setview-text": "$ setView (nom de vue)", - "script.sys-fnc-setview-tooltip": "Fonction système à définir la vue sur le client: $ setView (nom de vue en tant que chaîne)", - "reports.list-title": "Rapports Paramètres", + "script.scheduling-type": "Type", + "script.scheduling-interval": "Intervalle de la boucle", + "script.scheduling-start": "Seulement au démarrage", + "script.scheduling-add-item": "Ajouter un planificateur", + "script.scheduling-scheduling": "Planification", + "script.scheduling-weekly": "Hebdomadaire", + "script.scheduling-date": "Date", + "script.scheduling-time": "Heure", + "script.scheduling-hour": "Heure", + "script.scheduling-minute": "Minute", + "script.interval": "Intervalle (secondes)", + "script.delay": "Délai (secondes)", + "script.sys-fnc-setview-text": "$setView (nom de vue)", + "script.sys-fnc-setview-tooltip": "Fonction système pour définir la vue sur le client: $setView (nom de vue en tant que chaîne)", + "script.sys-fnc-setview-params": "'Nom de la vue'", + "script.sys-fnc-opencard-text": "$openCard (Nom de la vue)", + "script.sys-fnc-opencard-tooltip": "Fonction système pour ouvrir la carte sur le client: $openCard (nom de vue en tant que chaîne, Options en tant que dict {gauche, haut})", + "script.sys-fnc-opencard-params": "'Nom de la vue'", + "script.sys-fnc-enableDevice-text": "$enableDevice (Nom de l'appareil, activer True/False)", + "script.sys-fnc-enableDevice-tooltip": "Fonction système pour activer la connexion de l'appareil: $enableDevice (nom de l'appareil en tant que chaîne, activer en tant que booléen)", + "script.sys-fnc-enableDevice-params": "'Nom de l'appareil', true", + "script.sys-fnc-getDevice-text": "$getDevice (Nom de l'appareil, interface True/False)", + "script.sys-fnc-getDevice-tooltip": "Fonction système pour obtenir l'objet appareil: $getDevice (Nom de l'appareil en tant que chaîne, obtenir l'interface de communication en tant que booléen)", + "script.sys-fnc-getDevice-params": "'Nom de l'appareil', true", + "script.sys-fnc-setAdapterToDevice-text": "$setAdapterToDevice(Nom de l'adaptateur, Nom de l'appareil)", + "script.sys-fnc-setAdapterToDevice-tooltip": "Fonction système pour lier l'adaptateur (appareil interne) à un appareil: $setAdapterToDevice (Nom de l'adaptateur en tant que chaîne, Nom de l'appareil en tant que chaîne)", + "script.sys-fnc-setAdapterToDevice-params": "'Nom de l'adaptateur', 'Nom de l'appareil'", + "script.sys-fnc-resolveAdapterTagId-text": "$resolveAdapterTagId(TagID)", + "script.sys-fnc-resolveAdapterTagId-tooltip": "Fonction système pour obtenir l'ID de tag de l'appareil lié à l'adaptateur (appareil interne): $resolveAdapterTagId (TagID en tant que chaîne)", + "script.sys-fnc-resolveAdapterTagId-params": "'TagID de l'adaptateur'", + "script.sys-fnc-getTagId-text": "$getTagId (Nom du Tag, [Nom de l'appareil])", + "script.sys-fnc-getTagId-tooltip": "Fonction système pour obtenir l'ID de tag: $getTagId (Nom du Tag en tant que chaîne, [Nom de l'appareil en tant que chaîne facultative])", + "script.sys-fnc-getTagId-params": "'Nom du Tag', ", + "script.sys-fnc-getTagDaqSettings-text": "$getTagDaqSettings (TagID)", + "script.sys-fnc-getTagDaqSettings-tooltip": "Fonction système pour obtenir les paramètres DAQ de la balise: $getTagDaqSettings (TagID en tant que chaîne)", + "script.sys-fnc-getTagDaqSettings-params": "'TagID'", + "script.sys-fnc-setTagDaqSettings-text": "$setTagDaqSettings (TagID, DaqSettings)", + "script.sys-fnc-setTagDaqSettings-tooltip": "Fonction système pour définir les paramètres DAQ de la balise: $setTagDaqSettings (TagID en tant que chaîne, DaqSettings en tant qu'objet {restauré: booléen, activé: booléen, changé: booléen, intervalle: nombre, dernierDaqSauvegardé: nombre} )", + "script.sys-fnc-setTagDaqSettings-params": "'TagID', 'DaqSettings'", + "script.sys-fnc-invokeObject-text": "$invokeObject (Nom de l'objet, Nom de la fonction, [Paramètre])", + "script.sys-fnc-invokeObject-tooltip": "Fonction système pour appeler la fonction d'objet: $invokeObject (Nom de l'objet en tant que chaîne, Nom de la fonction en tant que chaîne, [paramètre])", + "script.sys-fnc-invokeObject-params": "'Nom de l'objet', 'Nom de la fonction', ", + "script.sys-fnc-runServerScript-text": "$runServerScript (Nom du script, [Paramètre])", + "script.sys-fnc-runServerScript-tooltip": "Fonction client pour appeler la fonction de script serveur: $runServerScript (Nom du script en tant que chaîne, [paramètre])", + "script.sys-fnc-runServerScript-params": "'Nom du script serveur', ", + "script.sys-fnc-getDeviceProperty-text": "$getDeviceProperty(Nom de l'appareil)", + "script.sys-fnc-getDeviceProperty-tooltip": "Fonction système pour obtenir la propriété de l'appareil: $getDeviceProperty(Nom de l'appareil en tant que chaîne)", + "script.sys-fnc-getDeviceProperty-params": "'Nom de l'appareil'", + "script.sys-fnc-setDeviceProperty-text": "$setDeviceProperty(Nom de l'appareil, propriété)", + "script.sys-fnc-setDeviceProperty-tooltip": "Fonction système pour définir la propriété de l'appareil: $setDeviceProperty(Nom de l'appareil en tant que chaîne, Propriété en tant qu'objet {adresse, port, ...} )", + "script.sys-fnc-setDeviceProperty-params": "'Nom de l'appareil', 'Propriété'", + "script.sys-fnc-getHistoricalTag-text": "$getHistoricalTags(TagIds array, De msec., à msec.)", + "script.sys-fnc-getHistoricalTag-tooltip":"Obtenir les tags d'historiques par plage de millisecondes: $getHistoricalTags([TagIds] en tant que tableau, à partir en tant que nombre, jusqu'à en tant que nombre)", + "script.sys-fnc-getHistoricalTag-params":"'Tag Ids array', 'De msec.', 'à msec.'", + "script.sys-fnc-sendMessage-text": "$sendMessage(adresse, sujet, message)", + "script.sys-fnc-sendMessage-tooltip": "Fonction système pour envoyer un message (Mail): $sendMessage(adresse en tant que chaîne, sujet en tant que chaîne, message en tant que chaîne)", + "script.sys-fnc-sendMessage-params": "'adresse', 'sujet', 'message'", + "script.sys-fnc-getAlarms-text": "$getAlarms()", + "script.sys-fnc-getAlarms-tooltip": "Fonction système pour obtenir la liste des alarmes (): $getAlarms()", + "script.sys-fnc-getAlarms-params": "", + "script.sys-fnc-getAlarmsHistory-text": "$getAlarmsHistory(de msec., à msec.)", + "script.sys-fnc-getAlarmsHistory-tooltip": "Fonction système pour obtenir la liste de l'historique de l'alarme (): $getAlarmsHistory(à partir en tant que nombre, jusqu'à en tant que nombre)", + "script.sys-fnc-getAlarmsHistory-params": "'De msec.', 'À msec.'", + "script.sys-fnc-ackAlarms-text": "$ackAlarm(Nom de l'alarme, types)", + "script.sys-fnc-ackAlarms-tooltip": "Fonction système pour acquitter l'alarme (): $ackAlarm(Nom de l'alarme en tant que chaîne, [types] 'highhigh|high|low')", + "script.sys-fnc-ackAlarms-params": "'Nom de l'alarme', 'types'", + + "script.template-chart-data-text": "Données de graphique personnalisées", + "script.template-chart-data-tooltip": "Modèle de code des données de graphique personnalisées à retourner", + "script.template-invoke-chart-update-options-text": "Mettre à jour les options de graphique", + "script.template-invoke-chart-update-options-tooltip": "Modèle de code pour mettre à jour les options de graphique (plage d'échelle de l'axe Y). Mode CLIENT uniquement !", + "script.template-getHistoricalTagsoptions-text": "Obtenir les valeurs des tags historiques", + "script.template-getHistoricalTagsoptions-tooltip": "Modèle de code pour obtenir les valeurs des tags historiques.", + + "client.script-access-title": "Accès des scripts client", + "client.script-access-info": "Configurer l'accès aux fonctions système depuis le frontend (par exemple, les widgets) via window.fuxaScriptAPI.", + + "reports.list-title": "Paramètres des rapports", "reports.list-name": "Nom", "reports.list-type": "Type", "reports.list-receiver": "Destinataire", "reports.list-scheduling": "Planification / intervalle", "reports.list-enabled": "Activé", - "report.property-title": "Signaler", + + "report.property-title": "Rapport", "report.property-name": "Nom", "report.property-receiver": "Email des récepteurs", "report.property-scheduling-type": "Planification des rapports", @@ -1034,30 +1408,31 @@ "report.property-page-ori-landscape": "paysage", "report.property-page-ori-portrait": "portrait", "report.property-margin-left": "Marge à gauche", - "report.property-margin-top": "Top à marge", + "report.property-margin-top": "Marge en haut", "report.property-margin-right": "Marge à droite", - "report.property-margin-bottom": "Marge Bottom", + "report.property-margin-bottom": "Marge en bas", "report.scheduling-none": "Désactivé", "report.scheduling-day": "Tous les jours", "report.scheduling-week": "Toutes les semaines", "report.scheduling-month": "Chaque mois", "report.content-addtext": "Ajouter du texte", - "report.content-addtable": "Ajouter le tableau des balises", + "report.content-addtable": "Ajouter un tableau de tags", "report.content-addalarms": "Ajouter l'historique des alarmes", "report.content-addchart": "Ajouter un graphique", "report.content-type-text": "Texte", - "report.content-type-tagstable": "TABLEAU DE TAGS", + "report.content-type-tagstable": "Tableau de tags", "report.content-type-alarmshistory": "Historique des alarmes", "report.content-type-chart": "Graphique", "report.content-fontsizeitem": "Taille de police", "report.content-alignitem": "Alignement du texte", "report.content-edit": "Éditer", "report.content-delete": "Effacer", - "report.item-text-title": "Signaler un texte", + "report.item-text-title": "Texte du rapport", "report.item-text-label": "Texte", - "report.tags-table-title": "Tableau des balises de rapport", - "report.tags-table-column": "TAGNES COLONNES TAGNES", - "report.tags-table-add": "Ajouter une étiquette", + "report.tags-table-title": "Tableau des tags du rapport", + "report.tags-table-column": "Colonnes de tags", + "report.tags-table-add": "Ajouter un tag", + "report.tags-table-setlabel": "Définir le label", "report.table-alignitem": "Aligner", "report.table-delitem": "Supprimer la colonne", "report.item-daterange": "Plage de données", @@ -1066,120 +1441,197 @@ "report.item-daterange-week": "La semaine dernière (lundi-dimanche)", "report.item-daterange-month": "Le mois dernier", "report.item-interval": "Intervalle (période)", - "report.item-interval-hour": "Heure", - "report.item-interval-day": "Jour", + "report.item-interval-min5": "5 minutes", + "report.item-interval-min10": "10 minutes", + "report.item-interval-min30": "30 minutes", + "report.item-interval-hour": "1 heure", + "report.item-interval-day": "1 jour", "report.item-function-type": "Type de fonction", "report.item-function-min": "Min", "report.item-function-max": "Max", "report.item-function-average": "Moyenne", "report.item-function-sum": "Somme", - "report.item-alarms-title": "Signaler les alarmes", + "report.item-alarms-title": "Rapport d'alarmes", "report.alarms-priority": "Priorité des alarmes", "report.alarms-column": "Colonnes d'alarme", + "report.alarms-filter": "Filtre d'alarmes", "report.chart-title": "Graphique de rapport", "report.chart-name": "Nom du graphique", "report.chart-width": "Largeur", "report.chart-height": "Hauteur", + + "maps.locations-list-title": "Paramètres de localisation", + "maps.locations-list-name": "Nom", + "maps.locations-list-view": "Vue", + "maps.locations-list-description": "Description", + "maps.location-property-title": "Emplacement", + "maps.location-property-name": "Nom", + "maps.location-property-description": "Description", + "maps.location-property-latitude": "Latitude", + "maps.location-property-longitude": "Longitude", + "maps.location-property-card": "Carte", + "maps.location-property-view": "Vue", + "maps.location-property-url": "URL", + "maps.edit-add-location": "Ajouter un emplacement", + "maps.edit-import-location": "Importer un emplacement", + "maps.edit-edit-location": "Modifier un emplacement", + "maps.edit-remove-location": "Supprimer un emplacement", + "maps.edit-start-location": "Définir comme emplacement de départ", + "maps.edit-start-location-saved": "Emplacement de départ enregistré", + "maps.close-popups": "Fermer tous les popups", + "maps.location-to-import": "Emplacement à importer", + "maps.location-to-import-input-title": "Sélectionner l'emplacement à importer", + "logs.view-title": "Journaux système", "logs.view-files": "Fichiers de journaux", + "events.view-ontime": "Date / heure", "events.view-type": "Type", - "events.view-source": "La source", + "events.view-source": "Source", "events.view-text": "Texte", + "card.config-title": "Paramètres de carte", "card.config-content-type": "Type de contenu", - "card.config-content-view": "Vue de contenu", - "card.config-content-iframe": "Adresse de liaison", + "card.config-content-view": "Vue du contenu", + "card.config-content-iframe": "Adresse du lien", "card.widget-view": "Voir", "card.widget-alarms": "Alarmes", "card.widget-table": "Table", "card.widget-iframe": "Lien", "card.style-zoom": "Zoom", + + "resources.lib-icons": "Icônes", "resources.lib-images": "Images", - "texts.list-title": "Paramètres de textes", + "resource.list-title": "Liste des ressources", + "resource.list-name": "Nom du fichier", + "resource.list-type": "Type de fichier", + "resource.list-title-fonts": "Liste des polices", + "resources.lib-widgets": "Widgets", + + "widgets.kiosk-title": "Kiosque des widgets", + "widget.remove": "Supprimer le widget", + + "texts.list-title": "Paramètres des langues", "texts.list-filter": "Filtre", "texts.list-filter-group": "Groupe", - "texts.list-id": "IDENTIFIANT", + "texts.list-id": "ID", "texts.list-group": "Groupe", - "texts.list-value": "Texte", - + "texts.list-value": "Texte (Par défaut)", + "texts.list-add-text": "Ajouter un texte", + "texts.list-edit-language": "Modifier la langue", + "language.settings-title": "Paramètres de langue", + "language.settings-add-tooltip": "Ajouter une langue", + "language.settings-id": "Clé", + "language.settings-default-id": "Clé (par défaut)", + "language.settings-id-placeholder": "ex: EN", + "language.settings-name": "Nom", + "language.settings-default-name": "Nom (par défaut)", + "language.settings-name-placeholder": "ex: Anglais", "text.settings-title": "Texte", - "text.settings-id": "IDENTIFIANT", + "text.settings-id": "Nom (Lettres et chiffres autorisés, pas d'espaces)", "text.settings-group": "Groupe", - "text.settings-value": "Texte", + "text.settings-value": "Texte (Par défaut)", "gui.range-number-min": "Min", "gui.range-number-max": "Max", - "gui.range-number-boolean": "Valeur de masque", + "gui.range-number-boolean": "Valeur du masque", "gui.range-number-true": "Vrai [1-1]", "gui.range-number-false": "Faux [0-0]", - "gui.range-number-switcher": "Gamme comme nombre ou booléen", - "dlg.bitmask-title": "Massacre", + "gui.range-number-switcher": "Plage comme nombre ou booléen", + + "dlg.bitmask-title": "Masque de bits", - "dlg.plugins-title": "Plugins", + "dlg.plugins-title": "Plugins du serveur", + "dlg.plugins-info": "Les plugins non installés peuvent être installés manuellement sur le serveur : 'npm install [nom du package]@[version]'", + "dlg.plugins-type": "Type", "dlg.plugins-name": "Nom", "dlg.plugins-version": "Version", "dlg.plugins-current": "Installée", + "dlg.plugins-description": "Description", "dlg.plugins-status-installing": "Installation ...", - "dlg.plugins-status-removing": "Supprimer ...", + "dlg.plugins-status-removing": "Suppression ...", "dlg.plugins-status-installed": "Installation ... OK!", "dlg.plugins-status-removed": "Suppression ... OK!", "dlg.plugins-status-error": "Erreur! Essayez manuellement!", - "dlg.setup-title": "Installer", + + "dlg.setup-title": "Installation", "dlg.setup-gui": "Interface utilisateur", - "dlg.setup-diverse": "Mission", + "dlg.setup-diverse": "Divers", "dlg.setup-logic": "Logique", "dlg.setup-system": "Système", "dlg.setup-views": "Vues", "dlg.setup-connections": "Connexions", - "dlg.setup-users": "Utilisatrices", + "dlg.setup-users": "Utilisateurs", + "dlg.setup-user-roles": "Rôles", "dlg.setup-alarms": "Alarmes", "dlg.setup-line-charts": "Graphiques de ligne", "dlg.setup-bar-charts": "Diagramme à barres", + "dlg.setup-maps-locations": "Emplacements", "dlg.setup-layout": "Disposition", "dlg.setup-plugins": "Plugins", "dlg.setup-scripts": "Scripts", "dlg.setup-reports": "Rapports", "dlg.setup-settings": "Réglages", - "dlg.setup-logs": "Bûches", + "dlg.setup-client-access": "Scripts Frontend", + "dlg.setup-logs": "Journaux", "dlg.setup-notifications": "Notifications", + "dlg.setup-events": "Événements", + "dlg.setup-resources": "Ressources", + "dlg.setup-fonts": "Polices", + "dlg.setup-language": "Langue", "dlg.app-settings-title": "Réglages", "dlg.app-settings-system": "Système", - "dlg.app-settings-smtp": "Smtp", - "dlg.app-settings-smtp-host": "Hôtesse", + "dlg.app-settings-smtp": "SMTP", + "dlg.app-settings-smtp-host": "Hôte SMTP", "dlg.app-settings-smtp-port": "Port", "dlg.app-settings-smtp-mailsender": "Expéditeur de courrier", - "dlg.app-settings-smtp-user": "Utilisateur / apikey", + "dlg.app-settings-smtp-user": "Utilisateur / Clef API", "dlg.app-settings-smtp-password": "Mot de passe", - "dlg.app-settings-smtp-testaddress": "Email pour envoyer un message de test", + "dlg.app-settings-smtp-testaddress": "Envoyer un email de test", "dlg.app-settings-smtp-test": "Test", "dlg.app-settings-language": "Langue", - "dlg.app-language-en": "Anglaise", - "dlg.app-language-ru": "russe", - "dlg.app-language-ua": "Ukrainienne", - "dlg.app-language-zh-cn": "Chinoise", + "dlg.app-language-de": "Allemand", + "dlg.app-language-en": "Anglais", + "dlg.app-language-ru": "Russe", + "dlg.app-language-ua": "Ukrainien", + "dlg.app-language-zh-cn": "Chinois", "dlg.app-language-pt": "Portugais", - "dlg.app-language-tr": "Turque", - "dlg.app-language-ko": "Coréenne", - "dlg.app-language-es": "Espagnole", + "dlg.app-language-sv": "Suédois", + "dlg.app-language-tr": "Turc", + "dlg.app-language-ko": "Coréen", + "dlg.app-language-es": "Espagnol", "dlg.app-language-fr": "Français", "dlg.app-settings-server-port": "Le serveur écoute sur le port", + "dlg.app-settings-server-log-full": "Mode journal complet", + "dlg.app-settings-alarms": "Alarmes", "dlg.app-settings-alarms-clear": "Effacer toutes les alarmes et l'historique", "dlg.app-settings-auth-token": "Authentification avec un jeton", + "dlg.app-settings-auth-only-editor": "Uniquement pour l'éditeur", "dlg.app-auth-disabled": "Désactivé", - "dlg.app-auth-expiration-15m": "Activé avec l'expiration des jetons en 15 min.", - "dlg.app-auth-expiration-1h": "Activé avec l'expiration des jetons en 1 heure.", - "dlg.app-auth-expiration-3h": "Activé avec l'expiration des jetons en 3 heures.", - "dlg.app-auth-expiration-1d": "Activé avec l'expiration des jetons en 1 jour.", - "dlg.app-auth-tooltip": "Par activé, vous disposez d'un compte administrateur «Admin / 123456». N'oubliez pas de le changer", + "dlg.app-auth-expiration-15m": "Activé avec l'expiration des jetons dans 15 min.", + "dlg.app-auth-expiration-1h": "Activé avec l'expiration des jetons dans 1 heure.", + "dlg.app-auth-expiration-3h": "Activé avec l'expiration des jetons dans 3 heures.", + "dlg.app-auth-expiration-1d": "Activé avec l'expiration des jetons dans 1 jour.", + "dlg.app-auth-tooltip": "Activé : vous disposez d'un compte administrateur «Admin / 123456». (N'oubliez pas de le changer). Redémarrage serveur requis !", + "dlg.app-settings-client-broadcast": "Diffuser vers le client (frontend) toutes les valeurs des tags", + "dlg.app-settings-daqstore": "Stockage DAQ", "dlg.app-settings-daqstore-type": "Type de base de données", "dlg.app-settings-daqstore-url": "URL", "dlg.app-settings-daqstore-token": "Jeton", "dlg.app-settings-daqstore-bucket": "Seau", - "dlg.app-settings-daqstore-organization": "Organisme", + "dlg.app-settings-daqstore-organization": "Organisation", "dlg.app-settings-daqstore-retention": "Rétention", - "store.retention-day1": "Un jour", + "dlg.app-settings-daqstore-database": "Nom de la base de données", + "dlg.app-settings-daqstore-username": "Nom d'utilisateur", + "dlg.app-settings-daqstore-password": "Mot de passe", + + "dlg.app-settings-user-group-label": "Type d'autorisation", + "dlg.app-settings-user-group": "Groupes (par défaut)", + "dlg.app-settings-user-roles": "Rôles", + + "store.retention-none": "Désactivé", + "store.retention-day1": "1 jour", "store.retention-days2": "2 jours", "store.retention-days3": "3 jours", "store.retention-days7": "7 jours", @@ -1187,44 +1639,79 @@ "store.retention-days30": "30 jours", "store.retention-days90": "90 jours", "store.retention-year1": "1 an", + "store.retention-year3": "3 ans", + "store.retention-year5": "5 ans", + + "plugin.group-connection-device": "Appareil de connexion", + "plugin.group-connection-database": "Base de données de connexion", + "plugin.group-chart-report": "Image du graphique pour le rapport", + + "action-settings-title": "Paramètres des actions", + "action-settings-readonly-tag": "Tag", + "action-settings-readonly-values": "Valeurs", + + "msg.alarm-ack-all": "Souhaitez-vous acquitter toutes les alarmes ?", "msg.alarm-remove": "Souhaitez-vous supprimer l'alarme", "msg.text-remove": "Souhaitez-vous supprimer du texte", "msg.alarmproperty-error-exist": "Le nom d'alarme existe!", "msg.alarmproperty-missing-value": "Certaines valeurs manquent!", - "msg.textproperty-error-exist": "Text-id existe!", + "msg.textproperty-error-exist": "Texte-id existe!", "msg.textproperty-missing-value": "Certaines valeurs manquent!", "msg.device-remove": "Souhaitez-vous supprimer l'appareil", - "msg.device-tag-remove": "Souhaitez-vous supprimer la balise", - "msg.device-tag-exist": "Le nom de balise existe!", + "msg.device-tag-remove": "Souhaitez-vous supprimer le tag", + "msg.device-tag-exist": "Le nom du tag existe!", + "msg.device-tag-invalid-char": "Le caractère '@' n'est pas autorisé dans les noms de tag!", "msg.notification-property-missing-value": "Certaines valeurs manquent!", "msg.report-property-missing-value": "Il y a des valeurs incorrectes ou manquantes!", + "msg.file-upload-failed": "Échec de l'upload!", + "msg.file-delete-failed": "Échec de la suppression du fichier!", + "msg.home-welcome": "Attendez ... Allez dans l'éditeur, mappez les appareils, concevez votre visualisation et liez les variables d'appareils", + "msg.server-connection-failed": "ECHEC DE LA CONNEXION AU SERVEUR !", "msg.project-load-error": "Impossible de lire '{{value}}'", - "msg.project": "Vous souhaitez enregistrer le changement de projet?", - "msg.tags-remove-all": "Souhaitez-vous supprimer toutes les balises?", - "msg.view-remove": "Souhaitez-vous supprimer la vue '{{value}}'?", - "msg.chart-remove": "Souhaitez-vous supprimer le graphique '{{value}}'?", - "msg.graph-remove": "Souhaitez-vous supprimer le graphique à barres '{{value}}'?", - "msg.script-remove": "Souhaitez-vous supprimer le script '{{value}}'?", - "msg.report-remove": "Souhaitez-vous supprimer le rapport", - "msg.device-connection-error": "Erreur de connexion '{{value}}'!", - "msg.server-connection-error": "La connexion du serveur a échoué!", - "msg.sendmail-success": "Mail Envoyer un succès!", - "msg.sendmail-error": "Envoi du courrier a échoué!", - "msg.users-save-error": "Échec de l'enregistrement de l'utilisateur!", + "msg.project": "Vous souhaitez enregistrer le changement du projet ?", + "msg.tags-remove-all": "Souhaitez-vous supprimer toutes les tags ?", + "msg.view-remove": "Souhaitez-vous supprimer la vue '{{value}}' ?", + "msg.chart-remove": "Souhaitez-vous supprimer le graphique '{{value}}' ?", + "msg.role-remove": "Souhaitez-vous supprimer le rôle '{{value}}' ?", + "msg.graph-remove": "Souhaitez-vous supprimer le graphique en barres '{{value}}' ?", + "msg.script-remove": "Souhaitez-vous supprimer le script '{{value}}' ?", + "msg.report-remove": "Souhaitez-vous supprimer le rapport ?", + "msg.device-connection-error": "Erreur de connexion à l'appareil '{{value}}' !", + "msg.server-connection-error": "La connexion du serveur a échoué !", + "msg.sendmail-success": "Mail envoyé avec succès !", + "msg.sendmail-error": "Envoi du courrier a échoué !", + "msg.users-save-error": "Échec de l'enregistrement de l'utilisateur !", "msg.user-remove": "Souhaitez-vous supprimer l'utilisateur", - "msg.project-save-success": "Project Sauver réussi!", - "msg.project-save-error": "Le projet SAVE a échoué!", - "msg.project-format-error": "Projeter le mauvais format!", - "msg.project-save-unauthorized": "Le projet SAVE a échoué! Non autorisé!", + "msg.project-save-success": "Sauvegarde du projet réussie !", + "msg.project-save-error": "Sauvegarde du projet a échoué !", + "msg.project-format-error": "Mauvais format du projet !", + "msg.view-format-error": "Mauvais format de la vue !", + "msg.project-save-unauthorized": "La sauvegarde du projet a échoué ! Non autorisé !", "msg.project-save-ask": "Vous voulez quitter le projet?", "msg.login-username-required": "Entrez un nom d'utilisateur", "msg.login-password-required": "Entrer un mot de passe", - "msg.signin-failed": "Non autorisé", - "msg.get-project-void": "Projet introuvable!", - "msg.editor-mode-locked": "L'éditeur est déjà ouvert!", - "msg.alarms-clear-success": "Toutes les alarmes ont été annulées!", - "msg.import-devices-error": "Les appareils d'importation ont échoué!", - "msg.report-build-forced": "Envoyer pour construire le rapport réussi", - "msg.report-build-error": "Envoyer un rapport de construction échoué!" + "msg.signin-failed": "Nom d'utilisateur ou mot de passe incorrect !", + "msg.signin-unauthorized": "Non autorisé !", + "msg.get-project-void": "Projet introuvable !", + "msg.editor-mode-locked": "L'éditeur est déjà ouvert !", + "msg.alarms-clear-success": "Toutes les alarmes ont été annulées !", + "msg.import-devices-error": "L'importation des appareils a échoué !", + "msg.report-build-forced": "L'envoi pour construire le rapport réussi !", + "msg.report-build-error": "L'envoi pour construire le rapport a échoué !", + "msg.device-tags-request-result": "Chargement {{value}} sur {{current}}", + "msg.chart-with-script": "Le script défini reçoit la liste des lignes de graphique en tant que paramètre, puis renvoie la liste complète avec les données. Exemple de code dans le script 'Templates'", + "msg.script-name-exist": "Le nom du script existe déjà !", + "msg.invalid-script-name": "Nom de script invalide !", + "msg.templates-exist-ask-overwrite": "Le modèle avec le nom '{{value}}' existe déjà. Voulez-vous le remplacer ?", + "msg.templates-save-success": "Sauvegarde du modèle réussie !", + "msg.view-name-exist": "Le nom de la vue existe déjà !", + "msg.notification-name-exist": "Le nom de la notification existe déjà !", + "msg.file-remove": "Souhaitez-vous supprimer '{{value}}' ?", + "msg.notification-remove": "Souhaitez-vous supprimer la notification '{{value}}' ?", + "msg.maps-location-remove": "Souhaitez-vous supprimer l'emplacement sur la carte '{{value}}' ?", + "msg.maps-location-name-exist": "Le nom de l'emplacement sur la carte existe déjà !", + "msg.text-name-exist": "Le nom du texte existe déjà !", + "msg.texts-text-remove": "Souhaitez-vous supprimer le texte '{{value}}' ?", + "msg.operation-unauthorized": "Opération non autorisée !" } diff --git a/client/src/assets/i18n/ja.json b/client/src/assets/i18n/ja.json new file mode 100644 index 000000000..492d96ba3 --- /dev/null +++ b/client/src/assets/i18n/ja.json @@ -0,0 +1,1751 @@ +{ + "with param": "サンプル {{value}}", + + "app.home": "ホーム", + "app.lab": "実行", + "app.editor": "エディター", + + "header.new-project": "新規プロジェクト", + "header.save-project": "プロジェクトを保存", + "header.save-project-tooltip": "未保存の変更を全て保存", + "header.saveas-project": "名前を付けてプロジェクトを保存...", + "header.rename-project": "プロジェクト名変更", + "header.open-project": "プロジェクトを開く", + "header.edit-project": "プロジェクト編集", + "header.edit-views": "ビューエディター", + "header.edit-devices": "接続設定", + "header.edit-charts": "チャート設定", + "header.edit-layout": "レイアウト設定", + "header.edit-plugins": "プラグイン", + "header.edit-users": "ユーザー設定", + "header.edit-alarms": "アラーム設定", + "header.edit-texts": "テキスト設定", + "header.help": "iFEMS ヘルプ", + "header.help-tutorial": "チュートリアル", + "header.help-info": "About", + "header.change-thema": "テーマ切り替え (beta)", + "header.info-version": "バージョン ", + "header.theme": "テーマ ライト/ダーク", + + "project.name": "プロジェクト名", + + "sidenav.title": "iFEMS", + + "tutorial.title": "iFEMS チュートリアル", + + "dlg.info-title": "iFEMS", + + "dlg.layout-title": "レイアウト設定", + "dlg.layout-general": "一般", + "dlg.layout-lbl-auto-resize": "自動リサイズ", + "dlg.layout-lbl-logo": "ロゴ", + "dlg.layout-lbl-icon": "アイコン", + "dlg.layout-lbl-sview": "開始ビュー", + "dlg.layout-lbl-login-start": "起動時にログインを表示", + "dlg.layout-lbl-login-overlay-color": "オーバーレイ色", + "dlg.layout-lbl-zoom": "ズーム", + "dlg.layout-navigation-mode": "ナビゲーションを表示", + "dlg.layout-connection-message": "接続エラーを表示 (Toast)", + "dlg.layout-show-dev": "ボタンを表示", + "dlg.layout-navigation": "ナビゲーションサイドメニュー" , + "dlg.layout-nav-bkcolor": "背景色", + "dlg.layout-nav-fgcolor": "色", + "dlg.layout-lbl-smode": "サイドモード", + "dlg.layout-lbl-type": "タイプ", + "dlg.layout-header": "ヘッダーナビゲーションバー", + "dlg.layout-header-bkcolor": "背景色", + "dlg.layout-header-fgcolor": "色", + "dlg.layout-lbl-title": "タイトル", + "dlg.layout-lbl-alarms": "アラーム通知モード", + "dlg.layout-lbl-datetime": "日付と時刻の形式 (yyyy/mm/dd - hh:mm a)", + "dlg.layout-lbl-infos": "情報通知モード", + "dlg.layout-lbl-font": "フォントファミリー", + "dlg.layout-lbl-font-size": "フォントサイズ", + "dlg.layout-lbl-anchor": "方向", + "dlg.layout-lbl-margin-left": "左マージン", + "dlg.layout-lbl-margin-right": "右マージン", + "dlg.layout-lbl-login-info": "ログイン情報", + "dlg.layout-lbl-custom-styles": "カスタムスタイル", + "dlg.layout-lbl-show-language": "言語を表示", + + "dlg.menuitem-title": "メニュー項目", + "dlg.menuitem-image": "[マイ画像...]", + "dlg.menuitem-icon": "アイコン", + "dlg.menuitem-text": "テキスト", + "dlg.menuitem-view": "クリックで表示", + "dlg.menuitem-link": "クリックでリンク", + "dlg.menuitem-alarms": " クリックでアラーム", + "dlg.menuitem-address": "リンクアドレス", + "dlg.menuitem-icons-filter": "アイコンフィルター", + + "dlg.menuitem-submenu": "サブメニュー", + "dlg.menuitem-add-submenu": "サブメニュー項目を追加", + "dlg.menuitem-submenu-items": "サブメニュー項目", + "sidenav.new_item": "新しいサブメニュー項目", + + "dlg.headeritem-title": "ヘッダー項目", + "dlg.headeritem-icon": "アイコン", + "dlg.headeritem-icons-filter": "アイコンフィルター", + + "dlg.docproperty-title": "プロパティを表示", + "dlg.docproperty-name": "名前", + "dlg.docproperty-width": "幅", + "dlg.docproperty-height": "高さ", + "dlg.docproperty-background": "背景", + "dlg.docproperty-size": "サイズ(事前定義)", + "dlg.docproperty-select": "サイズを選択", + "dlg.docproperty-size-320-240": "320 x 240 ピクセル", + "dlg.docproperty-size-460-360": "460 x 360 ピクセル", + "dlg.docproperty-size-640-480": "640 x 480 ピクセル", + "dlg.docproperty-size-800-600": "800 x 600 ピクセル", + "dlg.docproperty-size-1024-768": "1024 x 768 ピクセル", + "dlg.docproperty-size-1280-960": "1280 x 960 ピクセル", + "dlg.docproperty-size-1600-1200": "1600 x 1200 ピクセル", + "dlg.docproperty-size-1920-1080": "1920 x 1080 ピクセル", + "dlg.docproperty-margin": "余白", + "dlg.docproperty-align": "配置", + "dlg.docproperty-align-placeholder": "ページ上の配置", + "dlg.docproperty-align-topCenter": "上", + "dlg.docproperty-align-middleCenter": "中央", + "dlg.docproperty-gridtype": "グリッドタイプ", + "dlg.docproperty-gridtype-placeholder": "グリッドレイアウトタイプ", + "dlg.docproperty-gridtype-fit": "フィット", + "dlg.docproperty-gridtype-scrollVertical": "垂直スクロール", + "dlg.docproperty-gridtype-scrollHorizontal": "水平スクロール", + "dlg.docproperty-gridtype-fixed": "固定", + "dlg.docproperty-gridtype-verticalFixed": "垂直固定", + "dlg.docproperty-gridtype-horizontalFixed": "水平固定", + "dlg.docproperty-renderDelay": "ビュー描画遅延 (ms)", + + "dlg.docname-title": "ビュー名", + "dlg.docname-name": "名前", + "dlg.docproperty-type": "ビュータイプ", + "dlg.item-title": "名前", + "dlg.item-name": "名前", + "dlg.item-req-name": "関数名(スペースや数字は使用不可)", + "dlg.item-name-error": "名前が存在します!", + "dlg.parameter-title": "パラメータ", + + "dlg.tagname-title": "タグ名", + "dlg.tagname-name": "名前", + + "dlg.linkproperty-title": "ハイパーリンクを作成", + "dlg.linkproperty-url": "ハイパーリンクURL", + + "dlg.login-title": "サインイン...", + "dlg.logout-btn": "サインアウト", + + "dlg.ok": "OK", + "dlg.cancel": "キャンセル", + "dlg.close": "閉じる", + "dlg.apply": "適用", + + "dlg.userproperty-title": "ユーザー", + "dlg.userproperty-groups": "認証グループ", + "dlg.userproperty-roles": "承認ロール", + "dlg.useraccess-groups": "承認 (空 = 全員に完全アクセス権)", + "dlg.userproperty-language": "言語", + "dlg.userproperty-start": "開始ビュー", + + "dlg.gauge-permission-title": "認証", + "dlg.gauge-permission-label": "(空 = 全員に完全アクセス権)", + "dlg.gauge-permission-show": "表示", + "dlg.gauge-permission-enabled": "有効", + + "date.range-start": "開始日", + "date.range-end": "終了日", + + "general.search-up": "検索", + "general.close": "閉じる", + "general.search": "検索..." , + "general.search-notfound": "該当するオプションが見つかりません", + "general.username": "ユーザー名", + "general.fullname": "フルネーム", + "general.password": "パスワード", + "general.clientId": "クライアントID", + "general.authority": "権限", + "general.grant-type": "権限タイプ", + "general.usergroups": "閲覧者,オペレーター,エンジニア,スーパーバイザー,マネージャー,F,G,管理者", + "general.enabled": "有効", + "general.disabled": "無効", + "general.align-left": "左", + "general.align-center": "中央", + "general.align-right": "右", + "general-left": "左", + "general-top": "上", + "general-x": "X", + "general-y": "Y", + "general.monday": "月曜日", + "general.monday-short": "月曜日", + "general.tuesday": "火曜日", + "general.tuesday-short": "火", + "general.wednesday": "水曜日", + "general.wednesday-short": "水", + "general.thursday": "木曜日", + "general.thursday-short": "木", + "general.friday": "金曜日", + "general.friday-short": "金", + "general.saturday": "土曜日", + " general.saturday-short": "土", + "general.sunday": "日曜日", + "general.sunday-short": "日", + "general.save-template": "テンプレートとして保存", + "general.import-template": "テンプレートからインポート", + + "tester.title": "変数", + "tester.send": "送信", + + "item.overlaycolor-none": "なし", + "item.overlaycolor-black": "黒", + "item.overlaycolor-white": "白", + + "item.navsmode-none": "なし", + "item.navsmode-push": "プッシュ", + "item.navsmode-over": "オーバー", + "item.navsmode-fix": "固定", + + "item.navtype-icons": "アイコン", + "item.navtype-text": "テキスト", + "item.navtype-icons-text-block": "アイコン&テキスト(ブロック)", + "item.navtype-icons-text-inline": "アイコン&テキスト(インライン)", + + "item.headertype-button": "ボタン", + "item.headertype-label": "ラベル", + "item.headertype-image": "画像", + "item.headeranchor-left": "左", + "item.headeranchor-right": "右", + "item.headeranchor-center": "中央", + + "item.notifymode-hide": "非表示", + "item.notifymode-fix": "固定", + "item.notifymode-float": "プッシュ", + + "item.logininfo-type-nothing": "なし", + "item.logininfo-type-username": "ユーザー名", + "item.logininfo-type-fullname": "フルネーム", + "item.logininfo-type-both": "ユーザー名 & フルネーム", + + "item.language-show-mode-nothing": "非表示", + "item.language-show-mode-simple": "表示", + "item.language-show-mode-key": "キー付きで表示", + "item.language-show-mode-fullname": "フルネーム付きで表示", + + "item.zoommode-disabled": "無効", + "item.zoommode-enabled": "手動", + "item.zoommode-autoresize": "自動リサイズ", + + "item.headerbarmode-hide": "非表示", + "item.headerbarmode-show": "表示", + + "dlg.layout-input-dialog": "入力フィールドのダイアログモード", + "item.inputmode-disabled": "無効", + "item.inputmode-enabled": "ダイアログ", + "item.inputmode-keyboard": "仮想キーボード", + "item.inputmode-keyboard-full-screen": "仮想キーボード フルスクリーン", + + "chart.config-title": "チャート設定", + "chart.config-charts": "チャート", + "chart.config-devices": "デバイス", + "chart.config-tags": "タグ", + "chart.config-lines": "チャート 線", + "chart.config-line-name": "名前", + "chart.config-line-label": "ラベル", + "chart.config-line-yaxis": "Y軸", + "chart.config-line-color": "色", + "chart.config-name-title": "チャート", + " chart.config-name": "名前", + "chart.config-rename": "名前変更", + "chart.config-delete": "削除", + "chart.config-addline": "線を追加", + "chart.config-addlinePlaceholder": "プレースホルダーを追加", + "chart.config-line-interpolation": "補間", + "chart.config-line-fill": "塗りつぶし" , + "chart.config-interpo-linear": "線形", + "chart.config-interpo-stepAfter": "次の一歩", + "chart.config-interpo-stepBefore": "一歩手前", + "chart.config-interpo-spline": "スプライン", + "chart.config-line-width": "線幅", + "chart.config-line-gap": "ギャップを埋める", + "chart.config-line-add-zone": "ゾーンを追加", + "chart.config-line-zone-min": "最小", + "chart.config-line-zone-max": "最大", + "chart.config-line-zone-stroke": "ストローク", + "chart.config-line-zone-fill": "塗りつぶし", + + "chart.property-data": "データ", + "chart.property-props": "プロパティ", + "chart.property-layout": "レイアウト", + "chart.property-name": "名前", + "chart.property-chart": "表示するチャート", + "chart.property-newchart": "新しいチャート.. .", + "chart.property-chart-type": "表示モード", + "chart.property-realtime-max": "最大分", + "chart.viewtype-realtime1": "リアルタイム", + "chart.viewtype-history": "履歴", + "chart.viewtype-custom": "カスタム", + "chart.property-general": "一般", + "chart.property-font": "フォント", + "chart.property-font.titlesize": "タイトルサイズ", + "chart.property-font.axissize": "軸サイズ", + "chart.property-font.legendsize": "凡例サイズ", + "chart.property-theme": "テーマ", + "chart.property-color.background": "背景色", + "chart.property-color.text": "文字色", + "chart.property-color.grid": "グリッド色", + "chart.property-color.legend": "凡例色", + "chart.property-legend.mode": "凡例表示モード", + "chart.property-date-last-range": "日付範囲", + "chart.property-refresh-interval": "更新間隔 (分)", + "chart.property-hide-toolbar": "ツールバー非表示", + "chart.property-thouch-zoom": "タッチズーム", + " chart.property-load-old-values": "履歴を読み込む", + "chart.property-date.format": "日付形式", + "chart.property-time.format": "時刻形式", + "chart.property-axis": "軸", + "chart.property-xaxis": "X軸", + "chart.property-axis-x": "ラベル", + "chart.property-yaxis": "Y軸", + "chart.property-axis-y1": "Y1ラベル", + "chart.property-axis-y1-min": "Y1最小値", + "chart.property-axis-y1-max": "Y1最大値", + "chart.property-axis-y2": "Y2ラベル", + "chart.property-axis -y2-min": "Y2 最小値", + "chart.property-axis-y2-max": "Y2 最大値", + "chart.property-axis-y3": "Y3 ラベル", + "chart.property-axis-y3-min": "Y3 最小値", + "chart.property-axis-y3-max": "Y3 最大値", + "chart.property-axis-y4": "Y4 ラベル", + "chart.property-axis-y4-min": "Y4 最小値", + "chart.property-axis-y4-max": "Y4 最大値", + "chart.property-script": "スクリプト データソース", + + "chart.rangetype-last8h": "過去8時間" , + "chart.rangetype-last1d": "過去1日間", + "chart.rangetype-last3d": "過去3日間", + "chart.rangetype-last1w": "過去1週間", + + "chart.legend-always": "常に", + "chart.legend-follow": "追従", + "chart.legend-bottom": "下部", + "chart.legend-never": "非表示", + + "chart.labels-serie": "シリーズ", + "chart.labels-time": "時間", + "chart.labels-title": "タイトル", + + "graph.config-title": "グラフ設定", + "graph.config-rename": "名前変更", + "graph.config-source-tag": "ソースタグ追加", + "graph.config-source-name": "名前", + "graph.config-source-label": "ラベル", + "graph.config-category": "カテゴリ", + "graph.config-device": "デバイス", + "graph.config-bar-color": "境界線", + "graph.config-bar-fill": "塗りつぶし", + "graph.property-xtype": "X軸カテゴリタイプ", + "graph.property-sources": "ソース(タグ)", + "graph.bar-xtype-value": "値", + "graph.bar-xtype-date": "日時", + "graph.property-fnctype": "関数タイプ", + "graph.bar-date-fnc-value-integral": "合計 (積分)", + "graph.bar-date-fnc-hour-integral": "時間合計 (積分)", + + "graph.property-data": "データ", + "graph.property-name": "名前", + "graph.property-general": "一般", + "graph.property-title": "タイトル", + "graph.property-title-font": "フォントサイズ", + "graph.property-title-show": "表示", + "graph.property-title-color": "タイトル", + "graph.property-layout": "レイアウト", + "graph.property-graph": "表示するグラフ", + "graph.property-props": "プロパティ", + "graph.property-newgraph": "新しいグラフ..." , + "graph.property-date-last-range": "日付範囲", + "graph.property-date-group": "グループ", + "graph.property-offline": "オンライン", + "graph.property-graph-orientation": "向き", + "graph.property-ori-vartical": "縦", + "graph.property-ori-horizontal": "横", + "graph.property-decimals": "小数点以下桁数", + "graph.property-yaxis-min": "最小値", + "graph.property-yaxis-max": "最大値", + "graph.property-stepsize": "目盛間隔", + "graph.property-yaxis": "値軸", + "graph.property-yaxis-fontsize": "フォントサイズ", + "graph.property-yaxis-show": "表示", + "graph.property-yaxis-color": "値", + "graph.property-xaxis-fontsize": "フォントサイズ", + "graph.property-xaxis": "カテゴリ軸", + "graph.property-xaxis-show": "表示", + "graph.property-xaxis-color": "カテゴリ", + "graph.property-theme": "テーマ", + "graph.property-theme-type": "タイプ", + "graph.property-gridline": "グリッドを表示", + "graph.property-grid-color": "グリッド", + "graph.property-theme-owner": "カスタマイズ", + "graph.property-theme-light": "ライト", + "graph.property-theme-dark": "ダーク", + "graph.property-legend": "凡例", + "graph.property-legend-display": "表示", + "graph.property-legend-top": "上部", + "graph.property-legend-left": "左", + "graph.property-legend-bottom": "下", + "graph.property-legend-right": "右", + "graph.property-legend-show": "表示", + "graph.property-legend-fontsize": "フォント", + "graph.property-legend-align": "配置", + "graph.property-legend-center": "中央", + "graph.property-legend-start": "開始", + "graph.property-legend-end": "終了", + "graph.property-legend-color": "凡例", + "graph.property-border": "枠線の太さ", + "graph.property-tooltip": "ツールチップを表示", + "graph.property-datalabels": "データラベル", + "graph.property-datalabels-color": "データラベル", + "graph.property-datalabels-show": "表示", + "graph.property-datalabels-fontsize": "フォントサイズ", + "graph.property-datalabels-align": "配置", + + "graph.rangetype-last1h": "過去1時間", + "graph.rangetype-last1d": "過去1日間", + "graph.rangetype-last3d": "過去3日間", + "graph.rangetype-last1w": "過去1週間", + "graph.rangetype-last1m": "過去1か月", + + "graph.grouptype-hours": "時間", + "graph.grouptype-days": "日", + + "iframe.property-data": "データ", + "iframe.property-address": "アドレス (fix)", + "iframe.property-image": "画像", + + "video.property-title": "動画設定", + "video.property-data": "データ", + "video.property-address": "アドレス", + "video.property-controls": "コントロールを表示", + "video.property-image": "初期画像", + "video.property-image-placeholder": "初期画像を選択", + + "panel.property-data": "データ", + "panel.property-view-name": "ビュー名", + "panel.property-name": "名前", + "panel.property-scalemode": "拡大縮小モード", + "panel.property-scalemode-none": "なし", + "panel.property-scalemode-contain": "含める", + "panel.property-scalemode-stretch": "拡大", + + "table.property-title": "データテーブル設定", + "table.property-data": "データ", + "table.property-date-last-range": "日付範囲", + "table.property-name": "名前", + "table.property-type": "タイプ", + "table.property-type-with-realtime": "リアルタイム", + "table.property-header": "ヘッダー", + "table.property-header-height": "高さ", + "table.property-header-background": "背景", + "table.property-header-color": "色", + "table.property-header-fontSize": "フォントサイズ" , + "table.property-row": "行", + "table.property-row-height": "高さ", + "table.property-row-background": "背景", + "table.property-row-color": "色", + "table.property-row-fontSize": "フォントサイズ", + "table.property-selection": "選択", + "table.property-layout": "レイアウト", + "table.property-filter": "フィルター", + "table.property-paginator": "ページネーター", + "table.property-paginator-items-per-page": "ページあたりの項目数", + "table.property-paginator-next-page": "次のページ", + "table.property-paginator-prev-page": "前のページ", + " table.property-paginator-of-label": "の", + "table.property-daterange": "日付範囲", + "table.property-gridline": "グリッドを表示", + "table.property-type-data": "データテーブル", + "table.property-type-history": "履歴テーブル", + "table.property-type-alarms": "アラームテーブル", + "table.property-type-alarms-history": "アラーム履歴テーブル", + "table.property-type-reports": "レポートテーブル", + "table.property-grid-color": "グリッド色", + "table.property-cols": "列", + "table.property-rows": "行", + "table.property-column-type": "列タイプ", + "table.property-column-name": "名前", + "table.property-column-label": "ラベル", + "table.property-column-variable": "変数", + "table.property-column-device": "デバイス", + "table.property-column-timestamp": "日時", + "table.property-column-align": "配置", + "table.property-column-width": "幅", + "table.property-row-type": "行タイプ", + "table.property-customize-tooltip": "テーブルカスタマイザー", + "table.customize-title": "テーブルカスタマイザー", + "table.customize-column-edit": "列を編集", + "table.customize-column-add": "列を追加", + "table.customize-column-remove": "列を削除", + "table.customize-column-left": "左に移動", + "table.customize-column-right": "右に移動", + "table.customize-row-up": "上に移動", + "table.customize-row-down": "下に移動", + "table.customize-row-edit": "行を編集", + "table.customize-row-add": "行を追加", + "table.customize-row-remove": "行を削除", + "table.cell-column-name": "列名", + "table.column-dialog-title": "列", + "table.row-dialog-title": "行", + "table.cell-column-type": "列タイプ", + " table.cell-row-type": "行タイプ", + "table.cell-ts-format": "フォーマット (YYYY/MM/DD - HH:mm:ss)", + "table.cell-value-format": "フォーマット (0.000)", + "table.cell-format": "フォーマット", + "table.cell-text": "テキスト", + "table.cell-align-left": "左", + "table.cell-align-center": "中央", + "table.cell-align-right": "右", + + "table.history-filter": "フィルター", + "table.rangetype-last1h": "過去1時間" , + "table.rangetype-last1d": "過去1日間", + "table.rangetype-last3d": "過去3日間", + + "table.alarms-title": "テーブルアラーム", + "table.alarms-history-title": "テーブルアラーム履歴", + "table.alarm-columns": "アラーム列", + "table.alarm-filter": "アラームフィルター", + "table.alarm-priority": "優先度", + "table.alarm-tags": "タグ", + + "table.reports-title": "テーブルレポート", + "table.report-columns": "レポート列", + "table.report-view-name": "名前", + "table.report-view-ontime": "作成日時" , + "table.report-view-download": "ダウンロード", + "table.report-view-delete": "削除", + "table.report-filter": "レポートフィルター", + "table.report-filter-name": "名前", + "table.report-filter-count": "最大", + + "editor.view-svg": "Canvas/SVG", + "editor.view-cards": "マルチビューコンテナ", + "editor.view-maps": "マップ", + "editor.views": "ビュー", + "editor.resources": "リソース", + "editor.view-delete": "削除", + "editor.view-rename": "名前変更", + "editor.view-property": "プロパティ", + "editor.view-clone": "複製", + "editor.view-export": "エクスポート", + "editor.view-clean": "クリーン", + "editor.view-add": "ビュー追加", + "editor.image-add": "画像を追加", + "editor.view-import": "ビューをインポート", + "editor.general": "一般", + "editor.shape": "シェイプ", + "editor.processeng": "プロセスエンジニアリング", + "editor.animated": "アニメーション", + "editor.controls": "コントロール", + "editor.controls-input": "入力値", + "editor.controls-input-settings": "入力設定", + "editor.controls-output": "出力値", + "editor.controls-output-settings": "出力設定", + "editor.controls-button": "ボタン", + "editor.controls-button-settings": "ボタン設定", + "editor.controls-select": "値選択", + "editor.controls-select-settings": "選択設定", + "editor.controls-progress": "バーゲージ", + "editor.controls-progress-settings": "バーゲージ設定", + "editor.controls-semaphore": "LEDゲージ", + "editor.controls-semaphore-settings": "LEDゲージ設定", + "editor.controls-chart": "チャート", + "editor.controls-chart-settings": "チャート設定", + "editor.controls-bag": "円形ゲージ", + "editor.controls-bag-settings": "円形ゲージ設定", + "editor.controls-pipe": "パイプ", + "editor.controls-pipe-settings": "パイプ設定", + "editor.controls-slider": "スライダー", + "editor.controls-slider-settings": "スライダー設定", + "editor.controls-shape-settings": "シェイプ設定", + "editor.controls-html-switch-settings": "スイッチ設定", + "editor.controls-switch": "スイッチ", + "editor.controls-graphbar": "棒グラフ", + "editor.controls-graph-bar-settings": "棒グラフ設定", + "editor.controls-graphpie": "円グラフ", + "editor.controls-graph-pie-settings": "円グラフ設定", + "editor.controls-iframe": "Iframe", + "editor.controls-iframe-settings": "Iframe設定", + "editor.controls-table": "テーブル", + "editor.header-item-settings": "ヘッダー項目設定", + "editor.controls-image": "画像(リンク)", + "editor.controls-panel": "パネル", + "editor.controls-panel-settings": "パネル設定", + "editor.controls-video": "動画", + "editor.controls-video-settings": "動画設定", + + "editor.layout-settings": "レイアウト設定", + + "editor.interactivity": "インタラクティブ機能", + "editor.interactivity-id": "id:", + "editor.interactivity-id-title": "要素を識別", + "editor.interactivity-class": "class:", + "editor.interactivity-class-title": "要素クラス", + "editor.interactivity-name": "名前", + "editor.edit-bind-of-tags": "タグの編集バインド", + + "editor.cmenu-property": "プロパティ", + "editor.cmenu-cut": "切り取り", + "editor.cmenu-copy": "コピー", + "editor.cmenu-paste": "貼り付け", + "editor.cmenu-paste-place": "元の位置に貼り付け", + "editor.cmenu-delete": "削除", + "editor.cmenu-group": "グループ化" , + "editor.cmenu-ungroup": "グループ解除", + "editor.cmenu-bring-front": "前面へ移動", + "editor.cmenu-bring-forward": "前方へ移動", + "editor.cmenu-send-backward": "後方へ移動", + "editor.cmenu-send-back": "背面へ移動", + "editor.cmenu-layer-duplicate": "レイヤーを複製...", + "editor.cmenu-layer-delete": "レイヤーを削除", + "editor.cmenu-layer-marge-down": "下へ統合", + "editor.cmenu-layer-marge-all": "全て統合", + "editor.cmenu-unlock": "ロック解除", + "editor.cmenu-lock": "ロック", + + "editor.transform": "変換", + "editor.transform-x": "x", + "editor.transform-x-title": "X座標を変更", + "editor.transform-y": "y", + "editor.transform-y-title": "Y座標を変更", + "editor.transform-x1": "x1", + "editor.transform-x1-title": "線の開始x座標を変更", + "editor.transform-y1": "y1", + "editor.transform-y1 -title": "線の開始Y座標を変更", + "editor.transform-x2": "x2", + "editor.transform-x2-title": "線の開始X座標を変更", + "editor.transform-y2": "y2", + "editor.transform-y2-title": "線の開始Y座標を変更", + "editor.transform-rect-width-title": "矩形の幅を変更", + "editor.transform-width": "width", + "editor.transform-rect-height-title": "矩形の高さを変更", + "editor.transform-height": "height", + "editor.transform-rect-radius-title": "矩形の角半径を変更", + "editor.transform-radiuscorner": "半径の隅", + "editor.transform-circlecx": "cx", + "editor.transform-circlecx-title": "円のcx座標を変更", + "editor.transform-circlecy": "cy", + "editor.transform-circlecy-title": "円のcy座標を変更", + "editor.transform-circler": "r", + "editor.transform-circler-title": "円の半径を変更" , + "editor.transform-ellipsecx": "cx", + "editor.transform-ellipsecx-title": "楕円のcx座標を変更", + "editor.transform-ellipsecy": "cy", + "editor.transform-ellipsecy-title": "楕円のcy座標を変更", + "editor.transform-ellipserx": "rx", + "editor.transform-ellipserx-title": "楕円のx半径を変更", + "editor.transform-ellipsery": "ry", + "editor.transform-ellipsery-title": "楕円のy半径を変更", + "editor.transform-fontfamily": "フォントファミリー", + "editor.transform-font-serif": "Serif", + "editor.transform-font-sansserif": "Sans-serif", + "editor.transform-font-cursive": "Cursive", + "editor.transform-font-fantasy": "Fantasy", + "editor.transform-font-monospace": "Monospace", + "editor.transform-fontsize": "フォントサイズ", + "editor.transform-fontsize-title": "フォントサイズを変更", + "editor.transform-textalign": "テキスト配置", + "editor.transform-left": "左", + "editor.transform-center": "中央", + "editor.transform-right": "右", + "editor.transform-image-width-title": "画像幅を変更", + "editor.transform-image-height-title": "画像の高さを変更", + "editor.transform-url": "URL", + "editor.transform-image-url-title": "URLを変更", + "editor.transform-change-image": "画像を変更", + "editor.transform-change-image-title": "注意: この画像は埋め込みできません。表示にはこのパスに依存します", + "editor.transform-angle": "角度", + "editor.transform-angle-title": "回転角度を変更", + "editor.transform-hide": "非表示", + "editor.transform-lock": "ロック", + + "editor.align": "配置", + "editor.align-left-title": "左揃え", + "editor.align-center-title": "中央揃え", + "editor.align-right-title": "右揃え", + "editor.align-top-title": "上揃え", + "editor.align-middle-title": "中央揃え", + "editor.align-bottom-title": "下揃え", + + "editor.stroke": "ストローク", + "editor.stroke-width": "ストローク幅", + "editor.stroke-width-title": "ストローク幅を1ずつ変更、Shiftキーを押しながらクリックで0.1ずつ変更", + "editor.stroke-style": "ストロークスタイル", + "editor.stroke-style-title": "ストロークの破線スタイルを変更", + "editor.stroke-joinmiter-title": "線端接続(Miter)", + "editor.stroke-joinround-title": "線端接続(Round)", + "editor.stroke-joinbevel-title": "線端接続(Bevel)", + "editor.stroke-capbutt-title": "線端形状(Butt)", + "editor.stroke-capsquare-title": "線端形状(Square)", + "editor.stroke-capround-title": "線端形状(Round)", + "editor.stroke-shadow": "影", + "editor.stroke-shadow-title": "影付き", + + "editor.marker": "マーカー", + "editor.marker-start": "開始", + "editor.marker-start-title": "開始マーカータイプを選択", + "editor.marker-middle": "中間 ", + "editor.marker-middle-title": "中間マーカータイプを選択", + "editor.marker-end": "終了", + "editor.marker-end-title": "終了マーカータイプを選択", + + "editor.hyperlink": "ハイパーリンク", + "editor.hyperlink-url": "URL", + + "editor.tools-launch-title": "現在のビューを起動", + "editor.tools-select": "ツールを選択", + "editor.tools-pencil": "鉛筆ツール", + "editor.tools-line": "線ツール", + "editor.tools-rectangle": "四角形ツール", + "editor.tools-circle": "円ツール", + "editor.tools-ellipse": "楕円ツール", + "editor.tools-path": "パスツール", + "editor.tools-text": "テキストツール", + "editor.tools-image": "画像ツール (埋め込み)", + + "editor.tools-zoom-title": "ズームツール [Ctrl+Up/Down]", + "editor.tools-grid-title": "グリッドの表示/非表示", + "editor.tools-undo-title": "元に戻す [Z]" , + "editor.tools-redo-title": "やり直し [Y]", + "editor.tools-clone-title": "要素の複製 [D]", + "editor.tools-delete-title": "要素の削除 [Delete/Backspace]", + "editor.tools-movebottom-title": "最下層に移動 [ Ctrl+Shift+[ ]", + "editor.tools-movetop-title": "最前面に移動 [ Ctrl+Shift+] ]", + "editor.tools-topath-title": "パスに変換", + "editor.tools-clonemulti-title": "要素を複製 [C]", + "editor.tools-deletemulti-title": "選択した要素を削除 [Delete/Backspace]", + "editor.tools-group-title": "要素をグループ化 [G]", + "editor.tools-alignleft-title": "左揃え", + "editor.tools-aligncenter-title": "中央揃え", + "editor.tools-alignright-title": "右揃え", + "editor.tools-aligntop-title": "上揃え", + "editor.tools-alignmiddle-title": "中央揃え", + "editor.tools-alignbottom-title": "下揃え", + "editor.tools-ungroup-title": "要素のグループ解除 [G]", + "editor.tools-hyperlink-title": "ハイパーリンクを作成", + "editor.tools-svg-selector": "アイテムリストセレクター", + + "editor.settings-general": "一般", + "editor.settings-events": "イベント", + "editor.settings-actions": "アクション", + + "tags.ids-config-title": "タグ-IDリファレンス", + + "svg.selector.property-title": "アイテムリストを表示", + + "tutorial.editor-keyboard-shortcuts": "エディタ キーボードショートカット", + + "shapes.action-hide": "非表示", + "shapes.action-show": "表示", + "shapes.action-blink": "点滅", + "shapes.action-stop": "停止", + "shapes.action-start": "開始", + "shapes.action-pause": "一時停止", + "shapes.action-reset": "リセット", + "shapes.action-clockwise": "時計回りに回転", + "shapes.action-anticlockwise": "反時計回りに回転" , + "shapes.action-downup": "上下", + "shapes.action-rotate": "回転", + "shapes.action-move": "移動", + "shapes.action-refreshImage": "画像更新", + + "shapes.event-click": "クリック", + "shapes.event-dblclick": "ダブルクリック", + "shapes. event-mouseup": "マウスアップ", + "shapes.event-mousedown": "マウスダウン", + "shapes.event-mouseover": "マウスオーバー", + "shapes.event-mouseout": "マウスアウト", + "shapes.event-enter": "入力", + "shapes.event-select": "選択", + "shapes.event-onpage": "ページを開く", + "shapes.event-onwindow": "カードを開く", + "shapes.event-ondialog": "ダイアログを開く", + "shapes.event-oniframe": "iframeを開く" , + "shapes.event-oncard": "ウィンドウを開く", + "shapes.event-onopentab": "タブを開く", + "shapes.event-onsetvalue": "値を設定", + "shapes.event-ontogglevalue": "値を切り替え", + "shapes.event-onsetinput": "入力から設定", + "shapes.event-onclose": "閉じる", + "shapes.event-onopen": "開く", + "shapes.event-onrunscript": "スクリプトを実行", + "shapes.event-setvalue-set": "設定", + "shapes.event-setvalue-add": "増加", + "shapes.event-setvalue-remove": "減少", + "shapes.event-address-link": "リンク", + "shapes.event-address-resource": "リソース", + "shapes.event-onmonitor": "モニター", + "shapes.event-onViewToPanel": "ビューをパネルに設定", + "shapes.event-onLoad": "読み込み時", + "shapes.event-relativefrom-window": "ウィンドウ", + "shapes.event-relativefrom-mouse": "マウス", + + "pipe.property-title": "パイプ設定", + "pipe.property-data": "データ", + "pipe.property-style": "スタイル", + "pipe.property-props": "プロパティ", + "pipe.property-border-width": "境界線の幅", + "pipe.property-border-color": "境界線の色", + "pipe.property-pipe-width": "パイプの幅", + "pipe.property-pipe-color": "パイプの色", + "pipe.property-content-width": "コンテンツの幅", + "pipe.property-content-color": "コンテンツの色", + "pipe.property-content-space": "コンテンツのダッシュ", + "pipe.action-hide-content": "コンテンツを非表示", + "pipe.property-style-animation": "アニメーション画像", + "pipe.property-style-animation-image": "画像を選択 (SVG)", + "pipe.property-style-animation-count": "画像数", + "pipe.property-style-animation-delay": "アニメーション遅延 (ミリ秒)", + + "slider.property-props": "プロパティ", + "slider.property-horizontal": "水平", + "slider.property-vertical": "垂直", + "slider.property-orientation": "向き", + "slider.property-direction": "方向", + "slider.property-rtl": "rtl", + "slider.property-ltr": "ltr", + "slider.property-min": "最小値", + "slider.property-max": "最大値", + "slider.property-step": "ステップ", + "slider.property-font": "フォント", + "slider.property-background": "背景", + "slider.property-scala": "スカラー", + "slider.property-marker-color": "マーカー色", + "slider.property-subdivisions": "目盛り分割(%)", + "slider.property-subdivisions-height": "目盛り分割の高さ", + "slider.property-subdivisions-width": "目盛り分割の幅", + "slider.property-divisions": "分割(%)", + "slider.property-divisions-height": "高さ", + "slider.property-divisions-width": "幅", + "slider.property-font-size": "スカラーフォント", + "slider.property-tooltip": "ツールチップ", + "slider.property-tooltip-none": "なし", + "slider.property-tooltip-hide": "非表示", + " slider.property-tooltip-show": "表示", + "slider.property-tooltip-decimals": "小数点以下桁数", + "slider.property-tooltip-background": "背景", + "slider.property-tooltip-color": "文字色", + "slider.property-tooltip-font-size": "ツールチップのフォント", + "slider.property-slider-color": "接続色", + "slider.property-slider-background": "ベースカラー", + "slider.property-slider-handle": "ポインターカラー", + + "html-switch.property-off-value": "オフ値", + "html-switch.property-on-value": "オン値", + "html-switch.property-on-background": "オン時の背景色", + "html-switch.property-off-background": "オフ時の背景色", + "html-switch.property-off-text": "オフ時のテキスト", + "html-switch.property-on-text": "オン時のテキスト", + "html-switch.property-on-slider-color": "オン時のスライダー色" , + "html-switch.property-off-slider-color": "オフ時のスライダー色", + "html-switch.property-radius": "半径の隅", + "html-switch.property-off-text-color": "オフ時のテキスト色", + "html-switch.property-on-text-color": "オン時のテキスト色", + "html-switch.property-font-size": "フォントサイズ", + "html-switch.property-font": "フォント", + + "html-input.min": "最小", + "html-input.max": "最大", + "html-input.out-of-range": "値が範囲外です", + "html-input.not-a-number": "値が数値ではありません", + + "editor.tools-zoomlevel-title": "ズームレベル", + "editor.tools-zoomlevel-fitcanvas": "キャンバスに合わせる", + "editor.tools-zoomlevel-fitsection": "選択範囲に合わせる", + "editor.tools-zoomlevel-fitcontent": "全コンテンツに合わせる", + "editor.tools-fillcolor-title": "塗りつぶし色を変更", + "editor.tools-strokecolor-title": "線の色を変更", + "editor.tools-palettecolor-title": "クリックで塗りつぶし色を変更、Shiftキーを押しながらクリックで線の色を変更", + + "device.list-title": "接続設定", + "device.list-device": "接続", + "device.list-filter": "フィルター", + "device.list-name": "名前", + "device.list-address": "アドレス", + "device.list-type": "タイプ", + "device.list-min": "最小", + "device.list-max": "最大", + "device.list-value": "値", + "device.list-timestamp": "タイムスタンプ", + "device.list-description": "説明", + " device.list-edit": "タグ編集", + "device.list-add": "タグ追加", + "device.list-remove": "タグ削除", + "device.list-remove-all": "全タグ削除", + "device.list-options": "タグオプション", + "device.list-clipboard": "タグオブジェクトをクリップボードにコピー", + "device.list-direction": "方向", + + "devices.export": "接続をエクスポート", + "devices.export-json": "JSON", + "devices.export-csv": "CSV", + "devices.import": "接続をインポート", + "device.manage-templates": "テンプレートを管理", + "device.save-tags-to-template": "タグをテンプレートに保存", + "device.add-tags-from-template": "テンプレートからタグを追加", + "device.tags-template-name-title": "タグテンプレート名", + " devices.import-template": "テンプレートで接続をインポート", + "device.property-client": "接続プロパティ", + "device.property-server": "iFEMSサーバープロパティ", + "device.property-name": "名前", + "device.property-type": "タイプ", + "device.property-polling": "ポーリング", + "device.property-enable": "有効化", + "device.property-subscribe": "サブスクライブ", + "device.property-address": "アドレス (IP または opc.tcp://[server]:[port])", + "device.property-address-opc": "アドレス (opc.tcp://[server]:[port])", + " device.property-address-s7": "IP-Address (IP 127.0.0.1)", + "device.property-device-port": "デバイス IP and Port (127.0.0.1:47808)", + "device.property-address-port": "スレーブ IP and Port (127.0.0.1:502)", + "device.property-security": "セキュリティと暗号化モード", + "device.property-tags": "デバイスタグの編集", + "device.property-edit": "デバイスプロパティの編集", + "device.property-remove": "デバイスの削除", + "device.property-add": "デバイスの追加", + "device.not-property-security": "セキュリティと暗号化モードなし", + "device.property-connection-options": "接続オプション", + "device.property-port": "ポート", + "device.property-slave-id": "スレーブID", + "device.property-routing": "ルーティング", + "device.property-tockenized": "フラグメント化", + "device.property-rack": "ラック", + "device.property-slot": "スロット", + "device.property-serialport": "シリアルポート", + "device.property-baudrate": "ボーレート", + "device.property-databits": "データビット", + "device.property-stopbits": "ストップビット", + "device.property-parity": "パリティ", + "device.property-delay": "フレーム遅延 (ミリ秒)", + "device.property-method": "メソッド", + "device.property-format": "フォーマット", + "device.property-internal": "フロントエンド専用", + "device.property-url": "URL (http://[server]:[port])", + "device.property-webapi-result": "リクエスト結果", + "device.property-ads-target": "ターゲット AmsNetId (例: 192.168.1.10.1.1:851)", + "device.property-ads-local": "ローカル AmsNetId (例: 192.168.1.10.1. 1:32750)", + "device.property-ads-router": "ルーターアドレス(例: 192.168.1.120:48898)", + " device.not-webapi-result": "WebAPI結果の設定", + "device.property-show": "デバイスプロパティを表示", + "device.property-hide": "デバイスプロパティを非表示", + "device.property-interface-address": "インターフェースとポート" , + "device.property-interface-address-ph": "127.0.0.1:47808", + "device.property-broadcast-address": "ブロードキャスト", + "device.property-broadcast-address-ph": "127.0.0.255", + "device.property-adpu-timeout": "adpuタイムアウト", + "device.property-adpu-timeout-ph": "6000", + "device.property-certificate-section": "TLS証明書", + "device.property-certificate": "証明書", + "device.property-certificate-key": "秘密鍵", + "device.property-certificate-ca": "CA証明書", + "device.security-none": "なし", + "device.security-sign": "署名", + "device.security-signandencrypt": "署名と暗号化", + "device.webapi-property-title": "WebAPI プロパティ", + "device.webapi-property-gettags": "URL GET タグ", + "device.webapi-property-posttags": "URL POST タグ", + "device.webapi-property-loadtags": "タグを読み込み", + "device.property-dsn": "データソース名 (DSN=データベース名)", + "device.property-odbc-result": "見つかったテーブルの結果", + "device.not-odbc-result": "データベーステーブルの結果", + "device.add-device-templates-title": "デバイス テンプレート", + "device.add-tags-templates-title": "タグテンプレート", + "device.add-from-template": "テンプレートからデバイスを追加", + "device.manage-templates-title": "テンプレートを削除", + "device.template-device": "テンプレート名", + "device.template-tags": "テンプレート名", + "device.property-socket-reuse": "ソケット再利用", + "device.property-melsec-target": "アドレス (IP[:port])", + "device.property-melsec-ascii": "ASCII", + "device.property-melsec-octalIO": "8進数I/O", + + "device.browsetopics-property-title": "サブスクライブおよび公開するブローカートピック", + "device.browsetopics-property-sub": "サブスクライブ", + "device.browsetopics-property-pub": "公開", + "device.discovery-topics": "ブローカー上のブラウザートピック", + "device.topic-selected": "トピックパス", + "device.topic-raw": "raw", + "device.topic-json": "json", + "device.add-topics": "ブローカーにトピックを公開", + "device.topic-publish-name": "トピック名", + "device.topic-publish-path": "トピックパス", + "device.topic-publish": "公開", + "device. topic-subscribe": "サブスクライブ", + "device.topic-subscription-content": "コンテンツ", + "device.topic-subscription-name": "名前", + "device.topic-subscription-address": "アドレス", + "device.topic-publish-add-item": "ペイロードに属性を追加", + "device.topic-publish-key": "キー", + "device.topic-publish-type": "タイプ", + "device.topic-publish-timestamp": "タイムスタンプ", + "device.topic-publish-value": "トピックパス", + "device.topic-publish-static": "値", + "device.topic-publish-content": "ペイロード", + "device.topic-type-tag": "タグ", + "device.topic-type-timestamp": "タイムスタンプ", + "device.topic-type-value": "値(トピックの)", + "device.topic-type-static": "静的", + "device.topic-name-exist": "トピック名 '{{value}}' は既に存在します" , + "device.topic-subs-address-exist": "アドレス '{{value}}' でサブスクライブするトピックは既に存在します", + "device.topic-pubs-address-exist": "アドレス '{{value}}' で公開するトピックは既に存在します", + + "device.property-mqtt-address": "アドレス (mqtt://[server]: [port])", + "device.tag-property-title": "タグプロパティ", + "device.browsetag-property-title": "サーバー内のタグを閲覧", + "device.tag-property-device": "デバイス", + "device.tag-property-name": "タグ名", + "device.tag-property-register": "登録", + "device.tag-property-type": "タイプ", + "device.tag-property-address": "アドレス (例: db5.dbb3 db4.dbx2.0 MB7)", + "device.tag-property-address-sample": "アドレス", + "device.tag-property-min": " 最小", + "device.tag-property-max": "最大", + "device.tag-property-divisor": "除数", + "device.tag-property-address-offset": "アドレスオフセット (1-65536)", + "device.tag-property-obj-name": "名前", + "device.tag-property-path": "パス", + "device.tag-property-unit": "単位", + "device.tag-property-digits": "10進数", + "device.tag-property-initvalue": "初期値", + "device.tag-property-description": "説明", + "device.tag-property-direction": "方向", + "device.tag-property-edge": "エッジ", + "device.tag-property-gpio": "GPIO番号", + + + "device.tag-array-id": "配列ID:", + "device.tag-array-value": "値:", + "device-tag-dialog-title": "タグ選択", + + "device.tag-options-title": "タグオプション", + "device.tag-daq-enabled": "登録有効", + "device.tag-daq-changed": "変更時保存", + "device. tag-daq-interval": "値保存間隔 (秒)", + "device.tag-daq-restored": "復元対象", + + "device.tag-format": "桁数フォーマット (2 = #.##)", + "device.tag-deadband": "デッドバンド", + "device.tag-scale": "スケーリングモード / 変換", + "device. tag-scale-mode-undefined": "スケーリングなし", + "device.tag-scale-mode-undefined-tooltip": "タグ値", + "device.tag-scale-mode-linear": "線形: ΔS * (値 - RL) / ΔR + SL", + "device.tag-scale-mode-linear-tooltip": "ΔS = (スケール High - スケール Low)\nΔR = (Raw High - Raw Low)\nRL = Raw Low\nSL = スケール Low", + "device.tag-scale-mode-script": "スクリプト (読み取り/書き込み)", + "device.tag-raw-low": "Raw Low", + "device.tag-raw-high": "Raw High", + "device.tag-scaled-low": "スケール Low", + "device.tag-scaled-high": "スケール High", + "device.tag-convert-datetime": "ミリ秒から日付時刻形式への変換", + "device.tag-convert-datetime-tooltip": "例: 'YYYY-MM-DD HH:mm:ss' (2023-09-14 08:45:10 対応)", + "device.tag-convert-datetime-format": "日付時刻形式 (YYYY-MM-DD HH:mm:ss)", + "device.tag-convert-ticktime": "ミリ秒から時間形式 (残り時間または経過時間)", + "device.tag-convert-ticktime-tooltip": "例: 'HH:mm:ss' (56:45:10 対応)", + "device.tag-convert-ticktime-format": "時間形式 (HH:mm:ss)", + "device.tag-scale-read-script": "読み取りスクリプト", + "device.tag-scale-read-script-tooltip": "クライアントから受信した値を変換するスクリプト", + "device.tag-scale-read-script-params": "読み取りスクリプトのパラメータ値を入力", + "device.tag-scale-write-script": "書き込みスクリプト", + "device.tag-scale-write-script-tooltip": "クライアントへの書き込み前に値を変換するスクリプト", + "device.tag-scale-write-script-params": "書き込みスクリプトのパラメータ値を入力", + "device.tag-scale-script-params-tooltip": "スクリプトに渡す値を含むJSON形式のパラメータ配列", + " device.tag-property-webcam-device": "ウェブカメラデバイス", + "device.tag-property-webcam-device-address": "ウェブカメラデバイス ,例(/dev/video0)", + "device.tag-property-webcam-options.width": "幅", + "device.tag-property-webcam-options.height": "高さ", + "device. tag-property-webcam-options.frames": "フレーム数", + "device.tag-property-webcam-options.quality": "画質", + "device.tag-property-webcam-options.outputType": "出力タイプ", + "device.tag-property-webcam-options.callbackReturn": "コールバック戻り値", + + + + + "device.edit-placeholder-titel": "編集用プレースホルダー", + + "device.connect-ok": "接続成功", + "device.connect-error": "接続エラー", + "device.connect-failed": "接続失敗", + "device.connect-off": "オフ", + "device.connect-busy": "ビジー", + + "devices.mode-map": "デバイス図", + "devices. mode-list": "デバイス一覧", + "devices.list-name": "名前", + "devices.list-address": "アドレス", + "devices.list-type": "タイプ", + "devices.list-polling": "ポーリング", + "devices.list-enabled": "有効", + "devices.list-status": "ステータス", + + "users.list-title": "ユーザー設定", + "users.list-name": "ユーザー名", + "users.list-fullname": "フルネーム", + "users.list-groups": "グループ", + "users.list-roles": "ロール", + "users.list-start": "表示開始", + + "roles.list-title": "ロール設定", + "roles.list-index": "インデックス", + "roles.list-name": "名前", + "roles.list-description": "説明", + + "user-role-edit-title": "ロール設定", + "user-role-edit-name": "名前", + "user-role-edit-index": "インデックス", + "user-role-edit-description": "説明", + + "events-history.list-title": "イベント履歴", + "events-history.filter-daterange": "日付範囲フィルター", + + "gauges.property-props": "プロパティ", + "gauges.property-events": "イベント", + "gauges.property-title": "プロパティ", + "gauges.property-name": "名前", + "gauges.property-text": "テキスト", + "gauges.property-permission": "認証", + "gauges.property-mask": "ビットマスク", + "gauges.property-readonly": "読み取り専用", + "gauges.property-event-type": "タイプ", + "gauges.property-event-action": "アクション", + "gauges.property-event-destination": "宛先", + "gauges.property-event-destination-relative-from": "相対位置", + "gauges.property-event-destination-panel": "パネル", + "gauges.property-event-destination-hide-close": "非表示/閉じる", + "gauges.property-event-destination-target-device": "ターゲットデバイス", + "gauges.property-event-newtab": "新規タブ", + "gauges.property-event-single-card": "シングルカード", + "gauges.property-event-value": "値", + "gauges.property-event-function": "関数", + "gauges.property-event-input": "入力(名前付き入力のみ)", + "gauges.property-event-address-type": "タイプ", + "gauges.property-event-address": "リンク", + "gauges.property-event-resource": "リソース", + "gauges.property-event-width": "幅", + "gauges.property-event-height": "高さ", + "gauges.property-event-scale": "スケール" , + "gauges.property-event-script": "スクリプト", + "gauges.property-event-script-param-name": "パラメータ", + "gauges.property-event-script-param-value": "値", + "gauges.property-event-script-param-input-value": "入力値を送信するには空欄のままにする", + "gauges.property-head-device": "デバイス", + "gauges.property-head-variable": "変数", + "gauges.property-variable-value": "値", + "gauges.property-head-alarm": "アラーム", + "gauges.property-head-color": "色", + "gauges.property-head-mapvariable": "コンテキスト変数", + "gauges.property-head-tomapvariable": "コンテキスト変数を定義", + "gauges.property-head-todevice": "デバイス変数", + "gauges.property-head-value": "値", + "gauges.property-input-min": "最小値", + "gauges.property-input-max": "最大値", + "gauges.property-input-color": "塗りつぶし", + "gauges.property-input-stroke": "ストローク", + "gauges.property-input-value": "値", + "gauges.property-input-label": "ラベル", + "gauges.property-input-unit": "単位", + "gauges.property-input-type": "入力タイプ", + "gauges.property-input-type-number": "数値", + "gauges.property-input-type-text": "テキスト", + "gauges.property-input-type-date": "日付", + "gauges.property-input-type-time": "時刻", + "gauges.property-input-type-datetime": "日付と時刻", + "gauges.property-input-time-format": "時間形式", + "gauges.property-input-time-format-normal": "HH:mm", + "gauges.property-input-time-format-seconds": "HH:mm:ss", + "gauges.property-input-time-format-milliseconds": "HH:mm:ss:fff", + " gauges.property-input-milliseconds": "ミリ秒単位での変換", + "gauges.property-input-convertion": "変換", + "gauges.property-input-convertion-milliseconds": "ミリ秒", + "gauges.property-input-convertion-string": "文字列", + + "gauges.property-update-enabled": "更新を有効化", + "gauges.property-update-esc": "ESCで更新", + "gauges.property-input-esc-action": "離脱時のアクション", + "gauges.property-action-esc-update": "更新 (Refresh)", + "gauges.property-action-esc-enter": "確認 (Enter)", + "gauges.property-select-content-on-click": "クリックでコンテンツを選択", + "gauges.property-numeric-enabled": "数値のみ", + "gauges.property-format-digits": "桁のフォーマット", + "gauges.property-actions": "アクション", + "gauges.property-action-type": "タイプ", + "gauges.property-action-param": "アクションID", + "gauges.property-action-minAngle" : "最小角度", + "gauges.property-action-maxAngle" : "最大角度", + "gauges.property-action-toX" : "X位置へ", + "gauges.property-action-toY" : "Y位置へ", + "gauges.property-action-duration" : "持続時間", + "gauges.property-events-mapping-from": "コンテキスト変数", + "gauges.property-map-variable": "バインドするコンテキスト変数を追加", + "gauges.property-head-remove-mapvariable": "バインドを削除", + "gauges.property-tooltip-add-event": "イベントを追加", + "gauges.property-interval-msec": "間隔 (ミリ秒)", + "gauges.property-tag-label": "タグ", + "gauges.property-tag-internal-title": "宛先のプレースホルダー(または内部デバイスのタグ)を設定", + "gauges.property-input-range": "許可された入力範囲" , + "gauges.property-language-text": "テキストまたは @TextID", + + "bag.property-ticks": "目盛", + "bag.property-divisions": "分割", + "bag.property-subdivisions": "細分割", + "bag.property-divisions-length": "分割の長さ", + "bag.property-subdivisions-length": "小目盛りの長さ", + "bag.property-divisions-width": "目盛りの幅", + "bag.property-subdivisions-width": "小目盛りの幅", + "bag.property-divisions-color": "目盛りの色", + "bag.property-subdivisions-color": "小目盛りの色", + "bag.property-divisionfont-size": "目盛りのフォントサイズ", + "bag.property-divisionfont-color": "目盛りのフォント色", + "bag.property-divisions-labels": "目盛りのラベル (例: 10;20;...)", + "bag.property-current-value": "現在の値", + "bag.property-min": "最小値", + "bag.property-max": "最大値", + "bag.property-bar-width": "バーの幅", + "bag.property-animation-speed": "アニメーション速度", + "bag.property-angle": "角度", + "bag.property-radius": "半径", + "bag.property-font": "フォント", + "bag.property-font-size": "フォントサイズ", + "bag.property-textfield-position": "テキストフィールド位置", + "bag.property-pointer-length": "ポインタの長さ", + "bag.property-pointer-stroke": "ポインタのストローク", + "bag.property-pointer-color": "ポインタの色", + "bag.property-color-start": "色の開始点", + "bag.property-color-stop": "カラーストップ", + "bag.property-background": "背景", + "bag.property-format-digits": "数字の書式", + "bag.property-zones": "ゾーン", + "bag.property-color": "色", + "bag.property-fill": "塗りつぶし", + + "alarms.list-title": "アラーム設定", + "alarms.list-name": "名前", + "alarms.list-device": "デバイス / 変数", + "alarms.list-highhigh": "High High", + "alarms.list-high": "High", + "alarms.list-low": "Low", + "alarms.list-info": "メッセージ", + "alarms.list-actions": "アクション", + "alarm.property-title": "アラーム", + "alarm.property-name": "名前", + "alarm.property-permission": "認証", + "alarm.property-highhigh": "High High", + "alarm.property-high": "High", + "alarm.property-low": "Low", + "alarm.property-info": "メッセージ", + "alarm.property-action": "アクション", + "alarm.property-enabled": "有効", + "alarm.property-save-event": "イベント", + "alarm.property-min": "最小", + "alarm.property-max": "最大", + "alarm.property-timedelay": "最小-最大範囲の時間 (秒)", + "alarm.property-checkdelay": "チェック間隔 (秒)", + "alarm.property-type": "タイプ", + "alarm.property-ackmode": "承認モード", + "alarm.property-text": "テキスト", + "alarm.property-group": "グループ", + "alarm.ack-float": "フローティング", + "alarm.ack-active": "アクティブアラームによる承認を許可", + "alarm.ack-passive": "パッシブアラームのみによる承認", + "alarms.view-title": "アラーム", + "alarms.history-title": "履歴アラーム", + "alarms.view-ontime": "日付/時刻", + "alarms.view-text": "テキスト", + "alarms.view-group": "グループ", + "alarms.view-status": "ステータス", + "alarms.view-type": "優先度", + "alarms.view-offtime": "OFF 日時", + "alarms.view-acktime": "ACK 日時", + "alarms.view-userack": "ACK ユーザー", + "alarms.view-ack": "ACK", + "alarms.view-ack-all-alarms": "ACK 全アラーム", + "alarm.status-active": "アクティブ", + "alarm.status-passive": "パッシブ", + "alarm.status-active-ack": "アクティブ-ACK", + "alarms.show-current": "アラーム", + "alarms.show-history": "履歴アラーム", + "alarm.action-popup": "ポップアップ表示", + "alarm.action-onsetview": "ビュー設定", + "alarm.action-onsetvalue": "値を設定", + "alarm.action-onRunScript": "スクリプトを実行" , + "alarm.action-toastMessage": "メッセージを表示", + "alarm.action-sendMsg": "メッセージを送信", + "alarm.property-action-type": "アクションタイプ", + "alarm.property-action-value": "設定する値", + "alarm.property-action-destination": "表示するビュー", + "alarm.property-action-toastMessage": "表示するメッセージ", + "alarm.property-action-toastType": "タイプ", + + "notifications.list-title": "通知設定", + "notifications.list-name": "名前", + "notifications.list-receiver": "受信者", + "notifications.list-delay": "遅延", + "notifications.list-interval": "間隔", + "notifications.list-type": "タイプ", + "notifications.list-enabled": "有効", + "notifications.list-subscriptions": "サブスクリプション", + "notification.property-title": "通知", + "notification.property-name": "名前", + "notification.property-receiver": "受信者: メールアドレス ';' / WebApi (Telegram https://api.telegram.org/bot...${content})" , + "notification.property-type": "タイプ", + "notification.property-delay": "遅延 (分)", + "notification.property-interval": "間隔 (分)", + "notification.property-enabled": "有効", + "notification.property-priority": "優先度", + "notification.type-alarm": "アラーム", + "notification.type-trigger": "トリガー", + + "scripts.list-title": "スクリプト設定", + "scripts.list-name": "名前", + "scripts.list-type": "タイプ", + "scripts.list-mode": "モード", + "scripts.list-params": "パラメータ", + "scripts.list-scheduling": "スケジュール / 間隔", + "scripts.list-permission": "権限", + "scripts.list-options": "スクリプトオプション", + + "script.permission-title": "権限", + "script.permission-label": "(空 = 全員に完全アクセス権)", + "script.permission-enabled": "有効", + + "script.create-title": "スクリプト作成", + + "script.mode": "実行モード", + "script.mode-title": "実行モード", + "script.mode-label": "実行モード", + "script.mode-CLIENT": "クライアント (ブラウザで実行)", + "script.mode-SERVER": "サーバー (サーバーで実行)", + + "script.property-title": "スクリプト", + "script.property-systems": "システム関数", + "script.property-templates": "テンプレート", + "script.property-test": "テスト", + "script.property-test-params": "関数パラメータ", + "script.property-test-console": "コンソール", + "script.property-test-tag": "タグ設定", + "script.property-test-run": "テスト実行", + "script.property-editname": "スクリプト名編集", + "script.property-name": "名前", + "script.property-addfnc-param": "スクリプトパラメータ追加", + "script.property-async-function": "非同期関数", + "script.param-title": "スクリプトパラメータ", + "script.param-name": "名前", + "script.param-type": "タイプ", + "script.paramtype": "", + "script.paramtype-tagid": "タグID", + "script.paramtype-value": "値 (数値/文字列/オブジェクト)", + "script.paramtype-chart": "チャートライン (配列)", + "script.param-name-exist": "パラメータ名が既に存在します!", + "script.sys-fnc-settag-text": "$setTag (TagID, value)", + "script.sys-fnc-settag-tooltip": "タグ値を設定するシステム関数: $setTag (TagID as string, value as string or number)", + " script.sys-fnc-gettag-text": "$getTag (TagID)", + "script.sys-fnc-gettag-tooltip": "タグ値を取得するシステム関数: $getTag (TagID as string) 文字列または数値として値を返す", + "script.scheduling-title": "スクリプトスケジューリング", + "script.scheduling-type": "タイプ" , + "script.scheduling-interval": "間隔でループ", + "script.scheduling-start": "開始時のみ", + "script.scheduling-add-item": "スケジューラを追加", + "script.scheduling-scheduling": "スケジュール", + "script.scheduling-weekly": "毎週", + "script.scheduling-date": "日付", + "script.scheduling-time": "時刻", + "script.scheduling-hour": "時間", + "script.scheduling-minute": "分", + "script.interval": "間隔 (秒)", + "script.delay": "遅延 (秒)", + "script.sys-fnc-setview-text": "$setView (View name)", + "script.sys-fnc-setview-tooltip": "クライアントでビューを設定するシステム関数: $setView (View name as string)", + "script.sys-fnc-setview-params": "'View name'", + "script.sys-fnc-opencard-text": "$openCard (View name)", + "script.sys-fnc-opencard-tooltip": "クライアントでカードを開くシステム関数: $openCard (View name as string, Options as dict {left, top})", + "script.sys-fnc-opencard-params": "'View name'", + "script.sys-fnc-enableDevice-text": "$enableDevice (Device name, enable True/False)", + "script.sys-fnc-enableDevice-tooltip": "デバイス接続を有効化するシステム関数: $enableDevice (Device name as string, enable as boolean)", + "script.sys-fnc-enableDevice-params": "'Device name', true", + "script.sys-fnc-getDevice-text": "$getDevice (Device name, interface True/False)", + "script.sys-fnc-getDevice-tooltip": "デバイスオブジェクトを取得するシステム関数: $getDevice (Device name as string, get Comm Interface as boolean)", + "script.sys-fnc-getDevice-params": "'Device name', true", + "script.sys-fnc-setAdapterToDevice-text": "$setAdapterToDevice(Adapter name, Device name)", + "script.sys-fnc-setAdapterToDevice-tooltip": "アダプター(internal Device)をデバイスにバインドするシステム関数: $setAdapterToDevice (Adapter name as string, Device name as string)", + "script.sys-fnc-setAdapterToDevice-params": "'Adapter name', 'Device name'", + "script.sys-fnc-resolveAdapterTagId-text": "$resolveAdapterTagId(TagID)", + "script.sys-fnc-resolveAdapterTagId-tooltip": "アダプタ(internal Device)にバインドされたデバイスのタグIDを取得するシステム関数: $resolveAdapterTagId (TagID as string)", + "script. sys-fnc-resolveAdapterTagId-params": "'TagID of Adapter'", + "script.sys-fnc-getTagId-text": "$getTagId (Tag name, [Device name])", + "script.sys-fnc-getTagId-tooltip": "タグIDを取得するシステム関数: $getTagId (Tag name as string, [Optional Device name as string])", + "script.sys-fnc-getTagId-params": "'Tag name', ", + "script.sys-fnc-getTagDaqSettings-text": "$getTagDaqSettings (TagID)", + "script.sys-fnc-getTagDaqSettings-tooltip": "タグのDAQ設定を取得するシステム関数: $getTagDaqSettings (TagID as string)", + "script.sys-fnc-getTagDaqSettings-params": "'TagID'", + "script.sys-fnc-setTagDaqSettings-text": "$setTagDaqSettings (TagID, DaqSettings)", + "script.sys-fnc-setTagDaqSettings-tooltip": "タグDAQ設定を設定するシステム関数: $setTagDaqSettings (TagID as string, DaqSettings as object {restored: boolean, enabled: boolean, changed: boolean, interval: number, lastDaqSaved: number} )", + "script.sys-fnc-setTagDaqSettings-params": "'TagID', 'DaqSettings'", + "script.sys-fnc-invokeObject-text": "$invokeObject (Object name, Function name, [Parameter])", + "script.sys-fnc-invokeObject-tooltip": "オブジェクト関数を呼び出すシステム関数: $invokeObject (Object name as string, function name as string , [parameter])", + "script.sys-fnc-invokeObject-params": "'オブジェクト名', 'function name', ", + "script.sys-fnc-runServerScript-text": "$runServerScript (Script name, [Parameter])", + "script.sys-fnc-runServerScript-tooltip": "クライアント関数によるサーバースクリプト関数の呼び出し: $runServerScript (Script name as string, [parameter])", + "script.sys-fnc-runServerScript-params": "'Server script name', ", + "script.sys-fnc-getDeviceProperty-text": "$getDeviceProperty(Device name)", + "script.sys-fnc-getDeviceProperty-tooltip": "デバイスプロパティを取得するシステム関数: $getDeviceProperty(Device name as string)", + "script.sys-fnc-getDeviceProperty-params": "'Device name'", + "script.sys-fnc-setDeviceProperty-text": "$setDeviceProperty(Device name, property)", + "script.sys-fnc-setDeviceProperty-tooltip": "デバイスプロパティを設定するシステム関数: $setDeviceProperty(Device name as string, Property as object {address, port, ...} )", + "script.sys-fnc-setDeviceProperty-params": "'Device name', 'Property'", + "script.sys-fnc-getHistoricalTag-text": "$getHistoricalTags(TagIds array, from msec., to msec.)", + "script.sys-fnc-getHistoricalTag-tooltip":"ミリ秒範囲で履歴タグを取得: $getHistoricalTags([TagIds] as array, from as number, to as number)", + "script.sys-fnc-getHistoricalTag-params":"'タグID配列', '開始ミリ秒', '終了ミリ秒'", + "script.sys-fnc-sendMessage-text": "$sendMessage(address, subject, message)", + "script.sys-fnc-sendMessage-tooltip": "メッセージ(メール)を送信するシステム関数: $sendMessage(address as string, subject as string, message as string)", + "script.sys-fnc-sendMessage-params": "'address', 'subject', 'message'" , + "script.sys-fnc-getAlarms-text": "$getAlarms()", + "script.sys-fnc-getAlarms-tooltip": "アラームリストを取得するシステム関数 (): $getAlarms()", + "script.sys-fnc-getAlarms-params": "", + "script.sys-fnc-getAlarmsHistory-text": "$getAlarmsHistory(from msec., to msec.)", + "script.sys-fnc-getAlarmsHistory-tooltip": "履歴アラームリストを取得するシステム関数 (): $getAlarmsHistory(from as number, to as number)", + "script.sys-fnc-getAlarmsHistory-params": "'From msec.', 'To msec.'" , + "script.sys-fnc-ackAlarms-text": "$ackAlarm(Alarm name, types)", + "script.sys-fnc-ackAlarms-tooltip": "アラームをACKするシステム関数 (): $ackAlarm(Alarm name as string, [types] 'highhigh|high|low')", + "script.sys-fnc-ackAlarms-params": "'Alarm name', 'types'", + + "script.template-chart-data-text": "カスタマイズされたチャートデータ" , + "script.template-chart-data-tooltip": "返すカスタムチャートデータのコードテンプレート", + "script.template-invoke-chart-update-options-text": "チャート更新オプション", + "script.template-invoke-chart-update-options-tooltip": "チャートオプション(Y軸スケール範囲)を更新するコードテンプレート。クライアントモードのみ!", + "script.template-getHistoricalTagsoptions-text": "履歴タグの値を取得", + "script.template-getHistoricalTagsoptions-tooltip": "履歴タグの値を取得するコードテンプレート。", + + "client.script-access-title": "クライアントスクリプトへのアクセス", + "client.script-access-info": "フロントエンド(例:ウィジェット)から window.iFEMSScriptAPI 経由でシステム機能へのアクセスを設定します。", + + "reports.list-title": "レポート設定", + "reports.list-name": "名前", + "reports.list-type": "タイプ", + "reports.list-receiver": "受信者", + "reports.list-scheduling": "スケジュール / 間隔", + "reports.list-enabled": "有効", + + "report.property-title": "レポート", + "report.property-name": "名前", + "report.property-receiver": "受信者メールアドレス", + "report.property-scheduling-type": "レポートスケジュール", + "report.property-content": "内容", + "report.property-page": "ページ設定", + "report.property-page-size": "ページサイズ", + "report.property-page-orientation": "ページ向き", + "report.property-page-ori-landscape": "横向き", + "report.property-page-ori-portrait": "縦向き", + "report.property-margin-left": "左マージン", + "report.property-margin-top": "上マージン", + "report.property-margin-right": "右マージン", + "report.property-margin-bottom": "下マージン", + "report.scheduling-none": "無効", + "report.scheduling-day": "毎日", + "report.scheduling-week": "毎週", + "report.scheduling-month": "毎月", + "report.content-addtext": "テキストを追加", + "report.content-addtable": "タグテーブルを追加", + "report.content-addalarms": "アラーム履歴を追加", + "report.content-addchart": "チャート追加", + "report.content-type-text": "テキスト", + "report.content-type-tagstable": "タグテーブル", + "report.content-type-alarmshistory": "履歴アラーム", + "report.content-type-chart": "チャート", + "report.content-fontsizeitem": "フォントサイズ", + "report.content-alignitem": "テキスト配置", + "report.content-edit": "編集", + "report.content-delete": "削除", + "report.item-text-title": "レポートテキスト", + "report.item-text-label": "テキスト", + "report.tags-table-title": "レポートタグテーブル", + "report.tags-table-column": "テーブル列タグ", + "report. tags-table-add": "タグを追加", + "report.tags-table-setlabel": "ラベルを設定", + "report.table-alignitem": "揃える", + "report.table-delitem": "列を削除", + "report. item-daterange": "データ範囲", + "report.item-daterange-none": "なし", + "report.item-daterange-day": "前日 (0-24)", + "report.item-daterange-week": "先週 (月曜日-日曜日)", + "report.item-daterange-month": "先月", + "report.item-interval": "間隔(期間)", + "report.item-interval-min5": "5分", + "report.item-interval-min10": "10分", + "report.item-interval-min30": "30分", + "report.item-interval-hour": "1時間", + "report.item-interval-day": "1日", + "report.item-function-type": "関数タイプ", + "report.item-function-min": "最小値", + "report.item-function-max": "最大値", + "report.item-function-average": "平均値", + "report.item-function-sum": "合計値", + "report.item-alarms-title": "レポートアラーム", + "report.alarms-priority": "アラーム優先度", + "report.alarms-column": "アラーム列", + "report.alarms-filter": "アラームフィルター", + "report.chart-title": "レポートチャート", + "report.chart-name": "チャート名", + "report.chart-width": "幅", + "report.chart-height": "高さ", + + "maps.locations-list-title": "場所設定", + "maps.locations-list-name": "名前", + "maps.locations-list-view": "表示", + "maps.locations-list-description": "説明", + "maps.location-property-title": "場所", + "maps.location-property-name": "名前", + "maps.location-property-description": "説明", + "maps.location-property-latitude": "緯度", + "maps.location-property-longitude": "経度", + "maps.location-property-card": "カード", + "maps.location-property-view": "表示", + "maps.location-property-url": "URL", + "maps.edit-add-location": "場所を追加", + "maps.edit-import-location": "場所をインポート", + "maps.edit-edit-location": "場所を編集", + "maps.edit-remove-location": "位置情報の削除", + "maps.edit-start-location": "開始位置として設定", + "maps.edit-start-location-saved": "開始位置が保存されました", + "maps.close-popups": "全てのポップアップを閉じる", + "maps.location-to-import": "インポートする位置情報", + "maps.location-to-import-input-title": "インポートする位置情報を選択", + + "logs.view-title": "システムログ", + "logs.view-files": "ログファイル", + + "events.view-ontime": "日付/時刻", + "events.view-type": "タイプ", + "events.view-source": "ソース", + "events.view-text": "テキスト", + + "card.config-title": "カード設定", + "card.config-content-type": "コンテンツタイプ", + "card.config-content-view": "コンテンツ表示", + "card.config-content-iframe": "リンク先アドレス", + "card.widget-view": "表示", + "card.widget-alarms": "アラーム", + "card.widget-table": "テーブル", + "card.widget-iframe": "リンク", + "card.style-zoom": "ズーム", + + "resources.lib-icons": "アイコン", + "resources.lib-images": "画像", + "resource.list-title": "リソース一覧", + "resource.list-name": "ファイル名", + "resource.list-type": "ファイルタイプ", + "resource.list-title-fonts": "フォント一覧", + "resources.lib-widgets": "ウィジェット", + + "widgets.kiosk-title": "ウィジェットキオスク", + "widget.remove": "ウィジェットを削除", + + "texts.list-title": "言語設定", + "texts.list-filter": "フィルター", + "texts.list-filter-group": "グループ", + "texts.list-id": "ID", + "texts.list-group": "グループ", + "texts.list-value": "テキスト(デフォルト)", + "texts.list-add-text": "テキストを追加", + "texts.list-edit-language": "言語を編集", + "language.settings-title": "言語設定", + "language.settings-add-tooltip": "言語を追加", + "language.settings-id": "キー", + "language.settings-default-id": "キー (デフォルト)", + "language.settings-id-placeholder": "例: EN", + "language.settings-name": "名前", + "language.settings-default-name": "名前 (デフォルト)", + "language.settings-name-placeholder": "例: 英語", + "text.settings-title": "テキスト", + "text.settings-id": "名前 (許可される文字と数字、スペース不可)", + "text.settings-group": "グループ", + "text.settings-value": "テキスト (デフォルト)", + + "gui.range-number-min": "最小値", + "gui.range-number-max": "最大値", + "gui.range-number-boolean": "マスク値", + "gui.range-number-true": "真 [1-1]", + "gui.range-number-false": "偽 [0-0]", + "gui.range-number-switcher": "数値またはブール値としての範囲", + + "dlg.bitmask-title": "ビットマスク", + + "dlg.plugins-title": "サーバープラグイン", + "dlg.plugins-info": "インストールされていないプラグインはサーバーで手動インストール可能: 'npm install [package name]@[version]'", + "dlg.plugins-type": "タイプ", + "dlg.plugins-name": "名前", + "dlg.plugins-version": "バージョン", + "dlg.plugins-current": "インストール済み", + "dlg.plugins-description": "説明", + "dlg.plugins-status-installing": "インストール中...", + "dlg.plugins-status-removing": "削除中...", + "dlg.plugins-status-installed": "インストール中...OK!", + "dlg.plugins-status-removed": "削除中...OK!", + "dlg.plugins-status-error": "エラー!手動で試してください!", + + "dlg.setup-title": "セットアップ", + "dlg.setup-gui": "ユーザーインターフェース", + "dlg.setup-diverse": "その他", + "dlg.setup-logic": "ロジック", + "dlg.setup-system": "システム", + "dlg.setup-views": "ビュー", + "dlg.setup-connections": "接続", + "dlg.setup-users": "ユーザー", + "dlg.setup-user-roles": "ロール", + "dlg.setup-alarms": "アラーム", + "dlg.setup-line-charts": "折れ線グラフ", + "dlg.setup-bar-charts": "棒グラフ", + "dlg.setup-maps-locations": "場所", + "dlg.setup-layout": "レイアウト", + "dlg.setup-plugins": "プラグイン", + "dlg.setup-scripts": "スクリプト", + "dlg.setup-reports": "レポート", + "dlg.setup-settings": "設定", + "dlg.setup-client-access": "フロントエンドスクリプト", + "dlg.setup-logs": "ログ", + "dlg.setup-notifications": "通知", + "dlg.setup-events": "イベント", + "dlg.setup-resources": "リソース", + "dlg.setup-fonts": "フォント", + "dlg.setup-language": "言語", + "dlg.app-settings-title": "設定", + "dlg.app-settings-system": "システム", + "dlg.app-settings-smtp": "SMTP", + "dlg.app-settings-smtp-host": "ホスト", + "dlg.app-settings-smtp-port": "ポート", + "dlg.app-settings-smtp-mailsender": "メール送信者", + "dlg.app-settings-smtp-user": "ユーザー/ApiKey", + "dlg.app-settings-smtp-password": "パスワード", + "dlg.app-settings-smtp-testaddress": "テストメッセージ送信先メールアドレス", + "dlg.app-settings-smtp-test": "テスト", + "dlg.app-settings-language": "言語", + "dlg.app-language-de": "ドイツ語", + "dlg.app-language-en": "英語", + "dlg.app-language-ru": "ロシア語", + "dlg.app-language-ua": "ウクライナ語", + "dlg.app-language-zh-cn": "中国語", + "dlg.app-language-pt": "ポルトガル語", + "dlg.app-language-sv": "スウェーデン語", + "dlg.app-language-tr": "トルコ語", + "dlg.app-language-ko": "韓国語", + "dlg.app-language-es": "スペイン語", + "dlg.app-language-fr": "フランス語", + "dlg.app-language-ja": "日本語", + "dlg.app-settings-server-port": "サーバーはポートで待機中", + "dlg.app-settings-server-log-full": "ログ満杯モード", + "dlg.app-settings-alarms": "アラーム", + "dlg.app-settings-alarms-clear": "全てのアラームと履歴をクリア", + "dlg.app-settings-auth-token": "トークンによる認証", + "dlg.app-settings-auth-only-editor": "編集者のみ", + "dlg.app-auth-disabled": "無効", + "dlg.app-auth-expiration-15m": "有効(トークン有効期限15分)", + "dlg.app-auth-expiration-1h": "有効(トークン有効期限:1時間)", + "dlg.app-auth-expiration-3h": "有効(トークン有効期限:3時間)", + "dlg.app-auth-expiration-1d": "有効(トークン有効期限:1日)", + "dlg.app-auth-tooltip": "有効化済み: 管理者アカウント 'admin/123456' が存在します(変更をお忘れなく)。サーバーの再起動が必要です!", + "dlg.app-settings-client-broadcast": "クライアント(フロントエンド)に全タグ値をブロードキャスト", + + "dlg.app-settings-daqstore": "DAQストレージ", + "dlg.app-settings-daqstore-type": "データベースタイプ", + "dlg.app-settings-daqstore-url": "URL", + "dlg.app-settings-daqstore-token": "トークン", + "dlg.app-settings-daqstore-bucket": "バケット", + "dlg.app-settings-daqstore-organization": "組織", + "dlg.app-settings-daqstore-retention": "保持期間", + "dlg.app-settings-daqstore-database": "データベース名", + "dlg.app-settings-daqstore-username": "ユーザー名", + " dlg.app-settings-daqstore-password": "パスワード", + + "dlg.app-settings-user-group-label": "認証タイプ", + "dlg.app-settings-user-group": "グループ (デフォルト)", + "dlg.app-settings-user-roles": "ロール", + + "store.retention-none": "無効", + "store.retention-day1": "1日間", + "store.retention-days2": "2日間", + "store.retention-days3": "3日間", + "store.retention-days7": "7日間", + "store.retention-days14": "14日間", + "store.retention-days30": "30日間", + "store.retention-days90": "90日間", + "store.retention-year1": "1年間", + "store.retention-year3": "3年間", + "store.retention-year5": "5年間", + + "plugin.group-connection-device": "接続デバイス", + "plugin.group-connection-database": "接続データベース", + "plugin.group-chart-report": "レポート用チャート画像", + + "action-settings-title": "アクション設定", + "action-settings-readonly-tag": "タグ", + "action-settings-readonly-values": "値", + + "msg.alarm-ack-all": "全てのアラームを承認しますか?", + "msg.alarm-remove": "アラームを削除しますか?", + "msg.text-remove": "テキストを削除しますか?", + "msg.alarmproperty-error-exist": "アラーム名が存在します!", + "msg.alarmproperty-missing-value": "値が不足しています!", + "msg.textproperty-error-exist": "テキストIDが存在します!", + "msg.textproperty-missing-value": "一部の値が不足しています!", + "msg.device-remove": "デバイスを削除しますか?", + "msg.device-tag-remove": "タグを削除しますか?", + "msg.device-tag-exist": "タグ名が存在します!", + "msg.device-tag-invalid-char": "タグ名に '@' 文字は使用できません!", + "msg.notification-property-missing-value": "一部の値が不足しています!", + "msg.report-property-missing-value": "不正または不足している値があります!", + "msg.file-upload-failed": "アップロードに失敗しました!", + "msg.file-delete-failed": "ファイル削除に失敗しました!", + + "msg.home-welcome": "お待ちください...エディタに移動し、デバイスをマッピングし、可視化を設計し、デバイス変数をバインドしてください", + "msg.server-connection-failed": "サーバー接続に失敗しました!", + "msg.project-load-error": "'{{value}}' を読み取れませんでした", + "msg.project": "プロジェクトの変更を保存しますか?", + "msg.tags-remove-all": "全てのタグを削除しますか?", + "msg.view-remove": "ビュー '{{value}}' を削除しますか?", + "msg.chart-remove": "チャート '{{value}}' を削除しますか?", + "msg.role-remove": "ロール '{{value}}' を削除しますか?", + "msg.graph-remove": "棒グラフ '{{value}}' を削除しますか?", + "msg.script-remove": "スクリプト '{{value}}' を削除しますか?", + "msg.report-remove": "レポート を削除しますか?", + "msg.device-connection-error": "デバイス '{{value}}' の接続エラー!", + "msg.server-connection-error": "サーバー接続に失敗しました!", + "msg.sendmail-success": "メール送信に成功しました!", + "msg.sendmail-error": "メール送信に失敗しました!", + "msg.users-save-error": "ユーザー保存に失敗しました!", + "msg.user-remove": "ユーザー を削除しますか?", + "msg.project-save-success": "プロジェクト保存成功!", + "msg.project-save-error": "プロジェクト保存失敗!", + "msg.project-format-error": "プロジェクト形式不正!", + "msg.view-format-error": "ビュー形式不正!", + "msg.project-save-unauthorized": "プロジェクト保存失敗!権限不足!", + "msg.project-save-ask": "プロジェクトを離れますか?", + "msg.login-username-required": "ユーザー名を入力してください", + "msg.login-password-required": "パスワードを入力してください", + "msg.signin-failed": "ユーザー名またはパスワードが間違っています!", + "msg.signin-unauthorized": "権限がありません!", + "msg.get-project-void": "プロジェクトが見つかりません!", + "msg.editor-mode-locked": "エディターは既に開いています!", + "msg.alarms-clear-success": "全てのアラームがキャンセルされました!", + "msg.import-devices-error": "デバイスのインポートに失敗しました!", + "msg.report-build-forced": "ビルドレポートの送信に成功しました", + "msg.report-build-error": "ビルドレポート送信に失敗しました!", + "msg.device-tags-request-result": "{{current}}件中{{value}}件を読み込み", + "msg.chart-with-script": "定義されたスクリプトはチャート行のリストをパラメータとして受け取り、データを付加した完成リストを返します。コードサンプルはスクリプト 'Templates' 内にあります", + "msg.script-name-exist": " スクリプト名が存在します!", + "msg.invalid-script-name": "無効なスクリプト名です!", + "msg.templates-exist-ask-overwrite": "名前 '{{value}}' のテンプレートは既に存在します。上書きしますか?", + "msg.templates-save-success": "テンプレートの保存に成功しました!", + "msg.view-name-exist": "ビュー名が存在します!", + "msg.notification-name-exist": "通知名が存在します!", + "msg.file-remove": "'{{value}}' を削除しますか?", + "msg.notification-remove": "通知 '{{value}}' を削除しますか?", + "msg.maps-location-remove": "マップ位置 '{{value}}' を削除しますか?", + "msg.maps-location-name-exist": "マップ位置名が既に存在します!", + "msg.text-name-exist": "テキスト名が既に存在します!", + "msg.texts-text-remove": "テキスト '{{value}}' を削除しますか?", + "msg.operation-unauthorized": "操作が許可されていません!" +} \ No newline at end of file diff --git a/client/src/assets/i18n/ru.json b/client/src/assets/i18n/ru.json index f64c6adeb..0676f8952 100644 --- a/client/src/assets/i18n/ru.json +++ b/client/src/assets/i18n/ru.json @@ -254,7 +254,7 @@ "graph.property-date-last-range": "Диапазон времени", "graph.property-date-group": "Группа", "graph.property-offline": "Онлайн", - "graph.property-graph-oriantation": "Ориентация", + "graph.property-graph-orientation": "Ориентация", "graph.property-ori-vartical": "Вертикальная", "graph.property-ori-horizontal": "Горизонтальная", "graph.property-decimals": "Десятичные", diff --git a/client/src/assets/i18n/sv.json b/client/src/assets/i18n/sv.json index 401348ba9..8d7b01e4c 100644 --- a/client/src/assets/i18n/sv.json +++ b/client/src/assets/i18n/sv.json @@ -77,6 +77,11 @@ "dlg.menuitem-alarms": "Larm vid klick", "dlg.menuitem-address": "Länkadress", "dlg.menuitem-icons-filter": "Ikonfilter", + + "dlg.menuitem-submenu": "Undermeny", + "dlg.menuitem-add-submenu": "Lägg till undermenyobjekt", + "dlg.menuitem-submenu-items": "Undermenyobjekt", + "sidenav.new_item": "Nytt undermenyobjekt", "dlg.headeritem-title": "Headerobjekt", "dlg.headeritem-icon": "Ikon", @@ -357,7 +362,7 @@ "graph.property-date-last-range": "Datumintervall", "graph.property-date-group": "Grupp", "graph.property-offline": "Online", - "graph.property-graph-oriantation": "Orientering", + "graph.property-graph-orientation": "Orientering", "graph.property-ori-vartical": "Vertikal", "graph.property-ori-horizontal": "Horisontell", "graph.property-decimals": "Decimaler", diff --git a/client/src/assets/i18n/zh-cn.json b/client/src/assets/i18n/zh-cn.json index 956a03f53..04b0e768e 100644 --- a/client/src/assets/i18n/zh-cn.json +++ b/client/src/assets/i18n/zh-cn.json @@ -23,6 +23,7 @@ "header.help": "FUXA帮助", "header.help-tutorial": "教程", "header.help-info": "关于", + "header.change-thema": "切换主题(beta)", "header.info-version": "版本", "header.theme": "主题 明亮/黑暗", @@ -41,8 +42,10 @@ "dlg.layout-lbl-icon": "图标", "dlg.layout-lbl-sview": "启动视图", "dlg.layout-lbl-login-start": "启动时显示登录", + "dlg.layout-lbl-login-overlay-color": "覆盖颜色", "dlg.layout-lbl-zoom": "缩放", "dlg.layout-navigation-mode": "显示导航", + "dlg.layout-connection-message": "显示连接错误(Toast)", "dlg.layout-show-dev": "显示按钮", "dlg.layout-navigation": "导航侧菜单", "dlg.layout-nav-bkcolor": "背景色", @@ -54,7 +57,16 @@ "dlg.layout-header-fgcolor": "颜色", "dlg.layout-lbl-title": "标题", "dlg.layout-lbl-alarms": "警报通知模式", + "dlg.layout-lbl-datetime": "时间和日期格式(dd/MM/yyyy - hh:mm a)", "dlg.layout-lbl-infos": "信息通知模式", + "dlg.layout-lbl-font": "字体族", + "dlg.layout-lbl-font-size": "字体大小", + "dlg.layout-lbl-anchor": "方向", + "dlg.layout-lbl-margin-left": "左边距", + "dlg.layout-lbl-margin-right": "右边距", + "dlg.layout-lbl-login-info": "登录信息", + "dlg.layout-lbl-custom-styles": "自定义样式", + "dlg.layout-lbl-show-language": "显示语言", "dlg.menuitem-title": "菜单项目", "dlg.menuitem-image": "[我的图片...]", @@ -64,8 +76,14 @@ "dlg.menuitem-link": "通过点击进行链接", "dlg.menuitem-alarms": "通过点击发出警报", "dlg.menuitem-address": "链接地址", + "dlg.menuitem-icons-filter": "图标筛选", + + "dlg.headeritem-title": "页眉项", + "dlg.headeritem-icon": "图标", + "dlg.headeritem-icons-filter": "图标筛选", "dlg.docproperty-title": "查看属性", + "dlg.docproperty-name": "名称", "dlg.docproperty-width": "宽度", "dlg.docproperty-height": "高度", "dlg.docproperty-background": "背景", @@ -80,41 +98,62 @@ "dlg.docproperty-size-1600-1200": "1600 x 1200 像素", "dlg.docproperty-size-1920-1080": "1920 x 1080 像素", "dlg.docproperty-margin": "边距", + "dlg.docproperty-align": "对齐", + "dlg.docproperty-align-placeholder": "页面上的对齐方式", + "dlg.docproperty-align-topCenter": "顶部", + "dlg.docproperty-align-middleCenter": "中间", + "dlg.docproperty-gridtype": "网格类型", + "dlg.docproperty-gridtype-placeholder": "网格布局类型", + "dlg.docproperty-gridtype-fit": "适应", + "dlg.docproperty-gridtype-scrollVertical": "垂直滚动", + "dlg.docproperty-gridtype-scrollHorizontal": "水平滚动", + "dlg.docproperty-gridtype-fixed": "固定", + "dlg.docproperty-gridtype-verticalFixed": "垂直固定", + "dlg.docproperty-gridtype-horizontalFixed": "水平固定", + "dlg.docproperty-renderDelay": "视图渲染延迟(毫秒)", "dlg.docname-title": "视图名称", "dlg.docname-name": "名称", "dlg.docproperty-type": "视图类型", "dlg.item-title": "名称", "dlg.item-name": "名称", - "dlg.item-req-name": "名称(不允许有间隔或数字)", - "dlg.item-name-error": "名称存在!", + "dlg.item-req-name": "名称(不允许有空格或数字)", + "dlg.item-name-error": "名称已存在!", "dlg.parameter-title": "参数", "dlg.tagname-title": "标签名称", "dlg.tagname-name": "标签名称", - "dlg.linkproperty-title": "制作超链接", + "dlg.linkproperty-title": "创建超链接", "dlg.linkproperty-url": "超链接URL", "dlg.login-title": "登录...", - "dlg.logout-btn": "签出", + "dlg.logout-btn": "退出登录", "dlg.ok": "确定", "dlg.cancel": "取消", "dlg.close": "关闭", + "dlg.apply": "应用", "dlg.userproperty-title": "用户", "dlg.userproperty-groups": "授权组", - "dlg.useraccess-groups": "授权 (空 = 对全体授权)", + "dlg.userproperty-roles": "授权角色", + "dlg.useraccess-groups": "授权(空=对所有人授权)", + "dlg.userproperty-language": "语言", + "dlg.userproperty-start": "起始视图", "dlg.gauge-permission-title": "授权", - "dlg.gauge-permission-label": "(空 = 对全体授权)", + "dlg.gauge-permission-label": "(空=对所有人授权)", "dlg.gauge-permission-show": "显示", "dlg.gauge-permission-enabled": "已启用", + "date.range-start": "开始日期", + "date.range-end": "结束日期", + + "general.search-up": "搜索", "general.close": "关闭", "general.search": "搜索...", - "general.search-notfound": "没有找到选项", + "general.search-notfound": "未找到选项", "general.username": "用户名", "general.fullname": "全名", "general.password": "密码", @@ -128,30 +167,67 @@ "general.align-center": "居中", "general.align-right": "右", "general-left": "左", - "General-top": "顶部", - "General-x": "X", + "general-top": "顶部", + "general-x": "X", "general-y": "Y", + "general.monday": "星期一", + "general.monday-short": "周一", + "general.tuesday": "星期二", + "general.tuesday-short": "周二", + "general.wednesday": "星期三", + "general.wednesday-short": "周三", + "general.thursday": "星期四", + "general.thursday-short": "周四", + "general.friday": "星期五", + "general.friday-short": "周五", + "general.saturday": "星期六", + "general.saturday-short": "周六", + "general.sunday": "星期日", + "general.sunday-short": "周日", + "general.save-template": "保存为模板", + "general.import-template": "从模板导入", "tester.title": "变量", "tester.send": "发送", - "item.navsode-none": "无", - "item.navsode-push": "推送", - "item.navsode-over": "结束", - "item.navsode-fix": "固定", + "item.overlaycolor-none": "无", + "item.overlaycolor-black": "黑色", + "item.overlaycolor-white": "白色", + + "item.navsmode-none": "无", + "item.navsmode-push": "推送", + "item.navsmode-over": "结束", + "item.navsmode-fix": "固定", "item.navtype-icons": "图标", "item.navtype-text": "文本", "item.navtype-icons-text-block": "图标和文本(块)", " item.navtype-icons-text-inline": "图标和文本(内联)", + "item.headertype-button": "按钮", + "item.headertype-label": "标签", + "item.headertype-image": "图片", + "item.headeranchor-left": "左", + "item.headeranchor-right": "右", + "item.headeranchor-center": "中间", + "item.notifymode-hide": "隐藏", "item.notifymode-fix": "固定", "item.notifymode-float": "推送", - "item.zoommod-disabled": "禁用的", - "item.zoomode-enabled": "手动", - "item.zoomode-autoresize": "自动调整大小", + "item.logininfo-type-nothing": "无", + "item.logininfo-type-username": "用户名", + "item.logininfo-type-fullname": "全名", + "item.logininfo-type-both": "用户名和全名", + + "item.language-show-mode-nothing": "隐藏", + "item.language-show-mode-simple": "显示", + "item.language-show-mode-key": "显示键值", + "item.language-show-mode-fullname": "显示全名", + + "item.zoommode-disabled": "禁用的", + "item.zoommode-enabled": "手动", + "item.zoommode-autoresize": "自动调整大小", "item.headerbarmode-hide": "隐藏", "item.headerbarmode-show": "显示", @@ -160,6 +236,7 @@ "item.inputmode-disabled": "已禁用", "item.inputmode-enabled": "对话框", "item.inputmode-keyboard": "虚拟键盘", + "item.inputmode-keyboard-full-screen": "虚拟键盘全屏", "chart.config-title": "图表设置", "chart.config-charts": "图表", @@ -175,12 +252,20 @@ "chart.config-rename": "重命名", "chart.config-delete": "删除", "chart.config-addline": "添加线", + "chart.config-addlinePlaceholder": "添加占位符", "chart.config-line-interpolation": "插值", "chart.config-line-fill": "填充", "chart.config-interpo-linear": "线性", "chart.config-interpo-stepAfter": "之后的步骤", "chart.config-interpo-stepBefore": "之前的步骤", - "chart.config-interpo-spline": "spline", + "chart.config-interpo-spline": "样条", + "chart.config-line-width": "线宽", + "chart.config-line-gap": "填充间隙", + "chart.config-line-add-zone": "添加区域", + "chart.config-line-zone-min": "最小", + "chart.config-line-zone-max": "最大", + "chart.config-line-zone-stroke": "描边", + "chart.config-line-zone-fill": "填充", "chart.property-data": "数据", "chart.property-props": "属性", @@ -192,9 +277,10 @@ "chart.property-realtime-max": "最大分钟数", "chart.viewtype-realtime1": "实时", "chart.viewtype-history": "历史", + "chart.viewtype-custom": "自定义", "chart.property-general": "常规", "chart.property-font": "字体", - "chart.property-font.titleize": "标题大小", + "chart.property-font.titlesize": "标题大小", "chart.property-font.axissize": "轴的大小", "chart.property-font.legendsize": "图例大小", "chart.property-theme": "主题", @@ -204,6 +290,10 @@ "chart.property-color.legend": "图例颜色", "chart.property-legend.mode": "图例显示模式", "chart.property-date-last-range": "日期范围", + "chart.property-refresh-interval": "刷新间隔(分钟)", + "chart.property-hide-toolbar": "隐藏工具栏", + "chart.property-thouch-zoom": "触摸缩放", + "chart.property-load-old-values": "加载历史", "chart.property-date.format": "日期格式", "chart.property-time.format": "时间格式", "chart.property-axis": "轴", @@ -211,9 +301,18 @@ "chart.property-axis-x": "标签", "chart.property-yaxis": "Y轴", "chart.property-axis-y1": "Y1标签", + "chart.property-axis-y1-min": "Y1最小", + "chart.property-axis-y1-max": "Y1最大", "chart.property-axis-y2": "Y2标签", + "chart.property-axis-y2-min": "Y2最小", + "chart.property-axis-y2-max": "Y2最大", "chart.property-axis-y3": "Y3标签", + "chart.property-axis-y3-min": "Y3最小", + "chart.property-axis-y3-max": "Y3最大", "chart.property-axis-y4": "Y4标签", + "chart.property-axis-y4-min": "Y4最小", + "chart.property-axis-y4-max": "Y4最大", + "chart.property-script": "脚本数据源", "chart.rangetype-last8h": "最后8小时", "chart.rangetype-last1d": "最后一天", @@ -225,9 +324,9 @@ "chart.legend-bottom": "底部", "chart.legend-never": "从不", - "chart.lags-serie": "Serie", - "chart.lags-time": "时间", - "chart.labsels-title": "标题", + "chart.labels-serie": "系列", + "chart.labels-time": "时间", + "chart.labels-title": "标题", "graph.config-title": "图表设置", "graph.config-rename": "重命名", @@ -247,6 +346,7 @@ "graph.bar-date-fnc-hour-integral": "小时总和(积分)", "graph.property-data": "数据", + "graph.property-name": "名称", "graph.property-general": "常规", "graph.property-title": "标题", "graph.property-title-font": "字体大小", @@ -259,7 +359,7 @@ "graph.property-date-last-range": "日期范围", "graph.property-date-group": "组", "graph.property-offline": "在线", - "graph.property-graph-oriantation": "方向", + "graph.property-graph-orientation": "方向", "graph.property-ori-vartical": "垂直", "graph.property-ori-horizontal": "水平", "graph.property-decimals": "小数", @@ -281,7 +381,7 @@ "graph.property-theme-owner": "自定义", "graph.property-theme-light": "明亮", "graph.property-theme-dark": "黑暗", - "graph.property-legend": "Legend", + "graph.property-legend": "图例", "graph.property-legend-display": "位置", "graph.property-legend-top": "顶部", "graph.property-legend-left": "左", @@ -293,7 +393,7 @@ "graph.property-legend-center": "中心", "graph.property-legend-start": "开始", "graph.property-legend-end": "结束", - "graph.property-legend-color": "Legend", + "graph.property-legend-color": "图例", "graph.property-border": "边框尺寸", "graph.property-tooltip": "显示工具提示", "graph.property-datalabels": "数据标签", @@ -306,6 +406,7 @@ "graph.rangetype-last1d": "最后一天", "graph.rangetype-last3d": "最后3天", "graph.rangetype-last1w": "最近一周", + "graph.rangetype-last1m": "上个月", "graph.grouptype-hours": "小时", "graph.grouptype-days": "天数", @@ -314,11 +415,20 @@ "iframe.property-address": "地址", "iframe.property-name": "名称", + "panel.property-data": "数据", + "panel.property-view-name": "视图名称", + "panel.property-name": "名称", + "panel.property-scalemode": "缩放模式", + "panel.property-scalemode-none": "无", + "panel.property-scalemode-contain": "包含", + "panel.property-scalemode-stretch": "拉伸", + "table.property-title": "数据表设置", "table.property-data": "数据", "table.property-date-last-range": "日期范围", "table.property-name": "名称", "table.property-type": "类型", + "table.property-type-with-realtime": "实时", "table.property-header": "表头", "table.property-header-height": "高度", "table.property-header-background": "背景", @@ -329,6 +439,7 @@ "table.property-row-background": "背景", "table.property-row-color": "颜色", "table.property-row-fontSize": "字体大小", + "table.property-selection": "选择", "table.property-layout": "布局", "table.property-filter": "过滤器", "table.property-paginator": "分页器", @@ -340,6 +451,9 @@ "table.property-gridline": "显示网格", "table.property-type-data": "数据表", "table.property-type-history": "历史表", + "table.property-type-alarms": "警报表", + "table.property-type-alarms-history": "警报历史表", + "table.property-type-reports": "报告表", "table.property-grid-color": "网格颜色", "table.property-cols": "列", "table.property-rows": "行", @@ -357,6 +471,10 @@ "table.customize-column-edit": "编辑列", "table.customize-column-add": "添加列", "table.customize-column-remove": "删除列", + "table.customize-column-left": "左移", + "table.customize-column-right": "右移", + "table.customize-row-up": "上移", + "table.customize-row-down": "下移", "table.customize-row-edit": "编辑行", "table.customize-row-add": "添加行", "table.customize-row-remove": "删除行", @@ -370,7 +488,7 @@ "table.cell-format": "格式", "table.cell-text": "文本", "table.cell-align-left": "左", - "table.cell-align-center": "中心", + "table.cell-align-center": "居中", "table.cell-align-right": "右", "table.history-filter": "过滤器", @@ -378,8 +496,26 @@ "table.rangetype-last1d": "最后一天", "table.rangetype-last3d": "过去3天", + "table.alarms-title": "警报表", + "table.alarms-history-title": "警报历史表", + "table.alarm-columns": "警报列", + "table.alarm-filter": "警报过滤器", + "table.alarm-priority": "优先级", + "table.alarm-tags": "标签", + + "table.reports-title": "报告表", + "table.report-columns": "报告列", + "table.report-view-name": "名称", + "table.report-view-ontime": "创建时间", + "table.report-view-download": "下载", + "table.report-view-delete": "删除", + "table.report-filter": "报告过滤器", + "table.report-filter-name": "名称", + "table.report-filter-count": "最大值", + "editor.view-svg": "画布/SVG", "editor.view-cards": "多视图容器", + "editor.view-maps": "Maps", "editor.views": "视图", "editor.resources": "资源", "editor.view-delete": "删除", @@ -420,11 +556,15 @@ "editor.controls-switch": "开关", "editor.controls-graphbar": "条形图", "editor.controls-graph-bar-settings": "条形图设置", + "editor.controls-graphpie": "Pie Graph", "editor.controls-graph-pie-settings": "饼图设置", "editor.controls-iframe": "内嵌网页", "editor.controls-iframe-settings": "内嵌网页设置", "editor.controls-table": "表", - "editor.controls-webcam": "监控", + "editor.header-item-settings": "页眉项设置", + "editor.controls-image": "图片(链接)", + "editor.controls-panel": "面板", + "editor.controls-panel-settings": "面板设置", "editor.layout-settings": "布局设置", @@ -434,6 +574,7 @@ "editor.interactivity-class": "class:", "editor.interactivity-class-title": "元素类", "editor.interactivity-name": "名称", + "editor.edit-bind-of-tags": "编辑标签绑定", "editor.cmenu-property": "属性", "editor.cmenu-cut": "剪切", @@ -451,6 +592,8 @@ "editor.cmenu-layer-delete": "删除图层", "editor.cmenu-layer-marge-down": "向下合并", "editor.cmenu-layer-marge-all": "全部合并", + "editor.cmenu-unlock": "解锁", + "editor.cmenu-lock": "锁定", "editor.transform": "定位", "editor.transform-x": "x", @@ -505,6 +648,8 @@ "editor.transform-change-image-title": "注意:这个图像不能被嵌入,它将取决于这个路径来显示", "editor.transform-angle": "角度", "editor.transform-angle-title": "改变旋转角度", + "editor.transform-hide": "隐藏", + "editor.transform-lock": "锁定", "editor.align": "对齐", "editor.align-left-title": "向左对齐", @@ -519,12 +664,12 @@ "editor.stroke-width-title": "改变边框宽度为1,按shift键改变为0.1", "editor.stroke-style": "边框风格", "editor.stroke-style-title": "改变边框破折号样式", - "editor.stroke-joinmiter-title": "Linejoin Miter", - "editor.stroke-joinround-title": "Linejoin Round", - "editor.stroke-joinbevel-title": "Linejoin Round", - "editor.stroke-capbutt-title": "Linejoin Bevel", - "editor.stroke-capsquare-title": "Linecap Square", - "editor.stroke-capround-title": "Linecap Round", + "editor.stroke-joinmiter-title": "线连接Miter", + "editor.stroke-joinround-title": "线连接圆", + "editor.stroke-joinbevel-title": "线连接圆", + "editor.stroke-capbutt-title": "线连接圆", + "editor.stroke-capsquare-title": "线连接圆", + "editor.stroke-capround-title": "线连接圆", "editor.stroke-shadow": "阴影", "editor.stroke-shadow-title": "有阴影", @@ -572,37 +717,61 @@ "editor.tools-hyperlink-title": "制作超链接", "editor.tools-svg-selector": "项目列表选择器", + "editor.settings-general": "常规", + "editor.settings-events": "事件", + "editor.settings-actions": "动作", + + "tags.ids-config-title": "标签-Ids参考", + "svg.selector.property-title": "查看项目列表", - "tutorial.editor-keyboard-shortcuts": "编辑器键盘快捷键", + "tutorial.editor-keyboard-shortcuts": "编辑器快捷键", "shapes.action-hide": "隐藏", "shapes.action-show": "显示", - "shapes.action-link": "闪烁", + "shapes.action-blink": "闪烁", "shapes.action-stop": "停止", "shapes.action-clockwise": "顺时针转动", "shapes.action-anticlockwise": "逆时针转弯", "shapes.action-downup": "向上和向下", "shapes.action-rotate": "旋转", + "shapes.action-refreshImage": "更新图像", + + "shapes.action-move": "移动", "shapes.event-click": "点击", + "shapes.event-dblclick": "双击", "shapes.event-mouseup": "鼠标松开", "shapes.event-mousedown": "鼠标按下", + "shapes.event-mouseover": "鼠标悬停", + "shapes.event-mouseout": "鼠标移出", + "shapes.event-enter": "进入", + "shapes.event-select": "选择", "shapes.event-onpage": "打开页面", "shapes.event-onwindow": "打开窗体", "shapes.event-ondialog": "打开对话框", "shapes.event-oniframe": "打开iframe", "shapes.event-oncard": "打开窗口", + "shapes.event-onopentab": "打开标签页", "shapes.event-onsetvalue": "设置值", "shapes.event-ontogglevalue": "切换值", "shapes.event-onsetinput": "从输入设置", "shapes.event-onclose": "关闭", + "shapes.event-onopen": "打开", "shapes.event-onrunscript": "运行脚本", "shapes.event-setvalue-set": "设置", "shapes.event-setvalue-add": "增加", "shapes.event-setvalue-remove": "减少", + "shapes.event-address-link": "链接", + "shapes.event-address-resource": "资源", "shapes.event-onmonitor": "监控", - - + "shapes.event-onViewToPanel": "设置视图到面板", + "shapes.event-onLoad": "加载", + "shapes.event-relativefrom-window": "窗口", + "shapes.event-relativefrom-mouse": "鼠标", + + "pipe.property-title": "管道设置", + "pipe.property-data": "数据", + "pipe.property-style": "样式", "pipe.property-props": "属性", "pipe.property-border-width": "边界宽度", "pipe.property-border-color": "边界颜色", @@ -612,28 +781,32 @@ "pipe.property-content-color": "内容的颜色", "pipe.property-content-space": "内容的破折号", "pipe.action-hide-content": "隐藏内容", + "pipe.property-style-animation": "动画图片", + "pipe.property-style-animation-image": "选择图片(SVG)", + "pipe.property-style-animation-count": "图片数量", + "pipe.property-style-animation-delay": "动画延迟(毫秒)", "slider.property-props": "属性", "slider.property-horizontal": "水平", "slider.property-vertical": "垂直", "slider.property-orientation": "方向", "slider.property-direction": "方向", - "slider.property-rtl": "rtl", - "slider.property-ltr": "ltr", + "slider.property-rtl": "从右到左", + "slider.property-ltr": "从左到右", "slider.property-min": "最小", "slider.property-max": "最大", - "slider.property-step": "步骤", + "slider.property-step": "步长", "slider.property-font": "字体", "slider.property-background": "背景", - "slider.property-scala": "Scala", + "slider.property-scala": "刻度", "slider.property-marker-color": "颜色", - "slider.property-subdivisions": "SubDivisions(%)", + "slider.property-subdivisions": "子分区(%)", "slider.property-subdivisions-height": "高度", "slider.property-subdivisions-width": "宽度", - "slider.property-divisions": "划分(%)", + "slider.property-divisions": "分区(%)", "slider.property-divisions-height": "高度", "slider.property-divisions-width": "宽度", - "slider.property-font-size": "Scala字体", + "slider.property-font-size": "刻度字体", "slider.property-tooltip": "工具提示", "slider.property-tooltip-none": "无", "slider.property-tooltip-hide": "隐藏", @@ -682,20 +855,25 @@ "device.list-min": "最小", "device.list-max": "最大", "device.list-value": "值", + "device.list-timestamp": "时间戳", + "device.list-description": "描述", "device.list-edit": "编辑标签", "device.list-add": "添加标签", "device.list-remove": "删除标签", "device.list-remove-all": "删除所有标签", "device.list-options": "标签选项", - "device.list-timestamp": "时间戳", - "device.list-description": "描述", + "device.list-clipboard": "复制标签对象到剪贴板", "device.list-direction":"方向", "devices.export": "导出设备", "devices.export-json": "JSON", "devices.export-csv": "CSV", "devices.import": "导入设备", - "devices.import-template": "导入设备模板", + "device.manage-templates": "管理模板", + "device.save-tags-to-template": "保存标签到模板", + "device.add-tags-from-template": "添加标签从模板", + "device.tags-template-name-title": "标签模板名称", + "devices.import-template": "导入连接模板", "device.property-client": "设备属性", "device.property-server": "FUXA服务器属性", "device.property-name": "名称", @@ -714,6 +892,7 @@ "device.property-remove": "删除设备", "device.property-add": "添加设备", "device.not-property-security": "没有安全和加密模式", + "device.property-connection-options": "连接选项", "device.property-port": "端口", "device.property-slave-id": "从属ID", "device.property-routing": "路由", @@ -725,14 +904,28 @@ "device.property-databits": "数据位", "device.property-stopbits": "停止位", "device.property-parity": "奇偶性", + "device.property-delay": "帧延迟(毫秒)", "device.property-method": "方法", "device.property-format": "格式", "device.property-internal": "仅限前端", - "device.property-url": "URL(http://[server]:[port])", + "device.property-url": "URL(http://[服务器]:[端口])", "device.property-webapi-result": "请求的结果", + "device.property-ads-target": "目标AmsNetId(例如192.168.1.10.1.1:851)", + "device.property-ads-local": "本地AmsNetId(例如192.168.1.10.1.1:32750)", + "device.property-ads-router": "路由器地址(例如192.168.1.120:48898)", "device.not-webapi-result": "配置WebAPI的结果", "device.property-show": "显示设备属性", "device.property-hide": "隐藏设备属性", + "device.property-interface-address": "接口和端口", + "device.property-interface-address-ph": "127.0.0.1:47808", + "device.property-broadcast-address": "广播", + "device.property-broadcast-address-ph": "127.0.0.255", + "device.property-adpu-timeout": "adpu超时", + "device.property-adpu-timeout-ph": "6000", + "device.property-certificate-section": "TLS证书", + "device.property-certificate": "证书", + "device.property-certificate-key": "私钥", + "device.property-certificate-ca": "CA证书", "device.security-none": "无", "device.security-sign": "签名", "device.security-signandencrypt": "签名和加密", @@ -740,8 +933,16 @@ "device.webapi-property-gettags": "URL GET标签", "device.webapi-property-posttags": "URL POST标签", "device.webapi-property-loadtags": "加载标签", - "device.property-socket-reuse": "Socket复用", - "device.property-socket-serial": "Socket串行", + "device.property-dsn": "数据源名称(DSN=数据库名称)", + "device.property-odbc-result": "找到的表的结果", + "device.not-odbc-result": "数据库表结果", + "device.add-device-templates-title": "设备模板", + "device.add-tags-templates-title": "标签模板", + "device.add-from-template": "从模板添加设备", + "device.manage-templates-title": "删除模板", + "device.template-device": "模板名称", + "device.template-tags": "模板名称", + "device.property-socket-reuse": "Socket重用", "device.browsetopics-property-title": "要订阅和发布的经纪人主题", "device.browsetopics-property-sub": "订阅", @@ -796,24 +997,44 @@ "device.tag-property-edge": "边缘", "device.tag-property-gpio": "GPIO编号", + "device.tag-array-id": "阵列ID:", "device.tag-array-value": "值:", "device-tag-dialog-title": "标签选择", "device.tag-options-title": "标签选项", - "device.tag-daq-enabled": "注册已启用", - "device.tag-daq-changed": "如果改变,保存值", - "device.tag-daq-interval": "保存值的时间间隔(秒)", - "device.tag-format": "格式化数字(2=#.##)", + "device.tag-daq-enabled": "注册启用", + "device.tag-daq-changed": "如果更改则保存", + "device.tag-daq-interval": "保存值间隔(秒)", + "device.tag-daq-restored": "恢复", + + "device.tag-format": "格式化数字(2 = #.##)", + "device.tag-deadband": "死区", "device.tag-scale": "刻度模式", "device.tag-scale-mode-undefined": "无缩放", "device.tag-scale-mode-undefined-tooltip": "标签值", - "device.tag-scale-mode-linear": "Linear: ΔS * (Value - RL) / ΔR + SL", + "device.tag-scale-mode-linear": "线性:ΔS * (Value - RL) / ΔR + SL", "device.tag-scale-mode-linear-tooltip": "ΔS = (Scaled High - Scaled Low)\nΔR = (Raw High - Raw Low)\nRL = Raw Low\nSL = Scaled Low", + "device.tag-scale-mode-script": "脚本(读/写)", "device.tag-raw-low": "原始低", "device.tag-raw-high": "原始高", "device.tag-scaled-low": "按比例的低", "device.tag-scaled-high": "按比例的高", + "device.tag-convert-datetime": "毫秒到日期时间格式", + "device.tag-convert-datetime-tooltip": "示例格式:'YYYY-MM-DD HH:mm:ss' 2023-09-14 08:45:10", + "device.tag-convert-datetime-format": "日期时间格式(YYYY-MM-DD HH:mm:ss)", + "device.tag-convert-ticktime": "毫秒到时间格式(剩余或持续时间)", + "device.tag-convert-ticktime-tooltip": "示例格式:'HH:mm:ss' 56:45:10", + "device.tag-convert-ticktime-format": "时间格式(HH:mm:ss)", + "device.tag-scale-read-script": "读取刻度脚本", + "device.tag-scale-read-script-tooltip": "从客户端接收值的脚本", + "device.tag-scale-read-script-params": "输入读取脚本参数值", + "device.tag-scale-write-script": "写入刻度脚本", + "device.tag-scale-write-script-tooltip": "写入客户端之前的值的脚本", + "device.tag-scale-write-script-params": "输入写入脚本参数值", + "device.tag-scale-script-params-tooltip": "传递给脚本的参数值的JSON格式化数组", + + "device.edit-placeholder-titel": "编辑占位符", "device.connect-ok": "OK", "device.connect-error": "错误", @@ -829,11 +1050,28 @@ "devices.list-polling": "轮询", "devices.list-enabled": "已启用", "devices.list-status": "状态", + "device.list-clipboard": "复制到剪贴板", + "users.list-title": "用户设置", "users.list-name": "用户名", "users.list-fullname": "全名", "users.list-groups": "群体", + "users.list-roles": "角色", + "users.list-start": "开始视图", + + "roles.list-title": "角色设置", + "roles.list-index": "索引", + "roles.list-name": "名称", + "roles.list-description": "描述", + + "user-role-edit-title": "角色设置", + "user-role-edit-name": "名称", + "user-role-edit-index": "索引", + "user-role-edit-description": "描述", + + "events-history.list-title": "事件历史", + "events-history.filter-daterange": "日期范围过滤", "gauges.property-props": "属性", "gauges.property-events": "事件", @@ -846,16 +1084,25 @@ "gauges.property-event-type": "类型", "gauges.property-event-action": "行动", "gauges.property-event-destination": "目的地", + "gauges.property-event-destination-relative-from": "相对位置", + "gauges.property-event-destination-panel": "面板", + "gauges.property-event-destination-hide-close": "隐藏关闭", + "gauges.property-event-destination-target-device": "目标设备", + "gauges.property-event-newtab": "新标签", + "gauges.property-event-single-card": "单个卡片", "gauges.property-event-value": "值", "gauges.property-event-function": "功能", "gauges.property-event-input": "输入(仅指有名称的输入)", + "gauges.property-event-address-type": "类型", "gauges.property-event-address": "链接", + "gauges.property-event-resource": "资源", "gauges.property-event-width": "宽度", "gauges.property-event-height": "高度", "gauges.property-event-scale": "规模", "gauges.property-event-script": "脚本", "gauges.property-event-script-param-name": "参数", "gauges.property-event-script-param-value": "值", + "gauges.property-event-script-param-input-value": "留空以发送输入的值", "gauges.property-head-device": "设备", "gauges.property-head-variable": "变量", "gauges.property-variable-value": "值", @@ -872,7 +1119,27 @@ "gauges.property-input-value": "值", "gauges.property-input-label": "标签", "gauges.property-input-unit": "单位", + "gauges.property-input-type": "输入类型", + "gauges.property-input-type-number": "数字", + "gauges.property-input-type-text": "文本", + "gauges.property-input-type-date": "日期", + "gauges.property-input-type-time": "时间", + "gauges.property-input-type-datetime": "日期和时间", + "gauges.property-input-time-format": "时间格式", + "gauges.property-input-time-format-normal": "HH:mm", + "gauges.property-input-time-format-seconds": "HH:mm:ss", + "gauges.property-input-time-format-milliseconds": "HH:mm:ss:fff", + "gauges.property-input-milliseconds": "转换为毫秒", + "gauges.property-input-convertion": "转换", + "gauges.property-input-convertion-milliseconds": "毫秒", + "gauges.property-input-convertion-string": "字符串", + "gauges.property-update-enabled": "启用更新", + "gauges.property-update-esc": "ESC更新", + "gauges.property-input-esc-action": "离开时执行", + "gauges.property-action-esc-update": "更新(刷新)", + "gauges.property-action-esc-enter": "确认(回车)", + "gauges.property-select-content-on-click": "点击时选择内容", "gauges.property-numeric-enabled": "只有数字", "gauges.property-format-digits": "格式化数字", "gauges.property-actions": "行动", @@ -880,6 +1147,9 @@ "gauges.property-action-param": "行动标识", "gauges.property-action-minAngle" : "最小角度", "gauges.property-action-maxAngle" : "最大角度", + "gauges.property-action-toX" : "到位置X", + "gauges.property-action-toY" : "到位置Y", + "gauges.property-action-duration" : "持续时间", "gauges.property-events-mapping-from": "上下文变量", "gauges.property-map-variable": "添加上下文变量进行绑定", "gauges.property-head-remove-mapvariable": "删除绑定", @@ -888,6 +1158,7 @@ "gauges.property-tag-label": "标签", "gauges.property-tag-internal-title": "设置一个内部设备的标签", "gauges.property-input-range": "允许的输入范围", + "gauges.property-language-text": "文本或@文本ID", "bag.property-ticks": "刻", "bag.property-divisions": "划分", @@ -920,6 +1191,7 @@ "bag.property-format-digits": "小数位数", "bag.property-zones": "区域", "bag.property-color": "颜色", + "bag.property-fill": "Fill", "alarms.list-title": "警报器设置", "alarms.list-name": "名称", @@ -938,6 +1210,7 @@ "alarm.property-info": "信息", "alarm.property-action": "行动", "alarm.property-enabled": "已启用", + "alarm.property-save-event": "事件", "alarm.property-min": "最小", "alarm.property-max": "最大", "alarm.property-timedelay": "时间延迟(秒)", @@ -959,6 +1232,8 @@ "alarms.view-offtime": "关闭日期/时间", "alarms.view-acktime": "ACK日期/时间", "alarms.view-userack": "ACK用户", + "alarms.view-ack": "ACK", + "alarms.view-ack-all-alarms": "ACK所有警报", "alarm.status-active": "活跃", "alarm.status-passive": "被动", "alarm.status-active-ack": "Active-ACK", @@ -967,10 +1242,14 @@ "alarm.action-popup": "显示弹幕", "alarm.action-onsetview": "设置视图", "alarm.action-onsetvalue": "设置值", + "alarm.action-onRunScript": "运行脚本", + "alarm.action-toastMessage": "显示消息", "alarm.action-sendMsg": "发送消息", "alarm.property-action-type": "行动类型", "alarm.property-action-value": "要设置的值", "alarm.property-action-destination": "要显示的视图", + "alarm.property-action-toastMessage": "要显示的消息", + "alarm.property-action-toastType": "类型", "notifications.list-title": "通知设置", "notifications.list-name": "名称", @@ -1004,34 +1283,115 @@ "script.permission-label": "(空 = 对全体)", "script.permission-enabled": "已启用", + "script.create-title": "创建脚本", + "script.mode": "执行模式", "script.mode-title": "执行模式", "script.mode-label": "(默认:服务器)", + "script.mode-CLIENT": "客户端(在浏览器中执行)", + "script.mode-SERVER": "服务器(在服务器中执行)", "script.property-title": "脚本", "script.property-systems": "系统功能", + "script.property-templates": "模板", "script.property-test": "测试", "script.property-test-params": "功能参数", "script.property-test-console": "控制台", "script.property-test-tag": "设置标签", "script.property-test-run": "运行TEST", "script.property-editname": "编辑脚本名称", + "script.property-name": "名称", "script.property-addfnc-param": "添加脚本参数", + "script.property-async-function": "异步函数", "script.param-title": "脚本参数", "script.param-name": "名称", "script.param-type": "类型", "script.paramtype": "", "script.paramtype-tagid": "标签ID", - "script.paramtype-value": "值(数字或字符串)", + "script.paramtype-value": "值(数字/字符串/对象)", + "script.paramtype-chart": "图表线(数组)", "script.param-name-exist": "参数名称已经存在!", "script.sys-fnc-settag-text": "$setTag (TagID, value)", "script.sys-fnc-settag-tooltip": "设置标签值的系统函数:$setTag (TagID为字符串,值为字符串或数字)", "script.sys-fnc-gettag-text": "$getTag (TagID)", "script.sys-fnc-gettag-tooltip": "获取Tag值的系统函数:$getTag (TagID为字符串) 返回值为字符串或数字", "script.scheduling-title": "脚本调度", - "script.scheduling-interval": "间隔时间,以秒为单位", + "script.scheduling-type": "类型", + "script.scheduling-interval": "循环间隔", + "script.scheduling-start": "仅在启动时", + "script.scheduling-add-item": "添加调度器", + "script.scheduling-scheduling": "调度", + "script.scheduling-weekly": "每周", + "script.scheduling-date": "日期", + "script.scheduling-time": "时间", + "script.scheduling-hour": "小时", + "script.scheduling-minute": "分钟", + "script.interval": "间隔(秒)", + "script.delay": "延迟(秒)", "script.sys-fnc-setview-text": "$setView(视图名称)", "script.sys-fnc-setview-tooltip": "在客户端设置视图的系统函数:$setView(视图名称为字符串)", + "script.sys-fnc-setview-params": "'View name'", + "script.sys-fnc-opencard-text": "$openCard (View name)", + "script.sys-fnc-opencard-tooltip": "System function to open Card on client: $openCard (View name as string, Options as dict {left, top})", + "script.sys-fnc-opencard-params": "'View name'", + "script.sys-fnc-enableDevice-text": "$enableDevice (Device name, enable True/False)", + "script.sys-fnc-enableDevice-tooltip": "System function to enable Device connection: $enableDevice (Device name as string, enable as boolean)", + "script.sys-fnc-enableDevice-params": "'Device name', true", + "script.sys-fnc-getDevice-text": "$getDevice (Device name, interface True/False)", + "script.sys-fnc-getDevice-tooltip": "System function to get Device object: $getDevice (Device name as string, get Comm Interface as boolean)", + "script.sys-fnc-getDevice-params": "'Device name', true", + "script.sys-fnc-setAdapterToDevice-text": "$setAdapterToDevice(Adapter name, Device name)", + "script.sys-fnc-setAdapterToDevice-tooltip": "System function to bind Adapter (internal Device) to a Device: $setAdapterToDevice (Adapter name as string, Device name as string)", + "script.sys-fnc-setAdapterToDevice-params": "'Adapter name', 'Device name'", + "script.sys-fnc-resolveAdapterTagId-text": "$resolveAdapterTagId(TagID)", + "script.sys-fnc-resolveAdapterTagId-tooltip": "System function to get Tag ID of Device dind to Adapter (internal Device): $resolveAdapterTagId (TagID as string)", + "script.sys-fnc-resolveAdapterTagId-params": "'TagID of Adapter'", + "script.sys-fnc-getTagId-text": "$getTagId (Tag name, [Device name])", + "script.sys-fnc-getTagId-tooltip": "System function to get Tag ID: $getTagId (Tag name as string, [Optional Device name as string])", + "script.sys-fnc-getTagId-params": "'Tag name', ", + "script.sys-fnc-getTagDaqSettings-text": "$getTagDaqSettings (TagID)", + "script.sys-fnc-getTagDaqSettings-tooltip": "System function to get Tag DAQ settings: $getTagDaqSettings (TagID as string)", + "script.sys-fnc-getTagDaqSettings-params": "'TagID'", + "script.sys-fnc-setTagDaqSettings-text": "$setTagDaqSettings (TagID, DaqSettings)", + "script.sys-fnc-setTagDaqSettings-tooltip": "System function to set Tag DAQ settings: $setTagDaqSettings (TagID as string, DaqSettings as object {restored: boolean, enabled: boolean, changed: boolean, interval: number, lastDaqSaved: number} )", + "script.sys-fnc-setTagDaqSettings-params": "'TagID', 'DaqSettings'", + "script.sys-fnc-invokeObject-text": "$invokeObject (Object name, Function name, [Parameter])", + "script.sys-fnc-invokeObject-tooltip": "System function to call Object function: $invokeObject (Object name as string, function name as string , [parameter])", + "script.sys-fnc-invokeObject-params": "'Object name', 'function name', ", + "script.sys-fnc-runServerScript-text": "$runServerScript (Script name, [Parameter])", + "script.sys-fnc-runServerScript-tooltip": "Client function to call Server script function: $runServerScript (Script name as string, [parameter])", + "script.sys-fnc-runServerScript-params": "'Server script name', ", + "script.sys-fnc-getDeviceProperty-text": "$getDeviceProperty(Device name)", + "script.sys-fnc-getDeviceProperty-tooltip": "System function to get Device property: $getDeviceProperty(Device name as string)", + "script.sys-fnc-getDeviceProperty-params": "'Device name'", + "script.sys-fnc-setDeviceProperty-text": "$setDeviceProperty(Device name, property)", + "script.sys-fnc-setDeviceProperty-tooltip": "System function to set Device property: $setDeviceProperty(Device name as string, Property as object {address, port, ...} )", + "script.sys-fnc-setDeviceProperty-params": "'Device name', 'Property'", + "script.sys-fnc-getHistoricalTag-text": "$getHistoricalTags(TagIds array, from msec., to msec.)", + "script.sys-fnc-getHistoricalTag-tooltip":"get historical tags by milliseconds range: $getHistoricalTags([TagIds] as array, from as number, to as number)", + "script.sys-fnc-getHistoricalTag-params":"'Tag Ids array', 'From msec.', 'To msec.'", + "script.sys-fnc-sendMessage-text": "$sendMessage(address, subject, message)", + "script.sys-fnc-sendMessage-tooltip": "System function to send Message (Mail): $sendMessage(address as string, subject as string, message as string)", + "script.sys-fnc-sendMessage-params": "'address', 'subject', 'message'", + "script.sys-fnc-getAlarms-text": "$getAlarms()", + "script.sys-fnc-getAlarms-tooltip": "System function to get alarms list (): $getAlarms()", + "script.sys-fnc-getAlarms-params": "", + "script.sys-fnc-getAlarmsHistory-text": "$getAlarmsHistory(from msec., to msec.)", + "script.sys-fnc-getAlarmsHistory-tooltip": "System function to get historical alarms list (): $getAlarmsHistory(from as number, to as number)", + "script.sys-fnc-getAlarmsHistory-params": "'From msec.', 'To msec.'", + "script.sys-fnc-ackAlarms-text": "$ackAlarm(Alarm name, types)", + "script.sys-fnc-ackAlarms-tooltip": "System function to ACK alarm (): $ackAlarm(Alarm name as string, [types] 'highhigh|high|low')", + "script.sys-fnc-ackAlarms-params": "'Alarm name', 'types'", + + "script.template-chart-data-text": "自定义图表数据", + "script.template-chart-data-tooltip": "返回自定义图表数据的代码模板", + "script.template-invoke-chart-update-options-text": "更新图表选项", + "script.template-invoke-chart-update-options-tooltip": "更新图表选项(Y轴刻度范围)。仅限客户端模式!", + "script.template-getHistoricalTagsoptions-text": "获取历史标签值", + "script.template-getHistoricalTagsoptions-tooltip": "获取历史标签值的代码模板。", + + "client.script-access-title": "客户端脚本访问", + "client.script-access-info": "通过window.fuxaScriptAPI配置对前端(例如小部件)的系统函数访问。", "reports.list-title": "报告设置", "reports.list-name": "名称", @@ -1097,11 +1457,34 @@ "report.item-alarms-title": "报告报警", "report.alarms-priority": "警报优先级", "report.alarms-column": "警报列", + "report.alarms-filter": "Alarms filter", "report.chart-title": "报告图表", "report.chart-name": "图表名称", "report.chart-width": "宽度", "report.chart-height": "高度", + "maps.locations-list-title": "位置设置", + "maps.locations-list-name": "名称", + "maps.locations-list-view": "视图", + "maps.locations-list-description": "描述", + "maps.location-property-title": "位置", + "maps.location-property-name": "名称", + "maps.location-property-description": "描述", + "maps.location-property-latitude": "纬度", + "maps.location-property-longitude": "经度", + "maps.location-property-card": "卡片", + "maps.location-property-view": "视图", + "maps.location-property-url": "URL", + "maps.edit-add-location": "添加位置", + "maps.edit-import-location": "导入位置", + "maps.edit-edit-location": "编辑位置", + "maps.edit-remove-location": "删除位置", + "maps.edit-start-location": "设为起始位置", + "maps.edit-start-location-saved": "起始位置已保存", + "maps.close-popups": "关闭所有弹窗", + "maps.location-to-import": "要导入的位置", + "maps.location-to-import-input-title": "选择要导入的位置", + "logs.view-title": "系统日志", "logs.view-files": "日志文件", @@ -1120,15 +1503,33 @@ "card.widget-iframe": "链接", "card.style-zoom": "缩放", + "resources.lib-icons": "图标", "resources.lib-images": "图片", - - "text.list-title": "文本设置", - "text.list-filter": "过滤器", - "text.list-filter-group": "组", - "text.list-id": "ID", - "text.list-group": "组", - "text.list-value": "文本", - + "resource.list-title": "资源列表", + "resource.list-name": "文件名称", + "resource.list-type": "文件类型", + "resource.list-title-fonts": "字体列表", + "resources.lib-widgets": "小部件", + + "widgets.kiosk-title": "小部件", + "widget.remove": "删除小部件", + + "texts.list-title": "文本设置", + "texts.list-filter": "过滤器", + "texts.list-filter-group": "组", + "texts.list-id": "ID", + "texts.list-group": "组", + "texts.list-value": "文本", + "texts.list-add-text": "添加文本", + "texts.list-edit-language": "编辑语言", + "language.settings-title": "语言设置", + "language.settings-add-tooltip": "添加语言", + "language.settings-id": "键", + "language.settings-default-id": "键(默认)", + "language.settings-id-placeholder": "例如:EN", + "language.settings-name": "名称", + "language.settings-default-name": "名称(默认)", + "language.settings-name-placeholder": "例如:英语", "text.settings-title": "文本", "text.settings-id": "ID", "text.settings-group": "组", @@ -1141,12 +1542,15 @@ "gui.range-number-false": "假 [0-0]", "gui.range-number-switcher": "范围为数字或布尔值", - "dlg.bitmask-title": "Bitmask", + "dlg.bitmask-title": "位掩码", - "dlg.plugins-title": "插件", + "dlg.plugins-title": "服务器插件", + "dlg.plugins-info": "未安装的插件可以在服务器上手动安装:'npm install [package name]@[version]'", + "dlg.plugins-type": "类型", "dlg.plugins-name": "名称", "dlg.plugins-version": "版本", "dlg.plugins-current": "已安装", + "dlg.plugins-description": "描述", "dlg.plugins-status-installing": "正在安装...", "dlg.plugins-status-removing": "正在删除...", "dlg.plugins-status-installed": "正在安装...OK!", @@ -1161,16 +1565,23 @@ "dlg.setup-views": "视图", "dlg.setup-connections": "连接", "dlg.setup-users": "用户", + "dlg.setup-user-roles": "角色", "dlg.setup-alarms": "警报", "dlg.setup-line-charts": "线形图", "dlg.setup-bar-charts": "条形图", + "dlg.setup-maps-locations": "位置", "dlg.setup-layout": "布局", "dlg.setup-plugins": "插件", "dlg.setup-scripts": "脚本", "dlg.setup-reports": "报告", "dlg.setup-settings": "设置", + "dlg.setup-client-access": "前端脚本", "dlg.setup-logs": "日志", "dlg.setup-notifications": "通知", + "dlg.setup-events": "事件", + "dlg.setup-resources": "资源", + "dlg.setup-fonts": "字体", + "dlg.setup-language": "语言", "dlg.app-settings-title": "设置", "dlg.app-settings-system": "系统", "dlg.app-settings-smtp": "SMTP", @@ -1182,24 +1593,30 @@ "dlg.app-settings-smtp-testaddress": "发送测试信息的电子邮件", "dlg.app-settings-smtp-test": "测试", "dlg.app-settings-language": "语言", + "dlg.app-language-de": "German", "dlg.app-language-en": "English", "dlg.app-language-ru": "Русский", "dlg.app-language-ua": "Українська", "dlg.app-language-zh-cn": "中文", "dlg.app-language-pt": "Português", + "dlg.app-language-sv": "Swedish", "dlg.app-language-tr": "Türkçe", "dlg.app-language-ko": "한국어", "dlg.app-language-es": "Español", "dlg.app-language-fr": "Français", "dlg.app-settings-server-port": "服务器正在监听端口", + "dlg.app-settings-server-log-full": "日志全模式", + "dlg.app-settings-alarms": "警报", "dlg.app-settings-alarms-clear": "清除所有警报和历史记录", "dlg.app-settings-auth-token": "使用令牌进行认证", + "dlg.app-settings-auth-only-editor": "仅用于编辑器", "dlg.app-auth-disabled": "已禁用", "dlg.app-auth-expiration-15m": "已启用,令牌15分钟后失效", "dlg.app-auth-expiration-1h": "已启用,令牌将在1小时后过期,", "dlg.app-auth-expiration-3h": "已启用,令牌将在3小时后过期,", "dlg.app-auth-expiration-1d": "已启用,令牌将在1天内到期,", "dlg.app-auth-tooltip": "已启用: 你有一个管理员账户 'admin/123456' (请不要忘记修改). 需要重新启动服务器!", + "dlg.app-settings-client-broadcast": "广播到客户端(前端)所有标签值", "dlg.app-settings-daqstore": "DAQ存储", "dlg.app-settings-daqstore-type": "数据库类型", @@ -1208,6 +1625,14 @@ "dlg.app-settings-daqstore-bucket": "Bucket", "dlg.app-settings-daqstore-organization": "组织", "dlg.app-settings-daqstore-retention": "保留", + "dlg.app-settings-daqstore-database": "数据库名称", + "dlg.app-settings-daqstore-username": "用户名", + "dlg.app-settings-daqstore-password": "密码", + + "dlg.app-settings-user-group-label": "授权类型", + "dlg.app-settings-user-group": "组(默认)", + "dlg.app-settings-user-roles": "角色", + "store.retention-none": "禁用", "store.retention-day1": "1天", "store.retention-days2": "2天", @@ -1217,7 +1642,18 @@ "store.retention-days30": "30天", "store.retention-days90": "90天", "store.retention-year1": "1年", + "store.retention-year3": "3年", + "store.retention-year5": "5年", + + "plugin.group-connection-device": "连接设备", + "plugin.group-connection-database": "连接数据库", + "plugin.group-chart-report": "报告图表", + + "action-settings-title": "操作设置", + "action-settings-readonly-tag": "标签", + "action-settings-readonly-values": "值", + "msg.alarm-ack-all": "您是否想确认所有警报?", "msg.alarm-remove": "您是否想删除警报", "msg.text-remove": "您是否想删除文本", "msg.alarmproperty-error-exist": "警报名称存在!", @@ -1227,15 +1663,20 @@ "msg.device-remove": "您是否想删除设备", "msg.device-tag-remove": "您是否想删除标签", "msg.device-tag-exist": "标签名称存在!", + "msg.device-tag-invalid-char": "不允许在标签名称中使用'@'字符!", "msg.notification-property-missing-value": "一些数值丢失!", "msg.report-property-missing-value": "有不正确或缺失的值!", + "msg.file-upload-failed": "上传失败!", + "msg.file-delete-failed": "删除文件失败!", - "msg.home-welcome": "等待......去编辑器,映射设备,设计你的可视化并绑定设备的变量", + "msg.home-welcome": "请稍候......去编辑器,映射设备,设计你的可视化并绑定设备的变量", + "msg.server-connection-failed": "服务器连接失败!", "msg.project-load-error": "无法读取'{{value}}'", "msg.project": "您想保存项目的变化吗?", "msg.tags-remove-all": "您想删除所有标签吗?", "msg.view-remove": "您是否想删除视图'{{value}}'?", "msg.chart-remove": "您想删除图表'{{value}}'吗?", + "msg.role-remove": "您是否想删除角色'{{value}}'?", "msg.graph-remove": "您想删除条形图'{{value}}'吗?", "msg.script-remove": "您想删除脚本'{{value}}'吗?", "msg.report-remove": "您是否想删除报告", @@ -1248,16 +1689,32 @@ "msg.project-save-success": "项目保存成功!", "msg.project-save-error": "项目保存失败!", "msg.project-format-error": "项目格式错误!", + "msg.view-format-error": "视图格式错误!", "msg.project-save-unauthorized": "项目保存失败! 未经授权!", "msg.project-save-ask": "你想离开这个项目吗?", "msg.login-username-required": "输入一个用户名", "msg.login-password-required": "输入一个密码", "msg.signin-failed": "未经授权", + "msg.signin-unauthorized": "未经授权!", "msg.get-project-void": "没有找到项目!", "msg.editor-mode-locked": "编辑器已经打开!", "msg.alarms-clear-success": "所有警报已被取消!", "msg.import-devices-error": "导入设备失败!", "msg.report-build-forced": "发送构建报告成功", "msg.report-build-error": "发送构建报告失败!", - "msg.device-tags-request-result": "加载 {{value}} 的 {{current}}" + "msg.device-tags-request-result": "加载 {{current}} / {{value}}", + "msg.chart-with-script": "定义的脚本接收图表线列表作为参数,然后返回带有数据的完成列表。脚本'模板'中的代码示例", + "msg.script-name-exist": "脚本名称存在!", + "msg.invalid-script-name": "无效的脚本名称!", + "msg.templates-exist-ask-overwrite": "名称'{{value}}'的模板已经存在。您是否想覆盖它?", + "msg.templates-save-success": "模板保存成功!", + "msg.view-name-exist": "视图名称存在!", + "msg.notification-name-exist": "通知名称存在!", + "msg.file-remove": "您是否想删除'{{value}}'?", + "msg.notification-remove": "您是否想删除通知'{{value}}'?", + "msg.maps-location-remove": "您是否想删除位置'{{value}}'?", + "msg.maps-location-name-exist": "位置名称已经存在!", + "msg.text-name-exist": "文本名称已经存在!", + "msg.texts-text-remove": "您是否想删除文本'{{value}}'?", + "msg.operation-unauthorized": "操作未经授权!" } diff --git a/client/src/assets/i18n/zh-tw.json b/client/src/assets/i18n/zh-tw.json new file mode 100644 index 000000000..7a288cfb0 --- /dev/null +++ b/client/src/assets/i18n/zh-tw.json @@ -0,0 +1,1718 @@ +{ + "with param": "示例 {{value}}", + + "app.home": "首頁", + "app.lab": "實驗室", + "app.editor": "編輯器", + + "header.new-project": "新建專案", + "header.save-project": "儲存專案", + "header.save-project-tooltip": "儲存所有未完成的專案修改", + "header.saveas-project": "將專案另存為...", + "header.rename-project": "重新命名專案", + "header.open-project": "開啟專案", + "header.edit-project": "編輯專案", + "header.edit-views": "視圖編輯器", + "header.edit-devices": "裝置設定", + "header.edit-charts": "圖表設定", + "header.edit-layout": "版面設定", + "header.edit-plugins": "外掛", + "header.edit-users": "使用者設定", + "header.edit-alarms": "警報設定", + "header.edit-texts": "文字設定", + "header.help": "FUXA 說明", + "header.help-tutorial": "教學", + "header.help-info": "關於", + "header.change-thema": "切換主題(beta)", + "header.info-version": "版本", + "header.theme": "主題 亮/暗", + + "project.name": "專案名稱", + + "sidenav.title": "FUXA", + + "tutorial.title": "FUXA 教學", + + "dlg.info-title": "FUXA", + + "dlg.layout-title": "版面設定", + "dlg.layout-general": "一般", + "dlg.layout-lbl-auto-resize": "自動調整大小", + "dlg.layout-lbl-logo": "Logo", + "dlg.layout-lbl-icon": "圖示", + "dlg.layout-lbl-sview": "啟動視圖", + "dlg.layout-lbl-login-start": "啟動時顯示登入", + "dlg.layout-lbl-login-overlay-color": "覆蓋顏色", + "dlg.layout-lbl-zoom": "縮放", + "dlg.layout-navigation-mode": "顯示導覽", + "dlg.layout-connection-message": "顯示連線錯誤(Toast)", + "dlg.layout-show-dev": "顯示按鈕", + "dlg.layout-navigation": "導覽側選單", + "dlg.layout-nav-bkcolor": "背景色", + "dlg.layout-nav-fgcolor": "前景色", + "dlg.layout-lbl-smode": "側欄模式", + "dlg.layout-lbl-type": "類型", + "dlg.layout-header": "頁首導覽列", + "dlg.layout-header-bkcolor": "背景顏色", + "dlg.layout-header-fgcolor": "顏色", + "dlg.layout-lbl-title": "標題", + "dlg.layout-lbl-alarms": "警報通知模式", + "dlg.layout-lbl-datetime": "時間與日期格式(dd/MM/yyyy - hh:mm a)", + "dlg.layout-lbl-infos": "資訊通知模式", + "dlg.layout-lbl-font": "字型族", + "dlg.layout-lbl-font-size": "字型大小", + "dlg.layout-lbl-anchor": "方向", + "dlg.layout-lbl-margin-left": "左邊距", + "dlg.layout-lbl-margin-right": "右邊距", + "dlg.layout-lbl-login-info": "登入資訊", + "dlg.layout-lbl-custom-styles": "自訂樣式", + "dlg.layout-lbl-show-language": "顯示語言", + + "dlg.menuitem-title": "選單項目", + "dlg.menuitem-image": "[我的圖片...]", + "dlg.menuitem-icon": "圖示", + "dlg.menuitem-text": "文字", + "dlg.menuitem-view": "點擊開啟視圖", + "dlg.menuitem-link": "點擊開啟連結", + "dlg.menuitem-alarms": "點擊顯示警報", + "dlg.menuitem-address": "連結位址", + "dlg.menuitem-icons-filter": "圖示篩選", + + "dlg.headeritem-title": "頁首項目", + "dlg.headeritem-icon": "圖示", + "dlg.headeritem-icons-filter": "圖示篩選", + + "dlg.docproperty-title": "視圖屬性", + "dlg.docproperty-name": "名稱", + "dlg.docproperty-width": "寬度", + "dlg.docproperty-height": "高度", + "dlg.docproperty-background": "背景", + "dlg.docproperty-size": "尺寸預設", + "dlg.docproperty-select": "選擇一個尺寸", + "dlg.docproperty-size-320-240": "320 x 240 像素", + "dlg.docproperty-size-460-360": "460 x 360 像素", + "dlg.docproperty-size-640-480": "640 x 480 像素", + "dlg.docproperty-size-800-600": "800 x 600 像素", + "dlg.docproperty-size-1024-768": "1024 x 768 像素", + "dlg.docproperty-size-1280-960": "1280 x 960 像素", + "dlg.docproperty-size-1600-1200": "1600 x 1200 像素", + "dlg.docproperty-size-1920-1080": "1920 x 1080 像素", + "dlg.docproperty-margin": "邊距", + "dlg.docproperty-align": "對齊", + "dlg.docproperty-align-placeholder": "頁面上的對齊方式", + "dlg.docproperty-align-topCenter": "頂部", + "dlg.docproperty-align-middleCenter": "中間", + "dlg.docproperty-gridtype": "網格類型", + "dlg.docproperty-gridtype-placeholder": "網格版面類型", + "dlg.docproperty-gridtype-fit": "適應", + "dlg.docproperty-gridtype-scrollVertical": "垂直捲動", + "dlg.docproperty-gridtype-scrollHorizontal": "水平捲動", + "dlg.docproperty-gridtype-fixed": "固定", + "dlg.docproperty-gridtype-verticalFixed": "垂直固定", + "dlg.docproperty-gridtype-horizontalFixed": "水平固定", + "dlg.docproperty-renderDelay": "視圖渲染延遲(毫秒)", + + "dlg.docname-title": "視圖名稱", + "dlg.docname-name": "名稱", + "dlg.docproperty-type": "視圖類型", + "dlg.item-title": "名稱", + "dlg.item-name": "名稱", + "dlg.item-req-name": "名稱(不允許有空白或數字)", + "dlg.item-name-error": "名稱已存在!", + "dlg.parameter-title": "參數", + + "dlg.tagname-title": "標籤名稱", + "dlg.tagname-name": "標籤名稱", + + "dlg.linkproperty-title": "建立超連結", + "dlg.linkproperty-url": "超連結 URL", + + "dlg.login-title": "登入...", + "dlg.logout-btn": "登出", + + "dlg.ok": "確定", + "dlg.cancel": "取消", + "dlg.close": "關閉", + "dlg.apply": "套用", + + "dlg.userproperty-title": "使用者", + "dlg.userproperty-groups": "授權群組", + "dlg.userproperty-roles": "授權角色", + "dlg.useraccess-groups": "授權(空白 = 對所有人授權)", + "dlg.userproperty-language": "語言", + "dlg.userproperty-start": "起始視圖", + + "dlg.gauge-permission-title": "授權", + "dlg.gauge-permission-label": "(空白 = 對所有人授權)", + "dlg.gauge-permission-show": "顯示", + "dlg.gauge-permission-enabled": "已啟用", + + "date.range-start": "開始日期", + "date.range-end": "結束日期", + + "general.search-up": "搜尋", + "general.close": "關閉", + "general.search": "搜尋...", + "general.search-notfound": "未找到選項", + "general.username": "使用者名稱", + "general.fullname": "全名", + "general.password": "密碼", + "general.clientId": "用戶端 ID", + "general.authority": "權限", + "general.grant-type": "授權類型", + "general.usergroups": "查看者、操作員、工程師、監督員、經理、F、G、管理員", + "general.enabled": "已啟用", + "general.disabled": "已停用", + "general.align-left": "左", + "general.align-center": "置中", + "general.align-right": "右", + "general-left": "左", + "general-top": "頂部", + "general-x": "X", + "general-y": "Y", + "general.monday": "星期一", + "general.monday-short": "週一", + "general.tuesday": "星期二", + "general.tuesday-short": "週二", + "general.wednesday": "星期三", + "general.wednesday-short": "週三", + "general.thursday": "星期四", + "general.thursday-short": "週四", + "general.friday": "星期五", + "general.friday-short": "週五", + "general.saturday": "星期六", + "general.saturday-short": "週六", + "general.sunday": "星期日", + "general.sunday-short": "週日", + "general.save-template": "儲存為範本", + "general.import-template": "自範本匯入", + + "tester.title": "變數", + "tester.send": "送出", + + "item.overlaycolor-none": "無", + "item.overlaycolor-black": "黑色", + "item.overlaycolor-white": "白色", + + "item.navsmode-none": "無", + "item.navsmode-push": "推入", + "item.navsmode-over": "覆蓋", + "item.navsmode-fix": "固定", + + "item.navtype-icons": "圖示", + "item.navtype-text": "文字", + "item.navtype-icons-text-block": "圖示與文字(區塊)", + " item.navtype-icons-text-inline": "圖示與文字(行內)", + + "item.headertype-button": "按鈕", + "item.headertype-label": "標籤", + "item.headertype-image": "圖片", + "item.headeranchor-left": "左", + "item.headeranchor-right": "右", + "item.headeranchor-center": "中間", + + "item.notifymode-hide": "隱藏", + "item.notifymode-fix": "固定", + "item.notifymode-float": "浮動", + + "item.logininfo-type-nothing": "無", + "item.logininfo-type-username": "使用者名稱", + "item.logininfo-type-fullname": "全名", + "item.logininfo-type-both": "使用者名稱與全名", + + "item.language-show-mode-nothing": "隱藏", + "item.language-show-mode-simple": "顯示", + "item.language-show-mode-key": "顯示鍵值", + "item.language-show-mode-fullname": "顯示全名", + + "item.zoommode-disabled": "停用", + "item.zoommode-enabled": "手動", + "item.zoommode-autoresize": "自動調整大小", + + "item.headerbarmode-hide": "隱藏", + "item.headerbarmode-show": "顯示", + + "dlg.layout-input-dialog": "輸入欄位的對話模式", + "item.inputmode-disabled": "已停用", + "item.inputmode-enabled": "對話框", + "item.inputmode-keyboard": "虛擬鍵盤", + "item.inputmode-keyboard-full-screen": "虛擬鍵盤全螢幕", + + "chart.config-title": "圖表設定", + "chart.config-charts": "圖表", + "chart.config-devices": "裝置", + "chart.config-tags": "標籤", + "chart.config-lines": "圖-線", + "chart.config-line-name": "名稱", + "chart.config-line-label": "標籤", + "chart.config-line-yaxis": "Y 軸", + "chart.config-line-color": "顏色", + "chart.config-name-title": "圖表", + "chart.config-name": "名稱", + "chart.config-rename": "重新命名", + "chart.config-delete": "刪除", + "chart.config-addline": "新增線段", + "chart.config-addlinePlaceholder": "新增佔位符", + "chart.config-line-interpolation": "插值", + "chart.config-line-fill": "填滿", + "chart.config-interpo-linear": "線性", + "chart.config-interpo-stepAfter": "後序步進", + "chart.config-interpo-stepBefore": "前序步進", + "chart.config-interpo-spline": "樣條", + "chart.config-line-width": "線寬", + "chart.config-line-gap": "填滿間隙", + "chart.config-line-add-zone": "新增區域", + "chart.config-line-zone-min": "最小", + "chart.config-line-zone-max": "最大", + "chart.config-line-zone-stroke": "描邊", + "chart.config-line-zone-fill": "填滿", + + "chart.property-data": "資料", + "chart.property-props": "屬性", + "chart.property-layout": "版面", + "chart.property-name": "名稱", + "chart.property-chart": "要顯示的圖表", + "chart.property-newchart": "新圖表...", + "chart.property-chart-type": "顯示模式", + "chart.property-realtime-max": "最大分鐘數", + "chart.viewtype-realtime1": "即時", + "chart.viewtype-history": "歷史", + "chart.viewtype-custom": "自訂", + "chart.property-general": "一般", + "chart.property-font": "字型", + "chart.property-font.titlesize": "標題大小", + "chart.property-font.axissize": "軸尺寸", + "chart.property-font.legendsize": "圖例大小", + "chart.property-theme": "主題", + "chart.property-color.background": "背景", + "chart.property-color.text": "文字顏色", + "chart.property-color.grid": "網格顏色", + "chart.property-color.legend": "圖例顏色", + "chart.property-legend.mode": "圖例顯示模式", + "chart.property-date-last-range": "日期範圍", + "chart.property-refresh-interval": "重新整理間隔(分鐘)", + "chart.property-hide-toolbar": "隱藏工具列", + "chart.property-thouch-zoom": "觸控縮放", + "chart.property-load-old-values": "載入歷史", + "chart.property-date.format": "日期格式", + "chart.property-time.format": "時間格式", + "chart.property-axis": "軸", + "chart.property-xaxis": "X 軸", + "chart.property-axis-x": "標籤", + "chart.property-yaxis": "Y 軸", + "chart.property-axis-y1": "Y1 標籤", + "chart.property-axis-y1-min": "Y1 最小", + "chart.property-axis-y1-max": "Y1 最大", + "chart.property-axis-y2": "Y2 標籤", + "chart.property-axis-y2-min": "Y2 最小", + "chart.property-axis-y2-max": "Y2 最大", + "chart.property-axis-y3": "Y3 標籤", + "chart.property-axis-y3-min": "Y3 最小", + "chart.property-axis-y3-max": "Y3 最大", + "chart.property-axis-y4": "Y4 標籤", + "chart.property-axis-y4-min": "Y4 最小", + "chart.property-axis-y4-max": "Y4 最大", + "chart.property-script": "腳本資料來源", + + "chart.rangetype-last8h": "最近 8 小時", + "chart.rangetype-last1d": "最近一天", + "chart.rangetype-last3d": "最近 3 天", + "chart.rangetype-last1w": "最近一週", + + "chart.legend-always": "總是", + "chart.legend-follow": "跟隨", + "chart.legend-bottom": "底部", + "chart.legend-never": "從不", + + "chart.labels-serie": "序列", + "chart.labels-time": "時間", + "chart.labels-title": "標題", + + "graph.config-title": "圖表設定", + "graph.config-rename": "重新命名", + "graph.config-source-tag": "新增來源標籤", + "graph.config-source-name": "名稱", + "graph.config-source-label": "標籤", + "graph.config-category": "類別", + "graph.config-device": "裝置", + "graph.config-bar-color": "邊框", + "graph.config-bar-fill": "填滿", + "graph.property-xtype": "X 軸分類類型", + "graph.property-sources": "來源(標籤)", + "graph.bar-xtype-value": "數值", + "graph.bar-xtype-date": "日期與時間", + "graph.property-fnctype": "功能類型", + "graph.bar-date-fnc-value-integral": "總和(積分)", + "graph.bar-date-fnc-hour-integral": "每小時總和(積分)", + + "graph.property-data": "資料", + "graph.property-name": "名稱", + "graph.property-general": "一般", + "graph.property-title": "標題", + "graph.property-title-font": "字型大小", + "graph.property-title-show": "顯示", + "graph.property-title-color": "標題", + "graph.property-layout": "版面", + "graph.property-graph": "要顯示的圖形", + "graph.property-props": "屬性", + "graph.property-newgraph": "新圖形...", + "graph.property-date-last-range": "日期範圍", + "graph.property-date-group": "分組", + "graph.property-offline": "線上", + "graph.property-graph-orientation": "方向", + "graph.property-ori-vartical": "垂直", + "graph.property-ori-horizontal": "水平", + "graph.property-decimals": "小數", + "graph.property-yaxis-min": "最小值", + "graph.property-yaxis-max": "最大值", + "graph.property-stepsize": "刻度步長", + "graph.property-yaxis": "數值軸", + "graph.property-yaxis-fontsize": "字型大小", + "graph.property-yaxis-show": "顯示", + "graph.property-yaxis-color": "數值", + "graph.property-xaxis-fontsize": "字型大小", + "graph.property-xaxis": "類別軸", + "graph.property-xaxis-show": "顯示", + "graph.property-xaxis-color": "類別", + "graph.property-theme": "主題", + "graph.property-theme-type": "類型", + "graph.property-gridline": "顯示網格", + "graph.property-grid-color": "網格", + "graph.property-theme-owner": "自訂", + "graph.property-theme-light": "明亮", + "graph.property-theme-dark": "黑暗", + "graph.property-legend": "圖例", + "graph.property-legend-display": "位置", + "graph.property-legend-top": "頂部", + "graph.property-legend-left": "左", + "graph.property-legend-bottom": "底部", + "graph.property-legend-right": "右", + "graph.property-legend-show": "顯示", + "graph.property-legend-fontsize": "字型", + "graph.property-legend-align": "對齊", + "graph.property-legend-center": "置中", + "graph.property-legend-start": "起始", + "graph.property-legend-end": "結束", + "graph.property-legend-color": "圖例", + "graph.property-border": "邊框尺寸", + "graph.property-tooltip": "顯示工具提示", + "graph.property-datalabels": "資料標籤", + "graph.property-datalabels-color": "資料標籤", + "graph.property-datalabels-show": "顯示", + "graph.property-datalabels-fontsize": "字型大小", + "graph.property-datalabels-align": "對齊", + + "graph.rangetype-last1h": "最近一小時", + "graph.rangetype-last1d": "最近一天", + "graph.rangetype-last3d": "最近 3 天", + "graph.rangetype-last1w": "最近一週", + "graph.rangetype-last1m": "上個月", + + "graph.grouptype-hours": "小時", + "graph.grouptype-days": "天數", + + "iframe.property-data": "資料", + "iframe.property-address": "位址", + "iframe.property-name": "名稱", + + "panel.property-data": "資料", + "panel.property-view-name": "視圖名稱", + "panel.property-name": "名稱", + "panel.property-scalemode": "縮放模式", + "panel.property-scalemode-none": "無", + "panel.property-scalemode-contain": "置入", + "panel.property-scalemode-stretch": "延展", + + "table.property-title": "資料表設定", + "table.property-data": "資料", + "table.property-date-last-range": "日期範圍", + "table.property-name": "名稱", + "table.property-type": "類型", + "table.property-type-with-realtime": "即時", + "table.property-header": "表頭", + "table.property-header-height": "高度", + "table.property-header-background": "背景", + "table.property-header-color": "顏色", + "table.property-header-fontSize": "字型大小", + "table.property-row": "列", + "table.property-row-height": "高度", + "table.property-row-background": "背景", + "table.property-row-color": "顏色", + "table.property-row-fontSize": "字型大小", + "table.property-selection": "選取", + "table.property-layout": "版面", + "table.property-filter": "過濾器", + "table.property-paginator": "分頁器", + "table.property-paginator-items-per-page": "每頁項目", + "table.property-paginator-next-page": "下一頁", + "table.property-paginator-prev-page": "上一頁", + "table.property-paginator-of-label": "的", + "table.property-daterange": "日期範圍", + "table.property-gridline": "顯示網格", + "table.property-type-data": "資料表", + "table.property-type-history": "歷史表", + "table.property-type-alarms": "警報表", + "table.property-type-alarms-history": "警報歷史表", + "table.property-type-reports": "報告表", + "table.property-grid-color": "網格顏色", + "table.property-cols": "欄", + "table.property-rows": "列", + "table.property-column-type": "欄位類型", + "table.property-column-name": "名稱", + "table.property-column-label": "標籤", + "table.property-column-variable": "變數", + "table.property-column-device": "裝置", + "table.property-column-timestamp": "日期/時間", + "table.property-column-align": "對齊", + "table.property-column-width": "寬度", + "table.property-row-type": "列類型", + "table.property-customize-tooltip": "表格自訂器", + "table.customize-title": "表格自訂器", + "table.customize-column-edit": "編輯欄", + "table.customize-column-add": "新增欄", + "table.customize-column-remove": "刪除欄", + "table.customize-column-left": "左移", + "table.customize-column-right": "右移", + "table.customize-row-up": "上移", + "table.customize-row-down": "下移", + "table.customize-row-edit": "編輯列", + "table.customize-row-add": "新增列", + "table.customize-row-remove": "刪除列", + "table.cell-column-name": "欄名", + "table.column-dialog-title": "欄", + "table.row-dialog-title": "列", + "table.cell-column-type": "欄位類型", + "table.cell-row-type": "列類型", + "table.cell-ts-format": "格式(DD/MM/YYYY - HH:mm:ss)", + "table.cell-value-format": "格式(0.000)", + "table.cell-format": "格式", + "table.cell-text": "文字", + "table.cell-align-left": "左", + "table.cell-align-center": "置中", + "table.cell-align-right": "右", + + "table.history-filter": "過濾器", + "table.rangetype-last1h": "最近一小時", + "table.rangetype-last1d": "最近一天", + "table.rangetype-last3d": "過去 3 天", + + "table.alarms-title": "警報表", + "table.alarms-history-title": "警報歷史表", + "table.alarm-columns": "警報欄位", + "table.alarm-filter": "警報過濾器", + "table.alarm-priority": "優先順序", + "table.alarm-tags": "標籤", + + "table.reports-title": "報告表", + "table.report-columns": "報告欄位", + "table.report-view-name": "名稱", + "table.report-view-ontime": "建立時間", + "table.report-view-download": "下載", + "table.report-view-delete": "刪除", + "table.report-filter": "報告過濾器", + "table.report-filter-name": "名稱", + "table.report-filter-count": "最大值", + + "editor.view-svg": "畫布/SVG", + "editor.view-cards": "多視圖容器", + "editor.view-maps": "地圖", + "editor.views": "視圖", + "editor.resources": "資源", + "editor.view-delete": "刪除", + "editor.view-rename": "重新命名", + "editor.view-property": "屬性", + "editor.view-clone": "複製", + "editor.view-export": "匯出", + "editor.view-add": "新增視圖", + "editor.image-add": "新增圖片", + "editor.view-import": "匯入視圖", + "editor.general": "一般", + "editor.shape": "圖形", + "editor.processeng": "Proc. Eng.", + "editor.animated": "動畫", + "editor.controls": "控制", + "editor.controls-input": "輸入值", + "editor.controls-input-settings": "輸入設定", + "editor.controls-output": "輸出值", + "editor.controls-output-settings": "輸出設定", + "editor.controls-button": "按鈕", + "editor.controls-button-settings": "按鈕設定", + "editor.controls-select": "選擇值", + "editor.controls-select-settings": "選擇設定", + "editor.controls-progress": "儀表", + "editor.controls-progress-settings": "儀表設定", + "editor.controls-semaphore": "LED 儀錶", + "editor.controls-semaphore-settings": "LED 儀錶設定", + "editor.controls-chart": "圖表", + "editor.controls-chart-settings": "圖表設定", + "editor.controls-bag": "圓形量測儀", + "editor.controls-bag-settings": "圓形量測儀設定", + "editor.controls-pipe": "管道", + "editor.controls-pipe-settings": "管道設定", + "editor.controls-slider": "滑桿", + "editor.controls-slider-settings": "滑桿設定", + "editor.controls-shape-settings": "圖形設定", + "editor.controls-html-switch-settings": "開關設定", + "editor.controls-switch": "開關", + "editor.controls-graphbar": "長條圖", + "editor.controls-graph-bar-settings": "長條圖設定", + "editor.controls-graphpie": "圓餅圖", + "editor.controls-graph-pie-settings": "圓餅圖設定", + "editor.controls-iframe": "內嵌網頁", + "editor.controls-iframe-settings": "內嵌網頁設定", + "editor.controls-table": "表格", + "editor.header-item-settings": "頁首項目設定", + "editor.controls-image": "圖片(連結)", + "editor.controls-panel": "面板", + "editor.controls-panel-settings": "面板設定", + + "editor.layout-settings": "版面設定", + + "editor.interactivity": "互動", + "editor.interactivity-id": "id:", + "editor.interactivity-id-title": "識別此元素", + "editor.interactivity-class": "class:", + "editor.interactivity-class-title": "元素類別", + "editor.interactivity-name": "名稱", + "editor.edit-bind-of-tags": "編輯標籤繫結", + + "editor.cmenu-property": "屬性", + "editor.cmenu-cut": "剪下", + "editor.cmenu-copy": "複製", + "editor.cmenu-paste": "貼上", + "editor.cmenu-paste-place": "原地貼上", + "editor.cmenu-delete": "刪除", + "editor.cmenu-group": "群組", + "editor.cmenu-ungroup": "取消群組", + "editor.cmenu-bring-front": "置於最上層", + "editor.cmenu-bring-forward": "上移一層", + "editor.cmenu-send-backward": "下移一層", + "editor.cmenu-send-back": "置於最後方", + "editor.cmenu-layer-duplicate": "複製圖層...", + "editor.cmenu-layer-delete": "刪除圖層", + "editor.cmenu-layer-marge-down": "向下合併", + "editor.cmenu-layer-marge-all": "全部合併", + "editor.cmenu-unlock": "解除鎖定", + "editor.cmenu-lock": "鎖定", + + "editor.transform": "定位", + "editor.transform-x": "x", + "editor.transform-x-title": "變更 X 座標", + "editor.transform-y": "y", + "editor.transform-y-title": "變更 Y 座標", + "editor.transform-x1": "x1", + "editor.transform-x1-title": "變更線條起始 X 座標", + "editor.transform-y1": "y1", + "editor.transform-y1-title": "變更線條起始 y 座標", + "editor.transform-x2": "x2", + "editor.transform-x2-title": "變更線條結束 X 座標", + "editor.transform-y2": "y2", + "editor.transform-y2-title": "變更線條結束 Y 座標", + "editor.transform-rect-width-title": "變更矩形寬度", + "editor.transform-width": "寬度", + "editor.transform-rect-height-title": "變更矩形高度", + "editor.transform-height": "高度", + "editor.transform-rect-radius-title": "變更矩形圓角半徑", + "editor.transform-radiuscorner": "圓角", + "editor.transform-circlecx": "cx", + "editor.transform-circlecx-title": "變更圓形 cx 座標", + "editor.transform-circlecy": "cy", + "editor.transform-circlecy-title": "變更圓形 cy 座標", + "editor.transform-circler": "r", + "editor.transform-circler-title": "變更圓形半徑", + "editor.transform-ellipsecx": "cx", + "editor.transform-ellipsecx-title": "變更橢圓 cx 座標", + "editor.transform-ellipsecy": "cy", + "editor.transform-ellipsecy-title": "變更橢圓 cy 座標", + "editor.transform-ellipserx": "rx", + "editor.transform-ellipserx-title": "變更橢圓 x 半徑", + "editor.transform-ellipsery": "ry", + "editor.transform-ellipsery-title": "變更橢圓 y 半徑", + "editor.transform-fontfamily": "字型族", + "editor.transform-font-serif": "Serif", + "editor.transform-font-sansserif": "無襯線", + "editor.transform-font-cursive": "草書", + "editor.transform-font-fantasy": "Fantasy", + "editor.transform-font-monospace": "等寬", + "editor.transform-fontsize": "字型大小", + "editor.transform-fontsize-title": "變更字型大小", + "editor.transform-textalign": "文字對齊", + "editor.transform-left": "左", + "editor.transform-center": "置中", + "editor.transform-right": "右", + "editor.transform-image-width-title": "變更影像寬度", + "editor.transform-image-height-title": "變更影像高度", + "editor.transform-url": "url", + "editor.transform-image-url-title": "變更 URL", + "editor.transform-change-image": "變更影像", + "editor.transform-change-image-title": "注意:此影像無法內嵌,顯示將依賴此路徑", + "editor.transform-angle": "角度", + "editor.transform-angle-title": "變更旋轉角度", + "editor.transform-hide": "隱藏", + "editor.transform-lock": "鎖定", + + "editor.align": "對齊", + "editor.align-left-title": "向左對齊", + "editor.align-center-title": "對齊置中", + "editor.align-right-title":"向右對齊", + "editor.align-top-title": "對齊頂部", + "editor.align-middle-title": "對齊中間", + "editor.align-bottom-title": "對齊底部", + + "editor.stroke": "邊框", + "editor.stroke-width": "邊框寬度", + "editor.stroke-width-title": "變更邊框寬度為 1,按 Shift 變更為 0.1", + "editor.stroke-style": "邊框樣式", + "editor.stroke-style-title": "變更邊框虛線樣式", + "editor.stroke-joinmiter-title": "線段連接 Miter", + "editor.stroke-joinround-title": "線段連接 圓角", + "editor.stroke-joinbevel-title": "線段連接 斜角", + "editor.stroke-capbutt-title": "線端 Butt", + "editor.stroke-capsquare-title": "線端 方形", + "editor.stroke-capround-title": "線端 圓形", + "editor.stroke-shadow": "陰影", + "editor.stroke-shadow-title": "啟用陰影", + + "editor.marker": "標記", + "editor.marker-start": "開始", + "editor.marker-start-title": "選擇起始標記類型", + "editor.marker-middle": "中間", + "editor.marker-middle-title": "選擇中間標記類型", + "editor.marker-end": "尾端", + "editor.marker-end-title": "選擇末端標記類型", + + "editor.hyperlink": "超連結", + "editor.hyperlink-url": "url", + + "editor.tools-launch-title": "啟動目前視圖", + "editor.tools-select": "選取工具", + "editor.tools-pencil": "鉛筆工具", + "editor.tools-line": "直線工具", + "editor.tools-rectangle": "矩形工具", + "editor.tools-circle": "圓形工具", + "editor.tools-ellipse": "橢圓工具", + "editor.tools-path": "路徑工具", + "editor.tools-text": "文字工具", + "editor.tools-image": "影像工具", + + "editor.tools-zoom-title": "縮放工具[Ctrl+上/下]", + "editor.tools-grid-title": "顯示/隱藏網格", + "editor.tools-undo-title": "復原 [Z]", + "editor.tools-redo-title": "重做 [Y]", + "editor.tools-clone-title": "複製元素 [D]", + "editor.tools-delete-title": "刪除元素 [Delete/Backspace]", + "editor.tools-movebottom-title": "送至後方 [ Ctrl+Shift+[ ]", + "editor.tools-movetop-title": "帶到前方 [ Ctrl+Shift+] ]", + "editor.tools-topath-title": "轉換為路徑", + "editor.tools-clonemulti-title": "複製元素 [C]", + "editor.tools-deletemulti-title": "刪除選取元素 [Delete/Backspace]", + "editor.tools-group-title": "元素群組 [G]", + "editor.tools-alignleft-title": "向左對齊", + "editor.tools-aligncenter-title": "置中對齊", + "editor.tools-alignright-title": "向右對齊", + "editor.tools-aligntop-title": "對齊頂部", + "editor.tools-alignmiddle-title": "對齊中部", + "editor.tools-alignbottom-title": "對齊底部", + "editor.tools-ungroup-title": "取消群組元素 [G]", + "editor.tools-hyperlink-title": "建立超連結", + "editor.tools-svg-selector": "項目清單選擇器", + + "editor.settings-general": "一般", + "editor.settings-events": "事件", + "editor.settings-actions": "動作", + + "tags.ids-config-title": "標籤-IDs 參考", + + "svg.selector.property-title": "檢視項目清單", + + "tutorial.editor-keyboard-shortcuts": "編輯器快速鍵", + + "shapes.action-hide": "隱藏", + "shapes.action-show": "顯示", + "shapes.action-blink": "閃爍", + "shapes.action-stop": "停止", + "shapes.action-clockwise": "順時針轉動", + "shapes.action-anticlockwise": "逆時針轉動", + "shapes.action-downup": "向上與向下", + "shapes.action-rotate": "旋轉", + "shapes.action-refreshImage": "更新影像", + + "shapes.action-move": "移動", + "shapes.event-click": "點擊", + "shapes.event-dblclick": "雙擊", + "shapes.event-mouseup": "滑鼠放開", + "shapes.event-mousedown": "滑鼠按下", + "shapes.event-mouseover": "滑鼠懸停", + "shapes.event-mouseout": "滑鼠移出", + "shapes.event-enter": "進入", + "shapes.event-select": "選擇", + "shapes.event-onpage": "開啟頁面", + "shapes.event-onwindow": "開啟視窗", + "shapes.event-ondialog": "開啟對話框", + "shapes.event-oniframe": "開啟 iframe", + "shapes.event-oncard": "開啟視窗", + "shapes.event-onopentab": "開啟分頁", + "shapes.event-onsetvalue": "設定值", + "shapes.event-ontogglevalue": "切換值", + "shapes.event-onsetinput": "自輸入設定", + "shapes.event-onclose": "關閉", + "shapes.event-onopen": "開啟", + "shapes.event-onrunscript": "執行腳本", + "shapes.event-setvalue-set": "設定", + "shapes.event-setvalue-add": "增加", + "shapes.event-setvalue-remove": "減少", + "shapes.event-address-link": "連結", + "shapes.event-address-resource": "資源", + "shapes.event-onmonitor": "監控", + "shapes.event-onViewToPanel": "設定視圖至面板", + "shapes.event-onLoad": "載入", + "shapes.event-relativefrom-window": "視窗", + "shapes.event-relativefrom-mouse": "滑鼠", + + "pipe.property-title": "管道設定", + "pipe.property-data": "資料", + "pipe.property-style": "樣式", + "pipe.property-props": "屬性", + "pipe.property-border-width": "邊界寬度", + "pipe.property-border-color": "邊界顏色", + "pipe.property-pipe-width": "管道寬度", + "pipe.property-pipe-color": "管道顏色", + "pipe.property-content-width": "內容寬度", + "pipe.property-content-color": "內容顏色", + "pipe.property-content-space": "內容虛線", + "pipe.action-hide-content": "隱藏內容", + "pipe.property-style-animation": "動畫圖片", + "pipe.property-style-animation-image": "選擇圖片(SVG)", + "pipe.property-style-animation-count": "圖片數量", + "pipe.property-style-animation-delay": "動畫延遲(毫秒)", + + "slider.property-props": "屬性", + "slider.property-horizontal": "水平", + "slider.property-vertical": "垂直", + "slider.property-orientation": "方向", + "slider.property-direction": "方向", + "slider.property-rtl": "由右至左", + "slider.property-ltr": "由左至右", + "slider.property-min": "最小", + "slider.property-max": "最大", + "slider.property-step": "步長", + "slider.property-font": "字型", + "slider.property-background": "背景", + "slider.property-scala": "刻度", + "slider.property-marker-color": "顏色", + "slider.property-subdivisions": "子分區(%)", + "slider.property-subdivisions-height": "高度", + "slider.property-subdivisions-width": "寬度", + "slider.property-divisions": "分區(%)", + "slider.property-divisions-height": "高度", + "slider.property-divisions-width": "寬度", + "slider.property-font-size": "刻度字型", + "slider.property-tooltip": "工具提示", + "slider.property-tooltip-none": "無", + "slider.property-tooltip-hide": "隱藏", + "slider.property-tooltip-show": "顯示", + "slider.property-tooltip-decimals": "小數", + "slider.property-tooltip-background": "背景", + "slider.property-tooltip-color": "文字顏色", + "slider.property-tooltip-font-size": "工具提示字型", + "slider.property-slider-color": "連接顏色", + "slider.property-slider-background": "底色", + "slider.property-slider-handle": "指標顏色", + + "html-switch.property-off-value": "關閉值", + "html-switch.property-on-value": "開啟值", + "html-switch.property-on-background": "開啟背景", + "html-switch.property-off-background": "關閉背景", + "html-switch.property-off-text": "關閉文字", + "html-switch.property-on-text": "開啟文字", + "html-switch.property-on-slider-color": "開啟滑塊顏色", + "html-switch.property-off-slider-color":"關閉滑塊顏色", + "html-switch.property-radius": "圓角", + "html-switch.property-off-text-color": "關閉文字顏色", + "html-switch.property-on-text-color": "開啟文字顏色", + "html-switch.property-font-size":"字型大小", + "html-switch.property-font":"字型", + + "html-input.min": "最小值", + "html-input.max": "最大值", + "html-input.out-of-range": "超出範圍的值", + "html-input.not-a-number": "值不是數字", + + "editor.tools-zoomlevel-title": "縮放等級", + "editor.tools-zoomlevel-fitcanvas": "適合畫布", + "editor.tools-zoomlevel-fitsection": "適合選取", + "editor.tools-zoomlevel-fitcontent": "適合所有內容", + "editor.tools-fillcolor-title": "變更填滿顏色", + "editor.tools-strokecolor-title": "變更描邊顏色", + "editor.tools-palettecolor-title": "點擊變更填滿顏色,按住 Shift 變更描邊顏色", + + "device.list-title": "裝置設定", + "device.list-device": "裝置", + "device.list-filter": "過濾器", + "device.list-name": "名稱", + "device.list-address": "位址", + "device.list-type": "類型", + "device.list-min": "最小", + "device.list-max": "最大", + "device.list-value": "值", + "device.list-timestamp": "時間戳", + "device.list-description": "描述", + "device.list-edit": "編輯標籤", + "device.list-add": "新增標籤", + "device.list-remove": "刪除標籤", + "device.list-remove-all": "刪除所有標籤", + "device.list-options": "標籤選項", + "device.list-clipboard": "複製標籤物件到剪貼簿", + "device.list-direction":"方向", + + "devices.export": "匯出裝置", + "devices.export-json": "JSON", + "devices.export-csv": "CSV", + "devices.import": "匯入裝置", + "device.manage-templates": "管理範本", + "device.save-tags-to-template": "將標籤儲存至範本", + "device.add-tags-from-template": "自範本新增標籤", + "device.tags-template-name-title": "標籤範本名稱", + "devices.import-template": "匯入連線範本", + "device.property-client": "裝置屬性", + "device.property-server": "FUXA 伺服器屬性", + "device.property-name": "名稱", + "device.property-type": "類型", + "device.property-polling": "輪詢", + "device.property-enable": "啟用", + "device.property-subscribe": "訂閱", + "device.property-address": "位址(IP 或 opc.tcp://[伺服器]:[連接埠])", + "device.property-address-opc": "位址(opc.tcp://[伺服器]:[連接埠])", + "device.property-address-s7": "IP 位址(IP 127.0.0.1)", + "device.property-device-port": "裝置 IP 與連接埠(127.0.0.1:47808)", + "device.property-address-port": "從屬 IP 與連接埠(127.0.0.1:502)", + "device.property-security": "安全與加密模式", + "device.property-tags": "編輯裝置標籤", + "device.property-edit": "編輯裝置屬性", + "device.property-remove": "刪除裝置", + "device.property-add": "新增裝置", + "device.not-property-security": "沒有安全與加密模式", + "device.property-connection-options": "連線選項", + "device.property-port": "連接埠", + "device.property-slave-id": "從屬 ID", + "device.property-routing": "路由", + "device.property-tockenized": "權杖化(tokenized)", + "device.property-rack": "機架", + "device.property-slot": "插槽", + "device.property-serialport": "序列埠", + "device.property-baudrate": "鮑率", + "device.property-databits": "資料位元", + "device.property-stopbits": "停止位元", + "device.property-parity": "同位檢查", + "device.property-delay": "幀延遲(毫秒)", + "device.property-method": "方法", + "device.property-format": "格式", + "device.property-internal": "僅限前端", + "device.property-url": "URL(http://[伺服器]:[連接埠])", + "device.property-webapi-result": "請求的結果", + "device.property-ads-target": "目標 AmsNetId(例如 192.168.1.10.1.1:851)", + "device.property-ads-local": "本地 AmsNetId(例如 192.168.1.10.1.1:32750)", + "device.property-ads-router": "路由器位址(例如 192.168.1.120:48898)", + "device.not-webapi-result": "設定 WebAPI 的結果", + "device.property-show": "顯示裝置屬性", + "device.property-hide": "隱藏裝置屬性", + "device.property-interface-address": "介面與連接埠", + "device.property-interface-address-ph": "127.0.0.1:47808", + "device.property-broadcast-address": "廣播", + "device.property-broadcast-address-ph": "127.0.0.255", + "device.property-adpu-timeout": "adpu 逾時", + "device.property-adpu-timeout-ph": "6000", + "device.property-certificate-section": "TLS 憑證", + "device.property-certificate": "憑證", + "device.property-certificate-key": "私鑰", + "device.property-certificate-ca": "CA 憑證", + "device.security-none": "無", + "device.security-sign": "簽章", + "device.security-signandencrypt": "簽章與加密", + "device.webapi-property-title": "WebAPI 屬性", + "device.webapi-property-gettags": "URL GET 標籤", + "device.webapi-property-posttags": "URL POST 標籤", + "device.webapi-property-loadtags": "載入標籤", + "device.property-dsn": "資料來源名稱(DSN=資料庫名稱)", + "device.property-odbc-result": "找到的資料表結果", + "device.not-odbc-result": "資料庫資料表結果", + "device.add-device-templates-title": "裝置範本", + "device.add-tags-templates-title": "標籤範本", + "device.add-from-template": "自範本新增裝置", + "device.manage-templates-title": "刪除範本", + "device.template-device": "範本名稱", + "device.template-tags": "範本名稱", + "device.property-socket-reuse": "Socket 重用", + + "device.browsetopics-property-title": "要訂閱與發佈的 Broker 主題", + "device.browsetopics-property-sub": "訂閱", + "device.browsetopics-property-pub": "發佈", + "device.discovery-topics": "於 Broker 瀏覽主題", + "device.topic-selected": "已選主題", + "device.topic-raw": "原始", + "device.topic-json": "json", + "device.add-topics": "在 broker 上發佈我的主題", + "device.topic-publish-name": "主題名稱", + "device.topic-publish-path": "主題路徑", + "device.topic-publish": "發佈", + "device.topic-subscribe": "訂閱", + "device.topic-subscription-content": "內容", + "device.topic-subscription-name": "名稱", + "device.topic-subscription-address": "位址", + "device.topic-publish-add-item": "向有效載荷新增屬性", + "device.topic-publish-key": "鍵", + "device.topic-publish-type": "類型", + "device.topic-publish-timestamp": "時間戳", + "device.topic-publish-value": "主題路徑", + "device.topic-publish-static": "值", + "device.topic-publish-content": "有效載荷", + "device.topic-type-tag": "標籤", + "device.topic-type-timestamp": "時間戳", + "device.topic-type-value": "值(主題)", + "device.topic-type-static": "靜態", + "device.topic-name-exist": "主題名稱 '{{value}}' 已經存在", + "device.topic-subs-address-exist": "要訂閱位址為 '{{value}}' 的主題已經存在", + "device.topic-pubs-address-exist": "位址為 '{{value}}' 要發佈的主題已經存在", + + "device.property-mqtt-address": "位址(mqtt://[server]:[port])", + "device.tag-property-title": "標籤屬性", + "device.browsetag-property-title": "瀏覽伺服器中的標籤", + "device.tag-property-device": "裝置", + "device.tag-property-name": "Tag 名稱", + "device.tag-property-register": "暫存器", + "device.tag-property-type": "類型", + "device.tag-property-address": "位址(例:db5.dbb3 db4.dbx2.0 MB7)", + "device.tag-property-address-sample": "位址", + "device.tag-property-min": "最小", + "device.tag-property-max": "最大", + "device.tag-property-divisor": "除數", + "device.tag-property-address-offset": "位址位移(1-65536)", + "device.tag-property-obj-name": "名稱", + "device.tag-property-path": "路徑", + "device.tag-property-unit": "單位", + "device.tag-property-digits": "小數位", + "device.tag-property-initvalue": "初始值", + "device.tag-property-description": "描述", + "device.tag-property-direction": "方向", + "device.tag-property-edge": "邊緣", + "device.tag-property-gpio": "GPIO 編號", + + "device.tag-array-id": "陣列 ID:", + "device.tag-array-value": "值:", + "device-tag-dialog-title": "標籤選擇", + + "device.tag-options-title": "標籤選項", + "device.tag-daq-enabled": "註冊啟用", + "device.tag-daq-changed": "變更時儲存", + "device.tag-daq-interval": "儲存值間隔(秒)", + "device.tag-daq-restored": "還原", + + "device.tag-format": "數字格式化(2 = #.##)", + "device.tag-deadband": "死區", + "device.tag-scale": "縮放模式", + "device.tag-scale-mode-undefined": "無縮放", + "device.tag-scale-mode-undefined-tooltip": "標籤值", + "device.tag-scale-mode-linear": "線性:ΔS * (Value - RL) / ΔR + SL", + "device.tag-scale-mode-linear-tooltip": "ΔS = (Scaled High - Scaled Low)\nΔR = (Raw High - Raw Low)\nRL = Raw Low\nSL = Scaled Low", + "device.tag-scale-mode-script": "腳本(讀/寫)", + "device.tag-raw-low": "原始低", + "device.tag-raw-high": "原始高", + "device.tag-scaled-low": "縮放後低", + "device.tag-scaled-high": "縮放後高", + "device.tag-convert-datetime": "毫秒轉日期時間格式", + "device.tag-convert-datetime-tooltip": "範例格式:'YYYY-MM-DD HH:mm:ss' 2023-09-14 08:45:10", + "device.tag-convert-datetime-format": "日期時間格式(YYYY-MM-DD HH:mm:ss)", + "device.tag-convert-ticktime": "毫秒轉時間格式(剩餘或持續時間)", + "device.tag-convert-ticktime-tooltip": "範例格式:'HH:mm:ss' 56:45:10", + "device.tag-convert-ticktime-format": "時間格式(HH:mm:ss)", + "device.tag-scale-read-script": "讀取縮放腳本", + "device.tag-scale-read-script-tooltip": "從用戶端接收值的腳本", + "device.tag-scale-read-script-params": "輸入讀取腳本參數值", + "device.tag-scale-write-script": "寫入縮放腳本", + "device.tag-scale-write-script-tooltip": "寫入至用戶端前的值腳本", + "device.tag-scale-write-script-params": "輸入寫入腳本參數值", + "device.tag-scale-script-params-tooltip": "傳遞給腳本的參數值 JSON 格式化陣列", + + "device.edit-placeholder-titel": "編輯佔位符", + + "device.connect-ok": "OK", + "device.connect-error": "錯誤", + "device.connect-failed": "失敗", + "device.connect-off": "關閉", + "device.connect-busy": "忙碌", + + "devices.mode-map": "裝置圖示", + "devices.mode-list": "裝置清單", + "devices.list-name": "名稱", + "devices.list-address": "位址", + "devices.list-type": "類型", + "devices.list-polling": "輪詢", + "devices.list-enabled": "已啟用", + "devices.list-status": "狀態", + "device.list-clipboard": "複製到剪貼簿", + + "users.list-title": "使用者設定", + "users.list-name": "使用者名稱", + "users.list-fullname": "全名", + "users.list-groups": "群組", + "users.list-roles": "角色", + "users.list-start": "起始視圖", + + "roles.list-title": "角色設定", + "roles.list-index": "索引", + "roles.list-name": "名稱", + "roles.list-description": "描述", + + "user-role-edit-title": "角色設定", + "user-role-edit-name": "名稱", + "user-role-edit-index": "索引", + "user-role-edit-description": "描述", + + "events-history.list-title": "事件歷史", + "events-history.filter-daterange": "日期範圍過濾", + + "gauges.property-props": "屬性", + "gauges.property-events": "事件", + "gauges.property-title": "屬性", + "gauges.property-name": "名稱", + "gauges.property-text": "文字", + "gauges.property-permission": "授權", + "gauges.property-mask": "位元遮罩", + "gauges.property-readonly": "唯讀", + "gauges.property-event-type": "類型", + "gauges.property-event-action": "動作", + "gauges.property-event-destination": "目的地", + "gauges.property-event-destination-relative-from": "相對位置", + "gauges.property-event-destination-panel": "面板", + "gauges.property-event-destination-hide-close": "隱藏關閉", + "gauges.property-event-destination-target-device": "目標裝置", + "gauges.property-event-newtab": "新分頁", + "gauges.property-event-single-card": "單張卡片", + "gauges.property-event-value": "值", + "gauges.property-event-function": "函式", + "gauges.property-event-input": "輸入(僅限命名輸入)", + "gauges.property-event-address-type": "類型", + "gauges.property-event-address": "連結", + "gauges.property-event-resource": "資源", + "gauges.property-event-width": "寬度", + "gauges.property-event-height": "高度", + "gauges.property-event-scale": "縮放", + "gauges.property-event-script": "腳本", + "gauges.property-event-script-param-name": "參數", + "gauges.property-event-script-param-value": "值", + "gauges.property-event-script-param-input-value": "留空以傳送輸入的值", + "gauges.property-head-device": "裝置", + "gauges.property-head-variable": "變數", + "gauges.property-variable-value": "值", + "gauges.property-head-alarm": "警報", + "gauges.property-head-color": "顏色", + "gauges.property-head-mapvariable": "情境變數", + "gauges.property-head-tomapvariable": "定義情境變數", + "gauges.property-head-todevice": "裝置變數", + "gauges.property-head-value": "值", + "gauges.property-input-min": "最小", + "gauges.property-input-max": "最大", + "gauges.property-input-color": "填滿", + "gauges.property-input-stroke": "描邊", + "gauges.property-input-value": "值", + "gauges.property-input-label": "標籤", + "gauges.property-input-unit": "單位", + "gauges.property-input-type": "輸入類型", + "gauges.property-input-type-number": "數字", + "gauges.property-input-type-text": "文字", + "gauges.property-input-type-date": "日期", + "gauges.property-input-type-time": "時間", + "gauges.property-input-type-datetime": "日期與時間", + "gauges.property-input-time-format": "時間格式", + "gauges.property-input-time-format-normal": "HH:mm", + "gauges.property-input-time-format-seconds": "HH:mm:ss", + "gauges.property-input-time-format-milliseconds": "HH:mm:ss:fff", + "gauges.property-input-milliseconds": "轉換為毫秒", + "gauges.property-input-convertion": "轉換", + "gauges.property-input-convertion-milliseconds": "毫秒", + "gauges.property-input-convertion-string": "字串", + + "gauges.property-update-enabled": "啟用更新", + "gauges.property-update-esc": "ESC 更新", + "gauges.property-input-esc-action": "離開時執行", + "gauges.property-action-esc-update": "更新(重新整理)", + "gauges.property-action-esc-enter": "確認(Enter)", + "gauges.property-select-content-on-click": "點擊時選取內容", + "gauges.property-numeric-enabled": "僅允許數字", + "gauges.property-format-digits": "數字格式化", + "gauges.property-actions": "動作", + "gauges.property-action-type": "類型", + "gauges.property-action-param": "動作識別", + "gauges.property-action-minAngle" : "最小角度", + "gauges.property-action-maxAngle" : "最大角度", + "gauges.property-action-toX" : "至位置 X", + "gauges.property-action-toY" : "至位置 Y", + "gauges.property-action-duration" : "持續時間", + "gauges.property-events-mapping-from": "情境變數", + "gauges.property-map-variable": "新增情境變數以進行繫結", + "gauges.property-head-remove-mapvariable": "刪除繫結", + "gauges.property-tooltip-add-event": "新增事件", + "gauges.property-interval-msec": "間隔(毫秒)", + "gauges.property-tag-label": "標籤", + "gauges.property-tag-internal-title": "設定內部裝置的標籤", + "gauges.property-input-range": "允許的輸入範圍", + "gauges.property-language-text": "文字或 @文字 ID", + + "bag.property-ticks": "刻度", + "bag.property-divisions": "分區", + "bag.property-subdivisions": "子分區", + "bag.property-divisions-length": "分區長度", + "bag.property-subdivisions-length": "子分區長度", + "bag.property-divisions-width": "分區寬度", + "bag.property-subdivisions-width": "子分區寬度", + "bag.property-divisions-color": "分區顏色", + "bag.property-subdivisions-color": "子分區顏色", + "bag.property-divisionfont-size": "分區字型大小", + "bag.property-divisionfont-color": "分區字型顏色", + "bag.property-divisions-labels": "分區標籤(例如:10;20;...)", + "bag.property-current-value": "目前值", + "bag.property-min": "最小", + "bag.property-max": "最大", + "bag.property-bar-width": "條形寬度", + "bag.property-animation-speed": "動畫速度", + "bag.property-angle": "角度", + "bag.property-radius": "半徑", + "bag.property-font": "字型", + "bag.property-font-size": "字型大小", + "bag.property-textfield-position": "文字欄位位置", + "bag.property-pointer-length": "指針長度", + "bag.property-pointer-stroke": "指針描邊", + "bag.property-pointer-color": "指針顏色", + "bag.property-color-start": "指針掃過範圍顏色", + "bag.property-color-stop": "指針未掃過範圍顏色", + "bag.property-background": "背景", + "bag.property-format-digits": "小數位數", + "bag.property-zones": "區域", + "bag.property-color": "顏色", + "bag.property-fill": "填滿", + + "alarms.list-title": "警報器設定", + "alarms.list-name": "名稱", + "alarms.list-device": "裝置/變數", + "alarms.list-highhigh": "高高", + "alarms.list-high": "高", + "alarms.list-low": "低", + "alarms.list-info": "資訊", + "alarms.list-actions": "動作", + "alarm.property-title": "警報", + "alarm.property-name": "名稱", + "alarm.property-permission": "授權", + "alarm.property-highhigh": "高 高", + "alarm.property-high": "高", + "alarm.property-low": "低", + "alarm.property-info": "資訊", + "alarm.property-action": "動作", + "alarm.property-enabled": "已啟用", + "alarm.property-save-event": "事件", + "alarm.property-min": "最小", + "alarm.property-max": "最大", + "alarm.property-timedelay": "時間延遲(秒)", + "alarm.property-checkdelay": "檢查間隔(秒)", + "alarm.property-type": "類型", + "alarm.property-ackmode": "Ack 模式", + "alarm.property-text": "文字", + "alarm.property-group": "群組", + "alarm.ack-float": "浮動", + "alarm.ack-active": "允許主動警報 Ack", + "alarm.ack-passive": "僅允許被動警報 Ack", + "alarms.view-title": "警報", + "alarms.history-title": "歷史警報", + "alarms.view-ontime": "日期/時間", + "alarms.view-text": "文字", + "alarms.view-group": "群組", + "alarms.view-status": "狀態", + "alarms.view-type": "優先順序", + "alarms.view-offtime": "關閉日期/時間", + "alarms.view-acktime": "ACK 日期/時間", + "alarms.view-userack": "ACK 使用者", + "alarms.view-ack": "ACK", + "alarms.view-ack-all-alarms": "ACK 所有警報", + "alarm.status-active": "主動", + "alarm.status-passive": "被動", + "alarm.status-active-ack": "主動-ACK", + "alarms.show-current": "警報", + "alarms.show-history": "歷史警報", + "alarm.action-popup": "顯示彈窗", + "alarm.action-onsetview": "設定視圖", + "alarm.action-onsetvalue": "設定值", + "alarm.action-onRunScript": "執行腳本", + "alarm.action-toastMessage": "顯示訊息", + "alarm.action-sendMsg": "傳送訊息", + "alarm.property-action-type": "動作類型", + "alarm.property-action-value": "要設定的值", + "alarm.property-action-destination": "要顯示的視圖", + "alarm.property-action-toastMessage": "要顯示的訊息", + "alarm.property-action-toastType": "類型", + + "notifications.list-title": "通知設定", + "notifications.list-name": "名稱", + "notifications.list-receiver": "收件者", + "notifications.list-delay": "延遲", + "notifications.list-interval": "間隔", + "notifications.list-type": "類型", + "notifications.list-enabled": "已啟用", + "notifications.list-subscriptions": "訂閱", + "notification.property-title": "通知", + "notification.property-name": "名稱", + "notification.property-receiver": "收件者(信箱位址以 ';' 分隔)", + "notification.property-type": "類型", + "notification.property-delay": "延遲(分鐘)", + "notification.property-interval": "間隔(分鐘)", + "notification.property-enabled": "啟用", + "notification.property-priority": "優先順序", + "notification.type-alarm": "警報", + "notification.type-trigger": "觸發", + + "scripts.list-title": "腳本設定", + "scripts.list-name": "名稱", + "scripts.list-type": "類型", + "scripts.list-mode": "模式", + "scripts.list-params": "參數", + "scripts.list-scheduling": "排程 / 間隔", + "scripts.list-permission": "授權", + "scripts.list-options": "腳本選項", + + "script.permission-title": "授權", + "script.permission-label": "(空白 = 對全體)", + "script.permission-enabled": "已啟用", + + "script.create-title": "建立腳本", + + "script.mode": "執行模式", + "script.mode-title": "執行模式", + "script.mode-label": "(預設:伺服器)", + "script.mode-CLIENT": "用戶端(於瀏覽器中執行)", + "script.mode-SERVER": "伺服器(於伺服器中執行)", + + "script.property-title": "腳本", + "script.property-systems": "系統函式", + "script.property-templates": "範本", + "script.property-test": "測試", + "script.property-test-params": "函式參數", + "script.property-test-console": "主控台", + "script.property-test-tag": "設定標籤", + "script.property-test-run": "執行 TEST", + "script.property-editname": "編輯腳本名稱", + "script.property-name": "名稱", + "script.property-addfnc-param": "新增腳本參數", + "script.property-async-function": "非同步函式", + "script.param-title": "腳本參數", + "script.param-name": "名稱", + "script.param-type": "類型", + "script.paramtype": "", + "script.paramtype-tagid": "標籤 ID", + "script.paramtype-value": "值(數字/字串/物件)", + "script.paramtype-chart": "圖表線(陣列)", + "script.param-name-exist": "參數名稱已存在!", + "script.sys-fnc-settag-text": "$setTag (TagID, value)", + "script.sys-fnc-settag-tooltip": "設定標籤值的系統函式:$setTag (TagID 為字串,值為字串或數字)", + "script.sys-fnc-gettag-text": "$getTag (TagID)", + "script.sys-fnc-gettag-tooltip": "取得 Tag 值的系統函式:$getTag (TagID 為字串) 回傳值為字串或數字", + "script.scheduling-title": "腳本排程", + "script.scheduling-type": "類型", + "script.scheduling-interval": "循環間隔", + "script.scheduling-start": "僅在啟動時", + "script.scheduling-add-item": "新增排程器", + "script.scheduling-scheduling": "排程", + "script.scheduling-weekly": "每週", + "script.scheduling-date": "日期", + "script.scheduling-time": "時間", + "script.scheduling-hour": "小時", + "script.scheduling-minute": "分鐘", + "script.interval": "間隔(秒)", + "script.delay": "延遲(秒)", + "script.sys-fnc-setview-text": "$setView(視圖名稱)", + "script.sys-fnc-setview-tooltip": "在用戶端設定視圖的系統函式:$setView(視圖名稱為字串)", + "script.sys-fnc-setview-params": "'View name'", + "script.sys-fnc-opencard-text": "$openCard (View name)", + "script.sys-fnc-opencard-tooltip": "System function to open Card on client: $openCard (View name as string, Options as dict {left, top})", + "script.sys-fnc-opencard-params": "'View name'", + "script.sys-fnc-enableDevice-text": "$enableDevice (Device name, enable True/False)", + "script.sys-fnc-enableDevice-tooltip": "System function to enable Device connection: $enableDevice (Device name as string, enable as boolean)", + "script.sys-fnc-enableDevice-params": "'Device name', true", + "script.sys-fnc-getDevice-text": "$getDevice (Device name, interface True/False)", + "script.sys-fnc-getDevice-tooltip": "System function to get Device object: $getDevice (Device name as string, get Comm Interface as boolean)", + "script.sys-fnc-getDevice-params": "'Device name', true", + "script.sys-fnc-setAdapterToDevice-text": "$setAdapterToDevice(Adapter name, Device name)", + "script.sys-fnc-setAdapterToDevice-tooltip": "System function to bind Adapter (internal Device) to a Device: $setAdapterToDevice (Adapter name as string, Device name as string)", + "script.sys-fnc-setAdapterToDevice-params": "'Adapter name', 'Device name'", + "script.sys-fnc-resolveAdapterTagId-text": "$resolveAdapterTagId(TagID)", + "script.sys-fnc-resolveAdapterTagId-tooltip": "System function to get Tag ID of Device dind to Adapter (internal Device): $resolveAdapterTagId (TagID as string)", + "script.sys-fnc-resolveAdapterTagId-params": "'TagID of Adapter'", + "script.sys-fnc-getTagId-text": "$getTagId (Tag name, [Device name])", + "script.sys-fnc-getTagId-tooltip": "System function to get Tag ID: $getTagId (Tag name as string, [Optional Device name as string])", + "script.sys-fnc-getTagId-params": "'Tag name', ", + "script.sys-fnc-getTagDaqSettings-text": "$getTagDaqSettings (TagID)", + "script.sys-fnc-getTagDaqSettings-tooltip": "System function to get Tag DAQ settings: $getTagDaqSettings (TagID as string)", + "script.sys-fnc-getTagDaqSettings-params": "'TagID'", + "script.sys-fnc-setTagDaqSettings-text": "$setTagDaqSettings (TagID, DaqSettings)", + "script.sys-fnc-setTagDaqSettings-tooltip": "System function to set Tag DAQ settings: $setTagDaqSettings (TagID as string, DaqSettings as object {restored: boolean, enabled: boolean, changed: boolean, interval: number, lastDaqSaved: number} )", + "script.sys-fnc-setTagDaqSettings-params": "'TagID', 'DaqSettings'", + "script.sys-fnc-invokeObject-text": "$invokeObject (Object name, Function name, [Parameter])", + "script.sys-fnc-invokeObject-tooltip": "System function to call Object function: $invokeObject (Object name as string, function name as string , [parameter])", + "script.sys-fnc-invokeObject-params": "'Object name', 'function name', ", + "script.sys-fnc-runServerScript-text": "$runServerScript (Script name, [Parameter])", + "script.sys-fnc-runServerScript-tooltip": "Client function to call Server script function: $runServerScript (Script name as string, [parameter])", + "script.sys-fnc-runServerScript-params": "'Server script name', ", + "script.sys-fnc-getDeviceProperty-text": "$getDeviceProperty(Device name)", + "script.sys-fnc-getDeviceProperty-tooltip": "System function to get Device property: $getDeviceProperty(Device name as string)", + "script.sys-fnc-getDeviceProperty-params": "'Device name'", + "script.sys-fnc-setDeviceProperty-text": "$setDeviceProperty(Device name, property)", + "script.sys-fnc-setDeviceProperty-tooltip": "System function to set Device property: $setDeviceProperty(Device name as string, Property as object {address, port, ...} )", + "script.sys-fnc-setDeviceProperty-params": "'Device name', 'Property'", + "script.sys-fnc-getHistoricalTag-text": "$getHistoricalTags(TagIds array, from msec., to msec.)", + "script.sys-fnc-getHistoricalTag-tooltip":"get historical tags by milliseconds range: $getHistoricalTags([TagIds] as array, from as number, to as number)", + "script.sys-fnc-getHistoricalTag-params":"'Tag Ids array', 'From msec.', 'To msec.'", + "script.sys-fnc-sendMessage-text": "$sendMessage(address, subject, message)", + "script.sys-fnc-sendMessage-tooltip": "System function to send Message (Mail): $sendMessage(address as string, subject as string, message as string)", + "script.sys-fnc-sendMessage-params": "'address', 'subject', 'message'", + "script.sys-fnc-getAlarms-text": "$getAlarms()", + "script.sys-fnc-getAlarms-tooltip": "System function to get alarms list (): $getAlarms()", + "script.sys-fnc-getAlarms-params": "", + "script.sys-fnc-getAlarmsHistory-text": "$getAlarmsHistory(from msec., to msec.)", + "script.sys-fnc-getAlarmsHistory-tooltip": "System function to get historical alarms list (): $getAlarmsHistory(from as number, to as number)", + "script.sys-fnc-getAlarmsHistory-params": "'From msec.', 'To msec.'", + "script.sys-fnc-ackAlarms-text": "$ackAlarm(Alarm name, types)", + "script.sys-fnc-ackAlarms-tooltip": "System function to ACK alarm (): $ackAlarm(Alarm name as string, [types] 'highhigh|high|low')", + "script.sys-fnc-ackAlarms-params": "'Alarm name', 'types'", + + "script.template-chart-data-text": "自訂圖表資料", + "script.template-chart-data-tooltip": "回傳自訂圖表資料的程式碼範本", + "script.template-invoke-chart-update-options-text": "更新圖表選項", + "script.template-invoke-chart-update-options-tooltip": "更新圖表選項(Y 軸刻度範圍)。僅限用戶端模式!", + "script.template-getHistoricalTagsoptions-text": "取得歷史標籤值", + "script.template-getHistoricalTagsoptions-tooltip": "取得歷史標籤值的程式碼範本。", + + "client.script-access-title": "用戶端腳本存取", + "client.script-access-info": "透過 window.fuxaScriptAPI 設定對前端(例如小工具)的系統函式存取。", + + "reports.list-title": "報告設定", + "reports.list-name": "名稱", + "reports.list-type": "類型", + "reports.list-receiver": "收件者", + "reports.list-scheduling": "排程/間隔", + "reports.list-enabled": "已啟用", + + "report.property-title": "報告", + "report.property-name": "名稱", + "report.property-receiver": "收件者電子郵件", + "report.property-scheduling-type": "報告排程", + "report.property-content": "內容", + "report.property-page": "頁面設定", + "report.property-page-size": "頁面大小", + "report.property-page-orientation": "頁面方向", + "report.property-page-ori-landscape": "橫向", + "report.property-page-ori-portrait": "直向", + "report.property-margin-left": "左邊距", + "report.property-margin-top": "上邊距", + "report.property-margin-right": "右邊距", + "report.property-margin-bottom": "下邊距", + "report.scheduling-none": "停用", + "report.scheduling-day": "每日", + "report.scheduling-week": "每週", + "report.scheduling-month": "每月", + "report.content-addtext": "新增文字", + "report.content-addtable": "新增標籤表", + "report.content-addalarms": "新增警報歷史", + "report.content-addchart": "新增圖表", + "report.content-type-text": "文字", + "report.content-type-tagstable": "標籤表", + "report.content-type-alarmshistory": "警報歷史", + "report.content-type-chart": "圖表", + "report.content-fontsizeitem": "字型大小", + "report.content-alignitem": "文字對齊", + "report.content-edit": "編輯", + "report.content-delete": "刪除", + "report.item-text-title": "報告文字", + "report.item-text-label": "文字", + "report.tags-table-title": "報告標籤表", + "report.tags-table-column": "表格欄位標籤", + "report.tags-table-add": "新增標籤", + "report.tags-table-setlabel": "設定標籤", + "report.table-alignitem": "對齊", + "report.table-delitem": "刪除欄", + "report.item-daterange": "資料範圍", + "report.item-daterange-none": "無", + "report.item-daterange-day": "最近一天(0-24)", + "report.item-daterange-week": "上週(週一至週日)", + "report.item-daterange-month": "上個月", + "report.item-interval": "間隔(期間)", + "report.item-interval-min5": "5 分鐘", + "report.item-interval-min10": "10 分鐘", + "report.item-interval-min30": "30 分鐘", + "report.item-interval-hour": "1 小時", + "report.item-interval-day": "1 天", + "report.item-function-type": "功能類型", + "report.item-function-min": "最小", + "report.item-function-max": "最大", + "report.item-function-average": "平均", + "report.item-function-sum": "總和", + "report.item-alarms-title": "報告警報", + "report.alarms-priority": "警報優先順序", + "report.alarms-column": "警報欄位", + "report.alarms-filter": "警報過濾器", + "report.chart-title": "報告圖表", + "report.chart-name": "圖表名稱", + "report.chart-width": "寬度", + "report.chart-height": "高度", + + "maps.locations-list-title": "位置設定", + "maps.locations-list-name": "名稱", + "maps.locations-list-view": "視圖", + "maps.locations-list-description": "描述", + "maps.location-property-title": "位置", + "maps.location-property-name": "名稱", + "maps.location-property-description": "描述", + "maps.location-property-latitude": "緯度", + "maps.location-property-longitude": "經度", + "maps.location-property-card": "卡片", + "maps.location-property-view": "視圖", + "maps.location-property-url": "URL", + "maps.edit-add-location": "新增位置", + "maps.edit-import-location": "匯入位置", + "maps.edit-edit-location": "編輯位置", + "maps.edit-remove-location": "刪除位置", + "maps.edit-start-location": "設為起始位置", + "maps.edit-start-location-saved": "起始位置已儲存", + "maps.close-popups": "關閉所有彈窗", + "maps.location-to-import": "要匯入的位置", + "maps.location-to-import-input-title": "選擇要匯入的位置", + + "logs.view-title": "系統日誌", + "logs.view-files": "日誌檔", + + "events.view-ontime": "日期/時間", + "events.view-type": "類型", + "events.view-source": "來源", + "events.view-text": "文字", + + "card.config-title": "卡片設定", + "card.config-content-type": "內容類型", + "card.config-content-view": "內容視圖", + "card.config-content-iframe": "連結位址", + "card.widget-view": "視圖", + "card.widget-alarms": "警報", + "card.widget-table": "表格", + "card.widget-iframe": "連結", + "card.style-zoom": "縮放", + + "resources.lib-icons": "圖示", + "resources.lib-images": "圖片", + "resource.list-title": "資源清單", + "resource.list-name": "檔案名稱", + "resource.list-type": "檔案類型", + "resource.list-title-fonts": "字型清單", + "resources.lib-widgets": "小工具", + + "widgets.kiosk-title": "小工具", + "widget.remove": "刪除小工具", + + "texts.list-title": "文字設定", + "texts.list-filter": "過濾器", + "texts.list-filter-group": "群組", + "texts.list-id": "ID", + "texts.list-group": "群組", + "texts.list-value": "文字", + "texts.list-add-text": "新增文字", + "texts.list-edit-language": "編輯語言", + "language.settings-title": "語言設定", + "language.settings-add-tooltip": "新增語言", + "language.settings-id": "鍵", + "language.settings-default-id": "鍵(預設)", + "language.settings-id-placeholder": "例如:EN", + "language.settings-name": "名稱", + "language.settings-default-name": "名稱(預設)", + "language.settings-name-placeholder": "例如:English", + "text.settings-title": "文字", + "text.settings-id": "ID", + "text.settings-group": "群組", + "text.settings-value": "文字", + + "gui.range-number-min": "最小值", + "gui.range-number-max": "最大值", + "gui.range-number-boolean": "遮罩值", + "gui.range-number-true": "真 [1-1]", + "gui.range-number-false": "假 [0-0]", + "gui.range-number-switcher": "範圍為數字或布林值", + + "dlg.bitmask-title": "位元遮罩", + + "dlg.plugins-title": "伺服器外掛", + "dlg.plugins-info": "未安裝的外掛可在伺服器上手動安裝:'npm install [package name]@[version]'", + "dlg.plugins-type": "類型", + "dlg.plugins-name": "名稱", + "dlg.plugins-version": "版本", + "dlg.plugins-current": "已安裝", + "dlg.plugins-description": "描述", + "dlg.plugins-status-installing": "正在安裝...", + "dlg.plugins-status-removing": "正在移除...", + "dlg.plugins-status-installed": "正在安裝...OK!", + "dlg.plugins-status-removed": "正在移除...OK!", + "dlg.plugins-status-error": "錯誤!請手動再試!", + + "dlg.setup-title": "設定", + "dlg.setup-gui": "使用者介面", + "dlg.setup-diverse": "雜項", + "dlg.setup-logic": "邏輯", + "dlg.setup-system": "系統", + "dlg.setup-views": "視圖", + "dlg.setup-connections": "連線", + "dlg.setup-users": "使用者", + "dlg.setup-user-roles": "角色", + "dlg.setup-alarms": "警報", + "dlg.setup-line-charts": "折線圖", + "dlg.setup-bar-charts": "長條圖", + "dlg.setup-maps-locations": "位置", + "dlg.setup-layout": "版面", + "dlg.setup-plugins": "外掛", + "dlg.setup-scripts": "腳本", + "dlg.setup-reports": "報告", + "dlg.setup-settings": "設定", + "dlg.setup-client-access": "前端腳本", + "dlg.setup-logs": "日誌", + "dlg.setup-notifications": "通知", + "dlg.setup-events": "事件", + "dlg.setup-resources": "資源", + "dlg.setup-fonts": "字型", + "dlg.setup-language": "語言", + "dlg.app-settings-title": "設定", + "dlg.app-settings-system": "系統", + "dlg.app-settings-smtp": "SMTP", + "dlg.app-settings-smtp-host": "主機", + "dlg.app-settings-smtp-port": "連接埠", + "dlg.app-settings-smtp-mailsender": "郵件寄件者", + "dlg.app-settings-smtp-user": "User/ApiKey", + "dlg.app-settings-smtp-password": "密碼", + "dlg.app-settings-smtp-testaddress": "測試訊息收件的電子郵件", + "dlg.app-settings-smtp-test": "測試", + "dlg.app-settings-language": "語言", + "dlg.app-language-de": "German", + "dlg.app-language-en": "English", + "dlg.app-language-ru": "Русский", + "dlg.app-language-ua": "Українська", + "dlg.app-language-zh-cn": "中文", + "dlg.app-language-pt": "Português", + "dlg.app-language-sv": "Swedish", + "dlg.app-language-tr": "Türkçe", + "dlg.app-language-ko": "한국어", + "dlg.app-language-es": "Español", + "dlg.app-language-fr": "Français", + "dlg.app-settings-server-port": "伺服器監聽連接埠", + "dlg.app-settings-server-log-full": "日誌完整模式", + "dlg.app-settings-alarms": "警報", + "dlg.app-settings-alarms-clear": "清除所有警報與歷史", + "dlg.app-settings-auth-token": "使用權杖進行驗證", + "dlg.app-settings-auth-only-editor": "僅供編輯器", + "dlg.app-auth-disabled": "已停用", + "dlg.app-auth-expiration-15m": "已啟用,權杖 15 分鐘後失效", + "dlg.app-auth-expiration-1h": "已啟用,權杖將於 1 小時後到期,", + "dlg.app-auth-expiration-3h": "已啟用,權杖將於 3 小時後到期,", + "dlg.app-auth-expiration-1d": "已啟用,權杖將於 1 天內到期,", + "dlg.app-auth-tooltip": "已啟用:你有一個管理員帳號 'admin/123456'(請不要忘記修改)。需要重新啟動伺服器!", + "dlg.app-settings-client-broadcast": "廣播至用戶端(前端)所有標籤值", + + "dlg.app-settings-daqstore": "DAQ 儲存", + "dlg.app-settings-daqstore-type": "資料庫類型", + "dlg.app-settings-daqstore-url": "URL", + "dlg.app-settings-daqstore-token":"權杖", + "dlg.app-settings-daqstore-bucket": "Bucket", + "dlg.app-settings-daqstore-organization": "組織", + "dlg.app-settings-daqstore-retention": "保留", + "dlg.app-settings-daqstore-database": "資料庫名稱", + "dlg.app-settings-daqstore-username": "使用者名稱", + "dlg.app-settings-daqstore-password": "密碼", + + "dlg.app-settings-user-group-label": "授權類型", + "dlg.app-settings-user-group": "群組(預設)", + "dlg.app-settings-user-roles": "角色", + + "store.retention-none": "停用", + "store.retention-day1": "1 天", + "store.retention-days2": "2 天", + "store.retention-days3": "3 天", + "store.retention-days7": "7 天", + "store.retention-days14": "14 天", + "store.retention-days30": "30 天", + "store.retention-days90": "90 天", + "store.retention-year1": "1 年", + "store.retention-year3": "3 年", + "store.retention-year5": "5 年", + + "plugin.group-connection-device": "連線裝置", + "plugin.group-connection-database": "連線資料庫", + "plugin.group-chart-report": "報告圖表", + + "action-settings-title": "動作設定", + "action-settings-readonly-tag": "標籤", + "action-settings-readonly-values": "值", + + "msg.alarm-ack-all": "您是否要確認所有警報?", + "msg.alarm-remove": "您是否要刪除警報", + "msg.text-remove": "您是否要刪除文字", + "msg.alarmproperty-error-exist": "警報名稱已存在!", + "msg.alarmproperty-missing-value": "有些數值遺失!", + "msg.textproperty-error-exist": "Text-ID 已經存在!", + "msg.textproperty-missing-value": "有些數值缺失!", + "msg.device-remove": "您是否要刪除裝置", + "msg.device-tag-remove": "您是否要刪除標籤", + "msg.device-tag-exist": "標籤名稱已存在!", + "msg.device-tag-invalid-char": "不允許在標籤名稱中使用 '@' 字元!", + "msg.notification-property-missing-value": "有些數值遺失!", + "msg.report-property-missing-value": "有不正確或缺失的值!", + "msg.file-upload-failed": "上傳失敗!", + "msg.file-delete-failed": "刪除檔案失敗!", + + "msg.home-welcome": "請稍候......前往編輯器,繫結裝置,設計你的可視化並繫結裝置的變數", + "msg.server-connection-failed": "伺服器連線失敗!", + "msg.project-load-error": "無法讀取 '{{value}}'", + "msg.project": "您要儲存專案的變更嗎?", + "msg.tags-remove-all": "您要刪除所有標籤嗎?", + "msg.view-remove": "您是否要刪除視圖 '{{value}}'?", + "msg.chart-remove": "您要刪除圖表 '{{value}}' 嗎?", + "msg.role-remove": "您是否要刪除角色 '{{value}}'?", + "msg.graph-remove": "您要刪除長條圖 '{{value}}' 嗎?", + "msg.script-remove": "您要刪除腳本 '{{value}}' 嗎?", + "msg.report-remove": "您是否要刪除報告", + "msg.device-connection-error": "裝置 '{{value}}' 連線錯誤!", + "msg.server-connection-error": "伺服器連線失敗!", + "msg.sendmail-success": "郵件傳送成功!", + "msg.sendmail-error": "郵件傳送失敗!", + "msg.users-save-error": "使用者儲存失敗!", + "msg.user-remove": "您是否要刪除使用者", + "msg.project-save-success": "專案儲存成功!", + "msg.project-save-error": "專案儲存失敗!", + "msg.project-format-error": "專案格式錯誤!", + "msg.view-format-error": "視圖格式錯誤!", + "msg.project-save-unauthorized": "專案儲存失敗!未授權!", + "msg.project-save-ask": "你想離開此專案嗎?", + "msg.login-username-required": "輸入使用者名稱", + "msg.login-password-required": "輸入密碼", + "msg.signin-failed": "未授權", + "msg.signin-unauthorized": "未授權!", + "msg.get-project-void": "未找到專案!", + "msg.editor-mode-locked": "編輯器已開啟!", + "msg.alarms-clear-success": "所有警報已被清除!", + "msg.import-devices-error": "匯入裝置失敗!", + "msg.report-build-forced": "已成功觸發建置報告傳送", + "msg.report-build-error": "觸發建置報告傳送失敗!", + "msg.device-tags-request-result": "載入 {{current}} / {{value}}", + "msg.chart-with-script": "定義的腳本會接收圖表線清單作為參數,然後回傳附帶資料的完成清單。請參考腳本『範本』中的程式碼範例", + "msg.script-name-exist": "腳本名稱已存在!", + "msg.invalid-script-name": "無效的腳本名稱!", + "msg.templates-exist-ask-overwrite": "名稱 '{{value}}' 的範本已存在。您是否要覆蓋它?", + "msg.templates-save-success": "範本儲存成功!", + "msg.view-name-exist": "視圖名稱已存在!", + "msg.notification-name-exist": "通知名稱已存在!", + "msg.file-remove": "您是否要刪除 '{{value}}'?", + "msg.notification-remove": "您是否要刪除通知 '{{value}}'?", + "msg.maps-location-remove": "您是否要刪除位置 '{{value}}'?", + "msg.maps-location-name-exist": "位置名稱已存在!", + "msg.text-name-exist": "文字名稱已存在!", + "msg.texts-text-remove": "您是否要刪除文字 '{{value}}'?", + "msg.operation-unauthorized": "操作未授權!" +} diff --git a/client/src/assets/images/nodered-icon.svg b/client/src/assets/images/nodered-icon.svg new file mode 100644 index 000000000..f6b19d6a3 --- /dev/null +++ b/client/src/assets/images/nodered-icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/client/src/assets/lib/svgeditor/extensions/ext-bundle.min.js b/client/src/assets/lib/svgeditor/extensions/ext-bundle.min.js index 030a7c491..bf646a659 100644 --- a/client/src/assets/lib/svgeditor/extensions/ext-bundle.min.js +++ b/client/src/assets/lib/svgeditor/extensions/ext-bundle.min.js @@ -1 +1 @@ -window.extConnector=function(){window.svgEditor&&svgEditor.addExtension("Connector",function(e){var u,v,f,p,m,h,x=e.svgcontent,g=e.svgroot,l=e.getNextId,w=e.getElem,y=e.addSvgElementFromJson,b=e.selectorManager,c=svgEditor.curConfig,k=!1,_=[],C=".se_connector",E=[],A=$.data,t={en:[{id:"mode_connect",title:"Connect two objects"}],fr:[{id:"mode_connect",title:"Connecter deux objets"}]};function S(e,t,r,n){n&&(n-=0,(r=$.extend({},r)).width+=n,r.height+=n,r.x-=n/2,r.y-=n/2);var i,o=r.x+r.width/2,a=r.y+r.height/2,s=e-o,d=t-a;return{x:o+s*(i=Math.abs(d/s)').appendTo("head")),t.text(e?"#tool_clone, #tool_topath, #tool_angle, #xy_panel { display: none !important; }":""),$("#connector_panel").toggle(e)}function M(t,r,n,i,e){var o,a=t.points,s=g.createSVGPoint();s.x=n,s.y=i,"end"===r&&(r=a.numberOfItems-1);try{a.replaceItem(s,r)}catch(e){var d=t.getAttribute("points").split(" ");for(o=0;o\t\t\t
\t\t\t\t
\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t \t\t\t\t\t
\t\t\t\t\t
\t\t\t\t
\t\t\t
\t\t

');var o=function(){var e=parseFloat($("#workarea").css("height")),t=parseFloat($("#workarea").css("width")),r=$("#workarea").scrollLeft(),n=$("#workarea").scrollTop(),i=parseFloat($("#svgcanvas").css("width")),o=parseFloat($("#svgcanvas").css("height")),a=$("#overviewMiniView").attr("width"),s=$("#overviewMiniView").attr("height"),d=r/i*a,l=n/o*s,c=t/i*a,g=e/o*s;$("#overview_window_view_box").css("min-width",c+"px"),$("#overview_window_view_box").css("min-height",g+"px"),$("#overview_window_view_box").css("top",l+"px"),$("#overview_window_view_box").css("left",d+"px")};$("#workarea").scroll(function(){t.viewBoxDragging||o()}),$("#workarea").resize(o),o();var e=function(){var e=$("#svgroot").attr("width"),t=$("#svgroot").attr("height"),r=640,n=480;svgedit.browser.isIE()&&(n=r=0);var i=t/e*$("#overviewMiniView").attr("width");$("#overviewMiniView").attr("viewBox",r+" "+n+" "+e+" "+t),$("#overviewMiniView").attr("height",i),o()};e(),t.viewBoxDragging=!1;var l=function(){var e=parseFloat($("#svgcanvas").css("width")),t=parseFloat($("#svgcanvas").css("height")),r=$("#overviewMiniView").attr("width"),n=$("#overviewMiniView").attr("height"),i=parseFloat($("#overview_window_view_box").css("left"))/r*e,o=parseFloat($("#overview_window_view_box").css("top"))/n*t;$("#workarea").scrollLeft(i),$("#workarea").scrollTop(o)};return $("#overview_window_view_box").draggable({containment:"parent",drag:l,start:function(){t.viewBoxDragging=!0},stop:function(){t.viewBoxDragging=!1}}),$("#overviewMiniView").click(function(e){var t=e.offsetX||e.originalEvent.layerX,r=e.offsetY||e.originalEvent.layerY,n=$("#overviewMiniView").attr("width"),i=$("#overviewMiniView").attr("height"),o=parseFloat($("#overview_window_view_box").css("min-width")),a=parseFloat($("#overview_window_view_box").css("min-height")),s=t-.5*o,d=r-.5*a;s<0&&(s=0),d<0&&(d=0),n').appendTo("head")),t.text(e?"#tool_clone, #tool_topath, #tool_angle, #xy_panel { display: none !important; }":""),$("#connector_panel").toggle(e)}function M(t,r,n,i,e){var o,a=t.points,s=g.createSVGPoint();s.x=n,s.y=i,"end"===r&&(r=a.numberOfItems-1);try{a.replaceItem(s,r)}catch(e){var d=t.getAttribute("points").split(" ");for(o=0;o\t\t\t
\t\t\t\t
\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t \t\t\t\t\t
\t\t\t\t\t
\t\t\t\t
\t\t\t
\t\t');var o=function(){var e=parseFloat($("#workarea").css("height")),t=parseFloat($("#workarea").css("width")),r=$("#workarea").scrollLeft(),n=$("#workarea").scrollTop(),i=parseFloat($("#svgcanvas").css("width")),o=parseFloat($("#svgcanvas").css("height")),a=$("#overviewMiniView").attr("width"),s=$("#overviewMiniView").attr("height"),d=r/i*a,l=n/o*s,c=t/i*a,g=e/o*s;$("#overview_window_view_box").css("min-width",c+"px"),$("#overview_window_view_box").css("min-height",g+"px"),$("#overview_window_view_box").css("top",l+"px"),$("#overview_window_view_box").css("left",d+"px")};$("#workarea").scroll(function(){t.viewBoxDragging||o()}),$("#workarea").resize(o),o();var e=function(){var e=$("#svgroot").attr("width"),t=$("#svgroot").attr("height"),r=640,n=480;svgedit.browser.isIE()&&(n=r=0);var i=t/e*$("#overviewMiniView").attr("width");$("#overviewMiniView").attr("viewBox",r+" "+n+" "+e+" "+t),$("#overviewMiniView").attr("height",i),o()};e(),t.viewBoxDragging=!1;var l=function(){var e=parseFloat($("#svgcanvas").css("width")),t=parseFloat($("#svgcanvas").css("height")),r=$("#overviewMiniView").attr("width"),n=$("#overviewMiniView").attr("height"),i=parseFloat($("#overview_window_view_box").css("left"))/r*e,o=parseFloat($("#overview_window_view_box").css("top"))/n*t;$("#workarea").scrollLeft(i),$("#workarea").scrollTop(o)};return $("#overview_window_view_box").draggable({containment:"parent",drag:l,start:function(){t.viewBoxDragging=!0},stop:function(){t.viewBoxDragging=!1}}),$("#overviewMiniView").click(function(e){var t=e.offsetX||e.originalEvent.layerX,r=e.offsetY||e.originalEvent.layerY,n=$("#overviewMiniView").attr("width"),i=$("#overviewMiniView").attr("height"),o=parseFloat($("#overview_window_view_box").css("min-width")),a=parseFloat($("#overview_window_view_box").css("min-height")),s=t-.5*o,d=r-.5*a;s<0&&(s=0),d<0&&(d=0),n1;)u=i[r-1],t=u.multiply(t);return Math.abs(t.a)r&&(e=r,r=i,i=e),f=t.createSVGMatrix(),u=i;u<=r;++u)o=u>=0&&un.x&&t.yn.y}})(); var mysvgutils=function(t){"use strict";return{initSvgutils:function(){function e(t){if(svgedit.browser.supportsHVLineContainerBBox())try{return t.getBBox()}catch(t){}var e,i,r=$.data(t,"ref"),n=null;r?(i=$(r).children().clone().attr("visibility","hidden"),$(l).append(i),n=i.filter("line, path")):n=$(t).find("line, path");var s=!1;if(n.length)if(n.each(function(){var t=this.getBBox();t.width&&t.height||(s=!0)}),s){var o=r?i:$(t).children();e=getStrokedBBox(o)}else e=t.getBBox();else e=t.getBBox();return r&&i.remove(),e}svgedit.utilities||(svgedit.utilities={});var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",r=svgedit.NS,n="a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use",s=n.split(","),o=null,u=null,B=null,l=null;svgedit.utilities.init=function(t){o=t,u=t.getDOMDocument(),B=t.getDOMContainer(),l=t.getSVGRoot()},svgedit.utilities.toXml=function(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/,"'")},svgedit.utilities.fromXml=function(t){return $("

").html(t).text()},svgedit.utilities.encode64=function(t){if(t=svgedit.utilities.encodeUTF8(t),window.btoa)return window.btoa(t);var e,r,n,s,o,u,B,l=[];l.length=4*Math.floor((t.length+2)/3);var a=0,D=0;do{e=t.charCodeAt(a++),r=t.charCodeAt(a++),n=t.charCodeAt(a++),s=e>>2,o=(3&e)<<4|r>>4,u=(15&r)<<2|n>>6,B=63&n,isNaN(r)?u=B=64:isNaN(n)&&(B=64),l[D++]=i.charAt(s),l[D++]=i.charAt(o),l[D++]=i.charAt(u),l[D++]=i.charAt(B)}while(a>4,r=(15&s)<<4|o>>2,B=(3&o)<<6|l,u+=String.fromCharCode(e),64!=o&&(u+=String.fromCharCode(r)),64!=l&&(u+=String.fromCharCode(B)),e=r=B="",n=s=o=l=""}while(a>>8^r;return-1^i},svgedit.utilities.convertToXMLReferences=function(t){var e,i="";for(e=0;e127&&(i+="&#"+r+";")}return i},svgedit.utilities.text2xml=function(t){var e,i;t.indexOf("=0&&(t=t.replace(/<(\/?)svg:/g,"<$1").replace("xmlns:svg","xmlns"));try{i=window.DOMParser?new DOMParser:new ActiveXObject("Microsoft.XMLDOM"),i.async=!1}catch(t){throw new Error("XML Parser could not be instantiated")}try{e=i.loadXML?!!i.loadXML(t)&&i:i.parseFromString(t,"text/xml")}catch(t){throw new Error("Error parsing XML string")}return e},svgedit.utilities.bboxToObj=function(t){return{x:t.x,y:t.y,width:t.width,height:t.height}},svgedit.utilities.walkTree=function(t,e){if(t&&1==t.nodeType){e(t);for(var i=t.childNodes.length;i--;)svgedit.utilities.walkTree(t.childNodes.item(i),e)}},svgedit.utilities.walkTreePost=function(t,e){if(t&&1==t.nodeType){for(var i=t.childNodes.length;i--;)svgedit.utilities.walkTree(t.childNodes.item(i),e);e(t)}},svgedit.utilities.getUrlFromAttr=function(t){if(t){if(0===t.indexOf('url("'))return t.substring(5,t.indexOf('"',6));if(0===t.indexOf("url('"))return t.substring(5,t.indexOf("'",6));if(0===t.indexOf("url("))return t.substring(4,t.indexOf(")"))}return null},svgedit.utilities.getHref=function(t){return t.getAttributeNS(r.XLINK,"href")},svgedit.utilities.setHref=function(t,e){t.setAttributeNS(r.XLINK,"xlink:href",e)},svgedit.utilities.findDefs=function(){var t=o.getSVGContent(),e=t.getElementsByTagNameNS(r.SVG,"defs");return e.length>0?e=e[0]:(e=t.ownerDocument.createElementNS(r.SVG,"defs"),t.firstChild?t.insertBefore(e,t.firstChild.nextSibling):t.appendChild(e)),e},svgedit.utilities.getPathBBox=function(e){var i,r=e.pathSegList,n=r.numberOfItems,s=[[],[]],o=r.getItem(0),u=[o.x,o.y];for(i=0;i|:\\"+(e||"")+"-]","g"),"\\$&")},svgedit.utilities.executeAfterLoads=function(t,e,i){return function(){function r(){i.apply(null,n)}var n=arguments;window[t]?r():e.reduceRight(function(t,e){return function(){$.getScript(e,t)}},r)()}},svgedit.utilities.buildCanvgCallback=function(t){return svgedit.utilities.executeAfterLoads("canvg",["canvg/rgbcolor.js","canvg/canvg.js"],t)},svgedit.utilities.buildJSPDFCallback=function(e){return svgedit.utilities.executeAfterLoads("RGBColor",["canvg/rgbcolor.js"],function(){var i=[];RGBColor&&RGBColor.ok!==t||i.push("canvg/rgbcolor.js"),svgedit.utilities.executeAfterLoads("jsPDF",i.concat("jspdf/underscore-min.js","jspdf/jspdf.min.js","jspdf/jspdf.plugin.svgToPdf.js"),e)()})},svgedit.utilities.takePil=function(){var t=new Date,e=t.getFullYear(),i=t.getDay();Math.floor(3*Math.random());return e%2>0&&Math.floor(i/2),!0},svgedit.utilities.isNullish=function(t){return null==t}}}}(mysvgutils||{}); (function(){"use strict";svgedit.history||(svgedit.history={}),svgedit.history.HistoryEventTypes={BEFORE_APPLY:"before_apply",AFTER_APPLY:"after_apply",BEFORE_UNAPPLY:"before_unapply",AFTER_UNAPPLY:"after_unapply"};svgedit.history.MoveElementCommand=function(t,e,i,n){this.elem=t,this.text=n?"Move "+t.tagName+" to "+n:"Move "+t.tagName,this.oldNextSibling=e,this.oldParent=i,this.newNextSibling=t.nextSibling,this.newParent=t.parentNode},svgedit.history.MoveElementCommand.type=function(){return"svgedit.history.MoveElementCommand"},svgedit.history.MoveElementCommand.prototype.type=svgedit.history.MoveElementCommand.type,svgedit.history.MoveElementCommand.prototype.getText=function(){return this.text},svgedit.history.MoveElementCommand.prototype.apply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY,this),this.elem=this.newParent.insertBefore(this.elem,this.newNextSibling),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY,this)},svgedit.history.MoveElementCommand.prototype.unapply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY,this),this.elem=this.oldParent.insertBefore(this.elem,this.oldNextSibling),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY,this)},svgedit.history.MoveElementCommand.prototype.elements=function(){return[this.elem]},svgedit.history.InsertElementCommand=function(t,e){this.elem=t,this.text=e||"Create "+t.tagName,this.parent=t.parentNode,this.nextSibling=this.elem.nextSibling},svgedit.history.InsertElementCommand.type=function(){return"svgedit.history.InsertElementCommand"},svgedit.history.InsertElementCommand.prototype.type=svgedit.history.InsertElementCommand.type,svgedit.history.InsertElementCommand.prototype.getText=function(){return this.text},svgedit.history.InsertElementCommand.prototype.apply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY,this),this.elem=this.parent.insertBefore(this.elem,this.nextSibling),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY,this)},svgedit.history.InsertElementCommand.prototype.unapply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY,this),this.parent=this.elem.parentNode,this.elem=this.elem.parentNode.removeChild(this.elem),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY,this)},svgedit.history.InsertElementCommand.prototype.elements=function(){return[this.elem]},svgedit.history.RemoveElementCommand=function(t,e,i,n){this.elem=t,this.text=n||"Delete "+t.tagName,this.nextSibling=e,this.parent=i,svgedit.transformlist.removeElementFromListMap(t)},svgedit.history.RemoveElementCommand.type=function(){return"svgedit.history.RemoveElementCommand"},svgedit.history.RemoveElementCommand.prototype.type=svgedit.history.RemoveElementCommand.type,svgedit.history.RemoveElementCommand.prototype.getText=function(){return this.text},svgedit.history.RemoveElementCommand.prototype.apply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY,this),svgedit.transformlist.removeElementFromListMap(this.elem),this.parent=this.elem.parentNode,this.elem=this.parent.removeChild(this.elem),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY,this)},svgedit.history.RemoveElementCommand.prototype.unapply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY,this),svgedit.transformlist.removeElementFromListMap(this.elem),null==this.nextSibling&&window.console&&console.log("Error: reference element was lost"),this.parent.insertBefore(this.elem,this.nextSibling),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY,this)},svgedit.history.RemoveElementCommand.prototype.elements=function(){return[this.elem]},svgedit.history.ChangeElementCommand=function(t,e,i){this.elem=t,this.text=i?"Change "+t.tagName+" "+i:"Change "+t.tagName,this.newValues={},this.oldValues=e;var n;for(n in e)"#text"==n?this.newValues[n]=t.textContent:"#href"==n?this.newValues[n]=svgedit.utilities.getHref(t):this.newValues[n]=t.getAttribute(n)},svgedit.history.ChangeElementCommand.type=function(){return"svgedit.history.ChangeElementCommand"},svgedit.history.ChangeElementCommand.prototype.type=svgedit.history.ChangeElementCommand.type,svgedit.history.ChangeElementCommand.prototype.getText=function(){return this.text},svgedit.history.ChangeElementCommand.prototype.apply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY,this);var e,i=!1;for(e in this.newValues)this.newValues[e]?"#text"==e?this.elem.textContent=this.newValues[e]:"#href"==e?svgedit.utilities.setHref(this.elem,this.newValues[e]):this.elem.setAttribute(e,this.newValues[e]):"#text"==e?this.elem.textContent="":(this.elem.setAttribute(e,""),this.elem.removeAttribute(e)),"transform"==e&&(i=!0);if(!i){var n=svgedit.utilities.getRotationAngle(this.elem);if(n){var s=elem.getBBox(),o=s.x+s.width/2,r=s.y+s.height/2,h=["rotate(",n," ",o,",",r,")"].join("");h!=elem.getAttribute("transform")&&elem.setAttribute("transform",h)}}return t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY,this),!0},svgedit.history.ChangeElementCommand.prototype.unapply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY,this);var e,i=!1;for(e in this.oldValues)this.oldValues[e]?"#text"==e?this.elem.textContent=this.oldValues[e]:"#href"==e?svgedit.utilities.setHref(this.elem,this.oldValues[e]):this.elem.setAttribute(e,this.oldValues[e]):"#text"==e?this.elem.textContent="":this.elem.removeAttribute(e),"transform"==e&&(i=!0);if(!i){var n=svgedit.utilities.getRotationAngle(this.elem);if(n){var s=elem.getBBox(),o=s.x+s.width/2,r=s.y+s.height/2,h=["rotate(",n," ",o,",",r,")"].join("");h!=elem.getAttribute("transform")&&elem.setAttribute("transform",h)}}return svgedit.transformlist.removeElementFromListMap(this.elem),t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY,this),!0},svgedit.history.ChangeElementCommand.prototype.elements=function(){return[this.elem]},svgedit.history.BatchCommand=function(t){this.text=t||"Batch Command",this.stack=[]},svgedit.history.BatchCommand.type=function(){return"svgedit.history.BatchCommand"},svgedit.history.BatchCommand.prototype.type=svgedit.history.BatchCommand.type,svgedit.history.BatchCommand.prototype.getText=function(){return this.text},svgedit.history.BatchCommand.prototype.apply=function(t){t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY,this);var e,i=this.stack.length;for(e=0;e=0;e--)this.stack[e].unapply(t);t&&t.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY,this)},svgedit.history.BatchCommand.prototype.elements=function(){for(var t=[],e=this.stack.length;e--;)for(var i=this.stack[e].elements(),n=i.length;n--;)t.indexOf(i[n])==-1&&t.push(i[n]);return t},svgedit.history.BatchCommand.prototype.addSubCommand=function(t){this.stack.push(t)},svgedit.history.BatchCommand.prototype.isEmpty=function(){return 0===this.stack.length},svgedit.history.UndoManager=function(t){this.handler_=t||null,this.undoStackPointer=0,this.undoStack=[],this.undoChangeStackPointer=-1,this.undoableChangeStack=[]},svgedit.history.UndoManager.prototype.resetUndoStack=function(){this.undoStack=[],this.undoStackPointer=0},svgedit.history.UndoManager.prototype.getUndoStackSize=function(){return this.undoStackPointer},svgedit.history.UndoManager.prototype.getRedoStackSize=function(){return this.undoStack.length-this.undoStackPointer},svgedit.history.UndoManager.prototype.getNextUndoCommandText=function(){return this.undoStackPointer>0?this.undoStack[this.undoStackPointer-1].getText():""},svgedit.history.UndoManager.prototype.getNextRedoCommandText=function(){return this.undoStackPointer0){var t=this.undoStack[--this.undoStackPointer];t.unapply(this.handler_)}},svgedit.history.UndoManager.prototype.redo=function(){if(this.undoStackPointer0){var t=this.undoStack[this.undoStackPointer++];t.apply(this.handler_)}},svgedit.history.UndoManager.prototype.addCommandToHistory=function(t){this.undoStackPointer0&&(this.undoStack=this.undoStack.splice(0,this.undoStackPointer)),this.undoStack.push(t),this.undoStackPointer=this.undoStack.length},svgedit.history.UndoManager.prototype.beginUndoableChange=function(t,e){for(var i=++this.undoChangeStackPointer,n=e.length,s=new Array(n),o=new Array(n);n--;){var r=e[n];null!=r&&(o[n]=r,s[n]=r.getAttribute(t))}this.undoableChangeStack[i]={attrName:t,oldValues:s,elements:o}},svgedit.history.UndoManager.prototype.finishUndoableChange=function(){for(var t=this.undoChangeStackPointer--,e=this.undoableChangeStack[t],i=e.elements.length,n=e.attrName,s=new svgedit.history.BatchCommand("Change "+n);i--;){var o=e.elements[i];if(null!=o){var r={};r[n]=e.oldValues[i],r[n]!=o.getAttribute(n)&&s.addSubCommand(new svgedit.history.ChangeElementCommand(o,r,n))}}return this.undoableChangeStack[t]=null,s}})(); -(function(){"use strict";svgedit.sanitize||(svgedit.sanitize={});var e=svgedit.NS,t=svgedit.getReverseNS(),i={a:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","id","mask","opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","xlink:href","xlink:title"],circle:["class","clip-path","clip-rule","cx","cy","fill","fill-opacity","fill-rule","filter","id","mask","opacity","r","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],clipPath:["class","clipPathUnits","id"],defs:[],style:["type"],desc:[],ellipse:["class","clip-path","clip-rule","cx","cy","fill","fill-opacity","fill-rule","filter","id","mask","opacity","requiredFeatures","rx","ry","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],feGaussianBlur:["class","color-interpolation-filters","id","requiredFeatures","stdDeviation"],filter:["class","color-interpolation-filters","filterRes","filterUnits","height","id","primitiveUnits","requiredFeatures","width","x","xlink:href","y"],foreignObject:["class","font-size","height","id","opacity","requiredFeatures","style","transform","width","x","y"],g:["type","class","clip-path","clip-rule","id","display","fill","fill-opacity","fill-rule","filter","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","font-family","font-size","font-style","font-weight","text-anchor"],image:["class","clip-path","clip-rule","filter","height","id","mask","opacity","requiredFeatures","style","systemLanguage","transform","width","x","xlink:href","xlink:title","y"],line:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","id","marker-end","marker-mid","marker-start","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","x1","x2","y1","y2"],linearGradient:["class","id","gradientTransform","gradientUnits","requiredFeatures","spreadMethod","systemLanguage","x1","x2","xlink:href","y1","y2"],marker:["id","class","markerHeight","markerUnits","markerWidth","orient","preserveAspectRatio","refX","refY","systemLanguage","viewBox"],mask:["class","height","id","maskContentUnits","maskUnits","width","x","y"],metadata:["class","id"],path:["type","class","clip-path","clip-rule","d","fill","fill-opacity","fill-rule","filter","id","marker-end","marker-mid","marker-start","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],pattern:["class","height","id","patternContentUnits","patternTransform","patternUnits","requiredFeatures","style","systemLanguage","viewBox","width","x","xlink:href","y"],polygon:["class","clip-path","clip-rule","id","fill","fill-opacity","fill-rule","filter","id","class","marker-end","marker-mid","marker-start","mask","opacity","points","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],polyline:["class","clip-path","clip-rule","id","fill","fill-opacity","fill-rule","filter","marker-end","marker-mid","marker-start","mask","opacity","points","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],radialGradient:["class","cx","cy","fx","fy","gradientTransform","gradientUnits","id","r","requiredFeatures","spreadMethod","systemLanguage","xlink:href"],rect:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","height","id","mask","opacity","requiredFeatures","rx","ry","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","width","x","y"],stop:["class","id","offset","requiredFeatures","stop-color","stop-opacity","style","systemLanguage"],svg:["class","clip-path","clip-rule","filter","id","height","mask","preserveAspectRatio","requiredFeatures","style","systemLanguage","viewBox","width","x","xmlns","xmlns:se","xmlns:xlink","y"],switch:["class","id","requiredFeatures","systemLanguage"],symbol:["class","type","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","opacity","preserveAspectRatio","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","viewBox"],text:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","text-anchor","transform","x","xml:space","y"],textPath:["class","id","method","requiredFeatures","spacing","startOffset","style","systemLanguage","transform","xlink:href"],title:[],tspan:["class","clip-path","clip-rule","dx","dy","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","mask","opacity","requiredFeatures","rotate","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","text-anchor","textLength","transform","x","xml:space","y"],use:["class","type","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","height","id","mask","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","transform","width","x","xlink:href","y"],script:[],input:["class","id","type","style","value"],INPUT:["class","id","type","style","value"],select:["class","id","type","style"],SELECT:["class","id","type","style"],option:["value","text"],OPTION:["value","text"],button:["class","color","style","id"],BUTTON:["class","color","style","id"],span:["class","color","style","id"],SPAN:["class","color","style","id"],div:["class","style","id"],DIV:["class","style","id"],label:["class","style","id"],LABEL:["class","style","id"],annotation:["encoding"],"annotation-xml":["encoding"],maction:["actiontype","other","selection"],math:["class","id","display","xmlns"],menclose:["notation"],merror:[],mfrac:["linethickness"],mi:["mathvariant"],mmultiscripts:[],mn:[],mo:["fence","lspace","maxsize","minsize","rspace","stretchy"],mover:[],mpadded:["lspace","width","height","depth","voffset"],mphantom:[],mprescripts:[],mroot:[],mrow:["xlink:href","xlink:type","xmlns:xlink"],mspace:["depth","height","width"],msqrt:[],mstyle:["displaystyle","mathbackground","mathcolor","mathvariant","scriptlevel"],msub:[],msubsup:[],msup:[],mtable:["align","columnalign","columnlines","columnspacing","displaystyle","equalcolumns","equalrows","frame","rowalign","rowlines","rowspacing","width"],mtd:["columnalign","columnspan","rowalign","rowspan"],mtext:[],mtr:["columnalign","rowalign"],munder:[],munderover:[],none:[],semantics:[]},s={};$.each(i,function(t,i){var r={};$.each(i,function(t,i){if(i.indexOf(":")>=0){var s=i.split(":");r[s[1]]=e[s[0].toUpperCase()]}else r[i]="xmlns"==i?e.XMLNS:null}),s[t]=r}),svgedit.sanitize.sanitizeSvg=function(r){if(3==r.nodeType&&(r.nodeValue=r.nodeValue.replace(/^\s+|\s+$/g,""),0===r.nodeValue.length&&r.parentNode.removeChild(r)),1==r.nodeType){var a=r.ownerDocument,l=r.parentNode;if(a&&l){var o=i[r.nodeName],n=s[r.nodeName];if(void 0!==o){if("foreignObject"===l.nodeName||l.parentNode&&"foreignObject"===l.parentNode.nodeName){for(var d=document.createElement(r.tagName),c=r.attributes.length;c--;){var m=r.attributes.item(c);d.setAttribute(m.nodeName,m.value)}d.innerHTML=r.innerHTML,l.removeChild(r),l.appendChild(d),r=d}var f=[];for(c=r.attributes.length;c--;){m=r.attributes.item(c);var p=m.nodeName,y=m.localName,k=m.namespaceURI;if(n.hasOwnProperty(y)&&k==n[y]&&k!=e.XMLNS||k==e.XMLNS&&t[m.value]||(0===p.indexOf("se:")&&f.push([p,m.value]),r.removeAttributeNS(k,y)),svgedit.browser.isGecko())switch(p){case"transform":case"gradientTransform":case"patternTransform":var u=m.value.replace(/(\d)-/g,"$1 -");r.setAttribute(p,u)}if("style"==p&&"foreignObject"!==l.nodeName){for(var h=m.value.split(";"),g=h.length;g--;){var v=h[g].split(":"),x=$.trim(v[0]),w=$.trim(v[1]);o.indexOf(x)>=0&&r.setAttribute(x,w)}r.removeAttribute("style")}}$.each(f,function(t,i){r.setAttributeNS(e.SE,i[0],i[1])});var L=svgedit.utilities.getHref(r);if(L&&["filter","linearGradient","pattern","radialGradient","textPath","use"].indexOf(r.nodeName)>=0&&"#"!=L[0]&&(svgedit.utilities.setHref(r,""),r.removeAttributeNS(e.XLINK,"href")),"use"==r.nodeName&&!svgedit.utilities.getHref(r))return void l.removeChild(r);for($.each(["clip-path","fill","filter","marker-end","marker-mid","marker-start","mask","stroke"],function(e,t){var i=r.getAttribute(t);i&&(i=svgedit.utilities.getUrlFromAttr(i),i&&"#"!==i[0]&&(r.setAttribute(t,""),r.removeAttribute(t)))}),c=r.childNodes.length;c--;)svgedit.sanitize.sanitizeSvg(r.childNodes.item(c))}else{for(var N=[];r.hasChildNodes();)N.push(l.insertBefore(r.firstChild,r));for(l.removeChild(r),c=N.length;c--;)svgedit.sanitize.sanitizeSvg(N[c])}}}}})(); +(function(){"use strict";svgedit.sanitize||(svgedit.sanitize={});var e=svgedit.NS,t=svgedit.getReverseNS(),s={a:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","id","mask","opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","xlink:href","xlink:title"],circle:["class","clip-path","clip-rule","cx","cy","fill","fill-opacity","fill-rule","filter","id","mask","opacity","r","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],clipPath:["class","clipPathUnits","id"],defs:[],style:["type"],desc:[],ellipse:["class","clip-path","clip-rule","cx","cy","fill","fill-opacity","fill-rule","filter","id","mask","opacity","requiredFeatures","rx","ry","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],feGaussianBlur:["class","color-interpolation-filters","id","requiredFeatures","stdDeviation"],filter:["class","color-interpolation-filters","filterRes","filterUnits","height","id","primitiveUnits","requiredFeatures","width","x","xlink:href","y"],foreignObject:["class","font-size","height","id","opacity","requiredFeatures","style","transform","width","x","y"],g:["type","class","clip-path","clip-rule","id","display","fill","fill-opacity","fill-rule","filter","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","font-family","font-size","font-style","font-weight","text-anchor"],image:["class","clip-path","clip-rule","filter","height","id","mask","opacity","requiredFeatures","style","systemLanguage","transform","width","x","xlink:href","xlink:title","y"],line:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","id","marker-end","marker-mid","marker-start","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","x1","x2","y1","y2"],linearGradient:["class","id","gradientTransform","gradientUnits","requiredFeatures","spreadMethod","systemLanguage","x1","x2","xlink:href","y1","y2"],marker:["id","class","markerHeight","markerUnits","markerWidth","orient","preserveAspectRatio","refX","refY","systemLanguage","viewBox"],mask:["class","height","id","maskContentUnits","maskUnits","width","x","y"],metadata:["class","id"],path:["type","class","clip-path","clip-rule","d","fill","fill-opacity","fill-rule","filter","id","marker-end","marker-mid","marker-start","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],pattern:["class","height","id","patternContentUnits","patternTransform","patternUnits","requiredFeatures","style","systemLanguage","viewBox","width","x","xlink:href","y"],polygon:["class","clip-path","clip-rule","id","fill","fill-opacity","fill-rule","filter","id","class","marker-end","marker-mid","marker-start","mask","opacity","points","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],polyline:["class","clip-path","clip-rule","id","fill","fill-opacity","fill-rule","filter","marker-end","marker-mid","marker-start","mask","opacity","points","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform"],radialGradient:["class","cx","cy","fx","fy","gradientTransform","gradientUnits","id","r","requiredFeatures","spreadMethod","systemLanguage","xlink:href"],rect:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","height","id","mask","opacity","requiredFeatures","rx","ry","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","width","x","y"],stop:["class","id","offset","requiredFeatures","stop-color","stop-opacity","style","systemLanguage"],svg:["class","clip-path","clip-rule","filter","id","height","mask","preserveAspectRatio","requiredFeatures","style","systemLanguage","viewBox","width","x","xmlns","xmlns:se","xmlns:xlink","y"],switch:["class","id","requiredFeatures","systemLanguage"],symbol:["class","type","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","opacity","preserveAspectRatio","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","transform","viewBox"],text:["class","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","mask","opacity","requiredFeatures","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","text-anchor","transform","x","xml:space","y"],textPath:["class","id","method","requiredFeatures","spacing","startOffset","style","systemLanguage","transform","xlink:href"],title:[],tspan:["class","clip-path","clip-rule","dx","dy","fill","fill-opacity","fill-rule","filter","font-family","font-size","font-style","font-weight","id","mask","opacity","requiredFeatures","rotate","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","systemLanguage","text-anchor","textLength","transform","x","xml:space","y"],use:["class","type","clip-path","clip-rule","fill","fill-opacity","fill-rule","filter","height","id","mask","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","style","transform","width","x","xlink:href","y"],script:[],input:["class","id","type","style","value"],INPUT:["class","id","type","style","value"],textarea:["class","id","type","style","value"],TEXTAREA:["class","id","type","style","value"],select:["class","id","type","style"],SELECT:["class","id","type","style"],option:["value","text"],OPTION:["value","text"],button:["class","color","style","id"],BUTTON:["class","color","style","id"],span:["class","color","style","id"],SPAN:["class","color","style","id"],div:["class","style","id"],DIV:["class","style","id"],label:["class","style","id"],LABEL:["class","style","id"],annotation:["encoding"],"annotation-xml":["encoding"],maction:["actiontype","other","selection"],math:["class","id","display","xmlns"],menclose:["notation"],merror:[],mfrac:["linethickness"],mi:["mathvariant"],mmultiscripts:[],mn:[],mo:["fence","lspace","maxsize","minsize","rspace","stretchy"],mover:[],mpadded:["lspace","width","height","depth","voffset"],mphantom:[],mprescripts:[],mroot:[],mrow:["xlink:href","xlink:type","xmlns:xlink"],mspace:["depth","height","width"],msqrt:[],mstyle:["displaystyle","mathbackground","mathcolor","mathvariant","scriptlevel"],msub:[],msubsup:[],msup:[],mtable:["align","columnalign","columnlines","columnspacing","displaystyle","equalcolumns","equalrows","frame","rowalign","rowlines","rowspacing","width"],mtd:["columnalign","columnspan","rowalign","rowspan"],mtext:[],mtr:["columnalign","rowalign"],munder:[],munderover:[],none:[],semantics:[]},i={};$.each(s,function(t,s){var r={};$.each(s,function(t,s){if(s.indexOf(":")>=0){var i=s.split(":");r[i[1]]=e[i[0].toUpperCase()]}else r[s]="xmlns"==s?e.XMLNS:null}),i[t]=r}),svgedit.sanitize.sanitizeSvg=function(r){if(3==r.nodeType&&(r.nodeValue=r.nodeValue.replace(/^\s+|\s+$/g,""),0===r.nodeValue.length&&r.parentNode.removeChild(r)),1==r.nodeType){var a=r.ownerDocument,l=r.parentNode;if(a&&l){var o=s[r.nodeName],n=i[r.nodeName];if(void 0!==o){if("foreignObject"===l.nodeName||l.parentNode&&"foreignObject"===l.parentNode.nodeName){for(var d=document.createElement(r.tagName),c=r.attributes.length;c--;){var m=r.attributes.item(c);d.setAttribute(m.nodeName,m.value)}d.innerHTML=r.innerHTML,l.removeChild(r),l.appendChild(d),r=d}var f=[];for(c=r.attributes.length;c--;){m=r.attributes.item(c);var p=m.nodeName,y=m.localName,u=m.namespaceURI;if(n.hasOwnProperty(y)&&u==n[y]&&u!=e.XMLNS||u==e.XMLNS&&t[m.value]||(0===p.indexOf("se:")&&f.push([p,m.value]),r.removeAttributeNS(u,y)),svgedit.browser.isGecko())switch(p){case"transform":case"gradientTransform":case"patternTransform":var k=m.value.replace(/(\d)-/g,"$1 -");r.setAttribute(p,k)}if("style"==p&&"foreignObject"!==l.nodeName){for(var h=m.value.split(";"),g=h.length;g--;){var v=h[g].split(":"),x=$.trim(v[0]),w=$.trim(v[1]);o.indexOf(x)>=0&&r.setAttribute(x,w)}r.removeAttribute("style")}}$.each(f,function(t,s){r.setAttributeNS(e.SE,s[0],s[1])});var L=svgedit.utilities.getHref(r);if(L&&["filter","linearGradient","pattern","radialGradient","textPath","use"].indexOf(r.nodeName)>=0&&"#"!=L[0]&&(svgedit.utilities.setHref(r,""),r.removeAttributeNS(e.XLINK,"href")),"use"==r.nodeName&&!svgedit.utilities.getHref(r))return void l.removeChild(r);for($.each(["clip-path","fill","filter","marker-end","marker-mid","marker-start","mask","stroke"],function(e,t){var s=r.getAttribute(t);s&&(s=svgedit.utilities.getUrlFromAttr(s),s&&"#"!==s[0]&&(r.setAttribute(t,""),r.removeAttribute(t)))}),c=r.childNodes.length;c--;)svgedit.sanitize.sanitizeSvg(r.childNodes.item(c))}else{for(var N=[];r.hasChildNodes();)N.push(l.insertBefore(r.firstChild,r));for(l.removeChild(r),c=N.length;c--;)svgedit.sanitize.sanitizeSvg(N[c])}}}}})(); var svgedit=svgedit||{};(function(){"use strict";svgedit.coords||(svgedit.coords={});var t=[0,"z","M","m","L","l","C","c","Q","q","A","a","H","h","V","v","S","s","T","t"],n=null;svgedit.coords.init=function(t){n=t};svgedit.coords.remapElement=function(i,r,u){for(var v,h=function(n,t){return svgedit.math.transformPoint(n,t,u)},p=function(n){return u.a*n},w=function(n){return u.d*n},kt=n.getGridSnapping()&&i.parentNode.parentNode.localName==="svg",tt=function(){var n;if(kt)for(n in r)r[n]=svgedit.utilities.snapToGrid(r[n]);svgedit.utilities.assignAttributes(i,r,1e3,!0)},it=svgedit.utilities.getBBox(i),rt,lt,o,at,vt,yt,pt,b,y,k,ft,et,d,s,a,g,c,ot,st,f,ht,ct,nt,wt,bt,l,e=0;e<2;e++)v=e===0?"fill":"stroke",rt=i.getAttribute(v),rt&&rt.indexOf("url(")===0&&(u.a<0||u.d<0)&&(lt=svgedit.utilities.getRefElem(rt),o=lt.cloneNode(!0),u.a<0&&(at=o.getAttribute("x1"),vt=o.getAttribute("x2"),o.setAttribute("x1",-(at-1)),o.setAttribute("x2",-(vt-1))),u.d<0&&(yt=o.getAttribute("y1"),pt=o.getAttribute("y2"),o.setAttribute("y1",-(yt-1)),o.setAttribute("y2",-(pt-1))),o.id=n.getDrawing().getNextId(),svgedit.utilities.findDefs().appendChild(o),i.setAttribute(v,"url(#"+o.id+")"));b=i.tagName;(b==="g"||b==="text"||b=="tspan"||b==="use")&&(u.a==1&&u.b==0&&u.c==0&&u.d==1&&(u.e!=0||u.f!=0)?(ft=svgedit.math.transformListToTransform(i).matrix,et=svgedit.math.matrixMultiply(ft.inverse(),u,ft),r.x=parseFloat(r.x)+et.e,r.y=parseFloat(r.y)+et.f):(y=svgedit.transformlist.getTransformList(i),k=svgroot.createSVGTransform(),k.setMatrix(svgedit.math.matrixMultiply(svgedit.math.transformListToTransform(y).matrix,u)),y.clear(),y.appendItem(k)));switch(b){case"foreignObject":case"rect":case"image":b==="image"&&(u.a<0||u.d<0)?(y=svgedit.transformlist.getTransformList(i),k=svgroot.createSVGTransform(),k.setMatrix(svgedit.math.matrixMultiply(svgedit.math.transformListToTransform(y).matrix,u)),y.clear(),y.appendItem(k)):(a=h(r.x,r.y),r.width=p(r.width),r.height=w(r.height),r.x=a.x+Math.min(0,r.width),r.y=a.y+Math.min(0,r.height),r.width=Math.abs(r.width),r.height=Math.abs(r.height));tt();break;case"ellipse":d=h(r.cx,r.cy);r.cx=d.x;r.cy=d.y;r.rx=p(r.rx);r.ry=w(r.ry);r.rx=Math.abs(r.rx);r.ry=Math.abs(r.ry);tt();break;case"circle":d=h(r.cx,r.cy);r.cx=d.x;r.cy=d.y;var ut=svgedit.math.transformBox(it.x,it.y,it.width,it.height,u),dt=ut.tr.x-ut.tl.x,gt=ut.bl.y-ut.tl.y;r.r=Math.min(dt/2,gt/2);r.r&&(r.r=Math.abs(r.r));tt();break;case"line":a=h(r.x1,r.y1);g=h(r.x2,r.y2);r.x1=a.x;r.y1=a.y;r.x2=g.x;r.y2=g.y;case"text":case"tspan":case"use":tt();break;case"g":ot=$(i).data("gsvg");ot&&svgedit.utilities.assignAttributes(ot,r,1e3,!0);break;case"polyline":case"polygon":for(c=r.points.length,e=0;e0;)s.push(s.shift()),i--;var o=0;for(t in r.selectorGrips)r.selectorGrips[t].setAttribute("style","cursor:"+s[o]+"-resize"),o++},svgedit.select.Selector.prototype.showGrips=function(e){var t=e?"inline":"none";r.selectorGripsGroup.setAttribute("display",t);var s=this.selectedElement;this.hasGrips=e,s&&e&&(this.selectorGroup.appendChild(r.selectorGripsGroup),this.updateGripCursors(svgedit.utilities.getRotationAngle(s)))},svgedit.select.Selector.prototype.resize=function(){var t=this.selectorRect,i=r,o=i.selectorGrips,l=this.selectedElement,n=l.getAttribute("stroke-width"),a=e.currentZoom(),c=1/a;"none"===l.getAttribute("stroke")||isNaN(n)||(c+=n/2);var d=l.tagName;"text"===d&&(c+=2/a);var h=svgedit.transformlist.getTransformList(l),p=svgedit.math.transformListToTransform(h).matrix;p.e*=a,p.f*=a;var u=svgedit.utilities.getBBox(l);if("g"===d&&!$.data(l,"gsvg")){var g=e.getStrokedBBox(l.childNodes);g&&(u=g)}var G=u.x,v=u.y,f=u.width,b=u.height;u={x:G,y:v,width:f,height:b},c*=a;var m=svgedit.math.transformBox(G*a,v*a,f*a,b*a,p),y=m.aabox,x=y.x-c,w=y.y-c,S=y.width+2*c,k=y.height+2*c,C=x+S/2,B=w+k/2,M=svgedit.utilities.getRotationAngle(l);if(M){var A=e.svgRoot().createSVGTransform();A.setRotate(-M,C,B);var E=A.matrix;m.tl=svgedit.math.transformPoint(m.tl.x,m.tl.y,E),m.tr=svgedit.math.transformPoint(m.tr.x,m.tr.y,E),m.bl=svgedit.math.transformPoint(m.bl.x,m.bl.y,E),m.br=svgedit.math.transformPoint(m.br.x,m.br.y,E);var P=m.tl,R=P.x,V=P.y,N=P.x,z=P.y,F=Math.min,T=Math.max;R=F(R,F(m.tr.x,F(m.bl.x,m.br.x)))-c,V=F(V,F(m.tr.y,F(m.bl.y,m.br.y)))-c,N=T(N,T(m.tr.x,T(m.bl.x,m.br.x)))+c,z=T(z,T(m.tr.y,T(m.bl.y,m.br.y)))+c,x=R,w=V,S=N-R,k=z-V}var _=e.svgRoot().suspendRedraw(100),L="M"+x+","+w+" L"+(x+S)+","+w+" "+(x+S)+","+(w+k)+" "+x+","+(w+k)+"z";t.setAttribute("d",L);var j,W=M?"rotate("+[M,C,B].join(",")+")":"";for(j in this.selectorGroup.setAttribute("transform",W),this.gripCoords={nw:[x,w],ne:[x+S,w],sw:[x,w+k],se:[x+S,w+k],n:[x+S/2,w],w:[x,w+k/2],e:[x+S,w+k/2],s:[x+S/2,w+k]},this.gripCoords){var q=this.gripCoords[j];o[j].setAttribute("x",q[0]-3),o[j].setAttribute("y",q[1]-3)}i.rotateGripConnector.setAttribute("x1",x+S/2),i.rotateGripConnector.setAttribute("y1",w),i.rotateGripConnector.setAttribute("x2",x+S/2),i.rotateGripConnector.setAttribute("y2",w-5*s),i.rotateGrip.setAttribute("cx",x+S/2),i.rotateGrip.setAttribute("cy",w-5*s),e.svgRoot().unsuspendRedraw(_)},svgedit.select.SelectorManager=function(){this.selectorParentGroup=null,this.rubberBandBox=null,this.selectors=[],this.selectorMap={},this.selectorGrips={nw:null,n:null,ne:null,e:null,se:null,s:null,sw:null,w:null},this.selectorGripsGroup=null,this.rotateGripConnector=null,this.rotateGrip=null,this.initGroup()},svgedit.select.SelectorManager.prototype.initGroup=function(){var r;for(r in this.selectorParentGroup&&this.selectorParentGroup.parentNode&&this.selectorParentGroup.parentNode.removeChild(this.selectorParentGroup),this.selectorParentGroup=e.createSVGElement({element:"g",attr:{id:"selectorParentGroup"}}),this.selectorGripsGroup=e.createSVGElement({element:"g",attr:{display:"none"}}),this.selectorParentGroup.appendChild(this.selectorGripsGroup),e.svgRoot().appendChild(this.selectorParentGroup),this.selectorMap={},this.selectors=[],this.rubberBandBox=null,this.selectorGrips){var i=e.createSVGElement({element:"rect",attr:{id:"selectorGrip_resize_"+r,width:6,height:6,"stroke-width":1,stroke:"#9ebdff",fill:"#FFF",style:"cursor:"+r+"-resize","pointer-events":"all"}});$.data(i,"dir",r),$.data(i,"type","resize"),this.selectorGrips[r]=this.selectorGripsGroup.appendChild(i)}if(this.rotateGripConnector=this.selectorGripsGroup.appendChild(e.createSVGElement({element:"line",attr:{id:"selectorGrip_rotateconnector",stroke:"#9ebdff","stroke-width":"1"}})),this.rotateGrip=this.selectorGripsGroup.appendChild(e.createSVGElement({element:"circle",attr:{id:"selectorGrip_rotate",fill:"lime",r:s,stroke:"#9ebdff","stroke-width":1}})),$.data(this.rotateGrip,"type","rotate"),!$("#canvasBackground").length){var o=t.dimensions,l=e.createSVGElement({element:"svg",attr:{id:"canvasBackground",width:o[0],height:o[1],x:0,y:0,overflow:svgedit.browser.isWebkit()?"none":"visible",style:"pointer-events:none"}}),n=e.createSVGElement({element:"rect",attr:{width:"100%",height:"100%",x:0,y:0,"stroke-width":1,stroke:"#000",fill:"#FFF",style:"pointer-events:none"}});l.appendChild(n),e.svgRoot().insertBefore(l,e.svgContent())}},svgedit.select.SelectorManager.prototype.requestSelector=function(e){if(null==e)return null;var t,r=this.selectors.length;if("object"==typeof this.selectorMap[e.id])return this.selectorMap[e.id].locked=!0,this.selectorMap[e.id];for(t=0;t=0)return null;var a,s=t.getSVGRoot(),i=svgedit.transformlist.getTransformList(r);if(i&&i.numberOfItems>0){for(a=i.numberOfItems;a--;){var m=i.getItem(a);0===m.type?i.removeItem(a):1===m.type?svgedit.math.isIdentity(m.matrix)&&i.removeItem(a):4===m.type&&0===m.angle&&i.removeItem(a)}if(1===i.numberOfItems&&svgedit.utilities.getRotationAngle(r))return null}if(!i||0==i.numberOfItems)return r.setAttribute("transform",""),r.removeAttribute("transform"),null;if(i){a=i.numberOfItems;for(var n=[];a--;){var m=i.getItem(a);1===m.type?n.push([m.matrix,a]):n.length&&(n=[])}if(2===n.length){var o=s.createSVGTransformFromMatrix(svgedit.math.matrixMultiply(n[1][0],n[0][0]));i.removeItem(n[0][1]),i.removeItem(n[1][1]),i.insertItemBefore(o,n[1][1])}if(a=i.numberOfItems,a>=2&&1===i.getItem(a-2).type&&2===i.getItem(a-1).type){var f=s.createSVGTransform(),v=svgedit.math.matrixMultiply(i.getItem(a-2).matrix,i.getItem(a-1).matrix);f.setMatrix(v),i.removeItem(a-2),i.removeItem(a-2),i.appendItem(f)}}switch(r.tagName){case"line":case"polyline":case"polygon":case"path":break;default:if(1===i.numberOfItems&&1===i.getItem(0).type||2===i.numberOfItems&&1===i.getItem(0).type&&4===i.getItem(0).type)return null}var g=$(r).data("gsvg"),l=new svgedit.history.BatchCommand("Transform"),d={},u=null,c=[];switch(r.tagName){case"line":c=["x1","y1","x2","y2"];break;case"circle":c=["cx","cy","r"];break;case"ellipse":c=["cx","cy","rx","ry"];break;case"foreignObject":case"rect":case"image":c=["width","height","x","y"];break;case"use":case"text":case"tspan":c=["x","y"];break;case"polygon":case"polyline":u={},u.points=r.getAttribute("points");var p=r.points,I=p.numberOfItems;d.points=new Array(I);var x;for(x=0;x1e-10)var O=Math.sin(M)/(1-Math.cos(M));else var O=2/M;var x;for(x=0;x=3&&3==i.getItem(N-2).type&&2==i.getItem(N-3).type&&2==i.getItem(N-1).type){L=3;for(var R=i.getItem(N-3).matrix,w=i.getItem(N-2).matrix,k=i.getItem(N-1).matrix,C=r.childNodes,D=C.length;D--;){var E=C.item(D);if(G=0,V=0,1==E.nodeType){var P=svgedit.transformlist.getTransformList(E);if(!P)continue;var v=svgedit.math.transformListToTransform(P).matrix,j=svgedit.utilities.getRotationAngle(E),F=t.getStartTransform(),U=[];if(t.setStartTransform(E.getAttribute("transform")),j||svgedit.math.hasMatrixTransform(P)){var H=s.createSVGTransform();H.setMatrix(svgedit.math.matrixMultiply(R,w,k,v)),P.clear(),P.appendItem(H),U.push(H)}else{var W=svgedit.math.matrixMultiply(v.inverse(),k,v),q=s.createSVGMatrix();q.e=-W.e,q.f=-W.f;var z=svgedit.math.matrixMultiply(q.inverse(),v.inverse(),R,w,k,v,W.inverse()),J=s.createSVGTransform(),K=s.createSVGTransform(),Q=s.createSVGTransform();J.setTranslate(W.e,W.f),K.setScale(z.a,z.d),Q.setTranslate(q.e,q.f),P.appendItem(Q),P.appendItem(K),P.appendItem(J),U.push(Q),U.push(K),U.push(J)}l.addSubCommand(svgedit.recalculate.recalculateDimensions(E)),t.setStartTransform(F)}}i.removeItem(N-1),i.removeItem(N-2),i.removeItem(N-3)}else if(N>=3&&1==i.getItem(N-1).type){L=3,v=svgedit.math.transformListToTransform(i).matrix;var H=s.createSVGTransform();H.setMatrix(v),i.clear(),i.appendItem(H)}else if((1==N||N>1&&3!=i.getItem(1).type)&&2==i.getItem(0).type){L=2;var X=svgedit.math.transformListToTransform(i).matrix;i.removeItem(0);var Y=svgedit.math.transformListToTransform(i).matrix.inverse(),Z=svgedit.math.matrixMultiply(Y,X);if(G=Z.e,V=Z.f,0!=G||0!=V){for(var C=r.childNodes,D=C.length,_=[];D--;){var E=C.item(D);if(1==E.nodeType){if(E.getAttribute("clip-path")){var tt=E.getAttribute("clip-path");_.indexOf(tt)===-1&&(svgedit.recalculate.updateClipPath(tt,G,V),_.push(tt))}var F=t.getStartTransform();t.setStartTransform(E.getAttribute("transform"));var P=svgedit.transformlist.getTransformList(E);if(P){var et=s.createSVGTransform();et.setTranslate(G,V),P.numberOfItems?P.insertItemBefore(et,0):P.appendItem(et),l.addSubCommand(svgedit.recalculate.recalculateDimensions(E));for(var rt=r.getElementsByTagNameNS(e.SVG,"use"),at="#"+E.id,st=rt.length;st--;){var it=rt.item(st);if(at==svgedit.utilities.getHref(it)){var mt=s.createSVGTransform();mt.setTranslate(-G,-V),svgedit.transformlist.getTransformList(it).insertItemBefore(mt,0),l.addSubCommand(svgedit.recalculate.recalculateDimensions(it))}}t.setStartTransform(F)}}}_=[],t.setStartTransform(F)}}else{if(1!=N||1!=i.getItem(0).type||S){if(S){var nt=s.createSVGTransform();nt.setRotate(S,b.x,b.y),i.numberOfItems?i.insertItemBefore(nt,0):i.appendItem(nt)}return 0==i.numberOfItems&&r.removeAttribute("transform"),null}L=1;for(var v=i.getItem(0).matrix,C=r.childNodes,D=C.length;D--;){var E=C.item(D);if(1==E.nodeType){var F=t.getStartTransform();t.setStartTransform(E.getAttribute("transform"));var P=svgedit.transformlist.getTransformList(E);if(!P)continue;var ot=svgedit.math.matrixMultiply(v,svgedit.math.transformListToTransform(P).matrix),ft=s.createSVGTransform();ft.setMatrix(ot),P.clear(),P.appendItem(ft,0),l.addSubCommand(svgedit.recalculate.recalculateDimensions(E)),t.setStartTransform(F);var vt=E.getAttribute("stroke-width");if("none"!==E.getAttribute("stroke")&&!isNaN(vt)){var gt=(Math.abs(ot.a)+Math.abs(ot.d))/2;E.setAttribute("stroke-width",vt*gt)}}}i.clear()}if(2==L){if(S){b={x:y.x+B.e,y:y.y+B.f};var nt=s.createSVGTransform();nt.setRotate(S,b.x,b.y),i.numberOfItems?i.insertItemBefore(nt,0):i.appendItem(nt)}}else if(3==L){var v=svgedit.math.transformListToTransform(i).matrix,lt=s.createSVGTransform();lt.setRotate(S,y.x,y.y);var dt=lt.matrix,ut=s.createSVGTransform();ut.setRotate(S,b.x,b.y);var ct=ut.matrix.inverse(),pt=v.inverse(),It=svgedit.math.matrixMultiply(pt,ct,dt,v);if(G=It.e,V=It.f,0!=G||0!=V)for(var C=r.childNodes,D=C.length;D--;){var E=C.item(D);if(1==E.nodeType){var F=t.getStartTransform();t.setStartTransform(E.getAttribute("transform"));var P=svgedit.transformlist.getTransformList(E),et=s.createSVGTransform();et.setTranslate(G,V),P.numberOfItems?P.insertItemBefore(et,0):P.appendItem(et),l.addSubCommand(svgedit.recalculate.recalculateDimensions(E)),t.setStartTransform(F)}}S&&(i.numberOfItems?i.insertItemBefore(ut,0):i.appendItem(ut))}}else{var T=svgedit.utilities.getBBox(r);if(!T&&"path"!=r.tagName)return null;var v=s.createSVGMatrix(),j=svgedit.utilities.getRotationAngle(r);if(j){var y={x:T.x+T.width/2,y:T.y+T.height/2},b=svgedit.math.transformPoint(T.x+T.width/2,T.y+T.height/2,svgedit.math.transformListToTransform(i).matrix),M=j*Math.PI/180;if(Math.abs(M)>1e-10)var O=Math.sin(M)/(1-Math.cos(M));else var O=2/M;for(var x=0;x=3&&3==i.getItem(N-2).type&&2==i.getItem(N-3).type&&2==i.getItem(N-1).type)L=3,v=svgedit.math.transformListToTransform(i,N-3,N-1).matrix,i.removeItem(N-1),i.removeItem(N-2),i.removeItem(N-3);else if(4==N&&1==i.getItem(N-1).type){L=3,v=svgedit.math.transformListToTransform(i).matrix;var H=s.createSVGTransform();H.setMatrix(v),i.clear(),i.appendItem(H),v=s.createSVGMatrix()}else if((1==N||N>1&&3!=i.getItem(1).type)&&2==i.getItem(0).type){L=2;var Ot=i.getItem(0).matrix,At=svgedit.math.transformListToTransform(i,1).matrix,Gt=At.inverse();v=svgedit.math.matrixMultiply(Gt,Ot,At),i.removeItem(0)}else{if(1!=N||1!=i.getItem(0).type||j){if(L=4,j){var nt=s.createSVGTransform();nt.setRotate(j,b.x,b.y),i.numberOfItems?i.insertItemBefore(nt,0):i.appendItem(nt)}return 0==i.numberOfItems&&r.removeAttribute("transform"),null}switch(v=svgedit.math.transformListToTransform(i).matrix,r.tagName){case"line":d=$(r).attr(["x1","y1","x2","y2"]);case"polyline":case"polygon":if(d.points=r.getAttribute("points"),d.points){var p=r.points,I=p.numberOfItems;d.points=new Array(I);for(var x=0;x1?(y=Math.ceil(d/g*b*100)/100,x=Math.ceil(u/h*b*100)/100):(y=Math.floor(d/g*b*100)/100,x=Math.floor(u/h*b*100)/100);let S=Math.min(y,x);if(S===t)return;b=S/t;const C=svgedit.math.transformPoint(c,v,Ae),w={x:s.x-(s.x-C.x)/b,y:s.y-(s.y-C.y)/b},_={x:w.x*S,y:w.y*S},N={x:_.x-a+o/2,y:_.y-a+l/2,width:0,height:0,factor:b};V("myZoomed",{center:!1,bbox:N})})})();var Ge=function(e){$(e).click(function(e){e.preventDefault()})};me=o.textActions=function(){function e(e){var t,i=""===m.value;if($(m).focus(),!arguments.length)if(i)e=0;else{if(m.selectionEnd!==m.selectionStart)return;e=m.selectionEnd}if(t=_[e],t){i||m.setSelectionRange(e,e),c=svgedit.utilities.getElem("text_cursor"),c||(c=document.createElementNS(n.SVG,"line"),svgedit.utilities.assignAttributes(c,{id:"text_cursor",stroke:"#333","stroke-width":1}),c=svgedit.utilities.getElem("selectorParentGroup").appendChild(c)),f||(f=setInterval(function(){var e="none"===c.getAttribute("display");c.setAttribute("display",e?"inline":"none")},600));var r=l(t.x,y.y),a=l(t.x,y.y+y.height);svgedit.utilities.assignAttributes(c,{x1:r.x,y1:r.y,x2:a.x,y2:a.y,visibility:"visible",display:"inline"}),v&&v.setAttribute("d","")}}function t(t,i,r){if(t!==i){r||m.setSelectionRange(t,i),v=svgedit.utilities.getElem("text_selectblock"),v||(v=document.createElementNS(n.SVG,"path"),svgedit.utilities.assignAttributes(v,{id:"text_selectblock",fill:"green",opacity:.5,style:"pointer-events:none"}),svgedit.utilities.getElem("selectorParentGroup").appendChild(v));var a=_[t],s=_[i];c.setAttribute("visibility","hidden");var o=l(a.x,y.y),d=l(a.x+(s.x-a.x),y.y),u=l(a.x,y.y+y.height),g=l(a.x+(s.x-a.x),y.y+y.height),h="M"+o.x+","+o.y+" L"+d.x+","+d.y+" "+g.x+","+g.y+" "+u.x+","+u.y+"z";svgedit.utilities.assignAttributes(v,{d:h,display:"inline"})}else e(i)}function i(e,t){var i=h.createSVGPoint();if(i.x=e,i.y=t,1==_.length)return 0;var r=g.getCharNumAtPosition(i);r<0?(r=_.length-2,e<=_[0].x&&(r=0)):r>=_.length-2&&(r=_.length-2);var n=_[r],a=n.x+n.width/2;return e>a&&r++,r}function r(t,r){e(i(t,r))}function a(e,r,n){var a=m.selectionStart,s=i(e,r),o=Math.min(a,s),l=Math.max(a,s);t(o,l,!n)}function s(e,t){var i={x:e,y:t};if(i.x/=p,i.y/=p,x){var r=svgedit.math.transformPoint(i.x,i.y,x.inverse());i.x=r.x,i.y=r.y}return i}function l(e,t){var i={x:e,y:t};if(x){var r=svgedit.math.transformPoint(i.x,i.y,x);i.x=r.x,i.y=r.y}return i.x*=p,i.y*=p,i}function d(e){t(0,g.textContent.length),$(this).unbind(e)}function u(e){if(C&&g){var r=svgedit.math.transformPoint(e.pageX,e.pageY,Ae),n=r.x*p,a=r.y*p,o=s(n,a),l=i(o.x,o.y),u=g.textContent,h=u.substr(0,l).replace(/[a-z0-9]+$/i,"").length,m=u.substr(l).match(/^[a-z0-9]+/i),c=(m?m[0].length:0)+l;t(h,c),$(e.target).click(d),setTimeout(function(){$(e.target).unbind("click",d)},300)}}var g,m,c,v,f,y,x,b,S,C,_=[];return{select:function(e,t,i){g=e,me.toEditMode(t,i)},start:function(e){g=e,me.toEditMode()},mouseDown:function(e,t,i,n){var a=s(i,n);m.focus(),r(a.x,a.y),b=i,S=n},mouseMove:function(e,t){var i=s(e,t);a(i.x,i.y)},mouseUp:function(e,t,i){var r=s(t,i);a(r.x,r.y,!0),e.target!==g&&tb-2&&iS-2&&me.toSelectMode(!0)},setCursor:e,toEditMode:function(t,i){C=!1,current_mode="textedit",Y.requestSelector(g).showGrips(!1);Y.requestSelector(g).selectorRect;if(me.init(),$(g).css("cursor","text"),arguments.length){var n=s(t,i);r(n.x,n.y)}else e();setTimeout(function(){C=!0},300)},toSelectMode:function(e){current_mode="select",clearInterval(f),f=null,v&&$(v).attr("display","none"),c&&$(c).attr("visibility","hidden"),$(g).css("cursor","move"),e&&(ke(),$(g).css("cursor","move"),V("selected",[g]),Ee([g],!0)),g&&!g.textContent.length&&o.deleteSelectedElements(),$(m).blur(),g=!1},setInputElem:function(e){m=e},clear:function(){"textedit"==current_mode&&me.toSelectMode()},init:function(e){if(g){var i,r;g.parentNode||(g=w[0],Y.requestSelector(g).showGrips(!1));var n=g.textContent,a=n.length,s=g.getAttribute("transform");for(y=svgedit.utilities.getBBox(g),x=s?svgedit.math.getMatrix(g):null,_=[],_.length=a,m.focus(),$(g).unbind("dblclick",u).dblclick(u),a||(r={x:y.x+y.width/2,width:0}),i=0;i=0&&this.selected_pts.push(r)}this.selected_pts.sort(),t=this.selected_pts.length;var n=[];for(n.length=t;t--;){var a=this.selected_pts[t];i=this.segs[a],i.select(!0),n[t]=i.ptgrip}ce.canDeleteNodes=!0,ce.closed_subpath=this.subpathIsClosed(this.selected_pts[0]),V("selected",n)},i=null;var u=null,g=!1,h=function(e){var t,i=e.points,r=i.numberOfItems;if(r>=4){var n=i.getItem(0),a=null,s=[];for(s.push(["M",n.x,",",n.y," C"].join("")),t=1;t<=r-4;t+=3){var o=i.getItem(t),l=i.getItem(t+1),d=i.getItem(t+2);if(a){var u=svgedit.path.smoothControlPoints(a,o,n);if(u&&2==u.length){var g=s[s.length-1].split(",");g[2]=u[0].x,g[3]=u[0].y,s[s.length-1]=g.join(","),o=u[1]}}s.push([o.x,o.y,l.x,l.y,d.x,d.y].join(",")),n=d,a=l}for(s.push("L");t=E-N&&v<=E+N&&f>=B-N&&f<=B+N){A=!0;break}}l=ge(),svgedit.path.removePath_(l);var T,G,I=svgedit.utilities.getElem(l),M=S.numberOfItems;if(A){if(w<=1&&M>=2&&"pipe"!==current_mode){var L=S.getItem(0).x,P=S.getItem(0).y;G=y.pathSegList.getItem(1),T=4===G.pathSegType?u.createSVGPathSegLinetoAbs(L,P):u.createSVGPathSegCurvetoCubicAbs(L,P,G.x1/p,G.y1/p,L,P);var O=u.createSVGPathSegClosePath();S.appendItem(T),S.appendItem(O)}else if(M<3&&"pipe"!==current_mode)return b=!1,b;if($(y).remove(),element=I,u=null,started=!1,d){svgedit.path.path.matrix&&svgedit.coords.remapElement(I,{},svgedit.path.path.matrix.inverse());var D=I.getAttribute("d"),R=$(svgedit.path.path.elem).attr("d");return $(svgedit.path.path.elem).attr("d",R+D),$(I).remove(),svgedit.path.path.matrix&&svgedit.path.recalcRotatedPath(),svgedit.path.path.init(),ce.toEditMode(svgedit.path.path.elem),svgedit.path.path.selectPt(),!1}}else{if(!$.contains(e,Te(t)))return console.log("Clicked outside canvas"),!1;var V=u.pathSegList.numberOfItems,U=u.pathSegList.getItem(V-1),z=U.x,F=U.y;if(t.shiftKey){var j=svgedit.math.snapToAngle(z,F,v,f);v=j.x,f=j.y}G=y.pathSegList.getItem(1),T=4===G.pathSegType?u.createSVGPathSegLinetoAbs(de(v),de(f)):u.createSVGPathSegCurvetoCubicAbs(de(v),de(f),G.x1/p,G.y1/p,G.x2/p,G.y2/p),u.pathSegList.appendItem(T),v*=p,f*=p,y.setAttribute("d",["M",v,f,v,f].join(" ")),x=V,d&&(x+=svgedit.path.path.segs.length),svgedit.path.addPointGrip(x,v,f)}}else{if(d_attr="M"+v+","+f+" ",path_attr={d:d_attr,id:he(),opacity:C.opacity/2},"pipe"===current_mode){var H=he().replace("svg_","PIE_");path_attr={d:d_attr,id:H,type:"svg-ext-pipe",fill:"rgba(0,0,0,0)",stroke:"rgba(41,171,226,1)","stroke-width":10,opacity:C.opacity/2}}u=_({element:"path",curStyles:!0,attr:path_attr}),y.setAttribute("d",["M",mouse_x,mouse_y,mouse_x,mouse_y].join(" ")),x=d?svgedit.path.path.segs.length:0,svgedit.path.addPointGrip(x,mouse_x,mouse_y)}}},mouseMove:function(e,t){if(g=!0,"path"!==current_mode&&"pipe"!==current_mode)if(svgedit.path.path.dragging){var i=svgedit.path.getPointFromGrip({x:svgedit.path.path.dragging[0],y:svgedit.path.path.dragging[1]},svgedit.path.path),r=svgedit.path.getPointFromGrip({x:e,y:t},svgedit.path.path),n=r.x-i.x,a=r.y-i.y;svgedit.path.path.dragging=[e,t],svgedit.path.path.dragctrl?svgedit.path.path.moveCtrl(n,a):svgedit.path.path.movePts(n,a)}else svgedit.path.path.selected_pts=[],svgedit.path.path.eachSeg(function(e){var t=this;if(t.next||t.prev){t.item;var i=rubberBox.getBBox(),r=svgedit.path.getGripPt(t),n={x:r.x,y:r.y,width:0,height:0},a=svgedit.math.rectsIntersect(i,n);this.select(a),a&&svgedit.path.path.selected_pts.push(t.index)}});else{if(!u)return;var o=u.pathSegList,d=o.numberOfItems-1;if(s){var h=svgedit.path.addCtrlGrip("1c1"),m=svgedit.path.addCtrlGrip("0c2");h.setAttribute("cx",e),h.setAttribute("cy",t),h.setAttribute("display","inline");var c=s[0],v=s[1],f=(o.getItem(d),e/p),y=t/p,x=c+(c-f),b=v+(v-y);m.setAttribute("cx",x*p),m.setAttribute("cy",b*p),m.setAttribute("display","inline");var S=svgedit.path.getCtrlLine(1);if(svgedit.utilities.assignAttributes(S,{x1:e,y1:t,x2:x*p,y2:b*p,display:"inline"}),0===d)l=[e,t];else{var C=o.getItem(d-1),w=C.x,_=C.y;6===C.pathSegType?(w+=w-C.x2,_+=_-C.y2):l&&(w=l[0]/p,_=l[1]/p),svgedit.path.replacePathSeg(6,d,[c,v,w,_,x,b],u)}}else{var N=svgedit.utilities.getElem("path_stretch_line");if(N){var A=o.getItem(d);if(6===A.pathSegType){var k=A.x+(A.x-A.x2),E=A.y+(A.y-A.y2);svgedit.path.replacePathSeg(6,1,[e,t,k*p,E*p,e,t],N)}else l?svgedit.path.replacePathSeg(6,1,[e,t,l[0],l[1],e,t],N):svgedit.path.replacePathSeg(4,1,[e,t],N)}}}},mouseUp:function(e,t,i,r){if("path"===current_mode||"pipe"===current_mode){if(s=null,!u){var n=ge();"pipe"===current_mode&&(n=n.replace("svg_","PIE_")),t=svgedit.utilities.getElem(n),started=!1,l=null}return{keep:!0,element:t}}if(svgedit.path.path.dragging){var a=svgedit.path.path.cur_pt;svgedit.path.path.dragging=!1,svgedit.path.path.dragctrl=!1,svgedit.path.path.update(),g&&svgedit.path.path.endChanges("Move path point(s)"),e.shiftKey||g||svgedit.path.path.selectPt(a)}else rubberBox&&"none"!=rubberBox.getAttribute("display")?(rubberBox.setAttribute("display","none"),rubberBox.getAttribute("width")<=2&&rubberBox.getAttribute("height")<=2&&ce.toSelectMode(e.target)):ce.toSelectMode(e.target);g=!1},toEditMode:function(e){svgedit.path.path=svgedit.path.getPath_(e),current_mode="pathedit",ke(),svgedit.path.path.show(!0).update(),svgedit.path.path.oldbbox=svgedit.utilities.getBBox(svgedit.path.path.elem),d=!1},toSelectMode:function(e){var t=e==svgedit.path.path.elem;current_mode="select",svgedit.path.path.show(!1),i=!1,ke(),svgedit.path.path.matrix&&svgedit.path.recalcRotatedPath(),t&&(V("selected",[e]),Ee([e],!0))},addSubPath:function(e){e?(current_mode="path",d=!0):(ce.clear(!0),ce.toEditMode(svgedit.path.path.elem))},select:function(e){i===e?(ce.toEditMode(e),current_mode="pathedit"):i=e},reorient:function(){var e=w[0];if(e){var t=svgedit.utilities.getRotationAngle(e);if(0!=t){var i=new svgedit.history.BatchCommand("Reorient path"),r={d:e.getAttribute("d"),transform:e.getAttribute("transform")};i.addSubCommand(new svgedit.history.ChangeElementCommand(e,r)),ke(),this.resetOrientation(e),X(i),svgedit.path.getPath_(e).show(!1).matrix=null,this.clear(),Ee([e],!0),V("changed",w)}}},clear:function(e){if(i=null,u){var t=svgedit.utilities.getElem(ge());$(svgedit.utilities.getElem("path_stretch_line")).remove(),$(t).remove(),$(svgedit.utilities.getElem("pathpointgrip_container")).find("*").attr("display","none"),u=l=null,started=!1}else"pathedit"==current_mode&&this.toSelectMode();svgedit.path.path&&svgedit.path.path.init().show(!1)},resetOrientation:function(e){if(null==e||"path"!=e.nodeName)return!1;var t=svgedit.transformlist.getTransformList(e),i=svgedit.math.transformListToTransform(t).matrix;t.clear(),e.removeAttribute("transform");var n,a=e.pathSegList,s=a.numberOfItems;for(n=0;n0){var o=e.getItem(t-1).pathSegType;if(2===o){i(t-1,1),r();break}if(1===o&&e.numberOfItems-1===t){i(t,1),r();break}}}return!1};if(r(),svgedit.path.path.elem.pathSegList.numberOfItems<=1)return ce.toSelectMode(svgedit.path.path.elem),void o.deleteSelectedElements();if(svgedit.path.path.init(),svgedit.path.path.clearSelection(),window.opera){var n=$(svgedit.path.path.elem);n.attr("d",n.attr("d"))}svgedit.path.path.endChanges("Delete path node(s)")}},smoothPolylineIntoPath:h,setSegType:function(e){svgedit.path.path.setSegType(e)},moveNode:function(e,t){var i=svgedit.path.path.selected_pts;if(i.length){svgedit.path.path.storeD();var r=svgedit.path.path.segs[i[0]],n={x:0,y:0};n[e]=t-r.item[e],r.move(n.x,n.y),svgedit.path.path.endChanges("Move path point")}},fixEnd:function(e){var i,r,n=e.pathSegList,a=n.numberOfItems;for(i=0;i0;);ce.clear(!0),$.each(m.childNodes,function(e,t){e&&8===t.nodeType&&t.data.indexOf("Created with")>=0&&m.insertBefore(t,m.firstChild)}),b&&(De(),Be([b]));var e=[];$(m).find("g:data(gsvg)").each(function(){var t,i=this.attributes,r=i.length;for(t=0;t=0)return i.join("");D(e);var d,u,g=e.attributes,h=e.childNodes;for(u=0;u=0;u--){d=g.item(u);p=r(d.value);if(!(y.indexOf(d.localName)>=0)&&""!=p){if(0===p.indexOf("pointer-events"))continue;if("class"===d.localName&&0===p.indexOf("se_"))continue;if(i.push(" "),"d"===d.localName&&(p=ce.convertPath(e,!1)),isNaN(p)?o.test(p)&&(p=svgedit.units.shortFloat(p)+s):p=svgedit.units.shortFloat(p),save_options.apply&&"image"===e.nodeName&&"href"===d.localName&&save_options.images&&"embed"===save_options.images){var x=re[p];x&&(p=x)}d.namespaceURI&&d.namespaceURI!=n.SVG&&!z[d.namespaceURI]||(i.push(d.nodeName),i.push('="'),i.push(p),i.push('"'))}}}if(e.hasChildNodes()){i.push(">"),t++;var b=!1;for(u=0;u");break;case 8:i.push("\n"),i.push(new Array(t+1).join(" ")),i.push("")}}if(t--,!b)for(i.push("\n"),u=0;u")}else"div"===e.nodeName.toLowerCase()||"span"===e.nodeName.toLowerCase()?(i.push(">"),i.push("")):i.push("/>")}return i.join("")},this.embedImage=function(e,t){$(new Image).load(function(){var i=document.createElement("canvas");i.width=this.width,i.height=this.height,i.getContext("2d").drawImage(this,0,0);try{var r=";svgedit_url="+encodeURIComponent(e);r=i.toDataURL().replace(";base64",r+";base64"),re[e]=r}catch(t){re[e]=!1}ne=e,t&&t(re[e])}).attr("src",e)},this.setGoodImage=function(e){ne=e},this.setGoodSvgImageContent=function(e){last_good_img_content=e},this.open=function(){},this.save=function(e){ke(),e&&$.extend(save_options,e),save_options.apply=!0;var t=this.svgCanvasToString();V("saved",t)},this.rasterExport=function(e,t,r){var n="image/"+e.toLowerCase(),a=i(),s=this.svgCanvasToString();svgedit.utilities.buildCanvgCallback(function(){var i=e||"PNG";$("#export_canvas").length||$("",{id:"export_canvas"}).hide().appendTo("body");var o=$("#export_canvas")[0];o.width=svgCanvas.contentW,o.height=svgCanvas.contentH,canvg(o,s,{renderCallback:function(){var l=("ICO"===i?"BMP":i).toLowerCase(),d=t?o.toDataURL("image/"+l,t):o.toDataURL("image/"+l);V("exported",{datauri:d,svg:s,issues:a,type:e,mimeType:n,quality:t,exportWindowName:r})}})})()},this.exportPDF=function(e,t){var r=this;svgedit.utilities.buildJSPDFCallback(function(){var n=Ve(),a=n.w>n.h?"landscape":"portrait",s="pt",o=jsPDF({orientation:a,unit:s,format:[n.w,n.h]}),l=Ue();o.setProperties({title:l});var d=i(),u=r.svgCanvasToString();o.addSVG(u,0,0);var g={svg:u,issues:d,exportWindowName:e},h=t||"dataurlstring";g[h]=o.output(h),V("exportedPDF",g)})()},this.lockSelection=function(e){d=e},this.getSvgString=function(){return save_options.apply=!1,this.svgCanvasToString()},this.randomizeIds=function(e){arguments.length>0&&0==e?svgedit.draw.randomizeIds(!1,f()):svgedit.draw.randomizeIds(!0,f())};var Me=this.uniquifyElems=function(e){var t,i={},r=["filter","linearGradient","pattern","radialGradient","symbol","textPath","use"];for(t in svgedit.utilities.walkTree(e,function(e){if(1==e.nodeType){e.id&&(e.id in i||(i[e.id]={elem:null,attrs:[],hrefs:[]}),i[e.id].elem=e),$.each(Q,function(t,r){var n=e.getAttributeNode(r);if(n){var a=svgedit.utilities.getUrlFromAttr(n.value),s=a?a.substr(1):null;s&&(s in i||(i[s]={elem:null,attrs:[],hrefs:[]}),i[s].attrs.push(n))}});var t=svgedit.utilities.getHref(e);if(t&&r.indexOf(e.nodeName)>=0){var n=t.substr(1);n&&(n in i||(i[n]={elem:null,attrs:[],hrefs:[]}),i[n].hrefs.push(e))}}}),i)if(t){var n=i[t].elem;if(n){var a=he();n.id=a;for(var s=i[t].attrs,o=s.length;o--;){var l=s[o];l.ownerElement.setAttribute(l.name,"url(#"+a+")")}for(var d=i[t].hrefs,u=d.length;u--;){var g=d[u];svgedit.utilities.setHref(g,"#"+a)}}}},Le=this.setUseData=function(e){var t=$(e);"use"!==e.tagName&&(t=t.find("use")),t.each(function(){var e=I(this).substr(1),t=svgedit.utilities.getElem(e);t&&($(this).data("ref",t),"symbol"!=t.tagName&&"svg"!=t.tagName||$(this).data("symbol",t).data("ref",t))})},$e=this.convertGradients=function(e){var t=$(e).find("linearGradient, radialGradient");!t.length&&svgedit.browser.isWebkit()&&(t=$(e).find("*").filter(function(){return this.tagName.indexOf("Gradient")>=0})),t.each(function(){var e=this;if("userSpaceOnUse"===$(e).attr("gradientUnits")){var t=$(m).find('[fill="url(#'+e.id+')"],[stroke="url(#'+e.id+')"]');if(!t.length)return;var i=svgedit.utilities.getBBox(t[0]);if(!i)return;if("linearGradient"===e.tagName){var r=$(e).attr(["x1","y1","x2","y2"]),n=e.gradientTransform.baseVal;if(n&&n.numberOfItems>0){var a=svgedit.math.transformListToTransform(n).matrix,s=svgedit.math.transformPoint(r.x1,r.y1,a),o=svgedit.math.transformPoint(r.x2,r.y2,a);r.x1=s.x,r.y1=s.y,r.x2=o.x,r.y2=o.y,e.removeAttribute("gradientTransform")}$(e).attr({x1:(r.x1-i.x)/i.width,y1:(r.y1-i.y)/i.height,x2:(r.x2-i.x)/i.width,y2:(r.y2-i.y)/i.height}),e.removeAttribute("gradientUnits")}}})},Pe=this.convertToGroup=function(e){e||(e=w[0]);var t,i=$(e),r=new svgedit.history.BatchCommand;if(i.data("gsvg")){var a=e.firstChild,s=$(a).attr(["x","y"]);$(e.firstChild.firstChild).unwrap(),$(e).removeData("gsvg");var o=svgedit.transformlist.getTransformList(e),l=h.createSVGTransform();l.setTranslate(s.x,s.y),o.appendItem(l),svgedit.recalculate.recalculateDimensions(e),V("selected",[e])}else if(i.data("symbol")){e=i.data("symbol"),t=i.attr("transform");var d=i.attr(["x","y"]),u=e.getAttribute("viewBox");if(u){var c=u.split(" ");d.x-=+c[0],d.y-=+c[1]}t+=" translate("+(d.x||0)+","+(d.y||0)+")";var v=i.prev();r.addSubCommand(new svgedit.history.RemoveElementCommand(i[0],i[0].nextSibling,i[0].parentNode)),i.remove();var f,p=$(m).find("use:data(symbol)").length,y=g.createElementNS(n.SVG,"g"),x=e.childNodes;for(f=0;f0&&t.y>0&&(r=" translate("+t.x+","+t.y+") scale(1) translate(0)");else{var d,u=svgedit.utilities.text2xml(e);this.prepareSvg(u),d=g.adoptNode?g.adoptNode(u.documentElement):g.importNode(u.documentElement,!0),Me(d) ;var h=svgedit.units.convertToNum("width",d.getAttribute("width")),c=svgedit.units.convertToNum("height",d.getAttribute("height")),v=d.getAttribute("viewBox"),p=v?v.split(" "):[0,0,h,c];for(i=0;i<4;++i)p[i]=Number(p[i]);var y=Number(m.getAttribute("height"));r=c>h?"scale("+y/3/p[3]+")":"scale("+y/3/p[2]+")",r=t&&t.x>0&&t.y>0?"translate("+t.x+","+t.y+") scale(1) translate(0)":"translate(0) scale(1) translate(0)",o=g.createElementNS(n.SVG,"symbol");var x=svgedit.utilities.findDefs();if($(d).find("linearGradient, radialGradient, pattern").appendTo(x),!x.firstChild){var S=g.createElementNS(n.SVG,"symbol");S.id=he(),x.appendChild(S)}for(;d.firstChild;){var C=d.firstChild;svgedit.utilities.walkTree(C,function(e){e.id=he()}),o.appendChild(C)}o.id=he(),o.setAttribute("type","svg-ext-shapes-image"),o.childNodes.forEach(e=>{e.getAttribute("transform")&&e.setAttribute("transform","matrix(1, 0, 0, 1, 0, 0)")}),import_ids[a]={symbol:o,xform:r},svgedit.utilities.findDefs().appendChild(o),l.addSubCommand(new svgedit.history.InsertElementCommand(o))}var w=g.createElementNS(n.SVG,"use");w.id=he(),w.setAttribute("type","svg-ext-shapes-image"),M(w,"#"+o.id),(b||f().getCurrentLayer()).appendChild(w),l.addSubCommand(new svgedit.history.InsertElementCommand(w)),ke(),w.setAttribute("transform",r),svgedit.recalculate.recalculateDimensions(w),$(w).data("symbol",o).data("ref",o),Ee([w]),setTimeout(function(){Be([w],!0)},500),X(l),V("changed",[m])}catch(e){return console.log(e),!1}return!0};var Oe=o.identifyLayers=function(){De(),f().identifyLayers()};this.createLayer=function(e){var t=new svgedit.history.BatchCommand("Create Layer"),i=f().createLayer(e);t.addSubCommand(new svgedit.history.InsertElementCommand(i)),X(t),ke(),V("changed",[i])},this.cloneLayer=function(e){var t=new svgedit.history.BatchCommand("Duplicate Layer"),i=g.createElementNS(n.SVG,"g"),r=g.createElementNS(n.SVG,"title");r.textContent=e,i.appendChild(r);var a=f().getCurrentLayer();$(a).after(i);var s,l=a.childNodes;for(s=0;s=0&&et?e1;)e.addSubCommand(o.mergeLayer(!0));ke(),Oe(),V("changed",[m]),X(e)};var De=this.leaveContext=function(){var e,t=disabled_elems.length;if(t){for(e=0;e0&&(i?He(e,t,n):(je(e,t,n),V("changed",n)))};var ze=this.setGradient=function(e){if(cur_properties[e+"_paint"]&&"solidColor"!=cur_properties[e+"_paint"].type){var t=o[e+"Grad"],i=Fe(t),r=svgedit.utilities.findDefs();if(i)t=i;else{t=r.appendChild(g.importNode(t,!0)),t.id=he()}o.setColor(e,"url(#"+t.id+")")}},Fe=function(e){for(var t=svgedit.utilities.findDefs(),i=$(t).find("linearGradient, radialGradient"),r=i.length,a=["r","cx","cy","fx","fy"];r--;){var s=i[r];if("linearGradient"==e.tagName){if(e.getAttribute("x1")!=s.getAttribute("x1")||e.getAttribute("y1")!=s.getAttribute("y1")||e.getAttribute("x2")!=s.getAttribute("x2")||e.getAttribute("y2")!=s.getAttribute("y2"))continue}else{var o=$(e).attr(a),l=$(s).attr(a),d=!1;if($.each(a,function(e,t){o[t]!=l[t]&&(d=!0)}),d)continue}var u=e.getElementsByTagNameNS(n.SVG,"stop"),g=s.getElementsByTagNameNS(n.SVG,"stop");if(u.length==g.length){for(var h=u.length;h--;){var m=u[h],c=g[h];if(m.getAttribute("offset")!=c.getAttribute("offset")||m.getAttribute("stop-opacity")!=c.getAttribute("stop-opacity")||m.getAttribute("stop-color")!=c.getAttribute("stop-color"))break}if(-1==h)return s}}return null};this.setPaint=function(e,t){var i=new $.jGraduate.Paint(t);switch(this.setPaintOpacity(e,i.alpha/100,!0),cur_properties[e+"_paint"]=i,i.type){case"solidColor":-1===i.solidColor.indexOf("rgb")?this.setColor(e,"none"!=i.solidColor?"#"+i.solidColor:"none"):this.setColor(e,i.solidColor);break;case"linearGradient":case"radialGradient":o[e+"Grad"]=i[i.type],ze(e)}},this.setStrokePaint=function(e){this.setPaint("stroke",e)},this.setFillPaint=function(e){this.setPaint("fill",e)},this.getStrokeWidth=function(){return cur_properties.stroke_width},this.setStrokeWidth=function(e){function t(e){"g"!=e.nodeName&&i.push(e)}if(0==e&&["line","path"].indexOf(current_mode)>=0)o.setStrokeWidth(1);else{cur_properties.stroke_width=e;for(var i=[],r=w.length;r--;){var n=w[r];n&&("g"==n.tagName?svgedit.utilities.walkTree(n,t):i.push(n))}i.length>0&&(je("stroke-width",e,i),V("changed",w))}},this.setStrokeAttr=function(e,t){C[e.replace("-","_")]=t;for(var i=[],r=w.length;r--;){var n=w[r];n&&("g"==n.tagName?svgedit.utilities.walkTree(n,function(e){"g"!=e.nodeName&&i.push(e)}):i.push(n))}i.length>0&&(je(e,t,i),V("changed",w))},this.getStyle=function(){return C},this.getOpacity=function(){return C.opacity},this.setOpacity=function(e){C.opacity=e,je("opacity",e)},this.getFillOpacity=function(){return C.fill_opacity},this.getStrokeOpacity=function(){return C.stroke_opacity},this.setPaintOpacity=function(e,t,i){C[e+"_opacity"]=t,i?He(e+"-opacity",t):je(e+"-opacity",t)},this.getPaintOpacity=function(e){return"fill"===e?this.getFillOpacity():this.getStrokeOpacity()},this.getBlur=function(e){var t=0;if(e){var i=e.getAttribute("filter");if(i){var r=svgedit.utilities.getElem(e.id+"_blur");r&&(t=r.firstChild.getAttribute("stdDeviation"))}}return t},function(){function e(){var e=o.undoMgr.finishUndoableChange();t.addSubCommand(e),X(t),t=null,i=null}var t=null,i=null,r=!1;o.setBlurNoUndo=function(e){if(i)if(0===e)He("filter",""),r=!0;else{var t=w[0];r&&He("filter","url(#"+t.id+"_blur)"),svgedit.browser.isWebkit()&&(console.log("e",t),t.removeAttribute("filter"),t.setAttribute("filter","url(#"+t.id+"_blur)")),He("stdDeviation",e,[i.firstChild]),o.setBlurOffsets(i,e)}else o.setBlur(e)},o.setBlurOffsets=function(e,t){t>3?svgedit.utilities.assignAttributes(e,{x:"-50%",y:"-50%",width:"200%",height:"200%"},100):svgedit.browser.isWebkit()||(e.removeAttribute("x"),e.removeAttribute("y"),e.removeAttribute("width"),e.removeAttribute("height"))},o.setBlur=function(r,n){if(t)e();else{var a=w[0],s=a.id;i=svgedit.utilities.getElem(s+"_blur"),r-=0;var l=new svgedit.history.BatchCommand;if(i)0===r&&(i=null);else{var d=_({element:"feGaussianBlur",attr:{in:"SourceGraphic",stdDeviation:r}});i=_({element:"filter",attr:{id:s+"_blur"}}),i.appendChild(d),svgedit.utilities.findDefs().appendChild(i),l.addSubCommand(new svgedit.history.InsertElementCommand(i))}var u={filter:a.getAttribute("filter")};if(0===r)return a.removeAttribute("filter"),void l.addSubCommand(new svgedit.history.ChangeElementCommand(a,u));je("filter","url(#"+s+"_blur)"),l.addSubCommand(new svgedit.history.ChangeElementCommand(a,u)),o.setBlurOffsets(i,r),t=l,o.undoMgr.beginUndoableChange("stdDeviation",[i?i.firstChild:null]),n&&(o.setBlurNoUndo(r),e())}}}(),this.getBold=function(){var e=w[0];return null!=e&&"text"==e.tagName&&null==w[1]&&"bold"==e.getAttribute("font-weight")},this.setBold=function(e){var t=w[0];null!=t&&"text"==t.tagName&&null==w[1]&&je("font-weight",e?"bold":"normal"),w[0].textContent||me.setCursor()},this.getItalic=function(){var e=w[0];return null!=e&&"text"==e.tagName&&null==w[1]&&"italic"==e.getAttribute("font-style")},this.setItalic=function(e){var t=w[0];null!=t&&"text"==t.tagName&&null==w[1]&&je("font-style",e?"italic":"normal"),w[0].textContent||me.setCursor()},this.getFontFamily=function(){return cur_text.font_family},this.setFontFamily=function(e){cur_text.font_family=e,je("font-family",e),w[0]&&!w[0].textContent&&me.setCursor(),ae("setFontAttribute",{elem:w[0],attr:"font-family",value:e})},this.setTextAlign=function(e){cur_text.text_anchor=e,je("text-anchor",e),w[0]&&!w[0].textContent&&me.setCursor(),ae("setFontAttribute",{elem:w[0],attr:"text-anchor",value:e})},this.setFontColor=function(e){cur_text.fill=e,je("fill",e)},this.getFontColor=function(){return cur_text.fill},this.getFontSize=function(){return cur_text.font_size},this.setFontSize=function(e){w[0]&&(cur_text.font_size=e,je("font-size",e),w[0].textContent||me.setCursor(),ae("setFontAttribute",{elem:w[0],attr:"font-size",value:e+"px"}))},this.getExtensionFont=function(e){return oe("getFontAttribute",{elem:e})},this.getText=function(){var e=w[0];return null==e?"":e.textContent},this.setTextContent=function(e){je("#text",e),me.init(e),me.setCursor()},this.setImageURL=function(e){var t=w[0];if(t){var i=$(t).attr(["width","height"]),r=!i.width||!i.height,n=I(t);if(n!==e)r=!0;else if(!r)return;var a=new svgedit.history.BatchCommand("Change Image URL");M(t,e),a.addSubCommand(new svgedit.history.ChangeElementCommand(t,{"#href":n})),r?$(new Image).load(function(){var e=$(t).attr(["width","height"]);$(t).attr({width:this.width,height:this.height}),Y.requestSelector(t).resize(),a.addSubCommand(new svgedit.history.ChangeElementCommand(t,e)),X(a),V("changed",[t])}).attr("src",e):X(a)}},this.setLinkURL=function(e){var t=w[0];if(t){if("a"!==t.tagName){var i=$(t).parents("a");if(!i.length)return;t=i[0]}var r=I(t);if(r!==e){var n=new svgedit.history.BatchCommand("Change Link URL");M(t,e),n.addSubCommand(new svgedit.history.ChangeElementCommand(t,{"#href":r})),X(n)}}},this.setRectRadius=function(e){var t=w[0];if(null!=t&&"rect"==t.tagName){var i=t.getAttribute("rx");i!=e&&(t.setAttribute("rx",e),t.setAttribute("ry",e),X(new svgedit.history.ChangeElementCommand(t,{rx:i,ry:i},"Radius")),V("changed",[t]))}},this.convertToPath=function(e,t){if(null!=e){if(!t)var i=new svgedit.history.BatchCommand("Convert element to Path");var r=t?{}:{fill:C.fill,"fill-opacity":C.fill_opacity,stroke:C.stroke,"stroke-width":C.stroke_width,"stroke-dasharray":C.stroke_dasharray,"stroke-linejoin":C.stroke_linejoin,"stroke-linecap":C.stroke_linecap,"stroke-opacity":C.stroke_opacity,opacity:C.opacity,visibility:"hidden"};$.each(["marker-start","marker-end","marker-mid","filter","clip-path"],function(){e.getAttribute(this)&&(r[this]=e.getAttribute(this))});var n=_({element:"path",attr:r}),a=e.getAttribute("transform");a&&n.setAttribute("transform",a);var s=e.id,l=e.parentNode;e.nextSibling?l.insertBefore(n,e):l.appendChild(n);var d,u,g="",h=function(e){$.each(e,function(e,t){var i,r=t[0],n=t[1];for(g+=r,i=0;i=0&&(i=i[0].childNodes),o.undoMgr.beginUndoableChange(e,i);i.length;He(e,t,i);var r=o.undoMgr.finishUndoableChange();r.isEmpty()||X(r)},He=function(e,t,i){var r=h.suspendRedraw(1e3);"pathedit"==current_mode&&ce.moveNode(e,t),i=i||w;for(var n=i.length,a=["g","polyline","path"],s=["transform","opacity","filter"];n--;){var l=i[n];if(null!=l)if(("x"===e||"y"===e)&&a.indexOf(l.tagName)>=0){var d=getStrokedBBox([l]),u="x"===e?t-d.x:0,g="y"===e?t-d.y:0;o.moveSelectedElements(u*p,g*p,!0)}else{"g"===l.tagName&&s.indexOf(e);var m="#text"===e?l.textContent:l.getAttribute(e);if(null==m&&(m=""),m!==String(t)){if("#text"==e){svgedit.utilities.getBBox(l).width;l.textContent=t,/rotate/.test(l.getAttribute("transform"))&&(l=Se(l))}else"#href"==e?M(l,t):(l.setAttribute(e,t),ae("setGaugeAttribute",{elem:l,attr:e,value:t}));"textedit"===current_mode&&"#text"!==e&&l.textContent.length&&me.toSelectMode(l),svgedit.browser.isGecko()&&"text"===l.nodeName&&/rotate/.test(l.getAttribute("transform"))&&(0===String(t).indexOf("url")||["font-size","font-family","x","y"].indexOf(e)>=0&&l.textContent)&&(l=Se(l)),w.indexOf(l)>=0&&setTimeout(function(){l.parentNode&&Y.requestSelector(l).resize()},0);var c=svgedit.utilities.getRotationAngle(l);if(0!=c&&"transform"!=e)for(var v=svgedit.transformlist.getTransformList(l),f=v.numberOfItems;f--;){var y=v.getItem(f);if(4==y.type){v.removeItem(f);var x=svgedit.utilities.getBBox(l),b=svgedit.math.transformPoint(x.x+x.width/2,x.y+x.height/2,svgedit.math.transformListToTransform(v).matrix),S=b.x,C=b.y,_=h.createSVGTransform();_.setRotate(c,S,C),v.insertItemBefore(_,f);break}}}}}h.unsuspendRedraw(r)};this.deleteSelectedElements=function(){var e,t=new svgedit.history.BatchCommand("Delete Elements"),i=w.length,r=[];for(e=0;e{var t=svgedit.utilities.getElem(e.id);t||d.appendChild(e)}),l.defs&&l.defs.appendTo(d)}else{var u=be(l);a.push(u),(b||f().getCurrentLayer()).appendChild(u),s.addSubCommand(new svgedit.history.InsertElementCommand(u))}}if(Be(a),"in_place"!==e){var g,h;e?"point"===e&&(g=t,h=i):(g=lastClickPoint.x,h=lastClickPoint.y);var m=getStrokedBBox(a),c=g-(m.x+m.width/2),v=h-(m.y+m.height/2),p=[],y=[];$.each(a,function(e,t){p.push(c),y.push(v)});var x=o.moveSelectedElements(p,y,!1);s.addSubCommand(x)}X(s),V("onGaugeCopyPaste",{copy:r,past:a.reverse()}),V("changed",a)}},this.copySelectedElements=function(){o.clipBoard=$.merge([],w),qe()};var qe=function(){for(var e={symbols:[],defs:null},t=0;t{var i=svgedit.utilities.getElem(I(t).substr(1)),r=i.getAttribute("type"),n=t.getAttribute("type");!n&&r&&t.setAttribute("type",r),e.symbols.find(e=>e.id===i.id)||e.symbols.push(i)})}if(e.symbols.length){const t=svgedit.utilities.findDefs();e.defs=$(t).find("linearGradient, radialGradient, pattern"),o.clipBoard.push(e)}};this.groupSelectedElements=function(e,t){e||(e="g");var i="";switch(e){case"a":i="Make hyperlink";var r="";arguments.length>1&&(r=t);break;default:e="g",i="Group Elements"}var n=new svgedit.history.BatchCommand(i),a=_({element:e,attr:{id:he(),target:"_blank",type:"svg-ext-shapes-group"}});"a"===e&&M(a,r),n.addSubCommand(new svgedit.history.InsertElementCommand(a));for(var s=w.length;s--;){var o=w[s];if(null!=o){"a"===o.parentNode.tagName&&1===o.parentNode.childNodes.length&&(o=o.parentNode);var l=o.nextSibling,d=o.parentNode;a.appendChild(o),n.addSubCommand(new svgedit.history.MoveElementCommand(o,l,d))}}n.isEmpty()||X(n),Be([a],!0)};var We=this.pushGroupProperties=function(e,t){var i,r,n,a=e.childNodes,s=a.length,l=e.getAttribute("transform"),d=svgedit.transformlist.getTransformList(e),u=svgedit.math.transformListToTransform(d).matrix,g=new svgedit.history.BatchCommand("Push group properties"),m=0,c=svgedit.utilities.getRotationAngle(e),v=$(e).attr(["filter","opacity"]);for(m=0;mn[i].width)||("t"==e||"m"==e||"b"==e)&&(g==Number.MIN_VALUE||g>n[i].height))&&(a=n[i].x,l=n[i].y,s=n[i].x+n[i].width,d=n[i].y+n[i].height,u=n[i].width,g=n[i].height);break;case"largest":(("l"==e||"c"==e||"r"==e)&&(u==Number.MIN_VALUE||us&&(s=n[i].x+n[i].width),n[i].y+n[i].height>d&&(d=n[i].y+n[i].height)}"page"==t&&(a=0,l=0,s=o.contentW,d=o.contentH);var m=new Array(h),c=new Array(h);for(i=0;ia&&(a=r[t].x+r[t].width),r[t].y+r[t].height>o&&(o=r[t].y+r[t].height),d+=r[t].height,l+=r[t].width;"h"===e?r.sort((e,t)=>e.x>t.x?1:-1):"v"===e&&r.sort((e,t)=>e.y>t.y?1:-1),u--;var h=new Array(r.length),m=new Array(r.length),c=(a-n-l)/u,v=(o-s-d)/u,f=n,p=s ;for(t=0;t0?f>y.x?f-y.x:-(y.x-f):0,f+=y.width+c,m[t].y=0;break;case"v":m[t].y=t>0?p>y.y?p-y.y:-(y.y-p):0,p+=y.height+v,h[t].x=0}}h.sort((e,t)=>e.i>t.i?1:-1),m.sort((e,t)=>e.i>t.i?1:-1),h=h.map(e=>Math.round(100*e.x)/100),m=m.map(e=>Math.round(100*e.y)/100),this.moveSelectedElements(h,m)}},this.contentW=Ve().w,this.contentH=Ve().h,this.updateCanvas=function(e,t){h.setAttribute("width",e),h.setAttribute("height",t);var i=$("#canvasBackground")[0],r=m.getAttribute("x"),n=m.getAttribute("y"),a=e/2-this.contentW*p/2,s=t/2-this.contentH*p/2;svgedit.utilities.assignAttributes(m,{width:this.contentW*p,height:this.contentH*p,x:a,y:s,viewBox:"0 0 "+this.contentW+" "+this.contentH}),svgedit.utilities.assignAttributes(i,{width:m.getAttribute("width"),height:m.getAttribute("height"),x:a,y:s});var o=svgedit.utilities.getElem("background_image");return o&&svgedit.utilities.assignAttributes(o,{width:"100%",height:"100%"}),Y.selectorParentGroup.setAttribute("transform","translate("+a+","+s+")"),ae("canvasUpdated",{new_x:a,new_y:s,old_x:r,old_y:n,d_x:a-r,d_y:s-n}),{x:a,y:s,old_x:r,old_y:n,d_x:a-r,d_y:s-n}},this.setBackground=function(e,t){var i=svgedit.utilities.getElem("canvasBackground"),r=$(i).find("rect")[0],a=svgedit.utilities.getElem("background_image");r.setAttribute("fill",e),t?(a||(a=g.createElementNS(n.SVG,"image"),svgedit.utilities.assignAttributes(a,{id:"background_image",width:"100%",height:"100%",preserveAspectRatio:"xMinYMin",style:"pointer-events:none"})),M(a,t),i.appendChild(a)):a&&a.parentNode.removeChild(a)},this.cycleElement=function(e){var t,i=w[0],r=!1,n=pe(b||f().getCurrentLayer());if(n.length){if(null==i)t=e?n.length-1:0,r=n[t];else for(var a=n.length;a--;)if(n[a]==i){t=e?a-1:a+1,t>=n.length?t=0:t<0&&(t=n.length-1),r=n[t];break}Be([r],!0),V("selected",w)}},this.clear(),this.getExtensionMember=function(e,t){var i=[];return $.each(extensions,function(r,n){n&&e in n&&i.push(n[e](t))}),i},this.getPrivateMethods=function(){var e={addCommandToHistory:X,setGradient:ze,addSvgElementFromJson:_,addSvgGroupFromJson:N,assignAttributes:O,BatchCommand:K,call:V,ChangeElementCommand:W,copyElem:be,ffClone:Se,findDefs:T,findDuplicateGradient:Fe,getElem:P,getId:ge,getIntersectionList:ue,getMouseTarget:Te,getNextId:he,getPathBBox:L,getUrlFromAttr:G,hasMatrixTransform:E,identifyLayers:Oe,InsertElementCommand:H,isIdentity:svgedit.math.isIdentity,logMatrix:Ne,matrixMultiply:k,MoveElementCommand:j,preventClickDefault:Ge,recalculateAllSelectedDimensions:we,recalculateDimensions:U,remapElement:R,RemoveElementCommand:q,removeUnusedDefElems:Ie,round:de,runExtensions:ae,setSpecialsIds:se,runGetExtensions:oe,runExtension:le,sanitizeSvg:F,SVGEditTransformList:svgedit.transformlist.SVGTransformList,toString:toString,transformBox:svgedit.math.transformBox,transformListToTransform:B,transformPoint:A,walkTree:svgedit.utilities.walkTree};return e}}; -var mysvgeditor={initSvgEditor:function(e,t,n,o,i,a,r,l,s){window.svgEditor=function(e){function c(t,n){var o=!1!==d.setSvgString(t);n=n||e.noop,o?n(!0):e.alert(uiStrings.notification.errorLoadingSVG,function(){n(!1)})}var u={};console.log("editor v2.9.9-166"),e(document).unbind("keydown"),u.tool_scale=1,u.exportWindowCt=0,u.langChanged=!1,u.showSaveWarning=!1,u.storagePromptClosed=!1,u.extensionLoadedCallback=n,u.onSelectedElement=t,u.changeColor=o,u.onGaugeAdded=i,u.onGaugeResized=r,u.onGaugeRemoved=a,u.onGaugeCopyPaste=l,u.onGroupChanged=s,u.currentExtensionsInteractivityType=[],u.currentExtensionsPrefixIdType=[],u.shapesGrps={},u.shapesList=[],u.baseSvgTags=["path","line","rect","circle","ellipse","text","image"];var d,f,p=["VAL_","HXI_","HXB_","HXS_"],g=["HXI_","HXB_","HXS_","GXP_","HXC_","BAG_","SLI_","HXT_"],v=["SHE_"],h=svgedit.utilities,m=svgedit.shapes;return isReady=!1,customExportImage=!1,customExportPDF=!1,callbacks=[],defaultPrefs={lang:"",iconsize:"",bkgd_color:"#FFF",bkgd_url:"",img_save:"embed",save_notice_done:!1,export_notice_done:!1},curPrefs={},curConfig={extensions:[],allowedOrigins:[]},defaultExtensions=["ext-overview_window.js","ext-markers.js","ext-connector.js","ext-eyedropper.js","ext-imagelib.js","ext-grid.js","ext-polygon.js","ext-panning.js","ext-storage.js"],defaultConfig={canvasName:"default",canvas_expansion:3,initFill:{color:"FF0000",opacity:1},initStroke:{width:1,color:"000000",opacity:1},initOpacity:1,colorPickerCSS:null,initTool:"select",exportWindowType:"new",wireframe:!1,showlayers:!1,no_save_warning:!1,imgPath:"images/",langPath:"locale/",extPath:"extensions/",jGraduatePath:"jgraduate/images/",shapesPath:"assets/lib/svgeditor/shapes/",dimensions:[640,480],gridSnapping:!0,gridColor:"#000",baseUnit:"px",snappingStep:2,showRulers:!0,preventAllURLConfig:!1,preventURLContentLoading:!1,lockExtensions:!1,noDefaultExtensions:!1,showGrid:!1,noStorageOnLoad:!1,forceStorage:!1,emptyStorageOnDecline:!1},uiStrings=u.uiStrings={common:{ok:"OK",cancel:"Cancel",key_up:"Up",key_down:"Down",key_backspace:"Backspace",key_del:"Del"},layers:{layer:"Layer"},notification:{invalidAttrValGiven:"Invalid value given",noContentToFitTo:"No content to fit to",dupeLayerName:"There is already a layer named that!",enterUniqueLayerName:"Please enter a unique layer name",enterNewLayerName:"Please enter the new layer name",layerHasThatName:"Layer already has that name",QmoveElemsToLayer:"Move selected elements to layer '%s'?",QwantToClear:"Do you want to clear the drawing?\nThis will also erase your undo history!",QwantToOpen:"Do you want to open a new file?\nThis will also erase your undo history!",QerrorsRevertToSource:"There were parsing errors in your SVG source.\nRevert back to original SVG source?",QignoreSourceChanges:"Ignore changes made to SVG source?",featNotSupported:"Feature not supported",enterNewImgURL:"Enter the new image URL",defsFailOnSave:"NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",loadingImage:"Loading image, please wait...",saveFromBrowser:"Select 'Save As...' in your browser to save this image as a %s file.",noteTheseIssues:"Also note the following issues: ",unsavedChanges:"There are unsaved changes.",enterNewLinkURL:"Enter the new hyperlink URL",errorLoadingSVG:"Error: Unable to load SVG data",URLloadFail:"Unable to load from URL",retrieving:"Retrieving '%s' ..."}},e.pref=function(e,t){return t?(curPrefs[e]=t,void(u.curPrefs=curPrefs)):e in curPrefs?curPrefs[e]:defaultPrefs[e]},u.loadContentAndPrefs=function(){if(curConfig.forceStorage||!curConfig.noStorageOnLoad&&document.cookie.match(/(?:^|;\s*)store=(?:prefsAndContent|prefsOnly)/)){if(u.storage&&(curConfig.forceStorage||!curConfig.noStorageOnLoad&&document.cookie.match(/(?:^|;\s*)store=prefsAndContent/))){var e="svgedit-"+curConfig.canvasName,t=u.storage.getItem(e);t&&u.loadFromString(t)}var n;for(n in defaultPrefs)if(defaultPrefs.hasOwnProperty(n)){var o="web-edit-"+n;if(u.storage){var i=u.storage.getItem(o);i&&(defaultPrefs[n]=String(i))}else if(window.widget)defaultPrefs[n]=widget.preferenceForKey(o);else{var a=document.cookie.match(new RegExp("(?:^|;\\s*)"+h.preg_quote(encodeURIComponent(o))+"=([^;]+)"));defaultPrefs[n]=a?decodeURIComponent(a[1]):""}}}},u.setConfig=function(t,n){function o(t,n,o){t[n]&&"object"==typeof t[n]?e.extend(!0,t[n],o):t[n]=o}n=n||{},e.each(t,function(i,a){if(t.hasOwnProperty(i))if(defaultPrefs.hasOwnProperty(i)){if(!1===n.overwrite&&(curConfig.preventAllURLConfig||curPrefs.hasOwnProperty(i)))return;!0===n.allowInitialUserOverride?defaultPrefs[i]=a:e.pref(i,a)}else if(["extensions","allowedOrigins"].indexOf(i)>-1){if(!1===n.overwrite&&(curConfig.preventAllURLConfig||"allowedOrigins"===i||"extensions"===i&&curConfig.lockExtensions))return;curConfig[i]=curConfig[i].concat(a)}else if(defaultConfig.hasOwnProperty(i)){if(!1===n.overwrite&&(curConfig.preventAllURLConfig||curConfig.hasOwnProperty(i)))return;if(curConfig.hasOwnProperty(i)){if(!1===n.overwrite)return;o(curConfig,i,a)}else!0===n.allowInitialUserOverride?o(defaultConfig,i,a):defaultConfig[i]&&"object"==typeof defaultConfig[i]?(curConfig[i]={},e.extend(!0,curConfig[i],a)):curConfig[i]=a}}),u.curConfig=curConfig},u.setCustomHandlers=function(t){u.ready(function(){t.open&&(e('#tool_open > input[type="file"]').remove(),e("#tool_open").show(),d.open=t.open),t.save&&(u.showSaveWarning=!1,d.bind("saved",t.save)),t.exportImage&&(customExportImage=t.exportImage,d.bind("exported",customExportImage)),t.exportPDF&&(customExportPDF=t.exportPDF,d.bind("exportedPDF",customExportPDF))})},u.randomizeIds=function(){d.randomizeIds(arguments)},u.init=function(t){function n(){curPrefs=e.extend(!0,{},defaultPrefs,curPrefs),u.curPrefs=curPrefs}function o(){curConfig=e.extend(!0,{},defaultConfig,curConfig),curConfig.noDefaultExtensions||(curConfig.extensions=curConfig.extensions.concat(defaultExtensions)),e.each(["extensions","allowedOrigins"],function(t,n){curConfig[n]=e.grep(curConfig[n],function(e,t){return t===curConfig[n].indexOf(e)})}),u.curConfig=curConfig}function i(t,n){var o=t.id,i=o.split("_"),a=i[0],r=i[1];n&&d.setStrokeAttr("stroke-"+a,r),pe(),P("#cur_"+a,o,20),e(t).addClass("current").siblings().removeClass("current")}function r(t,n){e.pref("bkgd_color",t),e.pref("bkgd_url",n),d.setBackground(t,n)}function l(){var t=d.getHref(K);if(t=0===t.indexOf("data:")?"":t,u.promptImgURLcallback){var n=u.promptImgURLcallback;n&&he(n)}else e.prompt(uiStrings.notification.enterNewImgURL,t,function(e){e&&he(e)})}function s(t,n){var o,i;n||(n=d.getZoom()),t||(t=e("#svgcanvas"));var a=3e4,r=d.getContentElem(),l=svgedit.units.getTypeMap(),s=l[curConfig.baseUnit];for(o=0;o<2;o++){var c=0===o,u=c?"x":"y",f=c?"width":"height",p=Number(r.getAttribute(u)),g=e("#ruler_"+u+" canvas:first"),v=g.clone();g.replaceWith(v);var h=v[0],m=t[f](),_=m;h.parentNode.style[f]=_+"px";var w,y,b,C=0,x=h.getContext("2d");if(x.fillStyle="#666666",x.fillRect(0,0,h.width,h.height),v.siblings().remove(),m>=a){var k;for(b=parseInt(m/a,10)+1,w=[],w[0]=x,i=1;i=1)L=Math.round(y);else{var I=String(F).split(".")[1].length;L=y.toFixed(I)}if(0!==L&&1e3!==L&&L%1e3==0&&(L=L/1e3+"K"),c)x.fillText(L,A+2,8);else{var N=String(L).split("");for(i=0;im){if(C++,x.stroke(),C>=b){i=10,A=_;continue}x=w[C],A-=a,O=Math.round(A+B*i)+.5}var U=i%2?12:10;c?(x.moveTo(O,15),x.lineTo(O,U)):(x.moveTo(15,O),x.lineTo(U,O))}A+=P}x.strokeStyle="#666666",x.stroke()}}function _(){d.deleteCurrentLayer()&&(ye(),se(),e("#layerlist tr.layer").removeClass("layersel"),e("#layerlist tr.layer:first").addClass("layersel"))}function w(){var t=d.getCurrentDrawing().getCurrentLayerName()+" copy";e.prompt(uiStrings.notification.enterUniqueLayerName,t,function(t){t&&(d.getCurrentDrawing().hasLayer(t)?e.alert(uiStrings.notification.dupeLayerName):(d.cloneLayer(t),ye(),se()))})}function y(){e("#layerlist tr.layersel").index()!=d.getCurrentDrawing().getNumLayers()-1&&(d.mergeLayer(),ye(),se())}function b(t){var n=e("#layerlist tr.layersel").index(),o=d.getCurrentDrawing().getNumLayers();(n>0||n=n;return 0===t?n:n>=24?i?Math.round(1.1*n):Math.round(n/1.1):n<=1?i?2*n:n/2:o}function x(e,t){var n=Number(e.value);if(0===n)return 100;var o=n+t;return 0===t?n:n>=100?o:o>=n?2*n:n/2}function k(e){e.stopPropagation(),e.preventDefault()}function S(e){e.stopPropagation(),e.preventDefault()}function E(e){e.stopPropagation(),e.preventDefault()}try{"localStorage"in window&&(u.storage=localStorage)}catch(e){}var F=[];e("#lang_select option").each(function(){F.push(this.value)}),function(){var t,i;if(f=e.deparam.querystring(!0),e.isEmptyObject(f))o(),u.loadContentAndPrefs(),n();else{if(f.dimensions&&(f.dimensions=f.dimensions.split(",")),f.bkgd_color&&(f.bkgd_color="#"+f.bkgd_color),f.extensions&&(f.extensions=f.extensions.match(/[:\/\\]/)?"":f.extensions.split(",")),e.each(["extPath","imgPath","langPath","jGraduatePath"],function(e){f[e]&&delete f[e]}),u.setConfig(f,{overwrite:!1}),o(),!curConfig.preventURLContentLoading){if(t=f.source,i=e.param.querystring(),t||i.indexOf("source=data:")>=0&&(t=i.match(/source=(data:[^&]*)/)[1]),t)return void(0===t.indexOf("data:")?u.loadFromDataURI(t):u.loadFromString(t));if(f.url)return void u.loadFromURL(f.url)}f.noStorageOnLoad&&!curConfig.forceStorage||u.loadContentAndPrefs(),n()}}(),function(){var e,n=window.opener;if(n)try{e=n.document.createEvent("Event"),e.initEvent("svgEditorReady",!0,!0),n.document.documentElement.dispatchEvent(e)}catch(e){}t&&setTimeout(t,2e3)}();var P=u.setIcon=function(t,n,o){var i="string"==typeof n?e.getSvgIcon(n,!0):n.clone();i&&e(t).empty().append(i)},A=function(){window.extOverview&&window.extOverview(),window.extMarkers&&window.extMarkers(),window.extEyedropper&&window.extEyedropper(),window.extImagelib&&window.extImagelib(),window.extGrid&&window.extGrid(),window.extPanning&&window.extPanning(),window.extStorage&&window.extStorage(),window.extSwitch&&window.extSwitch(),window.extValue&&window.extValue(),window.extHtmlInput&&window.extHtmlInput(),window.extHtmlChart&&window.extHtmlChart(),window.extHtmlGraph&&window.extHtmlGraph(),window.extHtmlSelect&&window.extHtmlSelect(),window.extHtmlButton&&window.extHtmlButton(),window.extGaugeProgress&&window.extGaugeProgress(),window.extGaugeSemaphore&&window.extGaugeSemaphore(),window.extHtmlBag&&window.extHtmlBag(),window.extLinear&&window.extLinear(),window.extPipe&&window.extPipe(),window.extHtmlSlider&&window.extHtmlSlider(),window.extHtmlSwitch&&window.extHtmlSwitch(),window.extOwnCtrl&&window.extOwnCtrl(),u.putLocale&&u.putLocale(null,F)},T=function(e){m.load(curConfig.shapesPath,function(){Object.values(u.shapesGrps).forEach(e=>{for(var t=0;t"+a.replace(/\n/g,"

")+"

").toggleClass("prompt","prompt"==i),n.empty(),d=e('').appendTo(n),"alert"!==i&&e('').appendTo(n).click(function(){t.hide(),r&&r(!1)}),"prompt"===i)f=e('').prependTo(n),f.val(l||""),f.bind("keydown","return",function(){d.click()});else if("select"===i){var g=e('
');if(f=e("').appendTo(v),p.val(u.value),u.tooltip&&v.attr("title",u.tooltip),p.prop("checked",!!u.checked),g.append(e("
").append(v))}e.each(s||[],function(t,n){"object"==typeof n?f.append(e("