i18n 1/2
This commit is contained in:
parent
9284894589
commit
db5182c0a5
BIN
packages/kbot/dist/win-64/tauri-app.exe
vendored
BIN
packages/kbot/dist/win-64/tauri-app.exe
vendored
Binary file not shown.
BIN
packages/kbot/generated_gen_0.png
Normal file
BIN
packages/kbot/generated_gen_0.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 MiB |
31
packages/kbot/gr.sh
Normal file
31
packages/kbot/gr.sh
Normal 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!"
|
||||
1
packages/kbot/gui/tauri-app/i18n/en.json
Normal file
1
packages/kbot/gui/tauri-app/i18n/en.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
||||
7
packages/kbot/gui/tauri-app/scripts/i18n.sh
Normal file
7
packages/kbot/gui/tauri-app/scripts/i18n.sh
Normal 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}'
|
||||
51
packages/kbot/gui/tauri-app/scripts/translations.js
Normal file
51
packages/kbot/gui/tauri-app/scripts/translations.js
Normal 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);
|
||||
}
|
||||
@ -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>
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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})
|
||||
|
||||
@ -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>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@ -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}
|
||||
|
||||
209
packages/kbot/gui/tauri-app/src/i18n.tsx
Normal file
209
packages/kbot/gui/tauri-app/src/i18n.tsx
Normal 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 };
|
||||
350
packages/kbot/gui/tauri-app/src/i18n/de.json
Normal file
350
packages/kbot/gui/tauri-app/src/i18n/de.json
Normal 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."
|
||||
}
|
||||
379
packages/kbot/gui/tauri-app/src/i18n/en.json
Normal file
379
packages/kbot/gui/tauri-app/src/i18n/en.json
Normal 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."
|
||||
}
|
||||
350
packages/kbot/gui/tauri-app/src/i18n/es.json
Normal file
350
packages/kbot/gui/tauri-app/src/i18n/es.json
Normal 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."
|
||||
}
|
||||
350
packages/kbot/gui/tauri-app/src/i18n/fr.json
Normal file
350
packages/kbot/gui/tauri-app/src/i18n/fr.json
Normal 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."
|
||||
}
|
||||
350
packages/kbot/gui/tauri-app/src/i18n/it.json
Normal file
350
packages/kbot/gui/tauri-app/src/i18n/it.json
Normal 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."
|
||||
}
|
||||
350
packages/kbot/gui/tauri-app/src/i18n/nl.json
Normal file
350
packages/kbot/gui/tauri-app/src/i18n/nl.json
Normal 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."
|
||||
}
|
||||
442
packages/kbot/gui/tauri-app/src/ref/CassandraHMIDisplay.tsx
Normal file
442
packages/kbot/gui/tauri-app/src/ref/CassandraHMIDisplay.tsx
Normal 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;
|
||||
Loading…
Reference in New Issue
Block a user