This commit is contained in:
lovebird 2025-09-27 07:55:50 +02:00
parent 9284894589
commit db5182c0a5
19 changed files with 2913 additions and 45 deletions

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

31
packages/kbot/gr.sh Normal file
View File

@ -0,0 +1,31 @@
#!/bin/bash
# Script to update git remote domain to git.polymech.info
# This script updates the origin remote URL from git.polymech.io to git.polymech.info
echo "Updating git remote domain to git.polymech.info..."
# Get current remote URL
current_url=$(git remote get-url origin)
echo "Current remote URL: $current_url"
# Replace git.polymech.io with git.polymech.info
new_url=$(echo "$current_url" | sed 's/git\.polymech\.io/git.polymech.info/g')
echo "New remote URL: $new_url"
# Update the remote URL
git remote set-url origin "$new_url"
# Verify the change
updated_url=$(git remote get-url origin)
echo "Updated remote URL: $updated_url"
# Test connectivity
echo "Testing connectivity to new remote..."
if git ls-remote origin > /dev/null 2>&1; then
echo "✅ Successfully connected to new remote!"
else
echo "❌ Warning: Could not connect to new remote. Please check the URL and your network connection."
fi
echo "Git remote update completed!"

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,7 @@
osr-i18n translate \
--srcLang='EN' \
--dstLang='NL,ES,FR,IT,DE' \
--debug \
--createGlossary=false \
--src='./src/i18n/en.json' \
--dst='./src/i18n/${DST_LANG}${SRC_EXT}'

View File

@ -0,0 +1,51 @@
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
// Replicate __dirname behavior for ES modules
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const i18nDir = path.join(__dirname, '../i18n');
const outputDir = path.join(__dirname, '../src');
const outputFile = path.join(outputDir, 'translations.ts');
const allTranslations = {};
try {
// Ensure output directory exists
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
const files = fs.readdirSync(i18nDir);
files.forEach(file => {
if (path.extname(file) === '.json') {
const lang = path.basename(file, '.json');
const filePath = path.join(i18nDir, file);
const content = fs.readFileSync(filePath, 'utf8');
try {
allTranslations[lang] = JSON.parse(content);
console.log(`Successfully processed ${file}`);
} catch (parseError) {
console.error(`Error parsing JSON from ${file}:`, parseError);
}
}
});
const tsContent = `// Auto-generated by scripts/translations.js
// Do not edit this file manually.
// All changes will be overwritten.
export const translations: Record<string, { [key: string]: string }> = ${JSON.stringify(allTranslations, null, 2)};
`;
fs.writeFileSync(outputFile, tsContent, 'utf8');
console.log(`\nSuccessfully generated TypeScript translations file at ${outputFile}`);
console.log('Included languages:', Object.keys(allTranslations).join(', '));
} catch (error) {
console.error('Error generating translations file:', error);
process.exit(1);
}

View File

@ -16,10 +16,13 @@ const Header: React.FC<HeaderProps> = ({
}) => {
const navigate = useNavigate();
return (
<div className="mb-8 space-y-4">
<div className="mb-4 sm:mb-8 space-y-3 sm:space-y-4">
{/* Title on its own row */}
<div className="text-center">
<h1 className="text-2xl md:text-3xl font-bold accent-text drop-shadow-sm">Image Wizard</h1>
<h1 className="text-2xl md:text-3xl font-bold accent-text drop-shadow-sm flex justify-center gap-4">
<span>Image</span>
<span>Wizard</span>
</h1>
</div>
{/* Controls row - single row layout */}
@ -32,7 +35,7 @@ const Header: React.FC<HeaderProps> = ({
className="glass-button p-2 sm:p-3 rounded-xl hover:shadow-lg transition-all duration-300"
title="Toggle Debug Panel"
>
<svg className="w-4 h-4 sm:w-5 sm:h-5 text-slate-700 dark:text-slate-300" fill="currentColor" viewBox="0 0 20 20">
<svg className="w-5 h-5 sm:w-6 sm:h-6 text-slate-700 dark:text-slate-300" fill="currentColor" viewBox="0 0 20 20">
<path
fillRule="evenodd"
d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z"
@ -48,7 +51,7 @@ const Header: React.FC<HeaderProps> = ({
title={isDarkMode ? 'Switch to Light Mode' : 'Switch to Dark Mode'}
>
{isDarkMode ? (
<svg className="w-4 h-4 sm:w-5 sm:h-5 text-slate-300" fill="currentColor" viewBox="0 0 20 20">
<svg className="w-5 h-5 sm:w-6 sm:h-6 text-slate-300" fill="currentColor" viewBox="0 0 20 20">
<path
fillRule="evenodd"
d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"
@ -56,7 +59,7 @@ const Header: React.FC<HeaderProps> = ({
/>
</svg>
) : (
<svg className="w-4 h-4 sm:w-5 sm:h-5 text-slate-700" fill="currentColor" viewBox="0 0 20 20">
<svg className="w-5 h-5 sm:w-6 sm:h-6 text-slate-700" fill="currentColor" viewBox="0 0 20 20">
<path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z" />
</svg>
)}
@ -69,7 +72,7 @@ const Header: React.FC<HeaderProps> = ({
className="glass-button p-2 sm:p-3 rounded-xl hover:shadow-lg transition-all duration-300"
title="Settings"
>
<svg className="w-4 h-4 sm:w-5 sm:h-5 text-slate-700 dark:text-slate-300" fill="currentColor" viewBox="0 0 20 20">
<svg className="w-5 h-5 sm:w-6 sm:h-6 text-slate-700 dark:text-slate-300" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z" clipRule="evenodd" />
</svg>
</button>

View File

@ -725,7 +725,7 @@ const ImageWizard: React.FC<ImageWizardProps> = ({
<div className="absolute -bottom-40 -left-40 w-80 h-80 bg-gradient-to-tr from-cyan-200/30 to-blue-200/30 dark:from-cyan-500/20 dark:to-blue-500/20 rounded-full blur-3xl"></div>
</div>
<div className="w-full max-w-4xl relative z-10 h-full flex flex-col overflow-hidden p-6">
<div className="w-full max-w-4xl relative z-10 h-full flex flex-col overflow-hidden p-2 sm:p-6">
<Header
showDebugPanel={showDebugPanel}
setShowDebugPanel={setShowDebugPanel}
@ -735,7 +735,7 @@ const ImageWizard: React.FC<ImageWizardProps> = ({
{/* Error Message Display */}
{errorMessage && (
<div className="mb-6 p-4 bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-700 rounded-xl">
<div className="mb-4 sm:mb-6 p-3 sm:p-4 bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-700 rounded-xl">
<div className="flex justify-between items-start">
<div className="flex">
<div className="flex-shrink-0">

View File

@ -205,21 +205,18 @@ const PromptForm: React.FC<PromptFormProps> = ({
return (
<form
className="flex flex-col items-center glass-card p-8 glass-shimmer shadow-2xl"
className="flex flex-col items-center glass-card p-4 sm:p-8 glass-shimmer shadow-2xl"
onSubmit={(e) => {
e.preventDefault();
submit();
}}
>
<div className="w-full space-y-6">
{/* Two-column layout: Prompt + Templates/Actions */}
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
{/* Left column: Prompt area (2/3 width) */}
<div className="lg:col-span-2">
<label htmlFor="prompt-input" className="block text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">
Image Description
</label>
<div className="border-2 border-slate-200 dark:border-slate-700 rounded-xl p-4 focus-within:border-indigo-500 dark:focus-within:border-indigo-400 transition-colors duration-200">
{/* Two-column layout: Text Input + Action Buttons */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
{/* Left column: Text input area only */}
<div>
<div className="border-2 border-slate-200 dark:border-slate-700 rounded-xl p-3 sm:p-4 focus-within:border-indigo-500 dark:focus-within:border-indigo-400 transition-colors duration-200">
<textarea
id="prompt-input"
value={prompt}
@ -242,9 +239,13 @@ const PromptForm: React.FC<PromptFormProps> = ({
}}
/>
</div>
</div>
{/* Right column: Action buttons (Generate + Styles + Actions) */}
<div className="space-y-4">
{/* Generate Button + History Navigation */}
<div className="flex gap-3 mt-4">
<div className="flex flex-col sm:flex-row gap-3">
<button
type="button"
onClick={submit}
@ -288,11 +289,6 @@ const PromptForm: React.FC<PromptFormProps> = ({
</div>
)}
</div>
</div>
{/* Right column: Quick Tools (1/3 width) */}
<div className="space-y-3">
{/* Quick Styles - Compact */}
<div>
<h4 className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">Styles</h4>
@ -361,14 +357,14 @@ const PromptForm: React.FC<PromptFormProps> = ({
<label htmlFor="output-path" className="block text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">
Output File Path
</label>
<div className="flex gap-3">
<div className="flex flex-col sm:flex-row gap-3">
<input
id="output-path"
type="text"
value={dst}
onChange={(e) => setDst(e.target.value)}
placeholder="output.png"
className="flex-1 glass-input p-4 rounded-xl"
className="flex-1 glass-input p-3 sm:p-4 rounded-xl border-2 border-slate-300 dark:border-slate-600 focus:border-indigo-500 dark:focus:border-indigo-400"
/>
<button
type="button"
@ -387,19 +383,16 @@ const PromptForm: React.FC<PromptFormProps> = ({
ref={dropZoneRef}
className={`p-4 rounded-xl border-2 border-dashed transition-all duration-300 bg-slate-50/30 dark:bg-slate-800/30 ${dragIn ? 'border-blue-500 bg-blue-500/10' : 'border-slate-300/50 dark:border-slate-600/50'}`}
>
<label className="block text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2 text-center">
Source Images
</label>
<div className="space-y-3">
<button
type="button"
onClick={openFilePicker}
className="w-full glass-button font-semibold py-4 px-6 rounded-xl hover:border-slate-400/60 dark:hover-border-slate-500/60 flex items-center justify-center gap-2"
className="w-full glass-button font-semibold py-4 px-6 rounded-xl hover:border-slate-400/60 dark:hover-border-slate-500/60 flex items-center justify-center gap-2 border-2 border-dashed border-slate-300 dark:border-slate-600 hover:border-indigo-400 dark:hover:border-indigo-500 transition-colors"
>
<FolderOpen size={16} />
Select Images to Edit (or Drop Here)
<FolderOpen size={20} />
Select Images (or Drop Here)
</button>
<div className="flex gap-2 justify-center">
<div className="flex flex-col sm:flex-row gap-2 justify-center">
<button
type="button"
onClick={() => addImageFromUrl('https://picsum.photos/640/640')}
@ -423,7 +416,7 @@ const PromptForm: React.FC<PromptFormProps> = ({
</div>
{files.length > 0 && (
<div className="w-full mt-6 border border-slate-200/50 dark:border-slate-700/50 rounded-xl p-6 bg-slate-50/30 dark:bg-slate-800/30">
<div className="w-full mt-4 sm:mt-6 border border-slate-200/50 dark:border-slate-700/50 rounded-xl p-4 sm:p-6 bg-slate-50/30 dark:bg-slate-800/30">
<div className="flex justify-between items-center mb-4">
<h3 className="text-sm font-semibold text-slate-700 dark:text-slate-300">
Images ({files.length})

View File

@ -42,16 +42,16 @@ const Settings: React.FC<SettingsProps> = ({
};
return (
<div className="min-h-screen bg-gradient-to-br from-indigo-50 via-white to-cyan-50 dark:from-slate-900 dark:via-slate-800 dark:to-indigo-900 flex flex-col items-center p-6 transition-colors duration-500">
<main className="h-full w-full bg-gradient-to-br from-indigo-50 via-white to-cyan-50 dark:from-slate-900 dark:via-slate-800 dark:to-indigo-900 flex flex-col items-center overflow-hidden transition-colors duration-500">
{/* Background decoration */}
<div className="fixed inset-0 overflow-hidden pointer-events-none">
<div className="absolute -top-40 -right-40 w-80 h-80 bg-gradient-to-br from-indigo-200/30 to-purple-200/30 dark:from-indigo-500/20 dark:to-purple-500/20 rounded-full blur-3xl"></div>
<div className="absolute -bottom-40 -left-40 w-80 h-80 bg-gradient-to-tr from-cyan-200/30 to-blue-200/30 dark:from-cyan-500/20 dark:to-blue-500/20 rounded-full blur-3xl"></div>
</div>
<div className="w-full max-w-2xl relative z-10 mt-8">
<div className="w-full max-w-4xl relative z-10 h-full flex flex-col overflow-hidden p-2 sm:p-6">
{/* Header */}
<div className="mb-8 space-y-4">
<div className="mb-6 space-y-3">
<div className="flex items-center gap-4">
<button
onClick={() => navigate('/')}
@ -64,10 +64,11 @@ const Settings: React.FC<SettingsProps> = ({
</div>
</div>
{/* Settings Form */}
<div className="glass-card p-8 glass-shimmer shadow-2xl space-y-6">
<div className="flex-1 overflow-y-auto">
{/* Settings Form */}
<div className="glass-card p-4 sm:p-6 glass-shimmer shadow-2xl space-y-4">
{/* API Key Section */}
<div className="space-y-4">
<div className="space-y-3">
<div>
<label htmlFor="api-key" className="block text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">
Google AI API Key
@ -79,7 +80,7 @@ const Settings: React.FC<SettingsProps> = ({
value={localApiKey}
onChange={(e) => setLocalApiKey(e.target.value)}
placeholder="Enter your Google AI API key"
className="w-full glass-input p-4 rounded-xl"
className="w-full glass-input p-3 sm:p-4 rounded-xl"
/>
<div className="flex items-center gap-2">
<div className={`h-2 w-2 rounded-full ${localApiKey ? 'bg-green-500' : 'bg-red-500'}`}></div>
@ -103,7 +104,7 @@ const Settings: React.FC<SettingsProps> = ({
</div>
{/* Theme Section */}
<div className="border-t border-slate-200/50 dark:border-slate-700/50 pt-6">
<div>
<div className="flex items-center justify-between">
<div>
<h3 className="text-sm font-semibold text-slate-700 dark:text-slate-300">Theme</h3>
@ -132,7 +133,7 @@ const Settings: React.FC<SettingsProps> = ({
</div>
{/* Save Button */}
<div className="border-t border-slate-200/50 dark:border-slate-700/50 pt-6">
<div>
<button
onClick={handleSave}
className="w-full glass-button bg-gradient-to-r from-indigo-500 to-purple-600 hover:from-indigo-600 hover:to-purple-700 text-white px-6 py-3 rounded-xl font-semibold transition-all duration-300"
@ -142,7 +143,8 @@ const Settings: React.FC<SettingsProps> = ({
</div>
</div>
</div>
</div>
</div>
</main>
);
};

View File

@ -56,7 +56,7 @@ const TemplateManager: React.FC<TemplateManagerProps> = ({
{/* Right: Template Management Icons */}
<div>
<h4 className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2">Manage</h4>
<div className="flex gap-2">
<div className="flex flex-col sm:flex-row gap-2">
<button
type="button"
onClick={handleSaveTemplate}

View File

@ -0,0 +1,209 @@
import React, { useState, useEffect, ReactNode, useMemo } from 'react';
// --- Language Configuration ---
type LangCode = 'en' | 'fr' | 'sw' | 'de' | 'es' | 'it' | 'ja' | 'ko' | 'pt' | 'ru' | 'tr' | 'zh' | 'nl';
const DEFAULT_LANG: LangCode = 'en';
export const supportedLanguages = [
{ code: 'en', name: 'English' },
{ code: 'fr', name: 'Français' },
{ code: 'sw', name: 'Kiswahili' },
{ code: 'de', name: 'Deutsch' },
{ code: 'es', name: 'Español' },
{ code: 'nl', name: 'Nederlands' }
];
// --- Caching and Loading ---
const translationCache: { [lang: string]: Record<string, string> } = {};
const loadingPromises: { [lang: string]: Promise<Record<string, string>> } = {};
const translationsLoaded: { [lang: string]: boolean } = {};
// --- Pub/Sub for updates ---
let listeners: (() => void)[] = [];
const subscribe = (callback: () => void) => {
listeners.push(callback);
return () => {
listeners = listeners.filter(l => l !== callback);
};
};
const notify = () => {
listeners.forEach(l => l());
};
const loadTranslations = (lang: LangCode): Promise<Record<string, string>> => {
if (translationsLoaded[lang]) {
return Promise.resolve(translationCache[lang] || {});
}
return loadingPromises[lang] || (() => {
const promise = import(`./i18n/${lang}.json`)
.then(module => {
const translations = module.default;
// Merge with existing auto-collected keys, but prioritize loaded translations
const existingCache = translationCache[lang] || {};
translationCache[lang] = { ...existingCache, ...translations };
translationsLoaded[lang] = true;
delete loadingPromises[lang];
notify(); // Notify components to re-render with new translations
return translationCache[lang];
})
.catch(error => {
console.warn(`Could not load translations for language: ${lang}`, error);
// Don't mark as loaded if it failed, but keep auto-collected keys
delete loadingPromises[lang];
notify(); // Still notify to update state
return translationCache[lang] || {};
});
loadingPromises[lang] = promise;
return promise;
})();
};
const getCurrentLangInternal = (): LangCode => {
if (typeof window !== 'undefined') {
const params = new URLSearchParams(window.location.search);
const langParam = params.get('lang') as LangCode;
if (langParam && langParam.length === 2) {
return langParam;
}
const browserLangs = navigator.languages || [navigator.language];
for (const lang of browserLangs) {
const shortLang = lang.split('-')[0] as LangCode;
if (shortLang && shortLang.length === 2) {
return shortLang;
}
}
}
return DEFAULT_LANG;
};
export const getCurrentLang = getCurrentLangInternal;
// Helper function to get a translated string directly (SYNC)
export const translate = (textKey: string, langParam?: LangCode): string => {
const langToUse = langParam || getCurrentLangInternal();
// 1. Try loaded translations for current language
if (translationsLoaded[langToUse] && translationCache[langToUse] && translationCache[langToUse][textKey] !== undefined) {
return translationCache[langToUse][textKey];
}
// 2. If not found and lang is not default, try loaded translations for default language
if (langToUse !== DEFAULT_LANG && translationsLoaded[DEFAULT_LANG] && translationCache[DEFAULT_LANG] && translationCache[DEFAULT_LANG][textKey] !== undefined) {
return translationCache[DEFAULT_LANG][textKey];
}
// 3. Auto-populate cache with key for dictionary building (only if not already loaded)
if (!translationCache[langToUse]) {
translationCache[langToUse] = {};
}
if (translationCache[langToUse][textKey] === undefined) {
translationCache[langToUse][textKey] = textKey; // Store key as value for now
}
// 4. Ultimate fallback: return the key itself
return textKey;
};
interface TProps {
children: ReactNode;
}
const T: React.FC<TProps> = ({ children }) => {
const [, forceUpdate] = useState(0);
useEffect(() => {
return subscribe(() => {
forceUpdate(c => c + 1);
});
}, []);
const currentLang = getCurrentLangInternal();
useEffect(() => {
loadTranslations(currentLang);
}, [currentLang]);
const textKey = useMemo(() => {
if (typeof children === 'string') return children;
if (React.isValidElement(children) && typeof children.props.children === 'string') {
return children.props.children;
}
return null;
}, [children]);
if (!textKey) {
return <>{children}</>;
}
const translatedString = translate(textKey, currentLang);
if (React.isValidElement(children) && typeof children.props.children === 'string') {
return React.cloneElement(children, {}, translatedString);
}
return <>{translatedString}</>;
};
export const getTranslationCache = (lang?: LangCode): Record<string, string> | Record<string, Record<string, string>> => {
if (lang) {
return translationCache[lang] || {};
}
return translationCache;
};
// Helper function to download collected translations as JSON file
export const downloadTranslations = (lang: LangCode = 'en') => {
const translations = translationCache[lang] || {};
const isLoaded = translationsLoaded[lang];
const sortedTranslations = Object.keys(translations)
.sort()
.reduce((result, key) => {
result[key] = translations[key];
return result;
}, {} as Record<string, string>);
const jsonString = JSON.stringify(sortedTranslations, null, 2);
const blob = new Blob([jsonString], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = `${lang}.json`;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
console.log(`Downloaded ${Object.keys(sortedTranslations).length} translation keys for language: ${lang} (${isLoaded ? 'loaded from file' : 'auto-collected'})`);
};
// Helper function to check translation loading status
export const getTranslationStatus = (lang?: LangCode) => {
if (lang) {
return {
loaded: translationsLoaded[lang] || false,
keysCount: Object.keys(translationCache[lang] || {}).length
};
}
const status: Record<string, { loaded: boolean; keysCount: number }> = {};
for (const langCode of Object.keys(translationCache)) {
status[langCode] = {
loaded: translationsLoaded[langCode] || false,
keysCount: Object.keys(translationCache[langCode] || {}).length
};
}
return status;
};
if (typeof window !== 'undefined') {
(window as any).getTranslationCache = getTranslationCache;
(window as any).translate = translate;
(window as any).getCurrentLang = getCurrentLang;
(window as any).downloadTranslations = downloadTranslations;
(window as any).getTranslationStatus = getTranslationStatus;
}
export { T };

View File

@ -0,0 +1,350 @@
{
"Download English Translations": "Englische Übersetzungen herunterladen",
"Connect": "Verbinden Sie",
"PolyMech - Cassandra": "PolyMech - Cassandra",
"OFFLINE": "OFFLINE",
"System Information": "System-Informationen",
"API URL": "API-URL",
"System Messages": "System-Meldungen",
"Clear": "Klar",
"No enabled profile": "Kein aktiviertes Profil",
"Stop Profile": "Profil anhalten",
"N/A": "K.A",
"Press": "Presse",
"Stop": "Stopp",
"MANUAL": "MANUELL",
"AUTO": "AUTO",
"MANUAL MULTI": "MANUELL MULTI",
"AUTO MULTI": "AUTO MULTI",
"AUTO MULTI BALANCED": "AUTO-MULTI AUSGEGLICHEN",
"Press Cylinder Controls": "Pressenzylinder-Steuerung",
"PV": "PV",
"Mode": "Modus",
"SP:": "SP:",
"Interlocked": "Verriegelt",
"Low": "Niedrig",
"Mid": "Mitte",
"Max": "Max",
"Press Cylinder": "Presse-Zylinder",
"Dashboard": "Dashboard",
"Signals": "Signale",
"Profiles": "Profile",
"Advanced": "Fortgeschrittene",
"Settings": "Einstellungen",
"Network": "Netzwerk",
"Coils": "Spulen",
"Registers": "Register",
"Charts": "Diagramme",
"Logs": "Protokolle",
"Favorites": "Favoriten",
"Connect to view register data.": "Verbinden Sie sich, um Registerdaten anzuzeigen.",
"Cancel": "Abbrechen",
"Reset": "Zurücksetzen",
"Disconnect": "Trennen Sie die Verbindung",
"ONLINE": "ONLINE",
"No register data available. Try refreshing.": "Keine Registerdaten verfügbar. Versuchen Sie zu aktualisieren.",
"Connect to a Modbus server to see controller data.": "Stellen Sie eine Verbindung zu einem Modbus-Server her, um die Daten der Steuerung zu sehen.",
"Connected, but no register data received yet. Waiting for data...": "Verbunden, aber noch keine Registerdaten empfangen. Ich warte auf Daten...",
"Start Profile": "Profil starten",
"IDLE": "IDLE",
"Commons": "Commons",
"Slave Mode": "Slave-Modus",
"When Slave Mode is enabled, all Omron controllers will be disabled for processing.": "Wenn der Slave-Modus aktiviert ist, werden alle Omron-Regler für die Verarbeitung deaktiviert.",
"All Stop": "Alle Haltestelle",
"COM Write": "COM Schreiben",
"Set All SP": "Alle SP einstellen",
"Total Cost": "Gesamtkosten",
"Custom Widgets": "Benutzerdefinierte Widgets",
"Watched Items": "Beobachtete Artikel",
"DEC": "DEC",
"HEX": "HEX",
"MINLOAD": "MINLOAD",
"MAX_TIME": "MAX_TIME",
"STALLED": "STALLED",
"BALANCE": "BALANCE",
"LOADCELL": "LOADCELL",
"MULTI_TIMEOUT": "MULTI_TIMEOUT",
"NONE": "KEINE",
"MANUAL_MULTI": "MANUELL_MULTI",
"AUTO_MULTI": "AUTO_MULTI",
"AUTO_MULTI_BALANCED": "AUTO_MULTI_BALANCED",
"REMOTE": "FERNSEHEN",
"Temperature Profiles": "Temperatur-Profile",
"Controller Chart": "Controller-Diagramm",
"Global Settings": "Globale Einstellungen",
"Show PV": "PV anzeigen",
"Show SP": "SP anzeigen",
"Profile SP": "Profil SP",
"Window (min)": "Fenster (min)",
"Visible Controllers": "Sichtbare Kontrolleure",
"Cassandra Left": "Cassandra Links",
"Cassandra Right": "Cassandra Rechts",
"Clear Chart": "Übersichtliches Diagramm",
"Reset Zoom": "Zoom zurücksetzen",
"Export to CSV": "Exportieren nach CSV",
"Sequential Heating Control": "Sequentielle Heizungssteuerung",
"Sequential Heating": "Sequentielle Heizung",
"Heating Time": "Heizzeit",
"in seconds": "in Sekunden",
"Max Simultaneous": "Max. gleichzeitige",
"Window Offset": "Fenster Versatz",
"Start Index": "Start-Index",
"End Index": "Ende Index",
"Current Status": "Aktueller Stand",
"Unknown": "Unbekannt",
"Controller Partitions": "Controller Partitionen",
"Carina": "Carina",
"Stopped": "Gestoppt",
"SP": "SP",
"Castor": "Castor",
"Cetus": "Cetus",
"Corona": "Corona",
"Coma B": "Koma B",
"Corvus": "Corvus",
"Crater": "Krater",
"Crux": "Crux",
"Copy \"{plotName}\" to...": "Kopieren Sie \"{plotName}\" nach...",
"Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.": "Wählen Sie einen Zielplan aus. Der Inhalt von \"{PlotName}\" überschreibt den ausgewählten Plot. Diese Aktion kann nicht rückgängig gemacht werden.",
"Select a plot to overwrite": "Wählen Sie eine zu überschreibende Fläche",
"Signal Plot Editor": "Signalplot-Editor",
"Download All JSON": "Alle JSON herunterladen",
"Upload All JSON": "Alle JSON hochladen",
"Signal plots configuration loaded from API.": "Konfiguration der Signaldiagramme von der API geladen.",
"Slot:": "Steckplatz:",
"Enable control unavailable for {name}": "Aktivieren der Kontrolle nicht verfügbar für {Name}",
"Total:": "Insgesamt:",
"Add a set of sample control points to this plot": "Hinzufügen eines Satzes von Probenkontrollpunkten zu dieser Darstellung",
"Remove all control points from this plot": "Alle Kontrollpunkte aus diesem Diagramm entfernen",
"Download JSON for {name}": "JSON für {Name} herunterladen",
"Upload JSON for {name}": "JSON für {Name} hochladen",
"Copy this plot to another slot...": "Kopieren Sie diesen Plot in einen anderen Slot...",
"Slot": "Schlitz",
"Duration:": "Dauer:",
"Timeline:": "Zeitleiste:",
"Play from start": "Von Anfang an spielen",
"Pause": "Pause",
"Stop and reset": "Anhalten und zurücksetzen",
"Control Points": "Kontrollpunkte",
"Control Points List": "Liste der Kontrollpunkte",
"Move control point up": "Kontrollpunkt nach oben verschieben",
"Move control point down": "Kontrollpunkt nach unten verschieben",
"Delete control point": "Kontrollpunkt löschen",
"Properties:": "Eigenschaften:",
"Select a control point to see its properties.": "Wählen Sie einen Kontrollpunkt aus, um seine Eigenschaften anzuzeigen.",
"Add Samples": "Proben hinzufügen",
"Clear All CPs": "Alle CPs löschen",
"Download Plot": "Plot herunterladen",
"Upload Plot": "Plot hochladen",
"Copy to...": "Kopieren nach...",
"No Operation": "Keine Operation",
"Write Coil": "Spule schreiben",
"Write Holding Register": "Schreib-Halte-Register",
"Call Method": "Methode aufrufen",
"Call Function": "Funktion aufrufen",
"Call REST API": "REST-API aufrufen",
"Write GPIO": "GPIO schreiben",
"Display Message": "Meldung anzeigen",
"User Defined": "Benutzerdefiniert",
"Pause Profile": "Pause Profil",
"Start PID Controllers": "PID-Regler starten",
"Stop PID Controllers": "PID-Regler anhalten",
"Buzzer: Off": "Buzzer: Aus",
"Buzzer: Solid On": "Buzzer: Dauerhaft eingeschaltet",
"Buzzer: Slow Blink": "Buzzer: Langsames Blinken",
"Buzzer: Fast Blink": "Buzzer: Schnelles Blinken",
"Buzzer: Long Beep/Short Pause": "Buzzer: Langer Signalton/kurze Pause",
"Send IFTTT Notification": "IFTTT-Benachrichtigung senden",
"Buzzer": "Buzzer",
"General": "Allgemein",
"Hardware I/O": "Hardware-E/A",
"Integrations": "Integrationen",
"Modbus": "Modbus",
"PID Control": "PID-Regelung",
"System Calls": "Systemaufrufe",
"Addr:": "Addr:",
"Run this control point action now": "Führen Sie diese Kontrollpunktaktion jetzt aus",
"Select type": "Typ auswählen",
"Enter CP name": "CP-Name eingeben",
"Enter CP description": "CP-Beschreibung eingeben",
"ID:": "ID:",
"Run Action": "Aktion ausführen",
"Time:": "Zeit:",
"Scale:": "Maßstab:",
"State:": "Staat:",
"Type:": "Art:",
"CP Name (Optional):": "CP-Name (fakultativ):",
"CP Description (Optional):": "CP-Beschreibung (fakultativ):",
"Arguments:": "Argumente:",
"Argument 0:": "Argument 0:",
"Argument 1:": "Argument 1:",
"Argument 2 (Optional):": "Argument 2 (fakultativ):",
"Loading profiles from Modbus...": "Profile von Modbus laden...",
"This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.": "Dadurch wird das Profil \"{Profilname}\" dauerhaft vom Server gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.",
"Copy \"{profileName}\" to...": "Kopieren Sie \"{Profilname}\" nach...",
"Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.": "Wählen Sie ein Zielprofil. Der Inhalt von \"{Profilname}\" wird das ausgewählte Profil überschreiben. Diese Aktion kann nicht rückgängig gemacht werden.",
"Select a profile to overwrite": "Wählen Sie ein zu überschreibendes Profil",
"Help": "Hilfe",
"Download": "Herunterladen",
"Upload": "Hochladen",
"Associated Controllers:": "Zugehörige Steuergeräte:",
"Edit Profile": "Profil bearbeiten",
"Duplicate Profile": "Profil duplizieren",
"Copy to existing slot...": "In vorhandenen Steckplatz kopieren...",
"Delete Profile": "Profil löschen",
"Enabled": "Aktiviert",
"Total": "Insgesamt",
"Idle": "Leerlauf",
"Start": "Start",
"E.g., Quick Ramp Up": "Z.B. Quick Ramp Up",
"Select a signal plot to associate and edit": "Wählen Sie ein Signaldiagramm zum Zuordnen und Bearbeiten aus",
"Slave:": "Sklave:",
"SP CMD Addr:": "SP CMD Adr:",
"Profile Name": "Profil Name",
"Description": "Beschreibung",
"Duration (hh:mm:ss)": "Dauer (hh:mm:ss)",
"Profile Curves": "Profil-Kurven",
"Temperature Control Points": "Temperaturkontrollpunkte",
"Associated Signal Plot (Optional)": "Zugehöriges Signaldiagramm (optional)",
"Child Profiles (Sub-plots)": "Profile der Kinder (Nebenhandlungen)",
"Selected child profiles will start, stop, pause, and resume with this parent profile.": "Ausgewählte untergeordnete Profile werden mit diesem übergeordneten Profil gestartet, gestoppt, angehalten und fortgesetzt.",
"Target Controllers (Registers)": "Ziel-Controller (Register)",
"Add all": "Alle hinzufügen",
"Remove all": "Alle entfernen",
"Export": "Exportieren",
"Markdown": "Markdown",
"Import": "Importieren",
"Update Profile": "Profil aktualisieren",
"None": "Keine",
"Signal Control Point Details": "Details zum Signalkontrollpunkt",
"Save Signal Plot": "Signalplot speichern",
"Loading Cassandra settings...": "Laden der Cassandra-Einstellungen...",
"General Settings": "Allgemeine Einstellungen",
"Master Configuration": "Master-Konfiguration",
"Master Name": "Hauptname",
"Slaves": "Sklaven",
"Manage slave devices (max 1).": "Verwaltung von Slave-Geräten (max. 1).",
"Add Slave": "Slave hinzufügen",
"Partitions": "Partitionen",
"Import JSON": "JSON importieren",
"Export JSON": "JSON exportieren",
"Save All Settings": "Alle Einstellungen speichern",
"Loading network settings...": "Laden der Netzwerkeinstellungen...",
"Network Settings": "Netzwerk-Einstellungen",
"Hostname": "Hostname",
"Device Hostname": "Hostname des Geräts",
"This hostname is used for both STA and AP modes. Changes here will be saved with either form.": "Dieser Hostname wird sowohl für den STA- als auch für den AP-Modus verwendet. Änderungen hier werden in beiden Formen gespeichert.",
"Station (STA) Mode": "Station (STA) Modus",
"Connects to an existing Wi-Fi network.": "Stellt eine Verbindung zu einem bestehenden Wi-Fi-Netzwerk her.",
"STA SSID": "STA SSID",
"STA Password": "STA-Passwort",
"STA IP Address": "STA IP-Adresse",
"STA Gateway": "STA-Gateway",
"STA Subnet Mask": "STA-Subnetzmaske",
"STA Primary DNS": "STA Primäre DNS",
"STA Secondary DNS": "STA Sekundärer DNS",
"Save STA Settings": "STA-Einstellungen speichern",
"Access Point (AP) Mode": "Zugangspunkt (AP) Modus",
"Creates its own Wi-Fi network.": "Erzeugt ein eigenes Wi-Fi-Netzwerk.",
"AP SSID": "AP SSID",
"AP Password": "AP-Kennwort",
"AP IP Address": "AP-IP-Adresse",
"AP Gateway": "AP-Gateway",
"AP Subnet Mask": "AP-Subnetzmaske",
"Save AP Settings": "AP-Einstellungen speichern",
"Enable All": "Alle freigeben",
"Disable All": "Alle deaktivieren",
"Operatorswitch": "Operatorswitch",
"Set All": "Alle einstellen",
"Presscylinder": "Pressezylinder",
"MAXLOAD": "MAXLOAD",
"ERROR": "ERROR",
"OK": "OK",
"OVERLOAD": "OVERLOAD",
"BALANCE_MAX_DIFF": "BALANCE_MAX_DIFF",
"AUTO_TIMEOUT": "AUTO_TIMEOUT",
"Loadcell[25]": "Kraftmesszelle[25]",
"Loadcell[26]": "Kraftmesszelle[26]",
"Real-time Charts": "Charts in Echtzeit",
"Real time Charting": "Charting in Echtzeit",
"X-Axis": "X-Achse",
"Refresh Rate": "Aktualisierungsrate",
"Y-Axis Left": "Y-Achse links",
"Min": "Min",
"Series": "Serie",
"Settings...": "Einstellungen...",
"Copy...": "Kopieren...",
"Show Legend": "Legende anzeigen",
"Apply": "Bewerbung",
"CSV": "CSV",
"Pop-out": "Pop-out",
"Save As": "Speichern unter",
"Set as Default": "Als Standard festlegen",
"Delete": "Löschen",
"Series Toggles": "Serie Toggles",
"Continue": "Weiter",
"Stop at end": "Stopp am Ende",
"Restart at end": "Neustart am Ende",
"Series settings": "Einstellungen der Serie",
"Configure the series to be displayed on the chart.": "Konfigurieren Sie die Serien, die im Diagramm angezeigt werden sollen.",
"Color": "Farbe",
"Offset": "Versetzt",
"Scale": "Skala",
"Title (Optional)": "Titel (fakultativ)",
"Source": "Quelle",
"File name": "Name der Datei",
"Search...": "Suche...",
"No source found.": "Keine Quelle gefunden.",
"Select source...": "Quelle auswählen...",
"Favorite Registers": "Bevorzugte Register",
"Favorite Coils": "Bevorzugte Spulen",
"e.g., Start Heating": "z.B. Start Heizung",
"e.g., Turn on coil for pre-heating stage": "z.B., Einschalten der Spule für die Vorwärmstufe",
"Select Known Coil...": "Bekannte Spule auswählen...",
"Create New Control Point": "Neuen Kontrollpunkt erstellen",
"Configure the new control point. Press Enter to confirm or Esc to cancel.": "Konfigurieren Sie den neuen Kontrollpunkt. Drücken Sie die Eingabetaste zur Bestätigung oder Esc zum Abbrechen.",
"Coil to Write:": "Spule zum Schreiben:",
"Value:": "Wert:",
"ON": "ON",
"Create Control Point": "Kontrollpunkt erstellen",
"Phapp": "Phapp",
"Aux": "Aux",
"Joystick": "Joystick",
"Samplesignalplot 0": "Mustersignalplot 0",
"Shortplot 70s": "Shortplot 70s",
"Signalplot 922 Slot 2": "Signalplot 922 Steckplatz 2",
"Signalplot 923 Slot 3": "Signalplot 923 Steckplatz 3",
"Delta Vfd[15]": "Delta Vfd[15]",
"none": "keine",
"OC": "OC",
"OV": "OV",
"OL": "OL",
"CE": "CE",
"stop": "stoppen",
"run": "laufen",
"accel": "beschleunigung",
"decel": "abbremsen",
"err": "err",
"fwd": "fwd",
"rev": "rev",
"reset": "zurücksetzen",
"info": "infos",
"setup": "einrichtung",
"reset_fault": "reset_fault",
"Plunger": "Stößel",
"HomingMan": "HomingMan",
"HomingAuto": "HomingAuto",
"PlungingMan": "PlungingMan",
"PlungingAuto": "EintauchenAuto",
"Stopping": "Stoppen",
"Jammed": "Verklemmt",
"ResettingJam": "Zurücksetzen vonJam",
"Record": "Datensatz",
"Replay": "Wiederholen Sie",
"Filling": "Füllen",
"PostFlow": "PostFlow",
"Home": "Startseite",
"Plunge": "Eintauchen",
"Info": "Infos",
"Fill": "Füllen Sie",
"No coils data available. Try refreshing.": "Keine Coil-Daten verfügbar. Versuchen Sie zu aktualisieren."
}

View File

@ -0,0 +1,379 @@
{
"Download English Translations": "Download English Translations",
"Connect": "Connect",
"PolyMech - Cassandra": "PolyMech - Cassandra",
"OFFLINE": "OFFLINE",
"System Information": "System Information",
"API URL": "API URL",
"System Messages": "System Messages",
"Clear": "Clear",
"No enabled profile": "No enabled profile",
"Stop Profile": "Stop Profile",
"N/A": "N/A",
"Press": "Press",
"Stop": "Stop",
"MANUAL": "MANUAL",
"AUTO": "AUTO",
"MANUAL MULTI": "MANUAL MULTI",
"AUTO MULTI": "AUTO MULTI",
"AUTO MULTI BALANCED": "AUTO MULTI BALANCED",
"Press Cylinder Controls": "Press Cylinder Controls",
"PV": "PV",
"Mode": "Mode",
"SP:": "SP:",
"Interlocked": "Interlocked",
"Low": "Low",
"Mid": "Mid",
"Max": "Max",
"Press Cylinder": "Press Cylinder",
"Dashboard": "Dashboard",
"Signals": "Signals",
"Profiles": "Profiles",
"Playground": "Playground",
"Advanced": "Advanced",
"This is where you'll design and configure your HMI layouts.": "This is where you'll design and configure your HMI layouts.",
"Widget editor and drag-and-drop functionality coming soon...": "Widget editor and drag-and-drop functionality coming soon...",
"HMI Edit Mode Active": "HMI Edit Mode Active",
"Drag and resize widgets": "Drag and resize widgets",
"Edit": "Edit",
"View": "View",
"Add Widget": "Add Widget",
"Clear All": "Clear All",
"No widgets yet": "No widgets yet",
"Click \"Add Widget\" to start building your HMI": "Click \"Add Widget\" to start building your HMI",
"Empty Canvas": "Empty Canvas",
"Switch to edit mode to add widgets": "Switch to edit mode to add widgets",
"Edit mode: Add, move, and configure widgets": "Edit mode: Add, move, and configure widgets",
"View mode: Interact with your widgets": "View mode: Interact with your widgets",
"Widgets": "Widgets",
"Last updated": "Last updated",
"No widgets found": "No widgets found",
"Import": "Import",
"Export": "Export",
"Add Container": "Add Container",
"Edit mode: Configure containers and add widgets": "Edit mode: Configure containers and add widgets",
"Containers": "Containers",
"No containers yet": "No containers yet",
"Click \"Add Container\" to start building your layout": "Click \"Add Container\" to start building your layout",
"Empty Layout": "Empty Layout",
"Switch to edit mode to add containers": "Switch to edit mode to add containers",
"Address Picker": "Address Picker",
"Select a register or coil address": "Select a register or coil address",
"Settings": "Settings",
"Network": "Network",
"Coils": "Coils",
"Registers": "Registers",
"Charts": "Charts",
"Logs": "Logs",
"Favorites": "Favorites",
"Connect to view register data.": "Connect to view register data.",
"Cancel": "Cancel",
"Reset": "Reset",
"Disconnect": "Disconnect",
"ONLINE": "ONLINE",
"No register data available. Try refreshing.": "No register data available. Try refreshing.",
"Connect to a Modbus server to see controller data.": "Connect to a Modbus server to see controller data.",
"Connected, but no register data received yet. Waiting for data...": "Connected, but no register data received yet. Waiting for data...",
"Start Profile": "Start Profile",
"IDLE": "IDLE",
"Commons": "Commons",
"Slave Mode": "Slave Mode",
"When Slave Mode is enabled, all Omron controllers will be disabled for processing.": "When Slave Mode is enabled, all Omron controllers will be disabled for processing.",
"All Stop": "All Stop",
"COM Write": "COM Write",
"Set All SP": "Set All SP",
"Total Cost": "Total Cost",
"Custom Widgets": "Custom Widgets",
"Watched Items": "Watched Items",
"DEC": "DEC",
"HEX": "HEX",
"MINLOAD": "MINLOAD",
"MAX_TIME": "MAX_TIME",
"STALLED": "STALLED",
"BALANCE": "BALANCE",
"LOADCELL": "LOADCELL",
"MULTI_TIMEOUT": "MULTI_TIMEOUT",
"NONE": "NONE",
"MANUAL_MULTI": "MANUAL_MULTI",
"AUTO_MULTI": "AUTO_MULTI",
"AUTO_MULTI_BALANCED": "AUTO_MULTI_BALANCED",
"REMOTE": "REMOTE",
"Temperature Profiles": "Temperature Profiles",
"Controller Chart": "Controller Chart",
"Global Settings": "Global Settings",
"Show PV": "Show PV",
"Show SP": "Show SP",
"Profile SP": "Profile SP",
"Window (min)": "Window (min)",
"Visible Controllers": "Visible Controllers",
"Cassandra Left": "Cassandra Left",
"Cassandra Right": "Cassandra Right",
"Clear Chart": "Clear Chart",
"Reset Zoom": "Reset Zoom",
"Export to CSV": "Export to CSV",
"Sequential Heating Control": "Sequential Heating Control",
"Sequential Heating": "Sequential Heating",
"Heating Time": "Heating Time",
"in seconds": "in seconds",
"Max Simultaneous": "Max Simultaneous",
"Window Offset": "Window Offset",
"Start Index": "Start Index",
"End Index": "End Index",
"Current Status": "Current Status",
"Unknown": "Unknown",
"Controller Partitions": "Controller Partitions",
"Carina": "Carina",
"Stopped": "Stopped",
"SP": "SP",
"Castor": "Castor",
"Cetus": "Cetus",
"Corona": "Corona",
"Coma B": "Coma B",
"Corvus": "Corvus",
"Crater": "Crater",
"Crux": "Crux",
"Copy \"{plotName}\" to...": "Copy \"{plotName}\" to...",
"Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.": "Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.",
"Select a plot to overwrite": "Select a plot to overwrite",
"Signal Plot Editor": "Signal Plot Editor",
"Download All JSON": "Download All JSON",
"Upload All JSON": "Upload All JSON",
"Signal plots configuration loaded from API.": "Signal plots configuration loaded from API.",
"Slot:": "Slot:",
"Enable control unavailable for {name}": "Enable control unavailable for {name}",
"Total:": "Total:",
"Add a set of sample control points to this plot": "Add a set of sample control points to this plot",
"Remove all control points from this plot": "Remove all control points from this plot",
"Download JSON for {name}": "Download JSON for {name}",
"Upload JSON for {name}": "Upload JSON for {name}",
"Copy this plot to another slot...": "Copy this plot to another slot...",
"Slot": "Slot",
"Duration:": "Duration:",
"Timeline:": "Timeline:",
"Play from start": "Play from start",
"Pause": "Pause",
"Stop and reset": "Stop and reset",
"Control Points": "Control Points",
"Control Points List": "Control Points List",
"Move control point up": "Move control point up",
"Move control point down": "Move control point down",
"Delete control point": "Delete control point",
"Properties:": "Properties:",
"Select a control point to see its properties.": "Select a control point to see its properties.",
"Add Samples": "Add Samples",
"Clear All CPs": "Clear All CPs",
"Download Plot": "Download Plot",
"Upload Plot": "Upload Plot",
"Copy to...": "Copy to...",
"No Operation": "No Operation",
"Write Coil": "Write Coil",
"Write Holding Register": "Write Holding Register",
"Call Method": "Call Method",
"Call Function": "Call Function",
"Call REST API": "Call REST API",
"Write GPIO": "Write GPIO",
"Display Message": "Display Message",
"User Defined": "User Defined",
"Pause Profile": "Pause Profile",
"Start PID Controllers": "Start PID Controllers",
"Stop PID Controllers": "Stop PID Controllers",
"Buzzer: Off": "Buzzer: Off",
"Buzzer: Solid On": "Buzzer: Solid On",
"Buzzer: Slow Blink": "Buzzer: Slow Blink",
"Buzzer: Fast Blink": "Buzzer: Fast Blink",
"Buzzer: Long Beep/Short Pause": "Buzzer: Long Beep/Short Pause",
"Send IFTTT Notification": "Send IFTTT Notification",
"Buzzer": "Buzzer",
"General": "General",
"Hardware I/O": "Hardware I/O",
"Integrations": "Integrations",
"Modbus": "Modbus",
"PID Control": "PID Control",
"System Calls": "System Calls",
"Addr:": "Addr:",
"Run this control point action now": "Run this control point action now",
"Select type": "Select type",
"Enter CP name": "Enter CP name",
"Enter CP description": "Enter CP description",
"ID:": "ID:",
"Run Action": "Run Action",
"Time:": "Time:",
"Scale:": "Scale:",
"State:": "State:",
"Type:": "Type:",
"CP Name (Optional):": "CP Name (Optional):",
"CP Description (Optional):": "CP Description (Optional):",
"Arguments:": "Arguments:",
"Argument 0:": "Argument 0:",
"Argument 1:": "Argument 1:",
"Argument 2 (Optional):": "Argument 2 (Optional):",
"Loading profiles from Modbus...": "Loading profiles from Modbus...",
"This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.": "This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.",
"Copy \"{profileName}\" to...": "Copy \"{profileName}\" to...",
"Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.": "Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.",
"Select a profile to overwrite": "Select a profile to overwrite",
"Help": "Help",
"Download": "Download",
"Upload": "Upload",
"Associated Controllers:": "Associated Controllers:",
"Edit Profile": "Edit Profile",
"Duplicate Profile": "Duplicate Profile",
"Copy to existing slot...": "Copy to existing slot...",
"Delete Profile": "Delete Profile",
"Enabled": "Enabled",
"Total": "Total",
"Idle": "Idle",
"Start": "Start",
"E.g., Quick Ramp Up": "E.g., Quick Ramp Up",
"Select a signal plot to associate and edit": "Select a signal plot to associate and edit",
"Slave:": "Slave:",
"SP CMD Addr:": "SP CMD Addr:",
"Profile Name": "Profile Name",
"Description": "Description",
"Duration (hh:mm:ss)": "Duration (hh:mm:ss)",
"Profile Curves": "Profile Curves",
"Temperature Control Points": "Temperature Control Points",
"Associated Signal Plot (Optional)": "Associated Signal Plot (Optional)",
"Child Profiles (Sub-plots)": "Child Profiles (Sub-plots)",
"Selected child profiles will start, stop, pause, and resume with this parent profile.": "Selected child profiles will start, stop, pause, and resume with this parent profile.",
"Target Controllers (Registers)": "Target Controllers (Registers)",
"Add all": "Add all",
"Remove all": "Remove all",
"Export": "Export",
"Markdown": "Markdown",
"Import": "Import",
"Update Profile": "Update Profile",
"None": "None",
"Signal Control Point Details": "Signal Control Point Details",
"Save Signal Plot": "Save Signal Plot",
"Loading Cassandra settings...": "Loading Cassandra settings...",
"General Settings": "General Settings",
"Master Configuration": "Master Configuration",
"Master Name": "Master Name",
"Slaves": "Slaves",
"Manage slave devices (max 1).": "Manage slave devices (max 1).",
"Add Slave": "Add Slave",
"Partitions": "Partitions",
"Import JSON": "Import JSON",
"Export JSON": "Export JSON",
"Save All Settings": "Save All Settings",
"Loading network settings...": "Loading network settings...",
"Network Settings": "Network Settings",
"Hostname": "Hostname",
"Device Hostname": "Device Hostname",
"This hostname is used for both STA and AP modes. Changes here will be saved with either form.": "This hostname is used for both STA and AP modes. Changes here will be saved with either form.",
"Station (STA) Mode": "Station (STA) Mode",
"Connects to an existing Wi-Fi network.": "Connects to an existing Wi-Fi network.",
"STA SSID": "STA SSID",
"STA Password": "STA Password",
"STA IP Address": "STA IP Address",
"STA Gateway": "STA Gateway",
"STA Subnet Mask": "STA Subnet Mask",
"STA Primary DNS": "STA Primary DNS",
"STA Secondary DNS": "STA Secondary DNS",
"Save STA Settings": "Save STA Settings",
"Access Point (AP) Mode": "Access Point (AP) Mode",
"Creates its own Wi-Fi network.": "Creates its own Wi-Fi network.",
"AP SSID": "AP SSID",
"AP Password": "AP Password",
"AP IP Address": "AP IP Address",
"AP Gateway": "AP Gateway",
"AP Subnet Mask": "AP Subnet Mask",
"Save AP Settings": "Save AP Settings",
"Enable All": "Enable All",
"Disable All": "Disable All",
"Operatorswitch": "Operatorswitch",
"Set All": "Set All",
"Presscylinder": "Presscylinder",
"MAXLOAD": "MAXLOAD",
"ERROR": "ERROR",
"OK": "OK",
"OVERLOAD": "OVERLOAD",
"BALANCE_MAX_DIFF": "BALANCE_MAX_DIFF",
"AUTO_TIMEOUT": "AUTO_TIMEOUT",
"Loadcell[25]": "Loadcell[25]",
"Loadcell[26]": "Loadcell[26]",
"Real-time Charts": "Real-time Charts",
"Real time Charting": "Real time Charting",
"X-Axis": "X-Axis",
"Refresh Rate": "Refresh Rate",
"Y-Axis Left": "Y-Axis Left",
"Min": "Min",
"Series": "Series",
"Settings...": "Settings...",
"Copy...": "Copy...",
"Show Legend": "Show Legend",
"Apply": "Apply",
"CSV": "CSV",
"Pop-out": "Pop-out",
"Save As": "Save As",
"Set as Default": "Set as Default",
"Delete": "Delete",
"Series Toggles": "Series Toggles",
"Continue": "Continue",
"Stop at end": "Stop at end",
"Restart at end": "Restart at end",
"Series settings": "Series settings",
"Configure the series to be displayed on the chart.": "Configure the series to be displayed on the chart.",
"Color": "Color",
"Offset": "Offset",
"Scale": "Scale",
"Title (Optional)": "Title (Optional)",
"Source": "Source",
"File name": "File name",
"Search...": "Search...",
"No source found.": "No source found.",
"Select source...": "Select source...",
"Favorite Registers": "Favorite Registers",
"Favorite Coils": "Favorite Coils",
"e.g., Start Heating": "e.g., Start Heating",
"e.g., Turn on coil for pre-heating stage": "e.g., Turn on coil for pre-heating stage",
"Select Known Coil...": "Select Known Coil...",
"Create New Control Point": "Create New Control Point",
"Configure the new control point. Press Enter to confirm or Esc to cancel.": "Configure the new control point. Press Enter to confirm or Esc to cancel.",
"Coil to Write:": "Coil to Write:",
"Value:": "Value:",
"ON": "ON",
"Create Control Point": "Create Control Point",
"Phapp": "Phapp",
"Aux": "Aux",
"Joystick": "Joystick",
"Samplesignalplot 0": "Samplesignalplot 0",
"Shortplot 70s": "Shortplot 70s",
"Signalplot 922 Slot 2": "Signalplot 922 Slot 2",
"Signalplot 923 Slot 3": "Signalplot 923 Slot 3",
"Delta Vfd[15]": "Delta Vfd[15]",
"none": "none",
"OC": "OC",
"OV": "OV",
"OL": "OL",
"CE": "CE",
"stop": "stop",
"run": "run",
"accel": "accel",
"decel": "decel",
"err": "err",
"fwd": "fwd",
"rev": "rev",
"reset": "reset",
"info": "info",
"setup": "setup",
"reset_fault": "reset_fault",
"Plunger": "Plunger",
"HomingMan": "HomingMan",
"HomingAuto": "HomingAuto",
"PlungingMan": "PlungingMan",
"PlungingAuto": "PlungingAuto",
"Stopping": "Stopping",
"Jammed": "Jammed",
"ResettingJam": "ResettingJam",
"Record": "Record",
"Replay": "Replay",
"Filling": "Filling",
"PostFlow": "PostFlow",
"Home": "Home",
"Plunge": "Plunge",
"Info": "Info",
"Fill": "Fill",
"No coils data available. Try refreshing.": "No coils data available. Try refreshing."
}

View File

@ -0,0 +1,350 @@
{
"Download English Translations": "Descargar traducciones al inglés",
"Connect": "Conectar",
"PolyMech - Cassandra": "PolyMech - Cassandra",
"OFFLINE": "FUERA DE LÍNEA",
"System Information": "Información del sistema",
"API URL": "URL API",
"System Messages": "Mensajes del sistema",
"Clear": "Claro",
"No enabled profile": "Perfil no habilitado",
"Stop Profile": "Detener Perfil",
"N/A": "N/A",
"Press": "Pulse",
"Stop": "Stop",
"MANUAL": "MANUAL",
"AUTO": "AUTO",
"MANUAL MULTI": "MANUAL MULTI",
"AUTO MULTI": "AUTO MULTI",
"AUTO MULTI BALANCED": "AUTO MULTI BALANCED",
"Press Cylinder Controls": "Controles del cilindro de prensado",
"PV": "FV",
"Mode": "Modo",
"SP:": "SP:",
"Interlocked": "Entrelazados",
"Low": "Bajo",
"Mid": "Medio",
"Max": "Max",
"Press Cylinder": "Cilindro de prensa",
"Dashboard": "Cuadro de mandos",
"Signals": "Señales",
"Profiles": "Perfiles",
"Advanced": "Avanzado",
"Settings": "Ajustes",
"Network": "Red",
"Coils": "Bobinas",
"Registers": "Registros",
"Charts": "Gráficos",
"Logs": "Registros",
"Favorites": "Favoritos",
"Connect to view register data.": "Conéctate para ver los datos del registro.",
"Cancel": "Cancelar",
"Reset": "Restablecer",
"Disconnect": "Desconecte",
"ONLINE": "EN LÍNEA",
"No register data available. Try refreshing.": "No hay datos de registro disponibles. Prueba a actualizar.",
"Connect to a Modbus server to see controller data.": "Conectarse a un servidor Modbus para ver los datos del controlador.",
"Connected, but no register data received yet. Waiting for data...": "Conectado, pero aún no se han recibido datos de registro. Esperando datos...",
"Start Profile": "Iniciar perfil",
"IDLE": "IDLE",
"Commons": "Comunes",
"Slave Mode": "Modo esclavo",
"When Slave Mode is enabled, all Omron controllers will be disabled for processing.": "Cuando se activa el modo esclavo, todos los controladores Omron se desactivarán para el procesamiento.",
"All Stop": "Todos Stop",
"COM Write": "COM Escribir",
"Set All SP": "Fijar todo SP",
"Total Cost": "Coste total",
"Custom Widgets": "Widgets personalizados",
"Watched Items": "Artículos vigilados",
"DEC": "DEC",
"HEX": "HEX",
"MINLOAD": "CARGA MÍNIMA",
"MAX_TIME": "TIEMPO_MAX",
"STALLED": "BLOQUEADO",
"BALANCE": "BALANCE",
"LOADCELL": "CELDA DE CARGA",
"MULTI_TIMEOUT": "MULTI_TIMEOUT",
"NONE": "NONE",
"MANUAL_MULTI": "MANUAL_MULTI",
"AUTO_MULTI": "AUTO_MULTI",
"AUTO_MULTI_BALANCED": "AUTO_MULTI_BALANCED",
"REMOTE": "REMOTO",
"Temperature Profiles": "Perfiles de temperatura",
"Controller Chart": "Gráfico de controladores",
"Global Settings": "Ajustes globales",
"Show PV": "Mostrar PV",
"Show SP": "Mostrar SP",
"Profile SP": "Perfil SP",
"Window (min)": "Ventana (min)",
"Visible Controllers": "Controladores visibles",
"Cassandra Left": "Cassandra Izquierda",
"Cassandra Right": "Cassandra Derecha",
"Clear Chart": "Gráfico claro",
"Reset Zoom": "Restablecer zoom",
"Export to CSV": "Exportar a CSV",
"Sequential Heating Control": "Control de calefacción secuencial",
"Sequential Heating": "Calentamiento secuencial",
"Heating Time": "Tiempo de calentamiento",
"in seconds": "en segundos",
"Max Simultaneous": "Máximo simultáneo",
"Window Offset": "Desplazamiento de la ventana",
"Start Index": "Inicio Índice",
"End Index": "Índice final",
"Current Status": "Situación actual",
"Unknown": "Desconocido",
"Controller Partitions": "Particiones del controlador",
"Carina": "Carina",
"Stopped": "Detenido",
"SP": "SP",
"Castor": "Ricino",
"Cetus": "Cetus",
"Corona": "Corona",
"Coma B": "Coma B",
"Corvus": "Corvus",
"Crater": "Cráter",
"Crux": "Crux",
"Copy \"{plotName}\" to...": "Copiar \"{plotName}\" a...",
"Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.": "Seleccione una parcela de destino. El contenido de \"{plotName}\" sobrescribirá la parcela seleccionada. Esta acción no puede deshacerse.",
"Select a plot to overwrite": "Seleccione una parcela para sobrescribir",
"Signal Plot Editor": "Editor de trazados de señales",
"Download All JSON": "Descargar todo JSON",
"Upload All JSON": "Cargar todo el JSON",
"Signal plots configuration loaded from API.": "Configuración de trazados de señales cargada desde la API.",
"Slot:": "Ranura:",
"Enable control unavailable for {name}": "Habilitar control no disponible para {nombre}",
"Total:": "Total:",
"Add a set of sample control points to this plot": "Añadir un conjunto de puntos de control de muestra a este gráfico",
"Remove all control points from this plot": "Eliminar todos los puntos de control de este gráfico",
"Download JSON for {name}": "Descargar JSON para {nombre}",
"Upload JSON for {name}": "Subir JSON para {nombre}",
"Copy this plot to another slot...": "Copiar esta parcela a otra ranura...",
"Slot": "Ranura",
"Duration:": "Duración:",
"Timeline:": "Calendario:",
"Play from start": "Jugar desde el principio",
"Pause": "Pausa",
"Stop and reset": "Parar y reiniciar",
"Control Points": "Puntos de control",
"Control Points List": "Lista de puntos de control",
"Move control point up": "Mover el punto de control hacia arriba",
"Move control point down": "Mover el punto de control hacia abajo",
"Delete control point": "Borrar punto de control",
"Properties:": "Propiedades:",
"Select a control point to see its properties.": "Seleccione un punto de control para ver sus propiedades.",
"Add Samples": "Añadir muestras",
"Clear All CPs": "Borrar todos los CP",
"Download Plot": "Descargar parcela",
"Upload Plot": "Cargar parcela",
"Copy to...": "Copiar a...",
"No Operation": "Ninguna operación",
"Write Coil": "Bobina de escritura",
"Write Holding Register": "Registro de retención de escritura",
"Call Method": "Método de llamada",
"Call Function": "Función de llamada",
"Call REST API": "Llamar a la API REST",
"Write GPIO": "Escribir GPIO",
"Display Message": "Mostrar mensaje",
"User Defined": "Definido por el usuario",
"Pause Profile": "Pausa Perfil",
"Start PID Controllers": "Iniciar controladores PID",
"Stop PID Controllers": "Detener reguladores PID",
"Buzzer: Off": "Timbre: Apagado",
"Buzzer: Solid On": "Timbre: Encendido",
"Buzzer: Slow Blink": "Zumbador: Parpadeo lento",
"Buzzer: Fast Blink": "Zumbador: Parpadeo rápido",
"Buzzer: Long Beep/Short Pause": "Zumbador: Pitido largo/Pausa corta",
"Send IFTTT Notification": "Enviar notificación IFTTT",
"Buzzer": "Zumbador",
"General": "General",
"Hardware I/O": "E/S de hardware",
"Integrations": "Integraciones",
"Modbus": "Modbus",
"PID Control": "Control PID",
"System Calls": "Llamadas al sistema",
"Addr:": "Dirección",
"Run this control point action now": "Ejecute ahora esta acción de punto de control",
"Select type": "Seleccione el tipo",
"Enter CP name": "Introduzca el nombre del PC",
"Enter CP description": "Introduzca la descripción del CP",
"ID:": "ID:",
"Run Action": "Ejecutar acción",
"Time:": "Hora:",
"Scale:": "Escala:",
"State:": "Estado:",
"Type:": "Tipo:",
"CP Name (Optional):": "Nombre del CP (opcional):",
"CP Description (Optional):": "Descripción del CP (opcional):",
"Arguments:": "Argumentos:",
"Argument 0:": "Argumento 0:",
"Argument 1:": "Argumento 1:",
"Argument 2 (Optional):": "Argumento 2 (opcional):",
"Loading profiles from Modbus...": "Cargando perfiles de Modbus...",
"This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.": "Esto borrará permanentemente el perfil \"{profileName}\" del servidor. Esta acción no se puede deshacer.",
"Copy \"{profileName}\" to...": "Copiar \"{nombredeperfil}\" a...",
"Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.": "Seleccione un perfil de destino. El contenido de \"{nombredelperfil}\" sobrescribirá el perfil seleccionado. Esta acción no se puede deshacer.",
"Select a profile to overwrite": "Seleccione un perfil para sobrescribir",
"Help": "Ayuda",
"Download": "Descargar",
"Upload": "Cargar",
"Associated Controllers:": "Controladores asociados:",
"Edit Profile": "Editar perfil",
"Duplicate Profile": "Duplicar perfil",
"Copy to existing slot...": "Copiar en ranura existente...",
"Delete Profile": "Borrar perfil",
"Enabled": "Activado",
"Total": "Total",
"Idle": "Ralentí",
"Start": "Inicio",
"E.g., Quick Ramp Up": "Por ejemplo, Quick Ramp Up",
"Select a signal plot to associate and edit": "Seleccione un trazado de señal para asociar y editar",
"Slave:": "Esclavo:",
"SP CMD Addr:": "SP CMD Addr:",
"Profile Name": "Nombre del perfil",
"Description": "Descripción",
"Duration (hh:mm:ss)": "Duración (hh:mm:ss)",
"Profile Curves": "Curvas de perfil",
"Temperature Control Points": "Puntos de control de temperatura",
"Associated Signal Plot (Optional)": "Gráfico de señales asociadas (opcional)",
"Child Profiles (Sub-plots)": "Perfiles de los niños (subtramas)",
"Selected child profiles will start, stop, pause, and resume with this parent profile.": "Los perfiles hijos seleccionados se iniciarán, detendrán, pausarán y reanudarán con este perfil padre.",
"Target Controllers (Registers)": "Controladores de destino (registros)",
"Add all": "Añadir todo",
"Remove all": "Eliminar todo",
"Export": "Exportar",
"Markdown": "Markdown",
"Import": "Importar",
"Update Profile": "Actualizar perfil",
"None": "Ninguno",
"Signal Control Point Details": "Detalles del punto de control de señales",
"Save Signal Plot": "Guardar trazado de señal",
"Loading Cassandra settings...": "Cargando configuración de Cassandra...",
"General Settings": "Configuración general",
"Master Configuration": "Configuración maestra",
"Master Name": "Nombre principal",
"Slaves": "Esclavos",
"Manage slave devices (max 1).": "Gestionar dispositivos esclavos (máx. 1).",
"Add Slave": "Añadir esclavo",
"Partitions": "Particiones",
"Import JSON": "Importar JSON",
"Export JSON": "Exportar JSON",
"Save All Settings": "Guardar todos los ajustes",
"Loading network settings...": "Cargando configuración de red...",
"Network Settings": "Ajustes de red",
"Hostname": "Nombre de host",
"Device Hostname": "Nombre de host del dispositivo",
"This hostname is used for both STA and AP modes. Changes here will be saved with either form.": "Este nombre de host se utiliza tanto para los modos STA como AP. Los cambios aquí se guardarán con cualquiera de los dos modos.",
"Station (STA) Mode": "Modo Estación (STA)",
"Connects to an existing Wi-Fi network.": "Se conecta a una red Wi-Fi existente.",
"STA SSID": "STA SSID",
"STA Password": "Contraseña STA",
"STA IP Address": "Dirección IP STA",
"STA Gateway": "Pasarela STA",
"STA Subnet Mask": "Máscara de subred STA",
"STA Primary DNS": "STA DNS primario",
"STA Secondary DNS": "STA DNS secundario",
"Save STA Settings": "Guardar ajustes STA",
"Access Point (AP) Mode": "Modo de punto de acceso (AP)",
"Creates its own Wi-Fi network.": "Crea su propia red Wi-Fi.",
"AP SSID": "AP SSID",
"AP Password": "Contraseña AP",
"AP IP Address": "Dirección IP AP",
"AP Gateway": "Pasarela AP",
"AP Subnet Mask": "Máscara de subred AP",
"Save AP Settings": "Guardar configuración AP",
"Enable All": "Activar todo",
"Disable All": "Desactivar todo",
"Operatorswitch": "Interruptor de operador",
"Set All": "Fijar todo",
"Presscylinder": "Cilindro a presión",
"MAXLOAD": "MAXLOAD",
"ERROR": "ERROR",
"OK": "OK",
"OVERLOAD": "SOBRECARGA",
"BALANCE_MAX_DIFF": "BALANCE_MAX_DIFF",
"AUTO_TIMEOUT": "AUTO_TIMEOUT",
"Loadcell[25]": "Célula de carga[25]",
"Loadcell[26]": "Célula de carga[26]",
"Real-time Charts": "Gráficos en tiempo real",
"Real time Charting": "Gráficos en tiempo real",
"X-Axis": "Eje X",
"Refresh Rate": "Frecuencia de actualización",
"Y-Axis Left": "Eje Y Izquierda",
"Min": "Min",
"Series": "Serie",
"Settings...": "Ajustes...",
"Copy...": "Copia...",
"Show Legend": "Mostrar leyenda",
"Apply": "Solicitar",
"CSV": "CSV",
"Pop-out": "Desplegable",
"Save As": "Guardar como",
"Set as Default": "Fijar por defecto",
"Delete": "Borrar",
"Series Toggles": "Interruptores de serie",
"Continue": "Continúe en",
"Stop at end": "Parada al final",
"Restart at end": "Reinicio al final",
"Series settings": "Ajustes de la serie",
"Configure the series to be displayed on the chart.": "Configure las series que se mostrarán en el gráfico.",
"Color": "Color",
"Offset": "Desplazamiento",
"Scale": "Escala",
"Title (Optional)": "Título (opcional)",
"Source": "Fuente",
"File name": "Nombre del fichero",
"Search...": "Buscar...",
"No source found.": "No se ha encontrado ninguna fuente.",
"Select source...": "Seleccionar fuente...",
"Favorite Registers": "Registros favoritos",
"Favorite Coils": "Bobinas favoritas",
"e.g., Start Heating": "p. ej., Iniciar calefacción",
"e.g., Turn on coil for pre-heating stage": "p. ej., encender la bobina para la fase de precalentamiento",
"Select Known Coil...": "Seleccionar bobina conocida...",
"Create New Control Point": "Crear nuevo punto de control",
"Configure the new control point. Press Enter to confirm or Esc to cancel.": "Configure el nuevo punto de control. Pulse Intro para confirmar o Esc para cancelar.",
"Coil to Write:": "Bobina para escribir:",
"Value:": "Valor:",
"ON": "EN",
"Create Control Point": "Crear punto de control",
"Phapp": "Phapp",
"Aux": "Aux",
"Joystick": "Joystick",
"Samplesignalplot 0": "Gráfico de señal de muestreo 0",
"Shortplot 70s": "Trama corta 70s",
"Signalplot 922 Slot 2": "Signalplot 922 Ranura 2",
"Signalplot 923 Slot 3": "Signalplot 923 Ranura 3",
"Delta Vfd[15]": "Delta Vfd[15]",
"none": "ninguno",
"OC": "OC",
"OV": "OV",
"OL": "OL",
"CE": "CE",
"stop": "stop",
"run": "ejecute",
"accel": "accel",
"decel": "decel",
"err": "err",
"fwd": "fwd",
"rev": "rev",
"reset": "reiniciar",
"info": "información",
"setup": "configuración",
"reset_fault": "reset_fault",
"Plunger": "Émbolo",
"HomingMan": "HomingMan",
"HomingAuto": "HomingAuto",
"PlungingMan": "PlungingMan",
"PlungingAuto": "PlungingAuto",
"Stopping": "Detener",
"Jammed": "Atascado",
"ResettingJam": "ReiniciarJam",
"Record": "Registro",
"Replay": "Reproducir",
"Filling": "Relleno",
"PostFlow": "PostFlow",
"Home": "Inicio",
"Plunge": "Sumérgete",
"Info": "Información",
"Fill": "Rellene",
"No coils data available. Try refreshing.": "No hay datos de bobinas disponibles. Prueba a actualizar."
}

View File

@ -0,0 +1,350 @@
{
"Download English Translations": "Télécharger les traductions anglaises",
"Connect": "Connecter",
"PolyMech - Cassandra": "PolyMech - Cassandra",
"OFFLINE": "HORS LIGNE",
"System Information": "Informations sur le système",
"API URL": "URL DE L'API",
"System Messages": "Messages du système",
"Clear": "Clair",
"No enabled profile": "Pas de profil activé",
"Stop Profile": "Profil d'arrêt",
"N/A": "N/A",
"Press": "Presse",
"Stop": "Arrêter",
"MANUAL": "MANUEL",
"AUTO": "AUTO",
"MANUAL MULTI": "MANUEL MULTI",
"AUTO MULTI": "AUTO MULTI",
"AUTO MULTI BALANCED": "AUTO MULTI BALANCED",
"Press Cylinder Controls": "Contrôle des cylindres de presse",
"PV": "PV",
"Mode": "Mode",
"SP:": "SP :",
"Interlocked": "Enchevêtrés",
"Low": "Faible",
"Mid": "Moyen",
"Max": "Max",
"Press Cylinder": "Cylindre de presse",
"Dashboard": "Tableau de bord",
"Signals": "Signaux",
"Profiles": "Profils",
"Advanced": "Avancé",
"Settings": "Paramètres",
"Network": "Réseau",
"Coils": "Bobines",
"Registers": "Registres",
"Charts": "Graphiques",
"Logs": "Journaux",
"Favorites": "Favoris",
"Connect to view register data.": "Se connecter pour visualiser les données du registre.",
"Cancel": "Annuler",
"Reset": "Remise à zéro",
"Disconnect": "Déconnexion",
"ONLINE": "EN LIGNE",
"No register data available. Try refreshing.": "Aucune donnée de registre disponible. Essayer de rafraîchir.",
"Connect to a Modbus server to see controller data.": "Se connecter à un serveur Modbus pour consulter les données du contrôleur.",
"Connected, but no register data received yet. Waiting for data...": "Connecté, mais aucune donnée de registre n'a encore été reçue. En attente de données...",
"Start Profile": "Démarrer le profil",
"IDLE": "IDLE",
"Commons": "Communes",
"Slave Mode": "Mode esclave",
"When Slave Mode is enabled, all Omron controllers will be disabled for processing.": "Lorsque le mode esclave est activé, tous les contrôleurs Omron sont désactivés pour le traitement.",
"All Stop": "Tous les arrêts",
"COM Write": "COM Écriture",
"Set All SP": "Set All SP",
"Total Cost": "Coût total",
"Custom Widgets": "Widgets personnalisés",
"Watched Items": "Articles surveillés",
"DEC": "DEC",
"HEX": "HEX",
"MINLOAD": "CHARGE MIN",
"MAX_TIME": "MAX_TIME",
"STALLED": "STALLED",
"BALANCE": "ÉQUILIBRE",
"LOADCELL": "LOADCELL",
"MULTI_TIMEOUT": "MULTI_TIMEOUT",
"NONE": "AUCUN",
"MANUAL_MULTI": "MANUEL_MULTI",
"AUTO_MULTI": "AUTO_MULTI",
"AUTO_MULTI_BALANCED": "AUTO_MULTI_BALANCED",
"REMOTE": "REMOTE",
"Temperature Profiles": "Profils de température",
"Controller Chart": "Tableau des contrôleurs",
"Global Settings": "Paramètres globaux",
"Show PV": "Afficher le PV",
"Show SP": "Spectacle SP",
"Profile SP": "Profil SP",
"Window (min)": "Fenêtre (min)",
"Visible Controllers": "Contrôleurs visibles",
"Cassandra Left": "Cassandra Left",
"Cassandra Right": "Cassandra Right",
"Clear Chart": "Graphique clair",
"Reset Zoom": "Réinitialiser le zoom",
"Export to CSV": "Exporter vers CSV",
"Sequential Heating Control": "Contrôle séquentiel du chauffage",
"Sequential Heating": "Chauffage séquentiel",
"Heating Time": "Temps de chauffage",
"in seconds": "en secondes",
"Max Simultaneous": "Maximale simultanée",
"Window Offset": "Décalage de la fenêtre",
"Start Index": "Index de départ",
"End Index": "Index de fin",
"Current Status": "Statut actuel",
"Unknown": "Inconnu",
"Controller Partitions": "Partitions du contrôleur",
"Carina": "Carina",
"Stopped": "Arrêtée",
"SP": "SP",
"Castor": "Castor",
"Cetus": "Cetus",
"Corona": "Corona",
"Coma B": "Coma B",
"Corvus": "Corvus",
"Crater": "Cratère",
"Crux": "Crux",
"Copy \"{plotName}\" to...": "Copier \"{nom du graphe}\" dans...",
"Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.": "Sélectionnez une parcelle de destination. Le contenu de \"{nom du graphe}\" remplacera le graphe sélectionné. Cette action ne peut être annulée.",
"Select a plot to overwrite": "Sélectionner une parcelle à écraser",
"Signal Plot Editor": "Éditeur de tracés de signaux",
"Download All JSON": "Télécharger tous les JSON",
"Upload All JSON": "Télécharger tous les JSON",
"Signal plots configuration loaded from API.": "Configuration des tracés de signaux chargée à partir de l'API.",
"Slot:": "Crémaillère :",
"Enable control unavailable for {name}": "Activer le contrôle indisponible pour {nom}",
"Total:": "Total :",
"Add a set of sample control points to this plot": "Ajouter un ensemble de points de contrôle de l'échantillon à ce tracé",
"Remove all control points from this plot": "Supprimer tous les points de contrôle de ce tracé",
"Download JSON for {name}": "Télécharger le JSON pour {nom}",
"Upload JSON for {name}": "Télécharger le JSON pour {nom}",
"Copy this plot to another slot...": "Copier cette parcelle dans un autre emplacement...",
"Slot": "Fente",
"Duration:": "Durée de l'enquête :",
"Timeline:": "Calendrier :",
"Play from start": "Jouer depuis le début",
"Pause": "Pause",
"Stop and reset": "Arrêt et réinitialisation",
"Control Points": "Points de contrôle",
"Control Points List": "Liste des points de contrôle",
"Move control point up": "Déplacer le point de contrôle vers le haut",
"Move control point down": "Déplacer le point de contrôle vers le bas",
"Delete control point": "Supprimer le point de contrôle",
"Properties:": "Propriétés :",
"Select a control point to see its properties.": "Sélectionnez un point de contrôle pour afficher ses propriétés.",
"Add Samples": "Ajouter des échantillons",
"Clear All CPs": "Effacer tous les CP",
"Download Plot": "Télécharger la parcelle",
"Upload Plot": "Télécharger le tracé",
"Copy to...": "Copier sur...",
"No Operation": "Pas d'opération",
"Write Coil": "Bobine d'écriture",
"Write Holding Register": "Écriture du registre de maintien",
"Call Method": "Méthode d'appel",
"Call Function": "Appeler la fonction",
"Call REST API": "Appeler l'API REST",
"Write GPIO": "Écriture GPIO",
"Display Message": "Message d'affichage",
"User Defined": "Défini par l'utilisateur",
"Pause Profile": "Pause Profil",
"Start PID Controllers": "Démarrer les contrôleurs PID",
"Stop PID Controllers": "Arrêter les contrôleurs PID",
"Buzzer: Off": "Buzzer : Désactivé",
"Buzzer: Solid On": "Buzzer : Allumé en permanence",
"Buzzer: Slow Blink": "Buzzer : Clignotement lent",
"Buzzer: Fast Blink": "Buzzer : Clignotement rapide",
"Buzzer: Long Beep/Short Pause": "Buzzer : Bip long/Pause courte",
"Send IFTTT Notification": "Envoyer une notification IFTTT",
"Buzzer": "Buzzer",
"General": "Général",
"Hardware I/O": "E/S matérielles",
"Integrations": "Intégrations",
"Modbus": "Modbus",
"PID Control": "Contrôle PID",
"System Calls": "Appels du système",
"Addr:": "Addr :",
"Run this control point action now": "Exécuter cette action de point de contrôle maintenant",
"Select type": "Sélectionner le type",
"Enter CP name": "Saisir le nom du CP",
"Enter CP description": "Saisir la description de la PC",
"ID:": "ID :",
"Run Action": "Exécuter l'action",
"Time:": "Le temps :",
"Scale:": "Échelle :",
"State:": "État :",
"Type:": "Type :",
"CP Name (Optional):": "Nom du CP (facultatif) :",
"CP Description (Optional):": "CP Description (facultatif) :",
"Arguments:": "Arguments :",
"Argument 0:": "Argument 0 :",
"Argument 1:": "Argument 1 :",
"Argument 2 (Optional):": "Argument 2 (facultatif) :",
"Loading profiles from Modbus...": "Chargement des profils de Modbus...",
"This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.": "Cette action efface définitivement le profil \"{nomduprofil}\" du serveur. Cette action ne peut pas être annulée.",
"Copy \"{profileName}\" to...": "Copier \"{nomduprofil}\" dans...",
"Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.": "Sélectionnez un profil de destination. Le contenu de \"{nomduprofil}\" remplacera le profil sélectionné. Cette action ne peut être annulée.",
"Select a profile to overwrite": "Sélectionner un profil à écraser",
"Help": "Aide",
"Download": "Télécharger",
"Upload": "Télécharger",
"Associated Controllers:": "Contrôleurs associés :",
"Edit Profile": "Modifier le profil",
"Duplicate Profile": "Profil en double",
"Copy to existing slot...": "Copier dans un emplacement existant...",
"Delete Profile": "Supprimer le profil",
"Enabled": "Activé",
"Total": "Total",
"Idle": "Au repos",
"Start": "Démarrage",
"E.g., Quick Ramp Up": "Par exemple, une montée en puissance rapide",
"Select a signal plot to associate and edit": "Sélectionner un tracé de signal à associer et à éditer",
"Slave:": "Esclave :",
"SP CMD Addr:": "SP CMD Addr :",
"Profile Name": "Nom du profil",
"Description": "Description",
"Duration (hh:mm:ss)": "Durée (hh:mm:ss)",
"Profile Curves": "Courbes de profil",
"Temperature Control Points": "Points de contrôle de la température",
"Associated Signal Plot (Optional)": "Tracé du signal associé (optionnel)",
"Child Profiles (Sub-plots)": "Profils d'enfants (sous-intrigues)",
"Selected child profiles will start, stop, pause, and resume with this parent profile.": "Les profils enfants sélectionnés démarrent, s'arrêtent, se mettent en pause et reprennent avec ce profil parent.",
"Target Controllers (Registers)": "Contrôleurs cibles (registres)",
"Add all": "Ajouter tout",
"Remove all": "Supprimer tout",
"Export": "Exportation",
"Markdown": "Markdown",
"Import": "Importation",
"Update Profile": "Mise à jour du profil",
"None": "Aucun",
"Signal Control Point Details": "Détails des points de contrôle des signaux",
"Save Signal Plot": "Sauvegarder le tracé du signal",
"Loading Cassandra settings...": "Chargement des paramètres de Cassandra...",
"General Settings": "Paramètres généraux",
"Master Configuration": "Configuration principale",
"Master Name": "Nom du maître",
"Slaves": "Esclaves",
"Manage slave devices (max 1).": "Gérer les dispositifs esclaves (1 au maximum).",
"Add Slave": "Ajouter un esclave",
"Partitions": "Cloisons",
"Import JSON": "Importer JSON",
"Export JSON": "Exporter JSON",
"Save All Settings": "Sauvegarder tous les paramètres",
"Loading network settings...": "Chargement des paramètres réseau...",
"Network Settings": "Paramètres du réseau",
"Hostname": "Nom d'hôte",
"Device Hostname": "Nom d'hôte du dispositif",
"This hostname is used for both STA and AP modes. Changes here will be saved with either form.": "Ce nom d'hôte est utilisé pour les modes STA et AP. Les modifications apportées ici seront enregistrées sous l'une ou l'autre forme.",
"Station (STA) Mode": "Mode station (STA)",
"Connects to an existing Wi-Fi network.": "Se connecte à un réseau Wi-Fi existant.",
"STA SSID": "STA SSID",
"STA Password": "Mot de passe STA",
"STA IP Address": "Adresse IP de la STA",
"STA Gateway": "Passerelle STA",
"STA Subnet Mask": "STA Masque de sous-réseau",
"STA Primary DNS": "STA DNS primaire",
"STA Secondary DNS": "STA DNS secondaire",
"Save STA Settings": "Sauvegarder les paramètres de la STA",
"Access Point (AP) Mode": "Mode point d'accès (AP)",
"Creates its own Wi-Fi network.": "Crée son propre réseau Wi-Fi.",
"AP SSID": "AP SSID",
"AP Password": "Mot de passe AP",
"AP IP Address": "Adresse IP de l'AP",
"AP Gateway": "Passerelle AP",
"AP Subnet Mask": "Masque de sous-réseau de l'AP",
"Save AP Settings": "Sauvegarder les paramètres de l'AP",
"Enable All": "Activer tout",
"Disable All": "Désactiver tout",
"Operatorswitch": "Commutateur de l'opérateur",
"Set All": "Tout régler",
"Presscylinder": "Presscylindre",
"MAXLOAD": "CHARGE MAXIMALE",
"ERROR": "ERREUR",
"OK": "OK",
"OVERLOAD": "SURCHARGE",
"BALANCE_MAX_DIFF": "BALANCE_MAX_DIFF",
"AUTO_TIMEOUT": "AUTO_TIMEOUT",
"Loadcell[25]": "Capteur de charge[25]",
"Loadcell[26]": "Capteur de charge[26]",
"Real-time Charts": "Graphiques en temps réel",
"Real time Charting": "Graphiques en temps réel",
"X-Axis": "Axe X",
"Refresh Rate": "Taux de rafraîchissement",
"Y-Axis Left": "Axe Y gauche",
"Min": "Min",
"Series": "Série",
"Settings...": "Paramètres...",
"Copy...": "Copier...",
"Show Legend": "Afficher la légende",
"Apply": "Appliquer",
"CSV": "CSV",
"Pop-out": "Pop-out",
"Save As": "Enregistrer sous",
"Set as Default": "Définir par défaut",
"Delete": "Supprimer",
"Series Toggles": "Série Toggles",
"Continue": "Continuer",
"Stop at end": "Arrêter à la fin",
"Restart at end": "Redémarrage à la fin",
"Series settings": "Paramètres de la série",
"Configure the series to be displayed on the chart.": "Configurez la série à afficher sur le graphique.",
"Color": "Couleur",
"Offset": "Décalage",
"Scale": "Échelle",
"Title (Optional)": "Titre (facultatif)",
"Source": "Source",
"File name": "Nom du fichier",
"Search...": "Recherche...",
"No source found.": "Aucune source n'a été trouvée.",
"Select source...": "Sélectionner la source...",
"Favorite Registers": "Registres préférés",
"Favorite Coils": "Bobines préférées",
"e.g., Start Heating": "par exemple, Démarrer le chauffage",
"e.g., Turn on coil for pre-heating stage": "par exemple, allumer le serpentin pour la phase de préchauffage",
"Select Known Coil...": "Sélectionner la bobine connue...",
"Create New Control Point": "Créer un nouveau point de contrôle",
"Configure the new control point. Press Enter to confirm or Esc to cancel.": "Configurez le nouveau point de contrôle. Appuyez sur Enter pour confirmer ou sur Esc pour annuler.",
"Coil to Write:": "La bobine pour écrire :",
"Value:": "Valeur :",
"ON": "ON",
"Create Control Point": "Créer un point de contrôle",
"Phapp": "Phapp",
"Aux": "Aux",
"Joystick": "Manette",
"Samplesignalplot 0": "Diagramme de signaux d'échantillonnage 0",
"Shortplot 70s": "Raccourci 70s",
"Signalplot 922 Slot 2": "Signalplot 922 Slot 2",
"Signalplot 923 Slot 3": "Signalplot 923 Slot 3",
"Delta Vfd[15]": "Delta Vfd[15]",
"none": "aucun",
"OC": "OC",
"OV": "OV",
"OL": "LO",
"CE": "CE",
"stop": "arrêter",
"run": "courir",
"accel": "accel",
"decel": "décélérer",
"err": "errer",
"fwd": "en avant",
"rev": "réviser",
"reset": "réinitialiser",
"info": "info",
"setup": "configuration",
"reset_fault": "défaut_réinitialisation",
"Plunger": "Plongeur",
"HomingMan": "HomingMan",
"HomingAuto": "HomingAuto",
"PlungingMan": "L'homme en plongée",
"PlungingAuto": "PlongeantAuto",
"Stopping": "Arrêter",
"Jammed": "Bloqué",
"ResettingJam": "Réinitialisation du blocage",
"Record": "Enregistrer",
"Replay": "Replay",
"Filling": "Remplissage",
"PostFlow": "PostFlow",
"Home": "Accueil",
"Plunge": "Plongée",
"Info": "Info",
"Fill": "Remplir",
"No coils data available. Try refreshing.": "Aucune donnée sur les bobines n'est disponible. Essayez d'actualiser."
}

View File

@ -0,0 +1,350 @@
{
"Download English Translations": "Scarica le traduzioni in inglese",
"Connect": "Collegare",
"PolyMech - Cassandra": "PolyMech - Cassandra",
"OFFLINE": "OFFLINE",
"System Information": "Informazioni sul sistema",
"API URL": "URL API",
"System Messages": "Messaggi di sistema",
"Clear": "Libero",
"No enabled profile": "Nessun profilo abilitato",
"Stop Profile": "Profilo dell'arresto",
"N/A": "N/D",
"Press": "Stampa",
"Stop": "Stop",
"MANUAL": "MANUALE",
"AUTO": "AUTO",
"MANUAL MULTI": "MULTI MANUALE",
"AUTO MULTI": "AUTO MULTI",
"AUTO MULTI BALANCED": "AUTO MULTI BILANCIATO",
"Press Cylinder Controls": "Controlli del cilindro della pressa",
"PV": "PV",
"Mode": "Modalità",
"SP:": "SP:",
"Interlocked": "Interbloccati",
"Low": "Basso",
"Mid": "Medio",
"Max": "Massimo",
"Press Cylinder": "Cilindro di stampa",
"Dashboard": "Cruscotto",
"Signals": "Segnali",
"Profiles": "Profili",
"Advanced": "Avanzato",
"Settings": "Impostazioni",
"Network": "Rete",
"Coils": "Bobine",
"Registers": "Registri",
"Charts": "Grafici",
"Logs": "Registri",
"Favorites": "Preferiti",
"Connect to view register data.": "Collegarsi per visualizzare i dati del registro.",
"Cancel": "Annullamento",
"Reset": "Reset",
"Disconnect": "Disconnessione",
"ONLINE": "ONLINE",
"No register data available. Try refreshing.": "Non ci sono dati di registro disponibili. Provare ad aggiornare.",
"Connect to a Modbus server to see controller data.": "Collegarsi a un server Modbus per visualizzare i dati del controllore.",
"Connected, but no register data received yet. Waiting for data...": "Connesso, ma non sono ancora stati ricevuti dati di registro. In attesa di dati...",
"Start Profile": "Iniziare il profilo",
"IDLE": "IDLE",
"Commons": "Comuni",
"Slave Mode": "Modalità Slave",
"When Slave Mode is enabled, all Omron controllers will be disabled for processing.": "Quando la modalità Slave è abilitata, tutti i controllori Omron saranno disabilitati per l'elaborazione.",
"All Stop": "Tutti gli stop",
"COM Write": "Scrivere COM",
"Set All SP": "Imposta tutti gli SP",
"Total Cost": "Costo totale",
"Custom Widgets": "Widget personalizzati",
"Watched Items": "Articoli osservati",
"DEC": "DEC",
"HEX": "ESADECIMALE",
"MINLOAD": "CARICO MINIMO",
"MAX_TIME": "TEMPO MASSIMO",
"STALLED": "STALLATO",
"BALANCE": "EQUILIBRIO",
"LOADCELL": "CELLA DI CARICO",
"MULTI_TIMEOUT": "MULTI_TIMEOUT",
"NONE": "NESSUNO",
"MANUAL_MULTI": "MANUALE_MULTI",
"AUTO_MULTI": "AUTO_MULTI",
"AUTO_MULTI_BALANCED": "AUTO_MULTI_BILANCIATO",
"REMOTE": "REMOTO",
"Temperature Profiles": "Profili di temperatura",
"Controller Chart": "Grafico del controllore",
"Global Settings": "Impostazioni globali",
"Show PV": "Mostra PV",
"Show SP": "Mostra SP",
"Profile SP": "Profilo SP",
"Window (min)": "Finestra (min)",
"Visible Controllers": "Controllori visibili",
"Cassandra Left": "Cassandra Sinistra",
"Cassandra Right": "Cassandra Giusto",
"Clear Chart": "Grafico chiaro",
"Reset Zoom": "Azzeramento dello zoom",
"Export to CSV": "Esportazione in CSV",
"Sequential Heating Control": "Controllo del riscaldamento sequenziale",
"Sequential Heating": "Riscaldamento sequenziale",
"Heating Time": "Tempo di riscaldamento",
"in seconds": "in secondi",
"Max Simultaneous": "Massima simultaneità",
"Window Offset": "Sfalsamento della finestra",
"Start Index": "Indice di partenza",
"End Index": "Indice finale",
"Current Status": "Stato attuale",
"Unknown": "Sconosciuto",
"Controller Partitions": "Partizioni del controllore",
"Carina": "Carina",
"Stopped": "Interrotto",
"SP": "SP",
"Castor": "Castore",
"Cetus": "Cetus",
"Corona": "Corona",
"Coma B": "Coma B",
"Corvus": "Corvus",
"Crater": "Cratere",
"Crux": "Crux",
"Copy \"{plotName}\" to...": "Copiare \"{plotName}\" in...",
"Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.": "Selezionare un plot di destinazione. Il contenuto di \"{plotName}\" sovrascriverà il plot selezionato. Questa azione non può essere annullata.",
"Select a plot to overwrite": "Selezionare una trama da sovrascrivere",
"Signal Plot Editor": "Editor di trame di segnale",
"Download All JSON": "Scarica tutti i JSON",
"Upload All JSON": "Caricare tutti i JSON",
"Signal plots configuration loaded from API.": "Configurazione delle trame di segnale caricata dall'API.",
"Slot:": "Slot:",
"Enable control unavailable for {name}": "Abilita il controllo non disponibile per {nome}",
"Total:": "Totale:",
"Add a set of sample control points to this plot": "Aggiungere una serie di punti di controllo campione a questo grafico",
"Remove all control points from this plot": "Rimuovere tutti i punti di controllo da questo grafico",
"Download JSON for {name}": "Scarica JSON per {nome}",
"Upload JSON for {name}": "Caricare JSON per {nome}",
"Copy this plot to another slot...": "Copia questa trama in un altro slot...",
"Slot": "Slot",
"Duration:": "Durata:",
"Timeline:": "Cronologia:",
"Play from start": "Giocare dall'inizio",
"Pause": "Pausa",
"Stop and reset": "Arresto e ripristino",
"Control Points": "Punti di controllo",
"Control Points List": "Elenco dei punti di controllo",
"Move control point up": "Spostare il punto di controllo verso l'alto",
"Move control point down": "Spostare il punto di controllo verso il basso",
"Delete control point": "Cancellare il punto di controllo",
"Properties:": "Proprietà:",
"Select a control point to see its properties.": "Selezionare un punto di controllo per visualizzarne le proprietà.",
"Add Samples": "Aggiungi campioni",
"Clear All CPs": "Azzeramento di tutti i PC",
"Download Plot": "Scarica la trama",
"Upload Plot": "Carica trama",
"Copy to...": "Copia a...",
"No Operation": "Nessuna operazione",
"Write Coil": "Scrivere la bobina",
"Write Holding Register": "Scrivere il registro di mantenimento",
"Call Method": "Metodo di chiamata",
"Call Function": "Funzione di chiamata",
"Call REST API": "Chiamare l'API REST",
"Write GPIO": "Scrivere GPIO",
"Display Message": "Messaggio sul display",
"User Defined": "Definito dall'utente",
"Pause Profile": "Profilo di pausa",
"Start PID Controllers": "Avvio dei controllori PID",
"Stop PID Controllers": "Arresto dei controllori PID",
"Buzzer: Off": "Cicalino: Spento",
"Buzzer: Solid On": "Cicalino: Acceso fisso",
"Buzzer: Slow Blink": "Cicalino: Lampeggio lento",
"Buzzer: Fast Blink": "Cicalino: Lampeggio veloce",
"Buzzer: Long Beep/Short Pause": "Cicalino: Segnale acustico lungo/pausa breve",
"Send IFTTT Notification": "Invia una notifica IFTTT",
"Buzzer": "Cicalino",
"General": "Generale",
"Hardware I/O": "Hardware I/O",
"Integrations": "Integrazioni",
"Modbus": "Modbus",
"PID Control": "Controllo PID",
"System Calls": "Chiamate di sistema",
"Addr:": "Indirizzo:",
"Run this control point action now": "Eseguire ora l'azione del punto di controllo",
"Select type": "Selezionare il tipo",
"Enter CP name": "Inserire il nome del PC",
"Enter CP description": "Inserire la descrizione del PC",
"ID:": "ID:",
"Run Action": "Eseguire l'azione",
"Time:": "Tempo:",
"Scale:": "Scala:",
"State:": "Stato:",
"Type:": "Tipo:",
"CP Name (Optional):": "Nome del PC (facoltativo):",
"CP Description (Optional):": "Descrizione del PC (opzionale):",
"Arguments:": "Argomenti:",
"Argument 0:": "Argomento 0:",
"Argument 1:": "Argomento 1:",
"Argument 2 (Optional):": "Argomento 2 (facoltativo):",
"Loading profiles from Modbus...": "Caricamento dei profili da Modbus...",
"This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.": "Questa operazione cancella definitivamente il profilo \"{profileName}\" dal server. Questa azione non può essere annullata.",
"Copy \"{profileName}\" to...": "Copiare \"{nomeprofilo}\" in...",
"Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.": "Selezionare un profilo di destinazione. Il contenuto di \"{profileName}\" sovrascriverà il profilo selezionato. Questa azione non può essere annullata.",
"Select a profile to overwrite": "Selezionare un profilo da sovrascrivere",
"Help": "Aiuto",
"Download": "Scaricare",
"Upload": "Caricare",
"Associated Controllers:": "Controllori associati:",
"Edit Profile": "Modifica profilo",
"Duplicate Profile": "Profilo duplicato",
"Copy to existing slot...": "Copia nello slot esistente...",
"Delete Profile": "Cancellare il profilo",
"Enabled": "Abilitato",
"Total": "Totale",
"Idle": "Inattivo",
"Start": "Inizio",
"E.g., Quick Ramp Up": "Ad esempio, accelerazione rapida",
"Select a signal plot to associate and edit": "Selezionare un grafico del segnale da associare e modificare",
"Slave:": "Schiavo:",
"SP CMD Addr:": "SP CMD Addr:",
"Profile Name": "Nome del profilo",
"Description": "Descrizione",
"Duration (hh:mm:ss)": "Durata (hh:mm:ss)",
"Profile Curves": "Curve del profilo",
"Temperature Control Points": "Punti di controllo della temperatura",
"Associated Signal Plot (Optional)": "Traccia del segnale associato (opzionale)",
"Child Profiles (Sub-plots)": "Profili dei bambini (sottotrame)",
"Selected child profiles will start, stop, pause, and resume with this parent profile.": "I profili figlio selezionati si avviano, si fermano, si mettono in pausa e riprendono con questo profilo genitore.",
"Target Controllers (Registers)": "Controllori di destinazione (registri)",
"Add all": "Aggiungi tutti",
"Remove all": "Rimuovi tutto",
"Export": "Esportazione",
"Markdown": "Markdown",
"Import": "Importazione",
"Update Profile": "Aggiornamento del profilo",
"None": "Nessuno",
"Signal Control Point Details": "Dettagli del punto di controllo del segnale",
"Save Signal Plot": "Salvare il grafico del segnale",
"Loading Cassandra settings...": "Caricamento delle impostazioni di Cassandra...",
"General Settings": "Impostazioni generali",
"Master Configuration": "Configurazione master",
"Master Name": "Nome del master",
"Slaves": "Schiavi",
"Manage slave devices (max 1).": "Gestire i dispositivi slave (max 1).",
"Add Slave": "Aggiungi Slave",
"Partitions": "Divisori",
"Import JSON": "Importazione di JSON",
"Export JSON": "Esportazione JSON",
"Save All Settings": "Salva tutte le impostazioni",
"Loading network settings...": "Caricamento delle impostazioni di rete...",
"Network Settings": "Impostazioni di rete",
"Hostname": "Nome host",
"Device Hostname": "Nome host del dispositivo",
"This hostname is used for both STA and AP modes. Changes here will be saved with either form.": "Questo hostname viene utilizzato sia per la modalità STA che per quella AP. Le modifiche apportate saranno salvate in entrambe le modalità.",
"Station (STA) Mode": "Modalità stazione (STA)",
"Connects to an existing Wi-Fi network.": "Si collega a una rete Wi-Fi esistente.",
"STA SSID": "SSID STA",
"STA Password": "Password STA",
"STA IP Address": "Indirizzo IP STA",
"STA Gateway": "Gateway STA",
"STA Subnet Mask": "Maschera di sottorete STA",
"STA Primary DNS": "STA DNS primario",
"STA Secondary DNS": "STA DNS secondario",
"Save STA Settings": "Salvare le impostazioni STA",
"Access Point (AP) Mode": "Modalità punto di accesso (AP)",
"Creates its own Wi-Fi network.": "Crea la propria rete Wi-Fi.",
"AP SSID": "SSID DELL'AP",
"AP Password": "Password AP",
"AP IP Address": "Indirizzo IP AP",
"AP Gateway": "Gateway AP",
"AP Subnet Mask": "Maschera di sottorete AP",
"Save AP Settings": "Salvare le impostazioni AP",
"Enable All": "Abilitazione di tutti",
"Disable All": "Disattivare tutti",
"Operatorswitch": "Interruttore operatore",
"Set All": "Imposta tutto",
"Presscylinder": "Cilindro a pressione",
"MAXLOAD": "CARICO MASSIMO",
"ERROR": "ERRORE",
"OK": "OK",
"OVERLOAD": "SOVRACCARICO",
"BALANCE_MAX_DIFF": "EQUILIBRIO_MAX_DIFF",
"AUTO_TIMEOUT": "AUTO_TIMEOUT",
"Loadcell[25]": "Cella di carico[25]",
"Loadcell[26]": "Cella di carico[26]",
"Real-time Charts": "Grafici in tempo reale",
"Real time Charting": "Grafici in tempo reale",
"X-Axis": "Asse X",
"Refresh Rate": "Frequenza di aggiornamento",
"Y-Axis Left": "Asse Y Sinistra",
"Min": "Min",
"Series": "Serie",
"Settings...": "Impostazioni...",
"Copy...": "Copia...",
"Show Legend": "Mostra Legenda",
"Apply": "Applicare",
"CSV": "CSV",
"Pop-out": "A scomparsa",
"Save As": "Salva con nome",
"Set as Default": "Imposta come predefinito",
"Delete": "Cancellare",
"Series Toggles": "Serie Toggles",
"Continue": "Continua",
"Stop at end": "Arresto alla fine",
"Restart at end": "Riavvio alla fine",
"Series settings": "Impostazioni della serie",
"Configure the series to be displayed on the chart.": "Configurare le serie da visualizzare nel grafico.",
"Color": "Colore",
"Offset": "Offset",
"Scale": "Scala",
"Title (Optional)": "Titolo (facoltativo)",
"Source": "Fonte",
"File name": "Nome del file",
"Search...": "Ricerca...",
"No source found.": "Nessuna fonte trovata.",
"Select source...": "Selezionare la fonte...",
"Favorite Registers": "Registri preferiti",
"Favorite Coils": "Bobine preferite",
"e.g., Start Heating": "ad esempio, Avvio del riscaldamento",
"e.g., Turn on coil for pre-heating stage": "ad esempio, accendere la bobina per la fase di preriscaldamento",
"Select Known Coil...": "Selezionare la bobina nota...",
"Create New Control Point": "Creare un nuovo punto di controllo",
"Configure the new control point. Press Enter to confirm or Esc to cancel.": "Configurare il nuovo punto di controllo. Premere Invio per confermare o Esc per annullare.",
"Coil to Write:": "Bobina da scrivere:",
"Value:": "Valore:",
"ON": "ON",
"Create Control Point": "Creare un punto di controllo",
"Phapp": "Phapp",
"Aux": "Aux",
"Joystick": "Joystick",
"Samplesignalplot 0": "Grafico del segnale dei campioni 0",
"Shortplot 70s": "Trama breve 70s",
"Signalplot 922 Slot 2": "Signalplot 922 Slot 2",
"Signalplot 923 Slot 3": "Signalplot 923 Slot 3",
"Delta Vfd[15]": "Delta Vfd[15]",
"none": "nessuno",
"OC": "OC",
"OV": "OV",
"OL": "OL",
"CE": "CE",
"stop": "fermarsi",
"run": "corsa",
"accel": "accel",
"decel": "decelerare",
"err": "sbagliare",
"fwd": "in avanti",
"rev": "rev",
"reset": "azzeramento",
"info": "info",
"setup": "impostazione",
"reset_fault": "reset_fault",
"Plunger": "Stantuffo",
"HomingMan": "HomingMan",
"HomingAuto": "HomingAuto",
"PlungingMan": "Uomo che si tuffa",
"PlungingAuto": "TuffoAuto",
"Stopping": "Arresto",
"Jammed": "Inceppato",
"ResettingJam": "Azzeramento dell'inceppamento",
"Record": "Record",
"Replay": "Riproduzione",
"Filling": "Riempimento",
"PostFlow": "PostFlow",
"Home": "Casa",
"Plunge": "Tuffo",
"Info": "Info",
"Fill": "Riempimento",
"No coils data available. Try refreshing.": "Non sono disponibili dati sulle bobine. Prova a rinfrescare."
}

View File

@ -0,0 +1,350 @@
{
"Download English Translations": "Engelse vertalingen downloaden",
"Connect": "Maak verbinding met",
"PolyMech - Cassandra": "PolyMech - Cassandra",
"OFFLINE": "OFFLINE",
"System Information": "Systeeminformatie",
"API URL": "API URL",
"System Messages": "Systeemberichten",
"Clear": "Duidelijk",
"No enabled profile": "Geen ingeschakeld profiel",
"Stop Profile": "Stop profiel",
"N/A": "N.V.T",
"Press": "Druk op",
"Stop": "Stop",
"MANUAL": "HANDMATIG",
"AUTO": "AUTO",
"MANUAL MULTI": "HANDMATIG MULTI",
"AUTO MULTI": "AUTO MULTI",
"AUTO MULTI BALANCED": "AUTO MULTI-GEBALANCEERD",
"Press Cylinder Controls": "Cilinderbediening",
"PV": "PV",
"Mode": "Modus",
"SP:": "SP:",
"Interlocked": "Vergrendeld",
"Low": "Laag",
"Mid": "Midden",
"Max": "Max",
"Press Cylinder": "Perscilinder",
"Dashboard": "Dashboard",
"Signals": "Signalen",
"Profiles": "Profielen",
"Advanced": "Geavanceerd",
"Settings": "Instellingen",
"Network": "Netwerk",
"Coils": "Spoelen",
"Registers": "Registers",
"Charts": "Grafieken",
"Logs": "Logboeken",
"Favorites": "Favorieten",
"Connect to view register data.": "Maak verbinding om registergegevens te bekijken.",
"Cancel": "Annuleren",
"Reset": "Reset",
"Disconnect": "Ontkoppelen",
"ONLINE": "ONLINE",
"No register data available. Try refreshing.": "Geen registergegevens beschikbaar. Probeer te verversen.",
"Connect to a Modbus server to see controller data.": "Maak verbinding met een Modbus-server om controllergegevens te bekijken.",
"Connected, but no register data received yet. Waiting for data...": "Verbonden, maar nog geen registergegevens ontvangen. Wachten op gegevens...",
"Start Profile": "Profiel starten",
"IDLE": "IDLE",
"Commons": "Commons",
"Slave Mode": "Slavenmodus",
"When Slave Mode is enabled, all Omron controllers will be disabled for processing.": "Als de slave-modus is ingeschakeld, worden alle Omron-controllers uitgeschakeld voor verwerking.",
"All Stop": "Alle stoppen",
"COM Write": "COM schrijven",
"Set All SP": "Alle SP instellen",
"Total Cost": "Totale kosten",
"Custom Widgets": "Aangepaste Widgets",
"Watched Items": "Bekeken items",
"DEC": "DEC",
"HEX": "HEX",
"MINLOAD": "MINLOAD",
"MAX_TIME": "MAX_TIJD",
"STALLED": "STALLED",
"BALANCE": "BALANS",
"LOADCELL": "LOADCELL",
"MULTI_TIMEOUT": "MULTI_TIMEOUT",
"NONE": "GEEN",
"MANUAL_MULTI": "HANDMATIG_MULTI",
"AUTO_MULTI": "AUTO_MULTI",
"AUTO_MULTI_BALANCED": "AUTO_MULTI_GEBALANCEERD",
"REMOTE": "AFSTAND",
"Temperature Profiles": "Temperatuurprofielen",
"Controller Chart": "Regelaar Grafiek",
"Global Settings": "Wereldwijde instellingen",
"Show PV": "Toon PV",
"Show SP": "Toon SP",
"Profile SP": "Profiel SP",
"Window (min)": "Venster (min)",
"Visible Controllers": "Zichtbare regelaars",
"Cassandra Left": "Cassandra Links",
"Cassandra Right": "Cassandra Rechts",
"Clear Chart": "Duidelijke grafiek",
"Reset Zoom": "Zoom resetten",
"Export to CSV": "Exporteren naar CSV",
"Sequential Heating Control": "Sequentiële verwarmingsregeling",
"Sequential Heating": "Sequentiële verwarming",
"Heating Time": "Opwarmtijd",
"in seconds": "in seconden",
"Max Simultaneous": "Max. gelijktijdig",
"Window Offset": "Venster offset",
"Start Index": "Index starten",
"End Index": "Einde Index",
"Current Status": "Huidige status",
"Unknown": "Onbekend",
"Controller Partitions": "Controller-partities",
"Carina": "Carina",
"Stopped": "Gestopt",
"SP": "SP",
"Castor": "Castor",
"Cetus": "Cetus",
"Corona": "Corona",
"Coma B": "Coma B",
"Corvus": "Corvus",
"Crater": "Krater",
"Crux": "Crux",
"Copy \"{plotName}\" to...": "Kopieer \"{plotnaam}\" naar...",
"Select a destination plot. The content of \"{plotName}\" will overwrite the selected plot. This action cannot be undone.": "Selecteer een bestemmingsplot. De inhoud van \"{plotnaam}\" overschrijft het geselecteerde perceel. Deze actie kan niet ongedaan worden gemaakt.",
"Select a plot to overwrite": "Selecteer een perceel om te overschrijven",
"Signal Plot Editor": "Signaalplot-editor",
"Download All JSON": "Alle JSON downloaden",
"Upload All JSON": "Alle JSON uploaden",
"Signal plots configuration loaded from API.": "Signaalplots configuratie geladen van API.",
"Slot:": "Gleuf:",
"Enable control unavailable for {name}": "Controle niet beschikbaar voor {naam} inschakelen",
"Total:": "Totaal:",
"Add a set of sample control points to this plot": "Een set controlepunten toevoegen aan deze plot",
"Remove all control points from this plot": "Alle controlepunten uit dit diagram verwijderen",
"Download JSON for {name}": "JSON downloaden voor {naam}",
"Upload JSON for {name}": "JSON uploaden voor {naam}",
"Copy this plot to another slot...": "Kopieer deze plot naar een andere sleuf...",
"Slot": "Sleuf",
"Duration:": "Duur:",
"Timeline:": "Tijdlijn:",
"Play from start": "Speel vanaf het begin",
"Pause": "Pauze",
"Stop and reset": "Stoppen en resetten",
"Control Points": "Controlepunten",
"Control Points List": "Lijst met controlepunten",
"Move control point up": "Verplaats controlepunt omhoog",
"Move control point down": "Verplaats controlepunt omlaag",
"Delete control point": "Controlepunt verwijderen",
"Properties:": "Eigenschappen:",
"Select a control point to see its properties.": "Selecteer een controlepunt om de eigenschappen ervan te bekijken.",
"Add Samples": "Monsters toevoegen",
"Clear All CPs": "Alle CP's wissen",
"Download Plot": "Download Plot",
"Upload Plot": "Upload perceel",
"Copy to...": "Kopiëren naar...",
"No Operation": "Geen bediening",
"Write Coil": "Spoel schrijven",
"Write Holding Register": "Schrijf houdregister",
"Call Method": "Bel methode",
"Call Function": "Functie oproepen",
"Call REST API": "REST API oproepen",
"Write GPIO": "GPIO schrijven",
"Display Message": "Bericht weergeven",
"User Defined": "Door gebruiker gedefinieerd",
"Pause Profile": "Profiel pauzeren",
"Start PID Controllers": "PID-regelaars starten",
"Stop PID Controllers": "PID-regelaars stoppen",
"Buzzer: Off": "Zoemer: Uit",
"Buzzer: Solid On": "Zoemer: Continu aan",
"Buzzer: Slow Blink": "Zoemer: Langzaam knipperen",
"Buzzer: Fast Blink": "Zoemer: Snel knipperen",
"Buzzer: Long Beep/Short Pause": "Zoemer: Lange piep/korte pauze",
"Send IFTTT Notification": "IFTTT-kennisgeving verzenden",
"Buzzer": "Zoemer",
"General": "Algemeen",
"Hardware I/O": "Hardware I/O",
"Integrations": "Integraties",
"Modbus": "Modbus",
"PID Control": "PID-regeling",
"System Calls": "Systeemoproepen",
"Addr:": "Adres:",
"Run this control point action now": "Voer deze controlepuntactie nu uit",
"Select type": "Selecteer type",
"Enter CP name": "Voer CP-naam in",
"Enter CP description": "CP-beschrijving invoeren",
"ID:": "ID:",
"Run Action": "Actie uitvoeren",
"Time:": "Tijd:",
"Scale:": "Schaal:",
"State:": "Staat:",
"Type:": "Type:",
"CP Name (Optional):": "CP-naam (optioneel):",
"CP Description (Optional):": "CP Beschrijving (optioneel):",
"Arguments:": "Argumenten:",
"Argument 0:": "Argument 0:",
"Argument 1:": "Argument 1:",
"Argument 2 (Optional):": "Argument 2 (optioneel):",
"Loading profiles from Modbus...": "Profielen laden van Modbus...",
"This will permanently clear the profile \"{profileName}\" from the server. This action cannot be undone.": "Dit zal het profiel \"{profileName}\" permanent verwijderen van de server. Deze actie kan niet ongedaan worden gemaakt.",
"Copy \"{profileName}\" to...": "Kopieer \"{profielnaam}\" naar...",
"Select a destination profile. The content of \"{profileName}\" will overwrite the selected profile. This action cannot be undone.": "Selecteer een doelprofiel. De inhoud van \"{profileName}\" zal het geselecteerde profiel overschrijven. Deze actie kan niet ongedaan worden gemaakt.",
"Select a profile to overwrite": "Selecteer een profiel om te overschrijven",
"Help": "Help",
"Download": "Downloaden",
"Upload": "Uploaden",
"Associated Controllers:": "Bijbehorende controllers:",
"Edit Profile": "Profiel bewerken",
"Duplicate Profile": "Duplicaat profiel",
"Copy to existing slot...": "Kopiëren naar bestaande sleuf...",
"Delete Profile": "Profiel verwijderen",
"Enabled": "Ingeschakeld",
"Total": "Totaal",
"Idle": "Inactief",
"Start": "Start",
"E.g., Quick Ramp Up": "Bijvoorbeeld Quick Ramp Up",
"Select a signal plot to associate and edit": "Selecteer een signaalplot om te koppelen en te bewerken",
"Slave:": "Slaaf:",
"SP CMD Addr:": "SP CMD Addr:",
"Profile Name": "Profielnaam",
"Description": "Beschrijving",
"Duration (hh:mm:ss)": "Duur (uu:mm:ss)",
"Profile Curves": "Profielcurven",
"Temperature Control Points": "Temperatuurcontrolepunten",
"Associated Signal Plot (Optional)": "Bijbehorend signaalplot (optioneel)",
"Child Profiles (Sub-plots)": "Kindprofielen (subplots)",
"Selected child profiles will start, stop, pause, and resume with this parent profile.": "Geselecteerde kindprofielen zullen starten, stoppen, pauzeren en hervatten met dit ouderprofiel.",
"Target Controllers (Registers)": "Doelcontrollers (registers)",
"Add all": "Alles toevoegen",
"Remove all": "Alles verwijderen",
"Export": "Exporteer",
"Markdown": "Markdown",
"Import": "Importeren",
"Update Profile": "Profiel bijwerken",
"None": "Geen",
"Signal Control Point Details": "Details signaalcontrolepunt",
"Save Signal Plot": "Signaalplot opslaan",
"Loading Cassandra settings...": "Cassandra instellingen laden...",
"General Settings": "Algemene instellingen",
"Master Configuration": "Hoofdconfiguratie",
"Master Name": "Master Naam",
"Slaves": "Slaven",
"Manage slave devices (max 1).": "Slave-apparaten beheren (max 1).",
"Add Slave": "Slaaf toevoegen",
"Partitions": "Scheidingswanden",
"Import JSON": "JSON importeren",
"Export JSON": "JSON exporteren",
"Save All Settings": "Alle instellingen opslaan",
"Loading network settings...": "Netwerkinstellingen laden...",
"Network Settings": "Netwerkinstellingen",
"Hostname": "Hostnaam",
"Device Hostname": "Hostnaam apparaat",
"This hostname is used for both STA and AP modes. Changes here will be saved with either form.": "Deze hostnaam wordt gebruikt voor zowel de STA- als de AP-modus. Wijzigingen hier worden opgeslagen in beide vormen.",
"Station (STA) Mode": "Station (STA) Modus",
"Connects to an existing Wi-Fi network.": "Maakt verbinding met een bestaand Wi-Fi-netwerk.",
"STA SSID": "STA SSID",
"STA Password": "STA Wachtwoord",
"STA IP Address": "STA IP-adres",
"STA Gateway": "STA Gateway",
"STA Subnet Mask": "STA Subnetmasker",
"STA Primary DNS": "STA Primair DNS",
"STA Secondary DNS": "STA Secundair DNS",
"Save STA Settings": "STA-instellingen opslaan",
"Access Point (AP) Mode": "Modus toegangspunt (AP)",
"Creates its own Wi-Fi network.": "Maakt zijn eigen Wi-Fi-netwerk.",
"AP SSID": "AP SSID",
"AP Password": "AP wachtwoord",
"AP IP Address": "IP-adres AP",
"AP Gateway": "AP Gateway",
"AP Subnet Mask": "AP-subnetmasker",
"Save AP Settings": "AP-instellingen opslaan",
"Enable All": "Alles inschakelen",
"Disable All": "Alles uitschakelen",
"Operatorswitch": "Operatorschakelaar",
"Set All": "Alles instellen",
"Presscylinder": "Perscilinder",
"MAXLOAD": "MAXLOAD",
"ERROR": "FOUT",
"OK": "OK",
"OVERLOAD": "OVERLOAD",
"BALANCE_MAX_DIFF": "BALANS_MAX_VERSCHIL",
"AUTO_TIMEOUT": "AUTO_TIMEOUT",
"Loadcell[25]": "Loadcell[25]",
"Loadcell[26]": "Loadcell[26]",
"Real-time Charts": "Real-time grafieken",
"Real time Charting": "Real-time grafieken",
"X-Axis": "X-as",
"Refresh Rate": "Verversingssnelheid",
"Y-Axis Left": "Y-as links",
"Min": "Min",
"Series": "Serie",
"Settings...": "Instellingen...",
"Copy...": "Kopiëren...",
"Show Legend": "Legende weergeven",
"Apply": "Toepassen",
"CSV": "CSV",
"Pop-out": "Pop-up",
"Save As": "Opslaan als",
"Set as Default": "Instellen als standaard",
"Delete": "Verwijder",
"Series Toggles": "Serieschakelaars",
"Continue": "Ga verder",
"Stop at end": "Stoppen aan het einde",
"Restart at end": "Opnieuw starten aan het einde",
"Series settings": "Serie-instellingen",
"Configure the series to be displayed on the chart.": "Configureer de series die moeten worden weergegeven op de grafiek.",
"Color": "Kleur",
"Offset": "Offset",
"Scale": "Schaal",
"Title (Optional)": "Titel (optioneel)",
"Source": "Bron",
"File name": "Bestandsnaam",
"Search...": "Zoeken...",
"No source found.": "Geen bron gevonden.",
"Select source...": "Selecteer bron...",
"Favorite Registers": "Favoriete registers",
"Favorite Coils": "Favoriete spoelen",
"e.g., Start Heating": "bijv. Start Verwarming",
"e.g., Turn on coil for pre-heating stage": "bijv. Spiraal inschakelen voor voorverwarmen",
"Select Known Coil...": "Selecteer bekende spoel...",
"Create New Control Point": "Nieuw controlepunt maken",
"Configure the new control point. Press Enter to confirm or Esc to cancel.": "Configureer het nieuwe controlepunt. Druk op Enter om te bevestigen of op Esc om te annuleren.",
"Coil to Write:": "Spoel om te schrijven:",
"Value:": "Waarde:",
"ON": "OP",
"Create Control Point": "Controlepunt maken",
"Phapp": "Phapp",
"Aux": "Aux",
"Joystick": "Joystick",
"Samplesignalplot 0": "Voorbeeldsignaalplot 0",
"Shortplot 70s": "Korte Plot 70",
"Signalplot 922 Slot 2": "Signaalplot 922 sleuf 2",
"Signalplot 923 Slot 3": "Signaalplot 923 Sleuf 3",
"Delta Vfd[15]": "Delta Vfd[15]",
"none": "geen",
"OC": "OC",
"OV": "OV",
"OL": "OL",
"CE": "CE",
"stop": "stop",
"run": "uitvoeren",
"accel": "accel",
"decel": "decel",
"err": "err",
"fwd": "fwd",
"rev": "rev",
"reset": "reset",
"info": "info",
"setup": "setup",
"reset_fault": "reset_fout",
"Plunger": "Plunjer",
"HomingMan": "HomingMan",
"HomingAuto": "HomingAuto",
"PlungingMan": "DuikendMan",
"PlungingAuto": "DuikAuto",
"Stopping": "Stoppen",
"Jammed": "Vastgelopen",
"ResettingJam": "ResettenJam",
"Record": "Opnemen",
"Replay": "Replay",
"Filling": "Vullen",
"PostFlow": "PostFlow",
"Home": "Home",
"Plunge": "Duik",
"Info": "Info",
"Fill": "Vullen",
"No coils data available. Try refreshing.": "Geen spoelgegevens beschikbaar. Probeer te verversen."
}

View File

@ -0,0 +1,442 @@
import React, { useMemo } from 'react';
import { useModbus } from '@/contexts/ModbusContext';
import type { RegisterData } from '@/contexts/ModbusContext';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { T } from '../i18n';
import CassandraControllerCard from './CassandraControllerCard';
import SequentialHeatingCard from './SequentialHeatingCard';
import ControllerChart from './ControllerChart';
import { Progress } from "@/components/ui/progress";
import { PlotStatus, type Profile, TemperatureProfileCommand } from "@/types";
import { Play, Pause, StopCircle } from "lucide-react";
import { Button } from "@/components/ui/button";
import { useToast } from "@/components/ui/use-toast";
import CollapsibleSection from './CollapsibleSection';
import Commons from './Commons';
import VFDControls from './VFDControls';
import {
PV_REGISTER_NAME_SUFFIX,
SP_CMD_COMMAND_REGISTER_PREFIX,
PROFILE_REGISTER_NAMES
} from '@/constants';
import {
getSlaveIdFromGroup,
ControllerConfig,
getControllerStatus
} from '@/lib/controllerUtils';
interface ControllerDisplayData {
slaveid: number;
name: string;
pv: number | string;
sp: number | string;
isRunning: boolean;
// hasAlarm: boolean;
isAutoTuning: boolean;
hasHeaterBreak: boolean;
hasSensorBreak: boolean;
mode: 'manual' | 'auto' | 'cascade' | 'program' | 'unknown';
currentProfileName?: string | null;
isHeating: boolean;
}
interface PartitionDisplayData {
name: string;
controllers: ControllerDisplayData[];
}
const STATUS_HIGH_REGISTER_NAME = "Status High";
const STATUS_LOW_REGISTER_NAME = "Status Low";
const CassandraHMIDisplay = () => {
const {
registers: allModbusRegisters,
profiles: contextProfiles,
updateRegister,
isConnected,
settings,
featureFlags
} = useModbus();
const { toast } = useToast();
const liveUiProfiles = useMemo((): Profile[] => {
if (!contextProfiles || !allModbusRegisters) return [];
return contextProfiles.map(pService => {
let liveStatus: PlotStatus | undefined = pService.status;
let liveElapsed: number | undefined = pService.elapsed;
let liveCurrentTemp: number | undefined = pService.currentTemp;
const statusRegister = allModbusRegisters.find(
r => r.group === pService.name && r.name.startsWith(PROFILE_REGISTER_NAMES.STATUS)
);
if (statusRegister && typeof statusRegister.value === 'number' && statusRegister.value in PlotStatus) {
liveStatus = statusRegister.value as PlotStatus;
}
const currentTempRegister = allModbusRegisters.find(
r => r.group === pService.name && r.name === PROFILE_REGISTER_NAMES.CURRENT_VALUE
);
if (currentTempRegister && typeof currentTempRegister.value === 'number') {
liveCurrentTemp = currentTempRegister.value;
}
const elapsedRegister = allModbusRegisters.find(
r => r.group === pService.name && r.name === PROFILE_REGISTER_NAMES.ELAPSED
);
if (elapsedRegister && typeof elapsedRegister.value === 'number') {
liveElapsed = elapsedRegister.value * 1000; // Convert seconds to milliseconds
}
return {
...pService,
status: liveStatus,
elapsed: liveElapsed,
currentTemp: liveCurrentTemp,
};
});
}, [contextProfiles, allModbusRegisters]);
const activeUiProfiles = useMemo((): Profile[] => {
if (!liveUiProfiles) return [];
return liveUiProfiles.filter(
profile => profile.enabled || profile.status === PlotStatus.RUNNING || profile.status === PlotStatus.PAUSED || profile.status === PlotStatus.INITIALIZING
);
}, [liveUiProfiles]);
const handleHmiProfileCommand = async (profile: Profile | null, command: TemperatureProfileCommand) => {
if (!profile || !profile.name) {
toast({ title: "Command Error", description: "Invalid profile data for command (missing name).", variant: "destructive" });
return;
}
if (!isConnected) {
toast({ title: "Error", description: "Not connected to Modbus server.", variant: "destructive" });
return;
}
const commandRegisterEntry = allModbusRegisters.find(
reg => reg.group === profile.name && reg.name === PROFILE_REGISTER_NAMES.COMMAND
);
if (!commandRegisterEntry) {
toast({
title: "Command Error",
description: `Command register (Group: ${profile.name}, Name: ${PROFILE_REGISTER_NAMES.COMMAND}) not found.`,
variant: "destructive"
});
return;
}
try {
await updateRegister(commandRegisterEntry.address, command);
toast({
title: "Profile Command Sent",
description: `${TemperatureProfileCommand[command]} command sent to profile '${profile.name}'.`
});
} catch (error) {
toast({
title: "Command Failed",
description: `Failed to send command to profile '${profile.name}': ${error instanceof Error ? error.message : String(error)}`,
variant: "destructive"
});
}
};
const processedData = useMemo((): PartitionDisplayData[] => {
if (!settings) return [];
return settings.partitions.map(partition => {
let controllerConfigs: ControllerConfig[] = [];
if (partition.controllers && partition.controllers.length > 0) {
controllerConfigs = partition.controllers.filter(c => c.enabled);
} else if (partition.startslaveid !== undefined && partition.numcontrollers !== undefined) {
for (let i = 0; i < partition.numcontrollers; i++) {
controllerConfigs.push({
slaveid: partition.startslaveid + i,
name: `Controller ${partition.startslaveid + i}`,
enabled: true // Assume auto-generated are enabled
});
}
}
const controllersData: ControllerDisplayData[] = controllerConfigs.map(config => {
const pvRegister = allModbusRegisters.find((reg: RegisterData) =>
getSlaveIdFromGroup(reg.group) === config.slaveid && reg.name.endsWith(PV_REGISTER_NAME_SUFFIX)
);
const statusHighRegister = allModbusRegisters.find((reg: RegisterData) =>
getSlaveIdFromGroup(reg.group) === config.slaveid && reg.name === STATUS_HIGH_REGISTER_NAME
);
const statusLowRegister = allModbusRegisters.find((reg: RegisterData) =>
getSlaveIdFromGroup(reg.group) === config.slaveid && reg.name === STATUS_LOW_REGISTER_NAME
);
const status = getControllerStatus(statusHighRegister, statusLowRegister);
let activeProfileName: string | null = null;
const spCmdRegisterForController = allModbusRegisters.find(
reg => getSlaveIdFromGroup(reg.group) === config.slaveid &&
reg.name.startsWith(SP_CMD_COMMAND_REGISTER_PREFIX)
);
if (spCmdRegisterForController && liveUiProfiles) {
const controllerSpCmdAddress = spCmdRegisterForController.address;
for (const profile of liveUiProfiles) {
if ((profile.status === PlotStatus.RUNNING || profile.status === PlotStatus.PAUSED) &&
profile.targetRegisters &&
profile.targetRegisters.includes(controllerSpCmdAddress)) {
activeProfileName = profile.name;
break;
}
}
}
return {
slaveid: config.slaveid,
name: config.name,
pv: pvRegister ? pvRegister.value : "N/A",
sp: "N/A",
...status,
currentProfileName: activeProfileName,
isHeating: status.isHeating,
};
});
return {
name: partition.name,
controllers: controllersData,
};
});
}, [allModbusRegisters, liveUiProfiles, settings]);
if (!isConnected && (!allModbusRegisters || allModbusRegisters.length === 0)) {
return (
<div className="p-4 text-center">
<p className="text-muted-foreground"><T>Connect to a Modbus server to see controller data.</T></p>
</div>
);
}
if (allModbusRegisters.length === 0 && isConnected) {
return (
<div className="p-4 text-center">
<p className="text-muted-foreground"><T>Connected, but no register data received yet. Waiting for data...</T></p>
</div>
);
}
return (
<div className="space-y-3 md:space-y-6" id="cassandra-hmi-display">
<CollapsibleSection
title={<T>Commons</T>}
storageKey="hmi-commons-collapsible"
initiallyOpen={false}
className="glass-panel"
headerClassName="flex justify-between items-center p-3 rounded-t-lg"
contentClassName="p-3 glass-card rounded-b-lg"
titleClassName="text-lg font-semibold glass-text"
buttonClassName="text-slate-600 dark:text-white/80 hover:text-slate-800 dark:hover:text-white"
>
<Commons />
</CollapsibleSection>
{featureFlags.ENABLE_SAKO_VFD && (
<CollapsibleSection
title={<T>VFD Control</T>}
storageKey="hmi-vfd-collapsible"
className="glass-panel"
headerClassName="flex justify-between items-center p-3 rounded-t-lg"
contentClassName="p-3 glass-card rounded-b-lg"
titleClassName="text-lg font-semibold glass-text"
buttonClassName="text-slate-600 dark:text-white/80 hover:text-slate-800 dark:hover:text-white"
>
<VFDControls />
</CollapsibleSection>
)}
{activeUiProfiles.length > 0 && (
<CollapsibleSection
title={<T>Temperature Profiles</T>}
storageKey="hmi-profiles-collapsible"
className="glass-panel"
headerClassName="flex justify-between items-center p-3 rounded-t-lg"
contentClassName="p-3 glass-card rounded-b-lg"
titleClassName="text-lg font-semibold accent-text"
buttonClassName="text-slate-600 dark:text-white/80 hover:text-slate-800 dark:hover:text-white"
>
<div className="space-y-3 pt-2">
{activeUiProfiles.map(profile => (
<Card key={profile.slot} className="glass-card shadow-xl w-full">
<CardHeader className="pb-2 pt-3 flex flex-row justify-between items-center">
<CardTitle className="text-md font-semibold text-slate-700 dark:text-white">
{profile.status === PlotStatus.RUNNING ? 'Running Profile: ' :
profile.status === PlotStatus.PAUSED ? 'Paused Profile: ' :
'Profile: '}
<span className="text-indigo-600 dark:text-cyan-400 font-bold">{profile.name}</span>
<span> (Slot: {profile.slot})</span>
</CardTitle>
<div className="flex items-center space-x-2">
{profile.enabled && profile.status !== PlotStatus.RUNNING && profile.status !== PlotStatus.PAUSED && (
<Button
onClick={() => handleHmiProfileCommand(profile, TemperatureProfileCommand.START)}
title="Start Profile"
className="px-2 py-1 h-auto glass-button status-gradient-connected text-white border-0"
>
<Play className="h-4 w-4 mr-1" /> Start
</Button>
)}
{profile.status === PlotStatus.RUNNING && (
<Button
onClick={() => handleHmiProfileCommand(profile, TemperatureProfileCommand.PAUSE)}
title="Pause Profile"
className="px-2 py-1 h-auto glass-button bg-gradient-to-r from-amber-400 to-orange-500 text-white border-0"
disabled={!profile.enabled}
>
<Pause className="h-4 w-4 mr-1" /> Pause
</Button>
)}
{profile.status === PlotStatus.PAUSED && (
<Button
onClick={() => handleHmiProfileCommand(profile, TemperatureProfileCommand.RESUME)}
title="Resume Profile"
className="px-2 py-1 h-auto glass-button status-gradient-connected text-white border-0"
disabled={!profile.enabled}
>
<Play className="h-4 w-4 mr-1" /> Resume
</Button>
)}
{(profile.status === PlotStatus.RUNNING || profile.status === PlotStatus.PAUSED) && (
<Button
onClick={() => handleHmiProfileCommand(profile, TemperatureProfileCommand.STOP)}
title="Stop Profile"
className="px-2 py-1 h-auto glass-button status-gradient-error text-white border-0"
disabled={!profile.enabled}
>
<StopCircle className="h-4 w-4 mr-1" /> Stop
</Button>
)}
</div>
</CardHeader>
<CardContent className="pt-1 pb-3">
{(profile.status === PlotStatus.RUNNING || profile.status === PlotStatus.PAUSED) &&
profile.duration > 0 && (
<div className="space-y-2 pt-1">
{profile.currentTemp !== undefined && (
<div className="text-center">
<span className="font-bold text-lg text-indigo-600 dark:text-cyan-400">{profile.currentTemp.toFixed(1)}°C</span>
</div>
)}
{profile.elapsed !== undefined && (
<>
<Progress
value={(profile.elapsed / profile.duration) * 100}
className="w-full h-3 glass-progress"
/>
<div className="text-xs text-slate-500 dark:text-slate-400 flex justify-between">
<span>
<T>Elapsed</T>: {Math.floor(profile.elapsed / 60000)}m {Math.floor((profile.elapsed % 60000) / 1000)}s
</span>
<span>
<T>Total</T>: {Math.floor(profile.duration / 60000)}m {Math.floor((profile.duration % 60000) / 1000)}s
</span>
</div>
</>
)}
</div>
)}
{profile.status === PlotStatus.PAUSED && profile.elapsed === undefined && (
<div className="text-xs text-slate-500 dark:text-slate-400">
<span><T>Total Duration</T>: {Math.floor(profile.duration / 60000)}m {Math.floor((profile.duration % 60000) / 1000)}s - <T>Paused</T></span>
</div>
)}
</CardContent>
</Card>
))}
</div>
</CollapsibleSection>
)}
{featureFlags.ENABLE_OMRON_E5 && (
<CollapsibleSection
title={<T>Controller Chart</T>}
storageKey="hmi-chart-collapsible"
id="hmi-chart-collapsible"
className="glass-panel"
headerClassName="flex justify-between items-center p-3 rounded-t-lg"
contentClassName="p-3 glass-card rounded-b-lg"
titleClassName="text-lg font-semibold glass-text"
buttonClassName="text-slate-600 dark:text-white/80 hover:text-slate-800 dark:hover:text-white"
>
<ControllerChart />
</CollapsibleSection>
)}
{featureFlags.ENABLE_AMPERAGE_BUDGET_MANAGER && (
<CollapsibleSection
title={<T>Sequential Heating Control</T>}
storageKey="hmi-sequential-heating-collapsible"
id="hmi-sequential-heating-collapsible"
className="glass-panel"
headerClassName="flex justify-between items-center p-3 rounded-t-lg"
contentClassName="p-3 glass-card rounded-b-lg"
titleClassName="text-lg font-semibold glass-text"
buttonClassName="text-slate-600 dark:text-white/80 hover:text-slate-800 dark:hover:text-white"
>
<SequentialHeatingCard />
</CollapsibleSection>
)}
{featureFlags.ENABLE_OMRON_E5 && (
<CollapsibleSection
title={<T>Controller Partitions</T>}
storageKey="hmi-partitions-collapsible"
className="glass-panel"
headerClassName="flex justify-between items-center p-3 rounded-t-lg"
contentClassName="p-3 glass-card rounded-b-lg"
titleClassName="text-lg font-semibold glass-text"
buttonClassName="text-slate-600 dark:text-white/80 hover:text-slate-800 dark:hover:text-white"
>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 pt-2" id="hmi-partitions-container">
{processedData.map(partition => (
<Card key={partition.name} className="glass-card shadow-xl flex flex-col" id={`hmi-partition-${partition.name.replace(/\s+/g, '-')}`}>
<CardHeader>
<CardTitle className="text-lg glass-text"><T>{partition.name}</T></CardTitle>
</CardHeader>
<CardContent className="space-y-3 flex-grow">
{partition.controllers.length === 0 ? (
<p className="text-sm text-slate-500 dark:text-slate-400"><T>No controllers configured or found for this partition.</T></p>
) : (
partition.controllers.map((controller, index) => (
<React.Fragment key={controller.slaveid}>
<CassandraControllerCard
slaveId={controller.slaveid}
name={controller.name}
pv={controller.pv}
isRunning={controller.isRunning}
//hasAlarm={controller.hasAlarm}
isAutoTuning={controller.isAutoTuning}
hasHeaterBreak={controller.hasHeaterBreak}
hasSensorBreak={controller.hasSensorBreak}
mode={controller.mode}
currentProfile={controller.currentProfileName}
isHeating={controller.isHeating}
/>
{(index + 1) % 2 === 0 && index < partition.controllers.length - 1 && (
<div className="border-t border-slate-300/30 dark:border-white/10 my-3" />
)}
</React.Fragment>
))
)}
</CardContent>
</Card>
))}
</div>
</CollapsibleSection>
)}
</div>
);
};
export default CassandraHMIDisplay;