Skip to content

Commit 75cfd55

Browse files
committed
feat(i18n): add i18n
1 parent 1b60f6e commit 75cfd55

File tree

45 files changed

+2561
-1030
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+2561
-1030
lines changed

package-lock.json

Lines changed: 1437 additions & 377 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
"build:prd": "ng build --configuration=production",
1212
"lint": "ng lint && npx prettier -c \"src/**/*.ts\"",
1313
"lint:fix": "ng lint --fix",
14-
"prettier:fix": "npx prettier --write \"src/**/*.ts\""
14+
"prettier:fix": "npx prettier --write \"src/**/*.ts\"",
15+
"i18n:extract": "transloco-keys-manager extract --remove-extra-keys --sort",
16+
"i18n:find": "transloco-keys-manager find"
1517
},
1618
"private": true,
1719
"dependencies": {
@@ -30,6 +32,7 @@
3032
"@capacitor/status-bar": "^6.0.0",
3133
"@ionic/angular": "^7.6.4",
3234
"@ionic/storage-angular": "^4.0.0",
35+
"@jsverse/transloco": "^7.6.1",
3336
"@ngneat/until-destroy": "^10.0.0",
3437
"@ngrx/operators": "^18.0.2",
3538
"@ngrx/signals": "^18.0.2",
@@ -54,6 +57,7 @@
5457
"@commitlint/cli": "^18.4.4",
5558
"@commitlint/config-conventional": "^18.4.4",
5659
"@ionic/angular-toolkit": "^12.1.1",
60+
"@jsverse/transloco-keys-manager": "^5.1.0",
5761
"@types/jasmine": "~5.1.4",
5862
"@types/node": "^20.11.2",
5963
"@typescript-eslint/eslint-plugin": "6.18.1",

src/app/business/business.store.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ export const BusinessStore = signalStore(
200200
})),
201201

202202
withHooks({
203-
onInit: ({ loadBusinesses, loadBusinessStates, loadBusinessTypes }) => {
203+
onInit: ({ loadBusinessStates, loadBusinessTypes }) => {
204204
loadBusinessStates(null);
205205
loadBusinessTypes(null);
206206
}
Lines changed: 69 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,79 @@
1-
@if (business.Description) {
2-
<app-text-card
3-
[title]="'Beschreibung'"
4-
[HtmlText]="business.Description"
5-
></app-text-card>
6-
}
1+
<ng-container *transloco="let t; prefix:'business.detailText'">
2+
@if (business.Description) {
3+
<app-text-card
4+
[title]="t('description')"
5+
[HtmlText]="business.Description"
6+
></app-text-card>
7+
}
78

8-
@if (business.InitialSituation) {
9-
<app-text-card
10-
[title]="'Ausgangslage'"
11-
[HtmlText]="business.InitialSituation"
12-
></app-text-card>
13-
}
9+
@if (business.InitialSituation) {
10+
<app-text-card
11+
[title]="t('initialSituation')"
12+
[HtmlText]="business.InitialSituation"
13+
></app-text-card>
14+
}
1415

15-
@if (business.Proceedings) {
16-
<app-text-card
17-
[title]="'Verhandlungen'"
18-
[HtmlText]="business.Proceedings"
19-
></app-text-card>
20-
}
16+
@if (business.Proceedings) {
17+
<app-text-card
18+
[title]="t('proceedings')"
19+
[HtmlText]="business.Proceedings"
20+
></app-text-card>
21+
}
2122

22-
@if (business.DraftText) {
23-
<app-text-card
24-
[title]="'Entwurf'"
25-
[HtmlText]="business.DraftText"
26-
></app-text-card>
27-
}
23+
@if (business.DraftText) {
24+
<app-text-card
25+
[title]="t('draftText')"
26+
[HtmlText]="business.DraftText"
27+
></app-text-card>
28+
}
2829

29-
@if (business.SubmittedText) {
30-
<app-text-card
31-
[title]="'Eingereichter Text'"
32-
[HtmlText]="business.SubmittedText"
33-
></app-text-card>
34-
}
30+
@if (business.SubmittedText) {
31+
<app-text-card
32+
[title]="t('submittedText')"
33+
[HtmlText]="business.SubmittedText"
34+
></app-text-card>
35+
}
3536

36-
@if (business.ReasonText) {
37-
<app-text-card
38-
[title]="'Begründung'"
39-
[HtmlText]="business.ReasonText"
40-
></app-text-card>
41-
}
37+
@if (business.ReasonText) {
38+
<app-text-card
39+
[title]="t('reasonText')"
40+
[HtmlText]="business.ReasonText"
41+
></app-text-card>
42+
}
4243

43-
@if (business.DocumentationText) {
44-
<app-text-card
45-
[title]="'Dokumentation'"
46-
[HtmlText]="business.DocumentationText"
47-
></app-text-card>
48-
}
44+
@if (business.DocumentationText) {
45+
<app-text-card
46+
[title]="t('documentationText')"
47+
[HtmlText]="business.DocumentationText"
48+
></app-text-card>
49+
}
4950

50-
@if (business.MotionText) {
51-
<app-text-card
52-
[title]="'Motionstext'"
53-
[HtmlText]="business.MotionText"
54-
></app-text-card>
55-
}
51+
@if (business.MotionText) {
52+
<app-text-card
53+
[title]="t('motionText')"
54+
[HtmlText]="business.MotionText"
55+
></app-text-card>
56+
}
5657

57-
@if (business.FederalCouncilResponseText) {
58-
<app-text-card
59-
[title]="'Stellungnahme des Bundesrates'"
60-
[HtmlText]="business.FederalCouncilResponseText"
61-
></app-text-card>
62-
}
58+
@if (business.FederalCouncilResponseText) {
59+
<app-text-card
60+
[title]="t('federalCouncilResponseText')"
61+
[HtmlText]="business.FederalCouncilResponseText"
62+
></app-text-card>
63+
}
6364

64-
<app-text-card
65-
title="Ergänzende Informationen"
66-
HtmlText="Besuchen Sie www.parlament.ch für detaillierte Informationen und Ressourcen"
65+
<app-text-card
66+
[title]="t('business.detailText.additionalInformation.title')"
67+
[HtmlText]="t('business.detailText.additionalInformation.text')"
6768
>
68-
<ion-button
69-
expand="block"
70-
size="small"
71-
fill="outline"
72-
(click)="openFurtherInformation()"
73-
>Geschäft öffnen <ion-icon slot="end" name="link-outline"></ion-icon
74-
></ion-button>
75-
</app-text-card>
69+
<ion-button
70+
expand="block"
71+
size="small"
72+
fill="outline"
73+
(click)="openFurtherInformation()"
74+
>{{ t('business.detailText.additionalInformation.button') }}
75+
<ion-icon slot="end" name="link-outline"></ion-icon
76+
>
77+
</ion-button>
78+
</app-text-card>
79+
</ng-container>

src/app/business/components/business-detail-text/business-detail-text.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import { Component, Input } from '@angular/core';
22
import { Browser } from '@capacitor/browser';
33
import { Business } from 'swissparl';
44
import { IonicModule } from '@ionic/angular';
5+
import { TranslocoDirective } from '@jsverse/transloco';
56
import { TextCardComponent } from '../../../shared/components/text-card/text-card.component';
67

78
@Component({
89
selector: 'app-business-detail-text',
910
templateUrl: './business-detail-text.component.html',
1011
styleUrls: ['./business-detail-text.component.scss'],
1112
standalone: true,
12-
imports: [IonicModule, TextCardComponent]
13+
imports: [IonicModule, TextCardComponent, TranslocoDirective]
1314
})
1415
export class BusinessDetailTextComponent {
1516
@Input() business: Business;
Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,37 @@
1-
<form (ngSubmit)="onSubmit()">
2-
<h3>Geschäftstyp</h3>
3-
<ion-list>
4-
@for (businessType of businessTypeCheckboxes(); track businessType) {
5-
<ion-item>
6-
<ion-checkbox
7-
labelPlacement="start"
8-
[name]="businessType.BusinessTypeName"
9-
[(ngModel)]="businessType.checked"
10-
>{{ businessType.BusinessTypeName }}</ion-checkbox
1+
<ng-container *transloco="let t; prefix: 'business.filterForm'">
2+
<form (ngSubmit)="onSubmit()">
3+
<h3>{{ t('type') }}</h3>
4+
<ion-list>
5+
@for (businessType of businessTypeCheckboxes(); track businessType) {
6+
<ion-item>
7+
<ion-checkbox
8+
labelPlacement="start"
9+
[name]="businessType.BusinessTypeName"
10+
[(ngModel)]="businessType.checked"
11+
>{{ businessType.BusinessTypeName }}
12+
</ion-checkbox
1113
>
1214
</ion-item>
1315
}
1416
</ion-list>
15-
<h3>Geschäftsstatus</h3>
17+
<h3>{{ t('status') }}</h3>
1618
<ion-list>
1719
@for (businessStatus of businessStatusCheckboxes(); track businessStatus) {
1820
<ion-item>
1921
<ion-checkbox
2022
labelPlacement="start"
2123
[name]="businessStatus.BusinessStatusName"
2224
[(ngModel)]="businessStatus.checked"
23-
>{{ businessStatus.BusinessStatusName }}</ion-checkbox
24-
>
25-
</ion-item>
26-
}
27-
</ion-list>
28-
29-
<div class="floating-button">
30-
<ion-button expand="block" type="submit">Filter anwenden</ion-button>
31-
</div>
32-
</form>
25+
>{{ businessStatus.BusinessStatusName }}
26+
</ion-checkbox
27+
>
28+
</ion-item>
29+
}
30+
</ion-list>
3331

32+
<div class="floating-button">
33+
<ion-button expand="block" type="submit">{{ t('apply') }}</ion-button>
34+
</div>
35+
</form>
36+
</ng-container>
3437

src/app/business/components/business-filter-form/business-filter-form.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ import {
77
} from '@angular/core';
88
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
99
import { IonicModule } from '@ionic/angular';
10+
import { TranslocoDirective } from '@jsverse/transloco';
1011
import { BusinessStore } from '../../business.store';
11-
import { ErrorScreenComponent } from '../../../shared/components/error-screen/error-screen.component';
1212

1313
@Component({
1414
selector: 'app-business-filter-form',
1515
templateUrl: './business-filter-form.component.html',
1616
styleUrls: ['./business-filter-form.component.scss'],
1717
standalone: true,
18-
imports: [FormsModule, IonicModule, ReactiveFormsModule, ErrorScreenComponent]
18+
imports: [FormsModule, IonicModule, ReactiveFormsModule, TranslocoDirective]
1919
})
2020
export class BusinessFilterFormComponent {
2121
readonly store = inject(BusinessStore);
Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
1-
<ion-header>
2-
<ion-toolbar>
3-
<ion-buttons slot="start">
4-
<ion-back-button
5-
text="Zurück"
6-
defaultHref="layout/business"
7-
></ion-back-button>
8-
</ion-buttons>
9-
<ion-title>Geschäft</ion-title>
10-
</ion-toolbar>
11-
</ion-header>
1+
<ng-container *transloco="let t;">
2+
<ion-header>
3+
<ion-toolbar>
4+
<ion-buttons slot="start">
5+
<ion-back-button
6+
text="Zurück"
7+
defaultHref="layout/business"
8+
></ion-back-button>
9+
</ion-buttons>
10+
<ion-title>{{ t('business.detail.title') }}</ion-title>
11+
</ion-toolbar>
12+
</ion-header>
1213

13-
<ion-content class="ion-padding">
14-
@if (!store.isLoading()) {
15-
@if (!store.hasError()) {
16-
<app-business-card [business]="store.selectedBusiness()">
17-
@if (store.selectedBusiness().Votes.length > 0) {
18-
<ion-button
19-
expand="block"
20-
size="small"
21-
fill="outline"
22-
[routerLink]="['/layout/votes']"
23-
[queryParams]="{ BusinessShortNumber: store.selectedBusiness().BusinessShortNumber }"
24-
>Zu den Abstimmungen</ion-button
14+
<ion-content class="ion-padding">
15+
@if (!store.isLoading()) {
16+
@if (!store.hasError()) {
17+
<app-business-card [business]="store.selectedBusiness()">
18+
@if (store.selectedBusiness().Votes.length > 0) {
19+
<ion-button
20+
expand="block"
21+
size="small"
22+
fill="outline"
23+
[routerLink]="['/layout/votes']"
24+
[queryParams]="{ BusinessShortNumber: store.selectedBusiness().BusinessShortNumber }"
25+
>{{ t('business.detail.toVotes') }}
26+
</ion-button
2527
>
2628
}
2729
</app-business-card>
@@ -35,5 +37,5 @@
3537
<app-loading-screen></app-loading-screen>
3638
}
3739
</ion-content>
38-
40+
</ng-container>
3941

src/app/business/containers/business-detail/business-detail.page.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Component, inject, OnInit } from '@angular/core';
22
import { ActivatedRoute, RouterLink } from '@angular/router';
33
import { IonicModule } from '@ionic/angular';
4+
import { TranslocoDirective } from '@jsverse/transloco';
45
import { BusinessCardComponent } from '../../components/business-card/business-card.component';
56
import { BusinessDetailTextComponent } from '../../components/business-detail-text/business-detail-text.component';
67
import { LoadingScreenComponent } from '../../../shared/components/loading-screen/loading-screen.component';
@@ -18,7 +19,8 @@ import { BusinessStore } from '../../business.store';
1819
BusinessDetailTextComponent,
1920
LoadingScreenComponent,
2021
ErrorScreenComponent,
21-
RouterLink
22+
RouterLink,
23+
TranslocoDirective
2224
]
2325
})
2426
export class BusinessDetailPage implements OnInit {

0 commit comments

Comments
 (0)