feat(plugins): lifecycle polish — uninstall, error log, egress guard, widget slot (M8)

- Uninstall with data disposition: POST /api/admin/plugins/:id/uninstall kills the
  plugin, removes its code + DB metadata, and (deleteData) drops its data dir,
  error log and per-user settings.
- Error log: GET/DELETE /api/admin/plugins/:id/errors — the plugin's own crash /
  request-failure log, surfaced in the admin panel.
- Egress guard: the isolated child wraps global fetch and refuses any outbound
  host not in the plugin's declared egress[]; with none declared, all outbound is
  blocked. Process-level defense in depth (the container runtime enforces it at
  the network layer in v2).
- Admin → Plugins is now actionable: activate / deactivate / uninstall, a
  registry browser (install), and per-plugin error log. i18n across all locales.
- Dashboard widget slot: active widget plugins render as sandboxed cards.

The trek:request core-data bridge + photo/calendar hook consumers remain follow-ups.
This commit is contained in:
mauriceboe
2026-07-03 18:08:11 +02:00
committed by Maurice
parent 660e4b9dfc
commit 1cee4e93b1
34 changed files with 719 additions and 29 deletions
+18
View File
@@ -178,6 +178,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'فشل الحفظ',
'admin.tabs.addons': 'الإضافات',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -157,6 +157,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Falha ao salvar',
'admin.tabs.addons': 'Complementos',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -158,6 +158,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Uložení se nezdařilo',
'admin.tabs.addons': 'Doplňky',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -160,6 +160,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Fehler beim Speichern',
'admin.tabs.addons': 'Addons',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Neu scannen',
'admin.plugins.rescanned': 'Plugin-Ordner neu gescannt',
'admin.plugins.browse': 'Plugins durchsuchen',
'admin.plugins.installed': 'Installiert',
'admin.plugins.install': 'Installieren',
'admin.plugins.registryEmpty': 'Noch keine Plugins in der Registry verfügbar.',
'admin.plugins.actionError': 'Aktion fehlgeschlagen',
'admin.plugins.activate': 'Aktivieren',
'admin.plugins.activated': 'Plugin aktiviert',
'admin.plugins.deactivate': 'Deaktivieren',
'admin.plugins.deactivated': 'Plugin deaktiviert',
'admin.plugins.viewErrors': 'Fehlerprotokoll ansehen',
'admin.plugins.errorLog': 'Fehlerprotokoll',
'admin.plugins.noErrors': 'Keine Fehler protokolliert.',
'admin.plugins.uninstalled': 'Plugin deinstalliert',
'admin.plugins.uninstallTitle': 'Plugin deinstallieren?',
'admin.plugins.uninstallBody': 'Das stoppt das Plugin, entfernt seinen Code und löscht alle seine Daten. Das kann nicht rückgängig gemacht werden.',
'admin.plugins.trustNote': 'Plugins laufen isoliert mit nur den von dir freigegebenen Berechtigungen. Installiere nur Code von Autoren, denen du vertraust.',
'plugins.notFound': 'Plugin nicht gefunden',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Plugins von Drittanbietern auf deiner Instanz installieren und verwalten.',
+18
View File
@@ -212,6 +212,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Failed to save',
'admin.tabs.addons': 'Addons',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -159,6 +159,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Error al guardar',
'admin.tabs.addons': 'Complementos',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -161,6 +161,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Erreur de sauvegarde',
'admin.tabs.addons': 'Extensions',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -206,6 +206,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Αποτυχία αποθήκευσης',
'admin.tabs.addons': 'Πρόσθετα',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -160,6 +160,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Nem sikerült menteni',
'admin.tabs.addons': 'Bővítmények',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -202,6 +202,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Gagal menyimpan',
'admin.tabs.addons': 'Addon',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -159,6 +159,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Impossibile salvare',
'admin.tabs.addons': 'Moduli',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -191,6 +191,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': '保存に失敗しました',
'admin.tabs.addons': 'アドオン',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -197,6 +197,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': '저장 실패',
'admin.tabs.addons': '애드온',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -160,6 +160,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Fout bij opslaan',
'admin.tabs.addons': 'Add-ons',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -153,6 +153,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Nie udało się zapisać szablonu',
'admin.tabs.addons': 'Dodatki',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -160,6 +160,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Ошибка сохранения',
'admin.tabs.addons': 'Дополнения',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -212,6 +212,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Det gick inte att spara',
'admin.tabs.addons': 'Tillägg',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -204,6 +204,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Kaydedilemedi',
'admin.tabs.addons': 'Eklentiler',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -160,6 +160,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Помилка збереження',
'admin.tabs.addons': 'Дополнения',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -212,6 +212,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': 'Không lưu được',
'admin.tabs.addons': 'Tiện ích bổ sung',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -194,6 +194,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': '儲存失敗',
'admin.tabs.addons': '擴充套件',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
+18
View File
@@ -155,6 +155,24 @@ const admin: TranslationStrings = {
'admin.packingTemplates.saveError': '保存失败',
'admin.tabs.addons': '扩展',
'admin.tabs.plugins': 'Plugins',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody': 'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.trustNote': 'Plugins run isolated with only the permissions you approve. Only install code from authors you trust.',
'plugins.notFound': 'Plugin not found',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',