diff --git a/web/projects/shared/src/i18n/dictionaries/de.ts b/web/projects/shared/src/i18n/dictionaries/de.ts
index a898289ee..449be0c8f 100644
--- a/web/projects/shared/src/i18n/dictionaries/de.ts
+++ b/web/projects/shared/src/i18n/dictionaries/de.ts
@@ -575,4 +575,5 @@ export default {
608: 'Zweck',
609: 'Subdomains von',
610: 'Dynamisches DNS',
+ 611: 'Keine Service-Schnittstellen',
} satisfies i18n
diff --git a/web/projects/shared/src/i18n/dictionaries/en.ts b/web/projects/shared/src/i18n/dictionaries/en.ts
index 0a40276d8..c74fd0963 100644
--- a/web/projects/shared/src/i18n/dictionaries/en.ts
+++ b/web/projects/shared/src/i18n/dictionaries/en.ts
@@ -574,4 +574,5 @@ export const ENGLISH = {
'Purpose': 608, // as in, the reason for a thing to exist
'subdomains of': 609, // this is a partial sentence. A domain name will be added after "of" to complete the sentence.
'Dynamic DNS': 610,
+ 'No service interfaces': 611, // as in, there are no available interfaces (API, UI, etc) for this software application
} as const
diff --git a/web/projects/shared/src/i18n/dictionaries/es.ts b/web/projects/shared/src/i18n/dictionaries/es.ts
index 0d74d9aad..00d99c285 100644
--- a/web/projects/shared/src/i18n/dictionaries/es.ts
+++ b/web/projects/shared/src/i18n/dictionaries/es.ts
@@ -575,4 +575,5 @@ export default {
608: 'Propósito',
609: 'Subdominios de',
610: 'DNS dinámico',
+ 611: 'Sin interfaces de servicio',
} satisfies i18n
diff --git a/web/projects/shared/src/i18n/dictionaries/fr.ts b/web/projects/shared/src/i18n/dictionaries/fr.ts
index 5886b99cf..3090dd757 100644
--- a/web/projects/shared/src/i18n/dictionaries/fr.ts
+++ b/web/projects/shared/src/i18n/dictionaries/fr.ts
@@ -575,4 +575,5 @@ export default {
608: 'But',
609: 'Sous-domaines de',
610: 'DNS dynamique',
+ 611: 'Aucune interface de service',
} satisfies i18n
diff --git a/web/projects/shared/src/i18n/dictionaries/pl.ts b/web/projects/shared/src/i18n/dictionaries/pl.ts
index fe1d4f536..c3662b727 100644
--- a/web/projects/shared/src/i18n/dictionaries/pl.ts
+++ b/web/projects/shared/src/i18n/dictionaries/pl.ts
@@ -575,4 +575,5 @@ export default {
608: 'Cel',
609: 'Subdomeny',
610: 'Dynamiczny DNS',
+ 611: 'Brak interfejsów usług',
} satisfies i18n
diff --git a/web/projects/ui/src/app/routes/portal/routes/services/components/interfaces.component.ts b/web/projects/ui/src/app/routes/portal/routes/services/components/interfaces.component.ts
index 74723546e..a89d10d45 100644
--- a/web/projects/ui/src/app/routes/portal/routes/services/components/interfaces.component.ts
+++ b/web/projects/ui/src/app/routes/portal/routes/services/components/interfaces.component.ts
@@ -9,6 +9,7 @@ import { tuiDefaultSort } from '@taiga-ui/cdk'
import { PackageDataEntry } from 'src/app/services/patch-db/data-model'
import { ServiceInterfaceItemComponent } from './interface-item.component'
import { i18nPipe } from '@start9labs/shared'
+import { PlaceholderComponent } from '../../../components/placeholder.component'
@Component({
selector: 'service-interfaces',
@@ -31,6 +32,10 @@ import { i18nPipe } from '@start9labs/shared'
[pkg]="pkg()"
[disabled]="disabled()"
>
+ } @empty {
+
+ {{ 'No service interfaces' | i18n }}
+
}
@@ -42,7 +47,12 @@ import { i18nPipe } from '@start9labs/shared'
`,
host: { class: 'g-card' },
changeDetection: ChangeDetectionStrategy.OnPush,
- imports: [ServiceInterfaceItemComponent, TuiTable, i18nPipe],
+ imports: [
+ ServiceInterfaceItemComponent,
+ TuiTable,
+ i18nPipe,
+ PlaceholderComponent,
+ ],
})
export class ServiceInterfacesComponent {
readonly pkg = input.required()