Initial translation

This commit is contained in:
Matteo Gheza 2022-02-25 00:52:43 +01:00
parent 2d681ecea1
commit 1576d33a2b
9 changed files with 144 additions and 24 deletions

View File

@ -20,6 +20,8 @@
"@asymmetrik/ngx-leaflet": "^8.1.0",
"@fortawesome/fontawesome-free": "^5.15.4",
"@ng-bootstrap/ng-bootstrap": "11.0.0",
"@ngx-translate/core": "^14.0.0",
"@ngx-translate/http-loader": "^7.0.0",
"bootstrap": "^5.1.3",
"jwt-decode": "^3.1.2",
"leaflet": "^1.7.1",
@ -2467,6 +2469,31 @@
"webpack": "^5.30.0"
}
},
"node_modules/@ngx-translate/core": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-14.0.0.tgz",
"integrity": "sha512-UevdwNCXMRCdJv//0kC8h2eSfmi02r29xeE8E9gJ1Al4D4jEJ7eiLPdjslTMc21oJNGguqqWeEVjf64SFtvw2w==",
"dependencies": {
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/core": ">=13.0.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@ngx-translate/http-loader": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-7.0.0.tgz",
"integrity": "sha512-j+NpXXlcGVdyUNyY/qsJrqqeAdJdizCd+GKh3usXExSqy1aE9866jlAIL+xrfDU4w+LiMoma5pgE4emvFebZmA==",
"dependencies": {
"tslib": "^2.3.0"
},
"peerDependencies": {
"@angular/common": ">=13.0.0",
"@ngx-translate/core": ">=14.0.0",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -14331,6 +14358,22 @@
"dev": true,
"requires": {}
},
"@ngx-translate/core": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-14.0.0.tgz",
"integrity": "sha512-UevdwNCXMRCdJv//0kC8h2eSfmi02r29xeE8E9gJ1Al4D4jEJ7eiLPdjslTMc21oJNGguqqWeEVjf64SFtvw2w==",
"requires": {
"tslib": "^2.3.0"
}
},
"@ngx-translate/http-loader": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-7.0.0.tgz",
"integrity": "sha512-j+NpXXlcGVdyUNyY/qsJrqqeAdJdizCd+GKh3usXExSqy1aE9866jlAIL+xrfDU4w+LiMoma5pgE4emvFebZmA==",
"requires": {
"tslib": "^2.3.0"
}
},
"@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -17752,7 +17795,9 @@
"integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A=="
},
"karma": {
"version": "6.3.14",
"version": "6.3.9",
"resolved": "https://registry.npmjs.org/karma/-/karma-6.3.9.tgz",
"integrity": "sha512-E/MqdLM9uVIhfuyVnrhlGBu4miafBdXEAEqCmwdEMh3n17C7UWC/8Kvm3AYKr91gc7scutekZ0xv6rxRaUCtnw==",
"dev": true,
"requires": {
"body-parser": "^1.19.0",
@ -21998,4 +22043,4 @@
}
}
}
}
}

View File

@ -24,6 +24,8 @@
"@asymmetrik/ngx-leaflet": "^8.1.0",
"@fortawesome/fontawesome-free": "^5.15.4",
"@ng-bootstrap/ng-bootstrap": "11.0.0",
"@ngx-translate/core": "^14.0.0",
"@ngx-translate/http-loader": "^7.0.0",
"bootstrap": "^5.1.3",
"jwt-decode": "^3.1.2",
"leaflet": "^1.7.1",

View File

@ -2,14 +2,14 @@
<table *ngIf="sourceType === 'list'" id="table" class="table table-striped table-bordered dt-responsive nowrap">
<thead>
<tr>
<th>Nome</th>
<th>Disponibile</th>
<th>Autista</th>
<th>{{ 'name'|translate|titlecase }}</th>
<th>{{ 'available'|translate|titlecase }}</th>
<th>{{ 'driver'|translate|titlecase }}</th>
<ng-container *ngIf="auth.profile.hasRole('SUPER_EDITOR')">
<th>Chiama</th>
<th>{{ 'call'|translate|titlecase }}</th>
</ng-container>
<th>Interventi</th>
<th>Minuti disponibilità</th>
<th>{{ 'services'|translate|titlecase }}</th>
<th>{{ 'availability_minutes'|translate|titlecase }}</th>
</tr>
</thead>
<tbody id="table_body">

View File

@ -1,24 +1,24 @@
<div class="text-center">
<h3 *ngIf="available !== undefined">Attualmente sei: <b>{{ available ? "Disponibile" : "Non disponibile" }}{{ manual_mode ? "" : " (programmato)" }}</b></h3>
<h3 *ngIf="available !== undefined">{{ 'list.your_availability_is'|translate }} <b>{{ available ? ("available"|translate|uppercase) : ("unavailable"|translate|uppercase) }}{{ manual_mode ? "" : " ("+('programmed'|translate)+")" }}</b></h3>
<div id="availability-btn-group">
<button (click)="changeAvailibility(1)" type="button" [delay]="1000" tooltip="Cambia la tua disponibilità in 'attivo'" id="activate-btn" class="btn btn-lg btn-success me-1">Attiva</button>
<button (click)="changeAvailibility(0)" type="button" [delay]="1000" tooltip="Cambia la tua disponibilità in 'non attivo'" id="deactivate-btn" class="btn btn-lg btn-danger">Disattiva</button>
<button (click)="changeAvailibility(1)" type="button" [delay]="1000" tooltip="Cambia la tua disponibilità in 'attivo'" id="activate-btn" class="btn btn-lg btn-success me-1">{{ 'set_available'|translate|titlecase }}</button>
<button (click)="changeAvailibility(0)" type="button" [delay]="1000" tooltip="Cambia la tua disponibilità in 'non attivo'" id="deactivate-btn" class="btn btn-lg btn-danger">{{ 'set_unavailable'|translate|titlecase }}</button>
</div>
<ng-container *ngIf="manual_mode !== undefined">
<button type="button" class="btn btn-secondary" *ngIf="manual_mode" (click)="updateManualMode(0)">
Attiva programmazione oraria
{{ 'list.enable_schedules'|translate }}
</button>
<button type="button" class="btn btn-secondary" *ngIf="!manual_mode" (click)="updateManualMode(1)">
Disattiva programmazione oraria
{{ 'list.disable_schedules'|translate }}
</button>
<br>
</ng-container>
<button type="button" class="btn btn-lg" (click)="openScheduleModal()">
Modifica orari disponibilità
{{ 'list.update_schedules'|translate }}
</button>
</div>
<owner-image></owner-image>
<app-table [sourceType]="'list'" (changeAvailability)="changeAvailibility($event.newState, $event.user)" #table></app-table>
<div class="text-center">
<button (click)="requestTelegramToken()" class="btn btn-md btn-success mt-3">Collega l'account al bot Telegram</button>
<button (click)="requestTelegramToken()" class="btn btn-md btn-success mt-3">{{ 'list.connect_telegram_bot'|translate }}</button>
</div>

View File

@ -1,9 +1,9 @@
<div [className]="menuButtonClicked ? 'topnav responsive' : 'topnav'" id="topNavBar" *ngIf="auth.profile !== undefined">
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/list">Lista disponibilità</a>
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/services">Interventi</a>
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/trainings">Esercitazioni</a>
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/logs">Logs</a>
<a style="float: right;" id="logout">Ciao, {{ auth.profile.name }}. <b id="logout-text" (click)="auth.logout()">Logout</b></a>
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/list" translate>menu.list</a>
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/services" translate>menu.services</a>
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/trainings" translate>menu.trainings</a>
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/logs" translate>menu.logs</a>
<a style="float: right;" id="logout">Ciao, {{ auth.profile.name }}. <b id="logout-text" (click)="auth.logout()" translate>menu.logout</b></a>
<a class="icon" id="menuButton" (click)="menuButtonClicked = !menuButtonClicked"></a>
</div>
@ -14,6 +14,6 @@
<router-outlet></router-outlet>
<div id="footer" class="footer text-center p-3">
Allerta-VVF, software libero realizzato per i Vigili del Fuoco volontari.<br>
<p>Revisione {{ versions.revision }} ({{ revision_datetime_string }})</p>
{{ 'footer_text' | translate }}<br>
<p>{{ 'revision' | translate | titlecase }} {{ versions.revision }} ({{ revision_datetime_string }})</p>
</div>

View File

@ -3,6 +3,7 @@ import { AuthService } from './_services/auth.service';
import { LocationBackService } from 'src/app/_services/locationBack.service';
import { versions } from 'src/environments/versions';
import { Router, RouteConfigLoadStart, RouteConfigLoadEnd } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
@Component({
selector: 'app-root',
@ -18,9 +19,12 @@ export class AppComponent {
constructor(
public auth: AuthService,
private locationBackService: LocationBackService,
private router: Router
private router: Router,
private translate: TranslateService
) {
this.revision_datetime_string = new Date(versions.revision_timestamp).toLocaleString(undefined, { day: '2-digit', month: '2-digit', year: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric' });
this.translate.setDefaultLang('en');
this.translate.use("it");
}
ngOnInit () {

View File

@ -1,8 +1,10 @@
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { FormsModule } from '@angular/forms';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
import { ToastrModule } from 'ngx-toastr';
import { ModalModule } from 'ngx-bootstrap/modal';
import { TooltipModule } from 'ngx-bootstrap/tooltip';
@ -59,6 +61,13 @@ import { AuthInterceptor } from './_providers/auth-interceptor.provider';
// Register the ServiceWorker as soon as the app is stable
// or after 30 seconds (whichever comes first).
registrationStrategy: 'registerWhenStable:30000'
}),
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useFactory: HttpLoaderFactory,
deps: [HttpClient]
}
})
],
providers: [{
@ -69,3 +78,7 @@ import { AuthInterceptor } from './_providers/auth-interceptor.provider';
bootstrap: [AppComponent]
})
export class AppModule { }
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
return new TranslateHttpLoader(http);
}

View File

@ -0,0 +1,28 @@
{
"menu": {
"list": "List",
"services": "Services",
"trainings": "Trainings",
"logs": "Logs",
"logout": "Logout"
},
"list": {
"your_availability_is": "You are:",
"enable_schedules": "Enable hour schedules",
"disable_schedules": "Disable hour schedules",
"update_schedules": "Update availability schedules",
"connect_telegram_bot": "Connect your account to the Telegram bot"
},
"programmed": "programmed",
"available": "available",
"unavailable": "unavailable",
"set_available": "available",
"set_unavailable": "unavailable",
"name": "name",
"driver": "driver",
"call": "call",
"services": "services",
"availability_minutes": "availability_minutes",
"footer_text": "Allerta-VVF, free software developed for volunteer firefighters brigades.",
"revision": "revision"
}

View File

@ -0,0 +1,28 @@
{
"menu": {
"list": "Lista disponibilità",
"services": "Interventi",
"trainings": "Esercitazioni",
"logs": "Logs",
"logout": "Logout"
},
"list": {
"your_availability_is": "Attualmente sei:",
"enable_schedules": "Abilita programmazione oraria",
"disable_schedules": "Disattiva programmazione oraria",
"update_schedules": "Modifica orari disponibilità",
"connect_telegram_bot": "Collega l'account al bot Telegram"
},
"programmed": "programmed",
"available": "disponibile",
"unavailable": "non disponibile",
"set_available": "attiva",
"set_unavailable": "disattiva",
"name": "nome",
"driver": "autista",
"call": "chiama",
"services": "interventi",
"availability_minutes": "minuti di disponibilità",
"footer_text": "Allerta-VVF, software libero realizzato per i Vigili del Fuoco volontari.",
"revision": "revisione"
}