Update translations and labels

This commit is contained in:
Matteo Gheza 2024-01-07 22:06:31 +01:00
parent e7f65ab732
commit 2562fb1ff0
7 changed files with 164 additions and 101 deletions

View File

@ -20,90 +20,73 @@
<th></th>
<th></th>
<tr *ngIf="user.surname">
<td>Cognome</td>
<td>{{ 'surname'|translate|titlecase }}</td>
<td>{{ user.surname }}</td>
</tr>
<tr>
<td>Nome</td>
<td>{{ 'name'|translate|titlecase }}</td>
<td>{{ user.name }}</td>
</tr>
<tr>
<td>Username</td>
<td>{{ 'username'|translate|titlecase }}</td>
<td>{{ user.username }}</td>
</tr>
<tr *ngIf="user.birthday">
<td>Data di nascita</td>
<td>{{ 'birthday'|translate|titlecase }}</td>
<td>{{ user.birthday | date:'dd/MM/yyyy' }}</td>
</tr>
<tr *ngIf="user.birthplace">
<td>Luogo di nascita</td>
<td>{{ 'birthplace'|translate|titlecase }}</td>
<td>{{ user.birthplace }}<ng-container *ngIf="user.birthplace_province"> ({{ user.birthplace_province }})</ng-container></td>
</tr>
<tr *ngIf="user.ssn">
<td>Codice fiscale</td>
<td>{{ 'ssn'|translate|titlecase }}</td>
<td>{{ user.ssn }}</td>
</tr>
<tr>
<td colspan="2" class="text-center">
<br />
<h5>RECAPITI</h5>
<h5>{{ 'contact_information'|translate|uppercase }}</h5>
</td>
</tr>
<tr *ngIf="user.address">
<td>Indirizzo</td>
<td>{{ 'address'|translate|titlecase }}</td>
<td>
<a href="https://maps.google.com/?q={{ user.address }}" target="_blank">
{{ user.address }}<ng-container *ngIf="user.address_zip_code"> (CAP <i>{{ user.address_zip_code }}</i>)</ng-container>
{{ user.address }}<ng-container *ngIf="user.address_zip_code"> ({{ 'zip_code'|translate }} <i>{{ user.address_zip_code }}</i>)</ng-container>
</a>
</td>
</tr>
<tr>
<td>Telefono</td>
<td>{{ 'phone_number'|translate|titlecase }}</td>
<td><a href="tel:{{ user.phone_number }}">{{ user.phone_number }}</a></td>
</tr>
<tr>
<td>Email</td>
<td>{{ 'email'|translate|titlecase }}</td>
<td><a href="mailto:{{ user.email }}">{{ user.email }}</a></td>
</tr>
<!--
<tr>
<td colspan="2" class="text-center">
<br />
<h5>DOCUMENTI</h5>
<h5>{{ 'service_information'|translate|uppercase }}</h5>
</td>
</tr>
<tr>
<td>
<a href='./aj/download.php?f=p&d=pat' target='_blank'>Patente</a>
</td>
<td>
<small>Nr:</small> 123456789<br><small>Scad:</small> 11/02/2024
</td>
</tr>
-->
<tr>
<td colspan="2" class="text-center">
<br />
<h5>INFORMAZIONI SERVIZIO</h5>
</td>
</tr>
<tr>
<!--TODO: translate -->
<td>Autista</td>
<td>{{ 'driver'|translate|titlecase }}</td>
<td>
<i class="fa fa-check" style="color:green" *ngIf="user.driver"></i>
<i class="fa fa-times" style="color:red" *ngIf="!user.driver"></i>
</td>
</tr>
<tr>
<td>Tipologia</td>
<td>{{ 'chief'|translate|titlecase }}</td>
<td>
<img alt="red helmet" src="./assets/icons/red_helmet.png" width="20px" *ngIf="user.chief">
<img alt="black helmet" src="./assets/icons/black_helmet.png" width="20px" *ngIf="!user.chief">
<img alt="red helmet" src="./assets/icons/red_helmet.png" width="20px" *ngIf="user.chief"> Si
<img alt="black helmet" src="./assets/icons/black_helmet.png" width="20px" *ngIf="!user.chief"> No
</td>
</tr>
<tr *ngIf="user.course_date">
<td>Data corso</td>
<td>{{ 'course_date'|translate|titlecase }}</td>
<td>{{ user.course_date }}</td>
</tr>
</table>

View File

@ -3,6 +3,7 @@ import { ActivatedRouteSnapshot, Router, RouterStateSnapshot, UrlTree } from '@a
import { Observable } from 'rxjs';
import { GuardLoaderIconService } from '../_services/guard-loader-icon.service';
import { AuthService } from '../_services/auth.service';
import { TranslateService } from '@ngx-translate/core';
import Swal from 'sweetalert2';
@Injectable({
@ -12,7 +13,8 @@ export class AuthorizeGuard {
constructor(
private authService: AuthService,
private guardLoaderIconService: GuardLoaderIconService,
private router: Router
private router: Router,
private translateService: TranslateService
) { }
checkAuthAndRedirect(
@ -30,9 +32,8 @@ export class AuthorizeGuard {
let permissionsRequired = route.data["permissionsRequired"];
console.log(permissionsRequired, this.authService.profile.permissions);
if(!permissionsRequired.every((permission: string) => this.authService.profile.permissions.includes(permission))) {
//TODO: translate
Swal.fire({
title: "Non hai i permessi necessari per accedere a questa pagina",
title: this.translateService.instant("not_enough_permissions"),
icon: "error",
confirmButtonText: "Ok"
});

View File

@ -1,152 +1,153 @@
<back-btn></back-btn>
<div class="page-header">
<h1 class="text-center">ANAGRAFICA PERSONALE</h1>
<h1 class="text-center">{{ 'personal_information'|translate|uppercase }}</h1>
</div>
<h2 class="text-center mb-3">{{ user.surname }} {{ user.name }}</h2>
<form [formGroup]="profileForm" (ngSubmit)="formSubmit()" class="row g-4 m-3">
<div class="col-md-6">
<label for="name" class="form-label">Nome</label>
<label for="name" class="form-label">{{ 'name'|translate|titlecase }}</label>
<input formControlName="name" autocomplete="name" type="text" class="form-control" id="name">
</div>
<div class="col-md-6">
<label for="surname" class="form-label">Cognome</label>
<label for="surname" class="form-label">{{ 'surname'|translate|titlecase }}</label>
<input formControlName="surname" autocomplete="additional-name" type="text" class="form-control" id="surname">
</div>
<div class="col-md-6">
<label for="username" class="form-label">Username</label>
<label for="username" class="form-label">{{ 'username'|translate|titlecase }}</label>
<input formControlName="username" autocomplete="username" type="text" class="form-control" id="username">
</div>
<div class="col-md-6">
<label for="ssn" class="form-label">Codice fiscale</label>
<label for="ssn" class="form-label">{{ 'ssn'|translate|titlecase }}</label>
<input formControlName="ssn" autocomplete="ssn" type="text" class="form-control" id="ssn">
</div>
<div class="col-md-6">
<label for="birthday" class="form-label">Data di nascita</label>
<input formControlName="birthday" autocomplete="bday" type="text" class="form-control" placeholder="Premi per selezionare" id="birthday" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [maxDate]="birthdayMaxDate">
<label for="birthday" class="form-label">{{ 'birthday'|translate|titlecase }}</label>
<input formControlName="birthday" autocomplete="bday" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|titlecase" id="birthday" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [maxDate]="birthdayMaxDate">
</div>
<div class="col-md-6">
<label for="birthplace" class="form-label">Luogo di nascita</label>
<label for="birthplace" class="form-label">{{ 'birthplace'|translate|titlecase }}</label>
<div class="input-group" id="birthplace">
<input formControlName="birthplace" type="text" class="form-control" placeholder="Luogo">
<input formControlName="birthplace_province" type="text" class="form-control" placeholder="Provincia">
<input formControlName="birthplace" type="text" class="form-control" [placeholder]="'place'|translate|titlecase">
<input formControlName="birthplace_province" type="text" class="form-control" [placeholder]="'province'|translate|titlecase">
</div>
</div>
<h2 class="text-center mt-5"><i class="fas fa-fire-extinguisher"></i> Informazioni di servizio</h2>
<h2 class="text-center mt-5"><i class="fas fa-fire-extinguisher"></i> {{ 'service_information'|translate|titlecase }}</h2>
<div class="col-md-12">
<label for="course_date" class="form-label">Data corso</label>
<input formControlName="course_date" type="text" class="form-control" placeholder="Premi per selezionare" id="course_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [maxDate]="birthdayMaxDate">
<label for="course_date" class="form-label">{{ 'course_date'|translate|titlecase }}</label>
<input formControlName="course_date" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|titlecase" id="course_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [maxDate]="birthdayMaxDate">
</div>
<div class="col-md-6">
<label for="driver" class="form-label">Autista</label>
<label for="driver" class="form-label">{{ 'driver'|translate|titlecase }}</label>
<div class="form-check form-switch">
<input formControlName="driver" class="form-check-input custom-check-input" type="checkbox" role="switch" id="driver">
</div>
</div>
<div class="col-md-6">
<label for="chief" class="form-label">Caposquadra</label>
<label for="chief" class="form-label">{{ 'chief'|translate|titlecase }}</label>
<div class="form-check form-switch">
<input formControlName="chief" class="form-check-input custom-check-input" type="checkbox" role="switch" id="chief">
</div>
</div>
<div class="col-md-6">
<label for="banned" class="form-label">Bannato (non potrà accedere o interagire)</label>
<label for="banned" class="form-label">{{ 'banned'|translate|titlecase }}</label>
<div class="form-check form-switch">
<input formControlName="banned" class="form-check-input custom-check-input" type="checkbox" role="switch" id="banned">
</div>
</div>
<div class="col-md-6">
<label for="hidden" class="form-label">Nascosto nella lista</label>
<label for="hidden" class="form-label">{{ 'hidden'|translate|titlecase }}</label>
<div class="form-check form-switch">
<input formControlName="hidden" class="form-check-input custom-check-input" type="checkbox" role="switch" id="hidden">
</div>
</div>
<div class="col-md-6">
<label for="creation_date" class="form-label">Data aggiunta utente</label>
<label for="creation_date" class="form-label">{{ 'edit_user.creation_date'|translate|titlecase }}</label>
<input type="text" class="form-control" disabled id="creation_date" [value]="creation_date">
</div>
<div class="col-md-6">
<label for="update_date" class="form-label">Data ultima modifica all'utente</label>
<label for="update_date" class="form-label">{{ 'edit_user.last_update'|translate|titlecase }}</label>
<input type="text" class="form-control" disabled id="update_date" [value]="update_date">
</div>
<div class="col-md-12">
<label for="last_access_date" class="form-label">Ultimo accesso</label>
<label for="last_access_date" class="form-label">{{ 'edit_user.last_access'|translate|titlecase }}</label>
<input type="text" class="form-control" disabled id="last_access_date" [value]="last_access_date">
</div>
<h2 class="text-center mt-5"><i class="fas fa-phone"></i> Recapiti</h2>
<h2 class="text-center mt-5"><i class="fas fa-phone"></i> {{ 'contact_information'|translate|titlecase }}</h2>
<div class="col-md-8">
<label for="address" class="form-label">Indirizzo di residenza, civico</label>
<input formControlName="address" type="text" class="form-control" id="address" placeholder="Via/Piazza...">
<label for="address" class="form-label">{{ 'address'|translate|titlecase }}</label>
<input formControlName="address" type="text" class="form-control" id="address">
</div>
<div class="col-md-4">
<label for="address_zip_code" class="form-label">CAP</label>
<input formControlName="address_zip_code" type="number" class="form-control" id="address_zip_code" placeholder="12345" pattern="[0-9]{5}">
<label for="address_zip_code" class="form-label">{{ 'zip_code'|translate|titlecase }}</label>
<input formControlName="address_zip_code" type="number" class="form-control" id="address_zip_code" placeholder="12345">
</div>
<div class="col-md-6">
<label for="phone_number" class="form-label">Numero di telefono</label>
<input formControlName="phone_number" type="number" class="form-control" id="phone_number" placeholder="Fisso o cellulare">
<label for="phone_number" class="form-label">{{ 'phone_number'|translate|titlecase }}</label>
<input formControlName="phone_number" type="number" class="form-control" id="phone_number">
</div>
<div class="col-md-6">
<label for="email" class="form-label">Indirizzo email</label>
<input formControlName="email" type="email" class="form-control" id="email" placeholder="">
<label for="email" class="form-label">{{ 'email'|translate|titlecase }}</label>
<input formControlName="email" type="email" class="form-control" id="email">
</div>
<h2 class="text-center mt-5"><i class="fas fa-id-card"></i> Documenti</h2>
<h2 class="text-center mt-5"><i class="fas fa-id-card"></i> {{ 'documents'|translate|titlecase }}</h2>
<ng-container formGroupName="driving_license">
<h3 class="text-center mt-3">Patente <i class="fas fa-car-side"></i></h3>
<h3 class="text-center mt-3">{{ 'driving_license'|translate|titlecase }} <i class="fas fa-car-side"></i></h3>
<div class="col-md-12" *ngIf="dlCurrScanUrl !== null">
<img [src]="dlCurrScanUrl" class="img-fluid rounded mx-auto d-block w-50">
</div>
<div class="col-md-6">
<label for="dl_number" class="form-label">Numero patente</label>
<label for="dl_number" class="form-label">{{ 'driving_license_number'|translate|titlecase }}</label>
<input formControlName="number" autocomplete="dl-number" type="text" class="form-control" id="dl_number" placeholder="AB1234567">
</div>
<div class="col-md-6">
<label for="dl_type" class="form-label">Grado</label>
<input formControlName="type" autocomplete="dl-type" type="text" class="form-control" id="dl_type" placeholder="">
<label for="dl_type" class="form-label">{{ 'driving_license_type'|translate|titlecase }}</label>
<input formControlName="type" autocomplete="dl-type" type="text" class="form-control" id="dl_type">
</div>
<div class="col-md-6">
<label for="dl_expiration_date" class="form-label">Scadenza patente</label>
<input formControlName="expiration_date" autocomplete="dl-expiration-date" type="text" class="form-control" placeholder="Premi per selezionare" id="dl_expiration_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [minDate]="dlExpirationMinDate">
<label for="dl_expiration_date" class="form-label">{{ 'driving_license_expiration_date'|translate|titlecase }}</label>
<input formControlName="expiration_date" autocomplete="dl-expiration-date" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|titlecase" id="dl_expiration_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [minDate]="dlExpirationMinDate">
</div>
<div class="col-md-6">
<label for="dl_scan" class="form-label">Scansione patente</label>
<label for="dl_scan" class="form-label">{{ 'driving_license_scan'|translate|titlecase }}</label>
<input class="form-control" type="file" id="dl_scan" (change)="onDrivingLicenseScanSelected($event)" #drivingLicenseFileUpload>
<div *ngIf="tmpDrivingLicenseImgData !== null">
<img [src]="tmpDrivingLicenseImgData" class="img-fluid p-1 w-75">
<button type="button" class="btn btn-primary" *ngIf="dlScanNotUploadedYet" (click)="uploadDrivingLicenseScan(drivingLicenseFileUpload)">
<i class="fas fa-upload"></i> Carica scansione
<i class="fas fa-upload"></i> {{ 'upload_scan'|translate|titlecase }}
</button>
</div>
</div>
</ng-container>
<h2 class="text-center mt-5"><i class="fas fa-tshirt"></i> Indumenti</h2>
<h2 class="text-center mt-5"><i class="fas fa-tshirt"></i> {{ 'clothings'|translate|titlecase }}</h2>
<div class="col-md-6">
<label for="suit_size" class="form-label">Taglia tuta</label>
<label for="suit_size" class="form-label">{{ 'suit_size'|translate|titlecase }}</label>
<input formControlName="suit_size" type="text" class="form-control" id="suit_size" placeholder="M, L, XL...">
</div>
<div class="col-md-6">
<label for="boot_size" class="form-label">Taglia scarponi</label>
<label for="boot_size" class="form-label">{{ 'boot_size'|translate|titlecase }}</label>
<input formControlName="boot_size" type="text" class="form-control" id="boot_size" placeholder="41, 42, 43...">
</div>
<div class="col-12 m-3 mt-4">
<button type="submit" class="btn btn-lg btn-primary">Aggiorna</button>
<button type="submit" class="btn btn-lg btn-primary">{{ 'update'|translate|titlecase }}</button>
</div>
</form>
<ng-component *ngIf="false">
<hr>
<div class="text-center">
@ -206,3 +207,4 @@
</tbody>
</table>
</div>
</ng-component>

View File

@ -3,6 +3,7 @@ import { ActivatedRoute } from '@angular/router';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ApiClientService } from 'src/app/_services/api-client.service';
import { AuthService } from 'src/app/_services/auth.service';
import { TranslateService } from '@ngx-translate/core';
import Swal from 'sweetalert2';
@Component({
@ -46,9 +47,9 @@ export class EditUserComponent implements OnInit {
allowedImageTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'];
maxImageSize = 1024 * 1024 * 5; //5MB
creation_date: string = "MAI";
update_date: string = "MAI";
last_access_date: string = "MAI";
creation_date: string = this.translateService.instant("never").toUpperCase();
update_date: string = this.translateService.instant("never").toUpperCase();
last_access_date: string = this.translateService.instant("never").toUpperCase();
tmpDrivingLicenseImgData: string | null = null;
dlScanNotUploadedYet = true;
@ -58,7 +59,8 @@ export class EditUserComponent implements OnInit {
private route: ActivatedRoute,
private formBuilder: FormBuilder,
private api: ApiClientService,
private auth: AuthService
private auth: AuthService,
private translateService: TranslateService
) {
this.route.paramMap.subscribe(params => {
this.id = typeof params.get('id') === 'string' ? parseInt(params.get('id') || '') : undefined;
@ -95,7 +97,7 @@ export class EditUserComponent implements OnInit {
});
const convertToItalianDate = (date: string | null): string => {
if(!date) return "MAI";
if(!date) return this.translateService.instant("never").toUpperCase();
const dateObj = new Date(date);
return dateObj.toLocaleString('it-IT', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' });
}
@ -142,8 +144,8 @@ export class EditUserComponent implements OnInit {
if(!this.allowedImageTypes.includes(file.type)) {
event.target.value = null;
Swal.fire({
title: 'Errore',
text: 'Formato immagine non supportato',
title: this.translateService.instant("error_title"),
text: this.translateService.instant("edit_user.image_format_not_supported"),
icon: 'error',
confirmButtonText: 'Ok'
});
@ -152,8 +154,8 @@ export class EditUserComponent implements OnInit {
if(file.size > this.maxImageSize) {
event.target.value = null;
Swal.fire({
title: 'Errore',
text: 'File troppo grande',
title: this.translateService.instant("error_title"),
text: this.translateService.instant("edit_user.file_too_big"),
icon: 'error',
confirmButtonText: 'Ok'
});
@ -199,20 +201,19 @@ export class EditUserComponent implements OnInit {
data.driving_license.expiration_date = data.driving_license.expiration_date ? new Date(data.driving_license.expiration_date) : null;
if (this.id) {
//TODO: translate
this.api.put(`users/${this.id}`, data).then((response) => {
console.log(response);
Swal.fire({
title: 'Utente modificato',
text: 'L\'utente è stato modificato con successo',
title: this.translateService.instant("success_title"),
text: this.translateService.instant("edit_user.success_text"),
icon: 'success',
confirmButtonText: 'Ok'
});
}).catch((err) => {
console.log(err);
Swal.fire({
title: 'Errore',
text: 'Si è verificato un errore durante la modifica dell\'utente',
title: this.translateService.instant("error_title"),
text: this.translateService.instant("edit_user.error_text"),
icon: 'error',
confirmButtonText: 'Ok'
});

View File

@ -4,11 +4,11 @@
<div class="my-2 text-danger" *ngIf="!loginResponse.loginOk">{{ loginResponse.message }}</div>
<div class="form-floating">
<input type="text" class="form-control" (keydown.enter)="inputPassword.focus()" [(ngModel)]="username" id="username" [placeholder]="'username'|translate">
<label for="username" translate>login.username</label>
<label for="username">{{ 'username'|translate|titlecase }}</label>
</div>
<div class="form-floating">
<input type="password" class="form-control" (keydown.enter)="login()" [(ngModel)]="password" id="password" [placeholder]="'password'|translate" #inputPassword>
<label for="password" translate>login.password</label>
<label for="password">{{ 'password'|translate|titlecase }}</label>
</div>
<button class="w-100 btn btn-lg btn-primary" (click)="login()" [disabled]="loading">
<span *ngIf="!loading" translate>login.submit_btn</span>

View File

@ -52,8 +52,6 @@
"response_updated_successfully": "Response updated successfully"
},
"login": {
"username": "username",
"password": "password",
"submit_btn": "Login"
},
"place_details": {
@ -100,9 +98,20 @@
"training_load_failed": "Errore durante il caricamento dell'intervento. Riprovare più tardi",
"users_load_failed": "Errore durante il caricamento degli utenti. Riprovare più tardi"
},
"edit_user": {
"image_format_not_supported": "Image format not supported",
"file_too_big": "File too big",
"success_text": "User updated successfully",
"error_text": "User could not be updated. Please try again",
"creation_date": "User creation date",
"last_update": "User last update",
"last_access": "User last access"
},
"user_info_modal": {
"title": "User info"
},
"username": "username",
"password": "password",
"warning": "warning",
"press_for_more_info": "press here for more info",
"update_availability_schedule": "Update availability schedule",
@ -128,6 +137,30 @@
"set_available": "available",
"set_unavailable": "unavailable",
"name": "name",
"surname": "surname",
"ssn": "Social Security Number",
"address": "address",
"zip_code": "zip code",
"phone_number": "phone number",
"email": "email",
"birthday": "birthday",
"birthplace": "birthplace",
"personal_information": "personal information",
"contact_information": "contact information",
"service_information": "service information",
"course_date": "course date",
"documents": "documents",
"driving_license": "driving license",
"driving_license_expiration_date": "driving license expiration date",
"driving_license_number": "driving license number",
"driving_license_type": "driving license type",
"driving_license_scan": "driving license scan",
"upload_scan": "upload scan",
"clothings": "clothings",
"suit_size": "suit size",
"boot_size": "boot size",
"banned": "banned",
"hidden": "hidden",
"driver": "driver",
"drivers": "drivers",
"call": "call",
@ -148,6 +181,7 @@
"chief": "chief",
"crew": "crew",
"place": "place",
"province": "province",
"notes": "notes",
"type": "type",
"add": "add",
@ -166,5 +200,9 @@
"footer_text": "Allerta-VVF, free software developed for volunteer firefighters brigades.",
"revision": "revision",
"unknown": "unknown",
"edit": "edit"
"edit": "edit",
"never": "never",
"not_enough_permissions": "You don't have enough permissions to access this page.",
"error_title": "Error",
"success_title": "Successo"
}

View File

@ -52,8 +52,6 @@
"response_updated_successfully": "Risposta aggiornata con successo"
},
"login": {
"username": "username",
"password": "password",
"submit_btn": "Login"
},
"place_details": {
@ -100,9 +98,20 @@
"training_load_failed": "Errore durante il caricamento dell'intervento. Riprovare più tardi",
"users_load_failed": "Errore durante il caricamento degli utenti. Riprovare più tardi"
},
"edit_user": {
"image_format_not_supported": "Formato immagine non supportato",
"file_too_big": "File troppo grande",
"success_text": "Utente aggiornato con successo",
"error_text": "L'utente non può essere aggiornato. Riprova più tardi",
"creation_date": "Data di creazione dell'utente",
"last_update": "Data di ultima modifica dell'utente",
"last_access": "Ultimo accesso dell'utente"
},
"user_info_modal": {
"title": "Scheda utente"
},
"username": "username",
"password": "password",
"warning": "attenzione",
"press_for_more_info": "premi qui per informazioni",
"update_availability_schedule": "Aggiorna programmazione disponibilità",
@ -128,6 +137,30 @@
"set_available": "attiva",
"set_unavailable": "disattiva",
"name": "nome",
"surname": "cognome",
"ssn": "codice fiscale",
"address": "indirizzo",
"zip_code": "CAP",
"phone_number": "numero di telefono",
"email": "email",
"birthday": "data di nascita",
"birthplace": "luogo di nascita",
"personal_information": "anagrafica personale",
"contact_information": "recapiti",
"service_information": "informazioni di servizio",
"course_date": "data corso",
"documents": "documenti",
"driving_license": "patente",
"driving_license_expiration_date": "scadenza patente",
"driving_license_number": "numero patente",
"driving_license_type": "tipologia patente",
"driving_license_scan": "scansione patente",
"upload_scan": "carica scansione",
"clothings": "indumenti",
"suit_size": "taglia tuta",
"boot_size": "taglia scarponi",
"banned": "bannato",
"hidden": "nascosto",
"driver": "autista",
"drivers": "autisti",
"call": "chiama",
@ -148,6 +181,7 @@
"chief": "caposquadra",
"crew": "squadra",
"place": "luogo",
"province": "provincia",
"notes": "note",
"type": "tipologia",
"add": "aggiungi",
@ -166,5 +200,9 @@
"footer_text": "Allerta-VVF, software libero realizzato per i Vigili del Fuoco volontari.",
"revision": "revisione",
"unknown": "sconosciuto",
"edit": "modifica"
"edit": "modifica",
"never": "mai",
"not_enough_permissions": "Non hai i permessi necessari per accedere a questa pagina.",
"error_title": "Errore",
"success_title": "Successo"
}