Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,23 @@ All notable changes to **Tiger Core** (`webtigers/tiger-core`). Format follows

## [Unreleased]

## [1.0.2] — 2026-08-24

### Fixed
- **The admin chrome was still hardcoded English.** The platform ships six locales, but the shared
PUMA chrome rendered its own labels as literals — so **My Profile**, **Lock Screen**, **Sign Out**,
**Alerts**, **View all**, **Activity**, the agent aside, the theme/skin/language switchers, the
consent banner, and the cron + schedule setup screens all stayed English no matter the locale.
Even `Skip to content` — an accessibility affordance — was untranslated. 93 keys added to
`themes/puma/languages/*/theme.php`, all six locales at 133 with identical key sets.
- Time-ago strings ("15 minutes ago") became `sprintf` keys rather than baked-in English, and the
inline-JS `'User'` fallback now reads a translated `data-fallback` attribute.

### Note
Third-party UI labels are deliberately NOT translated: the cron setup walks you through **cPanel's
and Plesk's own English screens**, so control names like *Add New Cron Job* stay verbatim in every
locale — translating them would send people hunting for a button that doesn't exist.

## [1.0.1] — 2026-08-24

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion library/Tiger/Version.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@
class Tiger_Version
{
/** Current Tiger Core version. Keep in lockstep with the git tag cut for a release. */
const VERSION = '1.0.1';
const VERSION = '1.0.2';
}
111 changes: 111 additions & 0 deletions themes/puma/languages/de/theme.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,115 @@
'theme.footer.terms' => 'Nutzungsbedingungen',
'theme.footer.github' => 'GitHub',
'theme.footer.home' => 'Startseite',

// ------------------------------------------------------------------
// Admin-Oberfläche (gemeinsame Shell) — Siezen, wie im Backend üblich
// ------------------------------------------------------------------

'theme.a11y.skip_to_content' => 'Zum Inhalt springen',
'theme.a11y.toggle_nav' => 'Navigation ein- oder ausblenden',
'theme.a11y.main_nav' => 'Hauptnavigation',
'theme.a11y.sidebar_nav' => 'Seitenleistennavigation',
'theme.a11y.primary_nav' => 'Hauptnavigation',

'theme.action.save' => 'Speichern',
'theme.action.copy' => 'Kopieren',

'theme.admin.title' => 'Tiger-Verwaltung',
'theme.admin.navigation' => 'Navigation',
'theme.admin.guest' => 'Gast',
'theme.admin.user_fallback' => 'Benutzer',
'theme.search.label' => 'Suchen',

'theme.admin.alerts' => 'Meldungen',
'theme.admin.alert.user_locked' => 'Benutzer gesperrt',
'theme.admin.alert.connection_restored' => 'Verbindung wiederhergestellt',
'theme.admin.time.minutes_ago' => 'vor %d Minuten',
'theme.admin.time.hour_ago' => 'vor %d Stunde',
'theme.admin.view_all' => 'Alle ansehen',

'theme.admin.menu.profile' => 'Mein Profil',
'theme.admin.menu.two_factor' => 'Zwei-Faktor-Authentifizierung',
'theme.admin.menu.lock_screen' => 'Bildschirm sperren',
'theme.admin.menu.sign_out' => 'Abmelden',

'theme.aside.label' => 'Assistenzbereich',
'theme.aside.activity' => 'Aktivität',
'theme.aside.placeholder' => 'Diese optionale Leiste erscheint, sobald eine View %s setzt. Platzieren Sie hier kontextbezogene Widgets: letzte Aktivitäten, Inline-Hilfe, Filter.',

'theme.agent.label' => 'KI-Agent',
'theme.agent.title' => 'Agent',
'theme.agent.model' => 'Modell',
'theme.agent.new_chat' => 'Neuer Chat',
'theme.agent.drop_files' => 'Dateien hier ablegen, um sie anzuhängen',
'theme.agent.empty' => 'Beginnen Sie ein Gespräch — der Agent handelt mit Ihren Berechtigungen.',
'theme.agent.input_placeholder' => 'Bitten Sie den Agenten, etwas zu bauen, zu ändern oder zu erklären…',
'theme.agent.attach' => 'Datei anhängen',
'theme.agent.mode_title' => 'Automatisierungsgrad',
'theme.agent.send' => 'Senden',
'theme.agent.open' => 'KI-Agenten öffnen',

'theme.switcher.language' => 'Sprache',
'theme.switcher.theme' => 'Erscheinungsbild',
'theme.switcher.browser' => 'Browser',
'theme.switcher.light' => 'Hell',
'theme.switcher.dark' => 'Dunkel',
'theme.switcher.skin' => 'Skin',
'theme.switcher.skin_title' => 'Skin (Live-Vorschau)',
'theme.switcher.skin_header' => 'Skin — Live-Vorschau',
'theme.switcher.custom' => 'Eigenes',

'theme.consent.label' => 'Cookie-Einwilligung',
'theme.consent.learn_more' => 'Mehr erfahren',
'theme.consent.gpc' => 'Global Privacy Control erkannt — Sie sind von Analyse und Datenweitergabe ausgenommen.',

'theme.auth.title_default' => 'Anmelden — Tiger',

// Die Bezeichnungen der Bedienelemente von cPanel / Plesk bleiben ABSICHTLICH auf Englisch:
// genau so stehen sie auf dem cPanel- bzw. Plesk-Bildschirm, den der Nutzer vor sich hat.
'theme.cron.title' => 'So richten Sie Cron ein',
'theme.cron.status.real.title' => 'Ein echter Cron läuft.',
'theme.cron.status.real.body' => 'Tiger hat in den letzten Minuten vom Cron Ihres Servers gehört — die Zeitpläne laufen pünktlich.',
'theme.cron.status.pseudo.title' => 'Der Pseudo-Cron nach WordPress-Art ist aktiv.',
'theme.cron.status.pseudo.body' => 'Es wurde kein echter Cron erkannt, deshalb laufen geplante Aufgaben über den <em>Website-Traffic</em> — für den Anfang in Ordnung, aber auf einer ruhigen Website können Aufgaben zu spät laufen. Richten Sie unten einen echten Cron ein, damit alles zuverlässig und pünktlich läuft.',
'theme.cron.status.none.title' => 'Es läuft kein Cron.',
'theme.cron.status.none.body' => 'Sowohl der echte Cron als auch die Traffic-gesteuerte Notlösung sind aus — geplante Aufgaben laufen erst, wenn Sie unten einen Cron einrichten.',
'theme.cron.command_label' => 'Ihr Cron-Befehl',
'theme.cron.every_minute_note' => 'Führen Sie ihn <strong>jede Minute</strong> aus (<code>* * * * *</code>) — Tiger entscheidet intern, welche Aufgaben tatsächlich fällig sind. Ein minütlicher Cron ist also günstig und hält alles pünktlich.',
'theme.cron.tab.cli' => 'Kommandozeile',
'theme.cron.tab.claude' => 'Claude Code machen lassen',
'theme.cron.cpanel.step1' => 'Öffnen Sie in cPanel <strong>Advanced → Cron Jobs</strong>.',
'theme.cron.cpanel.step2' => 'Setzen Sie unter <em>Add New Cron Job</em> die <strong>Common Settings</strong> auf <strong>Once Per Minute</strong> (<code>* * * * *</code>).',
'theme.cron.cpanel.step3' => 'Fügen Sie den Befehl von oben in <strong>Command</strong> ein.',
'theme.cron.cpanel.step4' => 'Klicken Sie auf <strong>Add New Cron Job</strong>. Fertig — diese Karte wird innerhalb von ein bis zwei Minuten grün.',
'theme.cron.cpanel.php_path' => 'Wird <code>php</code> nicht gefunden, verwenden Sie statt <code>php</code> den vollständigen PHP-Pfad Ihres Hosters (z. B. <code>/usr/local/bin/ea-php82</code>).',
'theme.cron.plesk.step1' => 'Öffnen Sie in Plesk <strong>Websites &amp; Domains → Scheduled Tasks</strong> für Ihre Domain.',
'theme.cron.plesk.step2' => 'Klicken Sie auf <strong>Add Task</strong> und wählen Sie <strong>Run a command</strong>.',
'theme.cron.plesk.step3' => 'Stellen Sie <strong>Run</strong> auf <strong>Cron style</strong> und tragen Sie <code>* * * * *</code> ein.',
'theme.cron.plesk.step4' => 'Fügen Sie den Befehl von oben ein und klicken Sie zum Testen auf <strong>OK</strong> / <strong>Run Now</strong>.',
'theme.cron.cli.intro' => 'Verbinden Sie sich per SSH mit dem Server und bearbeiten Sie die Crontab:',
'theme.cron.cli.add' => 'Fügen Sie diese Zeile hinzu und speichern Sie:',
'theme.cron.claude.intro' => 'Lassen Sie es Claude Code (oder einen beliebigen Shell-Zugang zu diesem Server) für Sie erledigen — fragen Sie einfach:',
'theme.cron.claude.prompt' => 'Richte einen minütlichen Cron ein, der Folgendes ausführt:',
'theme.cron.claude.note' => 'Claude Code trägt den Crontab-Eintrag ein und bestätigt ihn. Bis dahin hält der Traffic-gesteuerte Pseudo-Cron den Betrieb am Laufen.',

'theme.schedule.frequency' => 'Häufigkeit',
'theme.schedule.time' => 'Uhrzeit',
'theme.schedule.day_of_week' => 'Wochentag',
'theme.schedule.day_of_month' => 'Tag des Monats',
'theme.schedule.enabled' => 'Aktiviert',
'theme.schedule.freq.every_minute' => 'Jede Minute',
'theme.schedule.freq.every_5_min' => 'Alle 5 Minuten',
'theme.schedule.freq.every_15_min' => 'Alle 15 Minuten',
'theme.schedule.freq.hourly' => 'Stündlich',
'theme.schedule.freq.daily' => 'Täglich',
'theme.schedule.freq.weekly' => 'Wöchentlich',
'theme.schedule.freq.monthly' => 'Monatlich',
'theme.schedule.day.sunday' => 'Sonntag',
'theme.schedule.day.monday' => 'Montag',
'theme.schedule.day.tuesday' => 'Dienstag',
'theme.schedule.day.wednesday' => 'Mittwoch',
'theme.schedule.day.thursday' => 'Donnerstag',
'theme.schedule.day.friday' => 'Freitag',
'theme.schedule.day.saturday' => 'Samstag',
];
127 changes: 127 additions & 0 deletions themes/puma/languages/en/theme.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,131 @@
'theme.footer.terms' => 'Terms',
'theme.footer.github' => 'GitHub',
'theme.footer.home' => 'Home',

// ------------------------------------------------------------------
// Admin chrome (the shared shell: layout, header, sidebars, asides)
// ------------------------------------------------------------------

// Accessibility labels (skip links, landmark + control names)
'theme.a11y.skip_to_content' => 'Skip to content',
'theme.a11y.toggle_nav' => 'Toggle navigation',
'theme.a11y.main_nav' => 'Main navigation',
'theme.a11y.sidebar_nav' => 'Sidebar navigation',
'theme.a11y.primary_nav' => 'Primary navigation',

// Shared actions
'theme.action.save' => 'Save',
'theme.action.copy' => 'Copy',

// Admin shell
'theme.admin.title' => 'Tiger Admin',
'theme.admin.navigation' => 'Navigation',
'theme.admin.guest' => 'Guest',
'theme.admin.user_fallback' => 'User',
'theme.search.label' => 'Search',

// Header notifications
'theme.admin.alerts' => 'Alerts',
'theme.admin.alert.user_locked' => 'User locked',
'theme.admin.alert.connection_restored' => 'Connection restored',
'theme.admin.time.minutes_ago' => '%d minutes ago',
'theme.admin.time.hour_ago' => '%d hour ago',
'theme.admin.view_all' => 'View all',

// Header user menu
'theme.admin.menu.profile' => 'My Profile',
'theme.admin.menu.two_factor' => 'Two-Factor Auth',
'theme.admin.menu.lock_screen' => 'Lock Screen',
'theme.admin.menu.sign_out' => 'Sign Out',

// Right aside (contextual rail)
'theme.aside.label' => 'Assistant panel',
'theme.aside.activity' => 'Activity',
'theme.aside.placeholder' => 'This optional rail appears when a view sets %s. Drop contextual widgets here — recent activity, inline help, filters.',

// TigerAgent aside
'theme.agent.label' => 'AI Agent',
'theme.agent.title' => 'Agent',
'theme.agent.model' => 'Model',
'theme.agent.new_chat' => 'New chat',
'theme.agent.drop_files' => 'Drop files to attach',
'theme.agent.empty' => 'Start a conversation — the agent acts with your permissions.',
'theme.agent.input_placeholder' => 'Ask the agent to build, change, or explain something…',
'theme.agent.attach' => 'Attach a file',
'theme.agent.mode_title' => 'Automation level',
'theme.agent.send' => 'Send',
'theme.agent.open' => 'Open the AI agent',

// Language / theme / skin switchers
'theme.switcher.language' => 'Language',
'theme.switcher.theme' => 'Theme',
'theme.switcher.browser' => 'Browser',
'theme.switcher.light' => 'Light',
'theme.switcher.dark' => 'Dark',
'theme.switcher.skin' => 'Skin',
'theme.switcher.skin_title' => 'Skin (live preview)',
'theme.switcher.skin_header' => 'Skin — live preview',
'theme.switcher.custom' => 'Custom',

// Cookie-consent banner ("Global Privacy Control" is the standard's own name — kept verbatim)
'theme.consent.label' => 'Cookie consent',
'theme.consent.learn_more' => 'Learn more',
'theme.consent.gpc' => "Global Privacy Control detected — you're opted out of analytics &amp; sharing.",

// Auth layout
'theme.auth.title_default' => 'Sign in — Tiger',

// ------------------------------------------------------------------
// Cron setup card. NOTE: the names of controls in cPanel's / Plesk's OWN
// interface ("Add New Cron Job", "Common Settings", "Once Per Minute",
// "Command", "Add Task", "Run a command", "Cron style", …) MUST stay in
// English in every locale — the user is looking for them on an English
// cPanel/Plesk screen. Translate the prose around them only.
// ------------------------------------------------------------------
'theme.cron.title' => 'How to set up Cron',
'theme.cron.status.real.title' => 'A real cron is running.',
'theme.cron.status.real.body' => 'Tiger heard from your server cron in the last couple of minutes — schedules run on time.',
'theme.cron.status.pseudo.title' => 'WordPress-style pseudo-cron is active.',
'theme.cron.status.pseudo.body' => 'No real cron detected, so scheduled jobs run on <em>site traffic</em> — fine to start, but a quiet site can run jobs late. Add a real cron below for reliable, on-time scheduling.',
'theme.cron.status.none.title' => 'No cron is running.',
'theme.cron.status.none.body' => 'Both real cron and the traffic-driven fallback are off — scheduled jobs will not run until you set one up below.',
'theme.cron.command_label' => 'Your cron command',
'theme.cron.every_minute_note' => 'Run it <strong>every minute</strong> (<code>* * * * *</code>) — Tiger decides internally which jobs are actually due, so a per-minute cron is cheap and keeps everything on time.',
'theme.cron.tab.cli' => 'Command line',
'theme.cron.tab.claude' => 'Let Claude Code do it',
'theme.cron.cpanel.step1' => 'In cPanel, open <strong>Advanced → Cron Jobs</strong>.',
'theme.cron.cpanel.step2' => 'Under <em>Add New Cron Job</em>, set <strong>Common Settings</strong> to <strong>Once Per Minute</strong> (<code>* * * * *</code>).',
'theme.cron.cpanel.step3' => 'Paste the command above into <strong>Command</strong>.',
'theme.cron.cpanel.step4' => 'Click <strong>Add New Cron Job</strong>. Done — this card flips to green within a minute or two.',
'theme.cron.cpanel.php_path' => "If <code>php</code> isn't found, use your host's full PHP path (e.g. <code>/usr/local/bin/ea-php82</code>) in place of <code>php</code>.",
'theme.cron.plesk.step1' => 'In Plesk, open <strong>Websites &amp; Domains → Scheduled Tasks</strong> for your domain.',
'theme.cron.plesk.step2' => 'Click <strong>Add Task</strong>, choose <strong>Run a command</strong>.',
'theme.cron.plesk.step3' => 'Set <strong>Run</strong> to <strong>Cron style</strong> and enter <code>* * * * *</code>.',
'theme.cron.plesk.step4' => 'Paste the command above, then <strong>OK</strong> / <strong>Run Now</strong> to test.',
'theme.cron.cli.intro' => 'SSH into the server and edit the crontab:',
'theme.cron.cli.add' => 'Add this line, then save:',
'theme.cron.claude.intro' => 'Have Claude Code (or any shell access to this server) do it for you — just ask:',
'theme.cron.claude.prompt' => 'Add a per-minute cron that runs:',
'theme.cron.claude.note' => 'Claude Code will add the crontab entry and confirm it. Until then, the traffic-driven pseudo-cron keeps things moving.',

// Schedule control (values posted to the API stay the English keys; only the labels localize)
'theme.schedule.frequency' => 'Frequency',
'theme.schedule.time' => 'Time',
'theme.schedule.day_of_week' => 'Day of week',
'theme.schedule.day_of_month' => 'Day of month',
'theme.schedule.enabled' => 'Enabled',
'theme.schedule.freq.every_minute' => 'Every minute',
'theme.schedule.freq.every_5_min' => 'Every 5 minutes',
'theme.schedule.freq.every_15_min' => 'Every 15 minutes',
'theme.schedule.freq.hourly' => 'Hourly',
'theme.schedule.freq.daily' => 'Daily',
'theme.schedule.freq.weekly' => 'Weekly',
'theme.schedule.freq.monthly' => 'Monthly',
'theme.schedule.day.sunday' => 'Sunday',
'theme.schedule.day.monday' => 'Monday',
'theme.schedule.day.tuesday' => 'Tuesday',
'theme.schedule.day.wednesday' => 'Wednesday',
'theme.schedule.day.thursday' => 'Thursday',
'theme.schedule.day.friday' => 'Friday',
'theme.schedule.day.saturday' => 'Saturday',
];
Loading
Loading