feat: add it-IT to internationalization (#2439)

* login it

* deepl translations, corrections

* login, en typos

* it internal, typo fixes

* message texts, optim console texts, guide for internationalization

* missing console, fix de, en

* Add missing keys from main

* translate missing keys

* add it to console selection, change it policy descriptors

* add missing i18n from jwt idp, fixes

* add missing translations

* missing translations

* fix

* auth user language change, interceptor

* remove multiline operator

Co-authored-by: Livio Amstutz <livio.a@gmail.com>
This commit is contained in:
Max Peintner 2021-11-15 08:23:35 +01:00 committed by GitHub
parent cfdb8c3301
commit 12eed30c08
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 3082 additions and 275 deletions

View File

@ -21,27 +21,20 @@ import { ManagementService } from './services/mgmt.service';
import { ThemeService } from './services/theme.service'; import { ThemeService } from './services/theme.service';
import { UpdateService } from './services/update.service'; import { UpdateService } from './services/update.service';
@Component({ @Component({
selector: 'cnsl-root', selector: 'cnsl-root',
templateUrl: './app.component.html', templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'], styleUrls: ['./app.component.scss'],
animations: [ animations: [toolbarAnimation, ...navAnimations, accountCard, routeAnimations, adminLineAnimation],
toolbarAnimation,
...navAnimations,
accountCard,
routeAnimations,
adminLineAnimation,
],
}) })
export class AppComponent implements OnDestroy { export class AppComponent implements OnDestroy {
@ViewChild('drawer') public drawer!: MatDrawer; @ViewChild('drawer') public drawer!: MatDrawer;
@ViewChild('input', { static: false }) input!: ElementRef; @ViewChild('input', { static: false }) input!: ElementRef;
public isHandset$: Observable<boolean> = this.breakpointObserver public isHandset$: Observable<boolean> = this.breakpointObserver.observe('(max-width: 599px)').pipe(
.observe('(max-width: 599px)') map((result) => {
.pipe(map(result => {
return result.matches; return result.matches;
})); }),
);
@HostBinding('class') public componentCssClass: string = 'dark-theme'; @HostBinding('class') public componentCssClass: string = 'dark-theme';
public showAccount: boolean = false; public showAccount: boolean = false;
@ -78,9 +71,18 @@ export class AppComponent implements OnDestroy {
private activatedRoute: ActivatedRoute, private activatedRoute: ActivatedRoute,
@Inject(DOCUMENT) private document: Document, @Inject(DOCUMENT) private document: Document,
) { ) {
console.log('%cWait!', 'text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; color: #5469D4; font-size: 50px'); console.log(
console.log('%cInserting something here could give attackers access to your zitadel account.', 'color: red; font-size: 18px'); '%cWait!',
console.log('%cIf you don\'t know exactly what you\'re doing, close the window and stay on the safe side', 'font-size: 16px'); 'text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; color: #5469D4; font-size: 50px',
);
console.log(
'%cInserting something here could give attackers access to your zitadel account.',
'color: red; font-size: 18px',
);
console.log(
"%cIf you don't know exactly what you're doing, close the window and stay on the safe side",
'font-size: 16px',
);
console.log('%cIf you know exactly what you are doing, you should work for us', 'font-size: 16px'); console.log('%cIf you know exactly what you are doing, you should work for us', 'font-size: 16px');
this.setLanguage(); this.setLanguage();
@ -109,10 +111,7 @@ export class AppComponent implements OnDestroy {
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/lightbulb-off-outline.svg'), this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/lightbulb-off-outline.svg'),
); );
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon('mdi_radar', this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/radar.svg'));
'mdi_radar',
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/radar.svg'),
);
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon(
'mdi_lock_question', 'mdi_lock_question',
@ -129,20 +128,14 @@ export class AppComponent implements OnDestroy {
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/lock-reset.svg'), this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/lock-reset.svg'),
); );
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon('mdi_broom', this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/broom.svg'));
'mdi_broom',
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/broom.svg'),
);
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon(
'mdi_pin_outline', 'mdi_pin_outline',
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/pin-outline.svg'), this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/pin-outline.svg'),
); );
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon('mdi_pin', this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/pin.svg'));
'mdi_pin',
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/pin.svg'),
);
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon(
'mdi_format-letter-case-lower', 'mdi_format-letter-case-lower',
@ -159,54 +152,40 @@ export class AppComponent implements OnDestroy {
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/counter.svg'), this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/counter.svg'),
); );
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon('mdi_openid', this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/openid.svg'));
'mdi_openid',
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/openid.svg'),
);
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon('mdi_jwt', this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/jwt.svg'));
'mdi_jwt',
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/jwt.svg'),
);
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon('mdi_symbol', this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/symbol.svg'));
'mdi_symbol',
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/symbol.svg'),
);
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon(
'mdi_numeric', 'mdi_numeric',
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/numeric.svg'), this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/numeric.svg'),
); );
this.matIconRegistry.addSvgIcon( this.matIconRegistry.addSvgIcon('mdi_api', this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/api.svg'));
'mdi_api',
this.domSanitizer.bypassSecurityTrustResourceUrl('assets/mdi/api.svg'),
);
this.activatedRoute.queryParams this.activatedRoute.queryParams.pipe(takeUntil(this.destroy$)).subscribe((route) => {
.pipe(takeUntil(this.destroy$)) const { org } = route;
.subscribe(route => { if (org) {
const { org } = route; this.authService.getActiveOrg(org).then((queriedOrg) => {
if (org) { this.org = queriedOrg;
this.authService.getActiveOrg(org).then(queriedOrg => { });
this.org = queriedOrg; }
}); });
}
});
this.loadPrivateLabelling(); this.loadPrivateLabelling();
this.getProjectCount(); this.getProjectCount();
this.authService.activeOrgChanged.pipe(takeUntil(this.destroy$)).subscribe(org => { this.authService.activeOrgChanged.pipe(takeUntil(this.destroy$)).subscribe((org) => {
this.org = org; this.org = org;
this.getProjectCount(); this.getProjectCount();
}); });
this.authenticationService.authenticationChanged.pipe(takeUntil(this.destroy$)).subscribe((authenticated) => { this.authenticationService.authenticationChanged.pipe(takeUntil(this.destroy$)).subscribe((authenticated) => {
if (authenticated) { if (authenticated) {
this.authService.getActiveOrg().then(org => { this.authService.getActiveOrg().then((org) => {
this.org = org; this.org = org;
}); });
} }
@ -219,17 +198,15 @@ export class AppComponent implements OnDestroy {
} }
this.isDarkTheme = this.themeService.isDarkTheme; this.isDarkTheme = this.themeService.isDarkTheme;
this.isDarkTheme.subscribe(dark => this.onSetTheme(dark ? 'dark-theme' : 'light-theme')); this.isDarkTheme.subscribe((dark) => this.onSetTheme(dark ? 'dark-theme' : 'light-theme'));
this.translate.onLangChange.subscribe((language: LangChangeEvent) => { this.translate.onLangChange.subscribe((language: LangChangeEvent) => {
this.document.documentElement.lang = language.lang; this.document.documentElement.lang = language.lang;
this.language = language.lang; this.language = language.lang;
}); });
this.filterControl.valueChanges.pipe(debounceTime(300)).subscribe(value => { this.filterControl.valueChanges.pipe(debounceTime(300)).subscribe((value) => {
this.loadOrgs( this.loadOrgs(value.trim().toLowerCase());
value.trim().toLowerCase(),
);
}); });
this.hideAdminWarn = localStorage.getItem('hideAdministratorWarning') === 'true' ? true : false; this.hideAdminWarn = localStorage.getItem('hideAdministratorWarning') === 'true' ? true : false;
@ -270,7 +247,7 @@ export class AppComponent implements OnDestroy {
setDefaultColors(); setDefaultColors();
this.mgmtService.getLabelPolicy().then(labelpolicy => { this.mgmtService.getLabelPolicy().then((labelpolicy) => {
if (labelpolicy.policy) { if (labelpolicy.policy) {
this.labelpolicy = labelpolicy.policy; this.labelpolicy = labelpolicy.policy;
@ -296,8 +273,7 @@ export class AppComponent implements OnDestroy {
} }
public loadPolicies(): void { public loadPolicies(): void {
this.mgmtService.getPrivacyPolicy().then(privacypolicy => { this.mgmtService.getPrivacyPolicy().then((privacypolicy) => {
if (privacypolicy.policy) { if (privacypolicy.policy) {
this.privacyPolicy = privacypolicy.policy; this.privacyPolicy = privacypolicy.policy;
} }
@ -316,7 +292,7 @@ export class AppComponent implements OnDestroy {
this.orgLoading$.next(true); this.orgLoading$.next(true);
this.orgs$ = from(this.authService.listMyProjectOrgs(10, 0, query ? [query] : undefined)).pipe( this.orgs$ = from(this.authService.listMyProjectOrgs(10, 0, query ? [query] : undefined)).pipe(
map(resp => { map((resp) => {
return resp.resultList.sort((left, right) => left.name.localeCompare(right.name)); return resp.resultList.sort((left, right) => left.name.localeCompare(right.name));
}), }),
catchError(() => of([])), catchError(() => of([])),
@ -347,16 +323,15 @@ export class AppComponent implements OnDestroy {
this.translate.addLangs(['en', 'de']); this.translate.addLangs(['en', 'de']);
this.translate.setDefaultLang('en'); this.translate.setDefaultLang('en');
this.authService.user.subscribe(userprofile => { this.authService.user.subscribe((userprofile) => {
if (userprofile) { if (userprofile) {
// this.user = userprofile; // this.user = userprofile;
const cropped = navigator.language.split('-')[0] ?? 'en'; const cropped = navigator.language.split('-')[0] ?? 'en';
const fallbackLang = cropped.match(/en|de/) ? cropped : 'en'; const fallbackLang = cropped.match(/en|de|it/) ? cropped : 'en';
const lang = const lang = userprofile?.human?.profile?.preferredLanguage.match(/en|de|it/)
userprofile?.human?.profile?.preferredLanguage.match(/en|de/) ? ? userprofile.human.profile?.preferredLanguage
userprofile.human.profile?.preferredLanguage : : fallbackLang;
fallbackLang;
this.translate.use(lang); this.translate.use(lang);
this.language = lang; this.language = lang;
this.document.documentElement.lang = lang; this.document.documentElement.lang = lang;
@ -388,4 +363,3 @@ export class AppComponent implements OnDestroy {
}, 0); }, 0);
} }
} }

View File

@ -107,7 +107,7 @@ export class LoginTextsComponent implements OnDestroy {
public serviceType: PolicyComponentServiceType = PolicyComponentServiceType.MGMT; public serviceType: PolicyComponentServiceType = PolicyComponentServiceType.MGMT;
public KeyNamesArray: string[] = KeyNamesArray; public KeyNamesArray: string[] = KeyNamesArray;
public LOCALES: string[] = ['en']; public LOCALES: string[] = ['en', 'de', 'it'];
private sub: Subscription = new Subscription(); private sub: Subscription = new Subscription();

View File

@ -383,7 +383,7 @@ export class MessageTextsComponent implements OnDestroy {
}; };
public locale: string = 'en'; public locale: string = 'en';
public LOCALES: string[] = ['en']; public LOCALES: string[] = ['en', 'de', 'it'];
private sub: Subscription = new Subscription(); private sub: Subscription = new Subscription();
public currentPolicy: GridPolicy = MESSAGE_TEXTS_POLICY; public currentPolicy: GridPolicy = MESSAGE_TEXTS_POLICY;

View File

@ -18,7 +18,7 @@ import { EditDialogComponent, EditDialogType } from './edit-dialog/edit-dialog.c
export class AuthUserDetailComponent implements OnDestroy { export class AuthUserDetailComponent implements OnDestroy {
public user!: User.AsObject; public user!: User.AsObject;
public genders: Gender[] = [Gender.GENDER_MALE, Gender.GENDER_FEMALE, Gender.GENDER_DIVERSE]; public genders: Gender[] = [Gender.GENDER_MALE, Gender.GENDER_FEMALE, Gender.GENDER_DIVERSE];
public languages: string[] = ['de', 'en']; public languages: string[] = ['de', 'en', 'it'];
private subscription: Subscription = new Subscription(); private subscription: Subscription = new Subscription();
@ -39,19 +39,26 @@ export class AuthUserDetailComponent implements OnDestroy {
) { ) {
this.loading = true; this.loading = true;
this.refreshUser(); this.refreshUser();
this.userService.getSupportedLanguages().then((lang) => {
this.languages = lang.languagesList;
});
} }
refreshUser(): void { refreshUser(): void {
this.refreshChanges$.emit(); this.refreshChanges$.emit();
this.userService.getMyUser().then(resp => { this.userService
if (resp.user) { .getMyUser()
this.user = resp.user; .then((resp) => {
} if (resp.user) {
this.loading = false; this.user = resp.user;
}).catch(error => { }
this.toast.showError(error); this.loading = false;
this.loading = false; })
}); .catch((error) => {
this.toast.showError(error);
this.loading = false;
});
} }
public ngOnDestroy(): void { public ngOnDestroy(): void {
@ -71,13 +78,15 @@ export class AuthUserDetailComponent implements OnDestroy {
width: '400px', width: '400px',
}); });
dialogRefPhone.afterClosed().subscribe(resp => { dialogRefPhone.afterClosed().subscribe((resp) => {
if (resp && resp !== this.user.userName) { if (resp && resp !== this.user.userName) {
this.userService.updateMyUserName(resp).then(() => { this.userService
.updateMyUserName(resp)
.then(() => {
this.toast.showInfo('USER.TOAST.USERNAMECHANGED', true); this.toast.showInfo('USER.TOAST.USERNAMECHANGED', true);
this.refreshUser(); this.refreshUser();
}) })
.catch(error => { .catch((error) => {
this.toast.showError(error); this.toast.showError(error);
}); });
} }
@ -101,7 +110,7 @@ export class AuthUserDetailComponent implements OnDestroy {
this.toast.showInfo('USER.TOAST.SAVED', true); this.toast.showInfo('USER.TOAST.SAVED', true);
this.refreshChanges$.emit(); this.refreshChanges$.emit();
}) })
.catch(error => { .catch((error) => {
this.toast.showError(error); this.toast.showError(error);
}); });
} }
@ -109,7 +118,8 @@ export class AuthUserDetailComponent implements OnDestroy {
public saveEmail(email: string): void { public saveEmail(email: string): void {
this.userService this.userService
.setMyEmail(email).then(() => { .setMyEmail(email)
.then(() => {
this.toast.showInfo('USER.TOAST.EMAILSAVED', true); this.toast.showInfo('USER.TOAST.EMAILSAVED', true);
if (this.user.human) { if (this.user.human) {
const mailToSet = new Email(); const mailToSet = new Email();
@ -117,18 +127,22 @@ export class AuthUserDetailComponent implements OnDestroy {
this.user.human.email = mailToSet.toObject(); this.user.human.email = mailToSet.toObject();
this.refreshUser(); this.refreshUser();
} }
}).catch(error => { })
.catch((error) => {
this.toast.showError(error); this.toast.showError(error);
}); });
} }
public enteredPhoneCode(code: string): void { public enteredPhoneCode(code: string): void {
this.userService.verifyMyPhone(code).then(() => { this.userService
this.toast.showInfo('USER.TOAST.PHONESAVED', true); .verifyMyPhone(code)
this.refreshUser(); .then(() => {
}).catch(error => { this.toast.showInfo('USER.TOAST.PHONESAVED', true);
this.toast.showError(error); this.refreshUser();
}); })
.catch((error) => {
this.toast.showError(error);
});
} }
public changedLanguage(language: string): void { public changedLanguage(language: string): void {
@ -136,40 +150,50 @@ export class AuthUserDetailComponent implements OnDestroy {
} }
public resendPhoneVerification(): void { public resendPhoneVerification(): void {
this.userService.resendMyPhoneVerification().then(() => { this.userService
this.toast.showInfo('USER.TOAST.PHONEVERIFICATIONSENT', true); .resendMyPhoneVerification()
this.refreshChanges$.emit(); .then(() => {
}).catch(error => { this.toast.showInfo('USER.TOAST.PHONEVERIFICATIONSENT', true);
this.toast.showError(error); this.refreshChanges$.emit();
}); })
.catch((error) => {
this.toast.showError(error);
});
} }
public resendEmailVerification(): void { public resendEmailVerification(): void {
this.userService.resendMyEmailVerification().then(() => { this.userService
this.toast.showInfo('USER.TOAST.EMAILVERIFICATIONSENT', true); .resendMyEmailVerification()
this.refreshChanges$.emit(); .then(() => {
}).catch(error => { this.toast.showInfo('USER.TOAST.EMAILVERIFICATIONSENT', true);
this.toast.showError(error); this.refreshChanges$.emit();
}); })
.catch((error) => {
this.toast.showError(error);
});
} }
public deletePhone(): void { public deletePhone(): void {
this.userService.removeMyPhone().then(() => { this.userService
this.toast.showInfo('USER.TOAST.PHONEREMOVED', true); .removeMyPhone()
if (this.user.human?.phone) { .then(() => {
const phone = new Phone(); this.toast.showInfo('USER.TOAST.PHONEREMOVED', true);
this.user.human.phone = phone.toObject(); if (this.user.human?.phone) {
this.refreshUser(); const phone = new Phone();
} this.user.human.phone = phone.toObject();
}).catch(error => { this.refreshUser();
this.toast.showError(error); }
}); })
.catch((error) => {
this.toast.showError(error);
});
} }
public savePhone(phone: string): void { public savePhone(phone: string): void {
if (this.user.human) { if (this.user.human) {
this.userService this.userService
.setMyPhone(phone).then(() => { .setMyPhone(phone)
.then(() => {
this.toast.showInfo('USER.TOAST.PHONESAVED', true); this.toast.showInfo('USER.TOAST.PHONESAVED', true);
if (this.user.human) { if (this.user.human) {
const phoneToSet = new Phone(); const phoneToSet = new Phone();
@ -177,7 +201,8 @@ export class AuthUserDetailComponent implements OnDestroy {
this.user.human.phone = phoneToSet.toObject(); this.user.human.phone = phoneToSet.toObject();
this.refreshUser(); this.refreshUser();
} }
}).catch(error => { })
.catch((error) => {
this.toast.showError(error); this.toast.showError(error);
}); });
} }
@ -199,7 +224,7 @@ export class AuthUserDetailComponent implements OnDestroy {
width: '400px', width: '400px',
}); });
dialogRefPhone.afterClosed().subscribe(resp => { dialogRefPhone.afterClosed().subscribe((resp) => {
if (resp) { if (resp) {
this.savePhone(resp); this.savePhone(resp);
} }
@ -219,7 +244,7 @@ export class AuthUserDetailComponent implements OnDestroy {
width: '400px', width: '400px',
}); });
dialogRefEmail.afterClosed().subscribe(resp => { dialogRefEmail.afterClosed().subscribe((resp) => {
if (resp) { if (resp) {
this.saveEmail(resp); this.saveEmail(resp);
} }

View File

@ -22,6 +22,8 @@ import {
GetMyProfileResponse, GetMyProfileResponse,
GetMyUserRequest, GetMyUserRequest,
GetMyUserResponse, GetMyUserResponse,
GetSupportedLanguagesRequest,
GetSupportedLanguagesResponse,
ListMyAuthFactorsRequest, ListMyAuthFactorsRequest,
ListMyAuthFactorsResponse, ListMyAuthFactorsResponse,
ListMyLinkedIDPsRequest, ListMyLinkedIDPsRequest,
@ -86,8 +88,6 @@ import { Gender, MembershipQuery, User, WebAuthNVerification } from '../proto/ge
import { GrpcService } from './grpc.service'; import { GrpcService } from './grpc.service';
import { StorageKey, StorageLocation, StorageService } from './storage.service'; import { StorageKey, StorageLocation, StorageService } from './storage.service';
@Injectable({ @Injectable({
providedIn: 'root', providedIn: 'root',
}) })
@ -108,26 +108,26 @@ export class GrpcAuthService {
private storage: StorageService, private storage: StorageService,
) { ) {
this.user = merge( this.user = merge(
of(this.oauthService.getAccessToken()).pipe( of(this.oauthService.getAccessToken()).pipe(filter((token) => (token ? true : false))),
filter(token => token ? true : false),
),
this.oauthService.events.pipe( this.oauthService.events.pipe(
filter(e => e.type === 'token_received'), filter((e) => e.type === 'token_received'),
timeout(this.oauthService.waitForTokenInMsec || 0), timeout(this.oauthService.waitForTokenInMsec || 0),
catchError(_ => of(null)), // timeout is not an error catchError((_) => of(null)), // timeout is not an error
map(_ => this.oauthService.getAccessToken()), map((_) => this.oauthService.getAccessToken()),
), ),
).pipe( ).pipe(
take(1), take(1),
mergeMap(() => { mergeMap(() => {
return from(this.getMyUser().then(resp => { return from(
const user = resp.user; this.getMyUser().then((resp) => {
if (user) { const user = resp.user;
return user; if (user) {
} else { return user;
return undefined; } else {
} return undefined;
})); }
}),
);
}), }),
finalize(() => { finalize(() => {
this.loadPermissions(); this.loadPermissions();
@ -143,7 +143,7 @@ export class GrpcAuthService {
public async getActiveOrg(id?: string): Promise<Org.AsObject> { public async getActiveOrg(id?: string): Promise<Org.AsObject> {
if (id) { if (id) {
const find = this.cachedOrgs.find(tmp => tmp.id === id); const find = this.cachedOrgs.find((tmp) => tmp.id === id);
if (find) { if (find) {
this.setActiveOrg(find); this.setActiveOrg(find);
return Promise.resolve(find); return Promise.resolve(find);
@ -151,7 +151,7 @@ export class GrpcAuthService {
const orgs = (await this.listMyProjectOrgs(10, 0)).resultList; const orgs = (await this.listMyProjectOrgs(10, 0)).resultList;
this.cachedOrgs = orgs; this.cachedOrgs = orgs;
const toFind = this.cachedOrgs.find(tmp => tmp.id === id); const toFind = this.cachedOrgs.find((tmp) => tmp.id === id);
if (toFind) { if (toFind) {
this.setActiveOrg(toFind); this.setActiveOrg(toFind);
return Promise.resolve(toFind); return Promise.resolve(toFind);
@ -167,7 +167,7 @@ export class GrpcAuthService {
} }
const org = this.storage.getItem<Org.AsObject>(StorageKey.organization, StorageLocation.local); const org = this.storage.getItem<Org.AsObject>(StorageKey.organization, StorageLocation.local);
if (org && orgs.find(tmp => tmp.id === org.id)) { if (org && orgs.find((tmp) => tmp.id === org.id)) {
this.storage.setItem(StorageKey.organization, org, StorageLocation.session); this.storage.setItem(StorageKey.organization, org, StorageLocation.session);
return org; return org;
} }
@ -175,7 +175,7 @@ export class GrpcAuthService {
if (orgs.length === 0) { if (orgs.length === 0) {
return Promise.reject(new Error('No organizations found!')); return Promise.reject(new Error('No organizations found!'));
} }
const orgToSet = orgs.find(element => element.id !== '0' && element.name !== ''); const orgToSet = orgs.find((element) => element.id !== '0' && element.name !== '');
if (orgToSet) { if (orgToSet) {
this.setActiveOrg(orgToSet); this.setActiveOrg(orgToSet);
@ -197,31 +197,35 @@ export class GrpcAuthService {
} }
private loadPermissions(): void { private loadPermissions(): void {
from(this.listMyZitadelPermissions()).pipe( from(this.listMyZitadelPermissions())
map(rolesResp => rolesResp.resultList), .pipe(
catchError(_ => { map((rolesResp) => rolesResp.resultList),
return of([]); catchError((_) => {
}), return of([]);
finalize(() => { }),
this.fetchedZitadelPermissions.next(true); finalize(() => {
}), this.fetchedZitadelPermissions.next(true);
).subscribe(roles => { }),
this.zitadelPermissions.next(roles); )
}); .subscribe((roles) => {
this.zitadelPermissions.next(roles);
});
} }
private loadFeatures(): void { private loadFeatures(): void {
from(this.listMyZitadelFeatures()).pipe( from(this.listMyZitadelFeatures())
map(featuresResp => featuresResp.resultList), .pipe(
catchError(_ => { map((featuresResp) => featuresResp.resultList),
return of([]); catchError((_) => {
}), return of([]);
finalize(() => { }),
this.fetchedZitadelFeatures.next(true); finalize(() => {
}), this.fetchedZitadelFeatures.next(true);
).subscribe(features => { }),
this.zitadelFeatures.next(features); )
}); .subscribe((features) => {
this.zitadelFeatures.next(features);
});
} }
/** /**
@ -230,7 +234,7 @@ export class GrpcAuthService {
*/ */
public isAllowed(roles: string[] | RegExp[]): Observable<boolean> { public isAllowed(roles: string[] | RegExp[]): Observable<boolean> {
if (roles && roles.length > 0) { if (roles && roles.length > 0) {
return this.zitadelPermissions.pipe(switchMap(zroles => of(this.hasRoles(zroles, roles)))); return this.zitadelPermissions.pipe(switchMap((zroles) => of(this.hasRoles(zroles, roles))));
} else { } else {
return of(false); return of(false);
} }
@ -242,11 +246,15 @@ export class GrpcAuthService {
* @param requestedRoles required roles for accessing the respective component * @param requestedRoles required roles for accessing the respective component
*/ */
public hasRoles(userRoles: string[], requestedRoles: string[] | RegExp[]): boolean { public hasRoles(userRoles: string[], requestedRoles: string[] | RegExp[]): boolean {
return requestedRoles.findIndex((regexp: any) => { return (
return userRoles.findIndex(role => { requestedRoles.findIndex((regexp: any) => {
return new RegExp(regexp).test(role); return (
}) > -1; userRoles.findIndex((role) => {
}) > -1; return new RegExp(regexp).test(role);
}) > -1
);
}) > -1
);
} }
/** /**
@ -255,7 +263,7 @@ export class GrpcAuthService {
*/ */
public canUseFeature(features: string[] | RegExp[]): Observable<boolean> { public canUseFeature(features: string[] | RegExp[]): Observable<boolean> {
if (features && features.length > 0) { if (features && features.length > 0) {
return this.zitadelFeatures.pipe(switchMap(zFeatures => of(this.hasFeature(zFeatures, features)))); return this.zitadelFeatures.pipe(switchMap((zFeatures) => of(this.hasFeature(zFeatures, features))));
} else { } else {
return of(false); return of(false);
} }
@ -267,33 +275,33 @@ export class GrpcAuthService {
* @param requestedFeature required features for accessing the respective component * @param requestedFeature required features for accessing the respective component
*/ */
public hasFeature(userFeatures: string[], requestedFeatures: string[] | RegExp[]): boolean { public hasFeature(userFeatures: string[], requestedFeatures: string[] | RegExp[]): boolean {
return requestedFeatures.findIndex((regexp: any) => { return (
return userFeatures.findIndex(feature => { requestedFeatures.findIndex((regexp: any) => {
return new RegExp(regexp).test(feature); return (
}) > -1; userFeatures.findIndex((feature) => {
}) > -1; return new RegExp(regexp).test(feature);
}) > -1
);
}) > -1
);
} }
public getMyProfile(): Promise<GetMyProfileResponse.AsObject> { public getMyProfile(): Promise<GetMyProfileResponse.AsObject> {
return this.grpcService.auth.getMyProfile(new GetMyProfileRequest(), null).then(resp => resp.toObject()); return this.grpcService.auth.getMyProfile(new GetMyProfileRequest(), null).then((resp) => resp.toObject());
} }
public getMyPasswordComplexityPolicy(): Promise<GetMyPasswordComplexityPolicyResponse.AsObject> { public getMyPasswordComplexityPolicy(): Promise<GetMyPasswordComplexityPolicyResponse.AsObject> {
return this.grpcService.auth.getMyPasswordComplexityPolicy( return this.grpcService.auth
new GetMyPasswordComplexityPolicyRequest(), null, .getMyPasswordComplexityPolicy(new GetMyPasswordComplexityPolicyRequest(), null)
).then(resp => resp.toObject()); .then((resp) => resp.toObject());
} }
public getMyUser(): Promise<GetMyUserResponse.AsObject> { public getMyUser(): Promise<GetMyUserResponse.AsObject> {
return this.grpcService.auth.getMyUser( return this.grpcService.auth.getMyUser(new GetMyUserRequest(), null).then((resp) => resp.toObject());
new GetMyUserRequest(), null,
).then(resp => resp.toObject());
} }
public listMyMultiFactors(): Promise<ListMyAuthFactorsResponse.AsObject> { public listMyMultiFactors(): Promise<ListMyAuthFactorsResponse.AsObject> {
return this.grpcService.auth.listMyAuthFactors( return this.grpcService.auth.listMyAuthFactors(new ListMyAuthFactorsRequest(), null).then((resp) => resp.toObject());
new ListMyAuthFactorsRequest(), null,
).then(resp => resp.toObject());
} }
public listMyProjectOrgs( public listMyProjectOrgs(
@ -313,7 +321,7 @@ export class GrpcAuthService {
req.setQueriesList(queryList); req.setQueriesList(queryList);
} }
return this.grpcService.auth.listMyProjectOrgs(req, null).then(resp => resp.toObject()); return this.grpcService.auth.listMyProjectOrgs(req, null).then((resp) => resp.toObject());
} }
public updateMyProfile( public updateMyProfile(
@ -343,7 +351,7 @@ export class GrpcAuthService {
if (preferredLanguage) { if (preferredLanguage) {
req.setPreferredLanguage(preferredLanguage); req.setPreferredLanguage(preferredLanguage);
} }
return this.grpcService.auth.updateMyProfile(req, null).then(resp => resp.toObject()); return this.grpcService.auth.updateMyProfile(req, null).then((resp) => resp.toObject());
} }
public get zitadelPermissionsChanged(): Observable<string[]> { public get zitadelPermissionsChanged(): Observable<string[]> {
@ -352,11 +360,14 @@ export class GrpcAuthService {
public listMyUserSessions(): Promise<ListMyUserSessionsResponse.AsObject> { public listMyUserSessions(): Promise<ListMyUserSessionsResponse.AsObject> {
const req = new ListMyUserSessionsRequest(); const req = new ListMyUserSessionsRequest();
return this.grpcService.auth.listMyUserSessions(req, null).then(resp => resp.toObject()); return this.grpcService.auth.listMyUserSessions(req, null).then((resp) => resp.toObject());
} }
public listMyUserGrants(limit?: number, offset?: number, queryList?: ListQuery[]): public listMyUserGrants(
Promise<ListMyUserGrantsResponse.AsObject> { limit?: number,
offset?: number,
queryList?: ListQuery[],
): Promise<ListMyUserGrantsResponse.AsObject> {
const req = new ListMyUserGrantsRequest(); const req = new ListMyUserGrantsRequest();
const query = new ListQuery(); const query = new ListQuery();
if (limit) { if (limit) {
@ -366,10 +377,12 @@ export class GrpcAuthService {
query.setOffset(offset); query.setOffset(offset);
} }
req.setQuery(query); req.setQuery(query);
return this.grpcService.auth.listMyUserGrants(req, null).then(resp => resp.toObject()); return this.grpcService.auth.listMyUserGrants(req, null).then((resp) => resp.toObject());
} }
public listMyMemberships(limit: number, offset: number, public listMyMemberships(
limit: number,
offset: number,
queryList?: MembershipQuery[], queryList?: MembershipQuery[],
): Promise<ListMyMembershipsResponse.AsObject> { ): Promise<ListMyMembershipsResponse.AsObject> {
const req = new ListMyMembershipsRequest(); const req = new ListMyMembershipsRequest();
@ -384,92 +397,87 @@ export class GrpcAuthService {
req.setQueriesList(queryList); req.setQueriesList(queryList);
} }
req.setQuery(metadata); req.setQuery(metadata);
return this.grpcService.auth.listMyMemberships(req, null).then(resp => resp.toObject()); return this.grpcService.auth.listMyMemberships(req, null).then((resp) => resp.toObject());
} }
public getMyEmail(): Promise<GetMyEmailResponse.AsObject> { public getMyEmail(): Promise<GetMyEmailResponse.AsObject> {
const req = new GetMyEmailRequest(); const req = new GetMyEmailRequest();
return this.grpcService.auth.getMyEmail(req, null).then(resp => resp.toObject()); return this.grpcService.auth.getMyEmail(req, null).then((resp) => resp.toObject());
} }
public setMyEmail(email: string): Promise<SetMyEmailResponse.AsObject> { public setMyEmail(email: string): Promise<SetMyEmailResponse.AsObject> {
const req = new SetMyEmailRequest(); const req = new SetMyEmailRequest();
req.setEmail(email); req.setEmail(email);
return this.grpcService.auth.setMyEmail(req, null).then(resp => resp.toObject()); return this.grpcService.auth.setMyEmail(req, null).then((resp) => resp.toObject());
} }
public resendMyEmailVerification(): Promise<ResendMyEmailVerificationResponse.AsObject> { public resendMyEmailVerification(): Promise<ResendMyEmailVerificationResponse.AsObject> {
const req = new ResendMyEmailVerificationRequest(); const req = new ResendMyEmailVerificationRequest();
return this.grpcService.auth.resendMyEmailVerification(req, null).then(resp => resp.toObject()); return this.grpcService.auth.resendMyEmailVerification(req, null).then((resp) => resp.toObject());
}
public getSupportedLanguages(): Promise<GetSupportedLanguagesResponse.AsObject> {
const req = new GetSupportedLanguagesRequest();
return this.grpcService.auth.getSupportedLanguages(req, null).then((resp) => resp.toObject());
} }
public removeMyPhone(): Promise<RemoveMyPhoneResponse.AsObject> { public removeMyPhone(): Promise<RemoveMyPhoneResponse.AsObject> {
return this.grpcService.auth.removeMyPhone( return this.grpcService.auth.removeMyPhone(new RemoveMyPhoneRequest(), null).then((resp) => resp.toObject());
new RemoveMyPhoneRequest(), null,
).then(resp => resp.toObject());
} }
public updateMyUserName(username: string): Promise<UpdateMyUserNameResponse.AsObject> { public updateMyUserName(username: string): Promise<UpdateMyUserNameResponse.AsObject> {
const req = new UpdateMyUserNameRequest(); const req = new UpdateMyUserNameRequest();
req.setUserName(username); req.setUserName(username);
return this.grpcService.auth.updateMyUserName(req, null).then(resp => resp.toObject()); return this.grpcService.auth.updateMyUserName(req, null).then((resp) => resp.toObject());
} }
public listMyZitadelPermissions(): Promise<ListMyZitadelPermissionsResponse.AsObject> { public listMyZitadelPermissions(): Promise<ListMyZitadelPermissionsResponse.AsObject> {
return this.grpcService.auth.listMyZitadelPermissions( return this.grpcService.auth
new ListMyZitadelPermissionsRequest(), null, .listMyZitadelPermissions(new ListMyZitadelPermissionsRequest(), null)
).then(resp => resp.toObject()); .then((resp) => resp.toObject());
} }
public listMyZitadelFeatures(): Promise<ListMyZitadelFeaturesResponse.AsObject> { public listMyZitadelFeatures(): Promise<ListMyZitadelFeaturesResponse.AsObject> {
return this.grpcService.auth.listMyZitadelFeatures( return this.grpcService.auth
new ListMyZitadelFeaturesRequest(), null, .listMyZitadelFeatures(new ListMyZitadelFeaturesRequest(), null)
).then(resp => resp.toObject()); .then((resp) => resp.toObject());
} }
public getMyPhone(): Promise<GetMyPhoneResponse.AsObject> { public getMyPhone(): Promise<GetMyPhoneResponse.AsObject> {
return this.grpcService.auth.getMyPhone( return this.grpcService.auth.getMyPhone(new GetMyPhoneRequest(), null).then((resp) => resp.toObject());
new GetMyPhoneRequest(), null,
).then(resp => resp.toObject());
} }
public setMyPhone(phone: string): Promise<SetMyPhoneResponse.AsObject> { public setMyPhone(phone: string): Promise<SetMyPhoneResponse.AsObject> {
const req = new SetMyPhoneRequest(); const req = new SetMyPhoneRequest();
req.setPhone(phone); req.setPhone(phone);
return this.grpcService.auth.setMyPhone(req, null).then(resp => resp.toObject()); return this.grpcService.auth.setMyPhone(req, null).then((resp) => resp.toObject());
} }
public resendMyPhoneVerification(): Promise<ResendMyPhoneVerificationResponse.AsObject> { public resendMyPhoneVerification(): Promise<ResendMyPhoneVerificationResponse.AsObject> {
const req = new ResendMyPhoneVerificationRequest(); const req = new ResendMyPhoneVerificationRequest();
return this.grpcService.auth.resendMyPhoneVerification(req, null).then(resp => resp.toObject()); return this.grpcService.auth.resendMyPhoneVerification(req, null).then((resp) => resp.toObject());
} }
public updateMyPassword(oldPassword: string, newPassword: string): Promise<UpdateMyPasswordResponse.AsObject> { public updateMyPassword(oldPassword: string, newPassword: string): Promise<UpdateMyPasswordResponse.AsObject> {
const req = new UpdateMyPasswordRequest(); const req = new UpdateMyPasswordRequest();
req.setOldPassword(oldPassword); req.setOldPassword(oldPassword);
req.setNewPassword(newPassword); req.setNewPassword(newPassword);
return this.grpcService.auth.updateMyPassword(req, null).then(resp => resp.toObject()); return this.grpcService.auth.updateMyPassword(req, null).then((resp) => resp.toObject());
} }
public removeMyLinkedIDP( public removeMyLinkedIDP(idpId: string, linkedUserId: string): Promise<RemoveMyLinkedIDPResponse.AsObject> {
idpId: string,
linkedUserId: string,
): Promise<RemoveMyLinkedIDPResponse.AsObject> {
const req = new RemoveMyLinkedIDPRequest(); const req = new RemoveMyLinkedIDPRequest();
req.setLinkedUserId(linkedUserId); req.setLinkedUserId(linkedUserId);
req.setIdpId(idpId); req.setIdpId(idpId);
return this.grpcService.auth.removeMyLinkedIDP(req, null).then(resp => resp.toObject()); return this.grpcService.auth.removeMyLinkedIDP(req, null).then((resp) => resp.toObject());
} }
public removeMyAvatar(): Promise<RemoveMyAvatarResponse.AsObject> { public removeMyAvatar(): Promise<RemoveMyAvatarResponse.AsObject> {
const req = new RemoveMyAvatarRequest(); const req = new RemoveMyAvatarRequest();
return this.grpcService.auth.removeMyAvatar(req, null).then(resp => resp.toObject()); return this.grpcService.auth.removeMyAvatar(req, null).then((resp) => resp.toObject());
} }
public listMyLinkedIDPs( public listMyLinkedIDPs(limit: number, offset: number): Promise<ListMyLinkedIDPsResponse.AsObject> {
limit: number,
offset: number,
): Promise<ListMyLinkedIDPsResponse.AsObject> {
const req = new ListMyLinkedIDPsRequest(); const req = new ListMyLinkedIDPsRequest();
const metadata = new ListQuery(); const metadata = new ListQuery();
if (limit) { if (limit) {
@ -479,25 +487,21 @@ export class GrpcAuthService {
metadata.setOffset(offset); metadata.setOffset(offset);
} }
req.setQuery(metadata); req.setQuery(metadata);
return this.grpcService.auth.listMyLinkedIDPs(req, null).then(resp => resp.toObject()); return this.grpcService.auth.listMyLinkedIDPs(req, null).then((resp) => resp.toObject());
} }
public addMyMultiFactorOTP(): Promise<AddMyAuthFactorOTPResponse.AsObject> { public addMyMultiFactorOTP(): Promise<AddMyAuthFactorOTPResponse.AsObject> {
return this.grpcService.auth.addMyAuthFactorOTP( return this.grpcService.auth.addMyAuthFactorOTP(new AddMyAuthFactorOTPRequest(), null).then((resp) => resp.toObject());
new AddMyAuthFactorOTPRequest(), null,
).then(resp => resp.toObject());
} }
public addMyMultiFactorU2F(): Promise<AddMyAuthFactorU2FResponse.AsObject> { public addMyMultiFactorU2F(): Promise<AddMyAuthFactorU2FResponse.AsObject> {
return this.grpcService.auth.addMyAuthFactorU2F( return this.grpcService.auth.addMyAuthFactorU2F(new AddMyAuthFactorU2FRequest(), null).then((resp) => resp.toObject());
new AddMyAuthFactorU2FRequest(), null,
).then(resp => resp.toObject());
} }
public removeMyMultiFactorU2F(tokenId: string): Promise<RemoveMyAuthFactorU2FResponse.AsObject> { public removeMyMultiFactorU2F(tokenId: string): Promise<RemoveMyAuthFactorU2FResponse.AsObject> {
const req = new RemoveMyAuthFactorU2FRequest(); const req = new RemoveMyAuthFactorU2FRequest();
req.setTokenId(tokenId); req.setTokenId(tokenId);
return this.grpcService.auth.removeMyAuthFactorU2F(req, null).then(resp => resp.toObject()); return this.grpcService.auth.removeMyAuthFactorU2F(req, null).then((resp) => resp.toObject());
} }
public verifyMyMultiFactorU2F(credential: string, tokenname: string): Promise<VerifyMyAuthFactorU2FResponse.AsObject> { public verifyMyMultiFactorU2F(credential: string, tokenname: string): Promise<VerifyMyAuthFactorU2FResponse.AsObject> {
@ -507,25 +511,21 @@ export class GrpcAuthService {
verification.setTokenName(tokenname); verification.setTokenName(tokenname);
req.setVerification(verification); req.setVerification(verification);
return this.grpcService.auth.verifyMyAuthFactorU2F(req, null).then(resp => resp.toObject()); return this.grpcService.auth.verifyMyAuthFactorU2F(req, null).then((resp) => resp.toObject());
} }
public listMyPasswordless(): Promise<ListMyPasswordlessResponse.AsObject> { public listMyPasswordless(): Promise<ListMyPasswordlessResponse.AsObject> {
return this.grpcService.auth.listMyPasswordless( return this.grpcService.auth.listMyPasswordless(new ListMyPasswordlessRequest(), null).then((resp) => resp.toObject());
new ListMyPasswordlessRequest(), null,
).then(resp => resp.toObject());
} }
public addMyPasswordless(): Promise<AddMyPasswordlessResponse.AsObject> { public addMyPasswordless(): Promise<AddMyPasswordlessResponse.AsObject> {
return this.grpcService.auth.addMyPasswordless( return this.grpcService.auth.addMyPasswordless(new AddMyPasswordlessRequest(), null).then((resp) => resp.toObject());
new AddMyPasswordlessRequest(), null,
).then(resp => resp.toObject());
} }
public removeMyPasswordless(tokenId: string): Promise<RemoveMyPasswordlessResponse.AsObject> { public removeMyPasswordless(tokenId: string): Promise<RemoveMyPasswordlessResponse.AsObject> {
const req = new RemoveMyPasswordlessRequest(); const req = new RemoveMyPasswordlessRequest();
req.setTokenId(tokenId); req.setTokenId(tokenId);
return this.grpcService.auth.removeMyPasswordless(req, null).then(resp => resp.toObject()); return this.grpcService.auth.removeMyPasswordless(req, null).then((resp) => resp.toObject());
} }
public verifyMyPasswordless(credential: string, tokenname: string): Promise<VerifyMyPasswordlessResponse.AsObject> { public verifyMyPasswordless(credential: string, tokenname: string): Promise<VerifyMyPasswordlessResponse.AsObject> {
@ -535,37 +535,35 @@ export class GrpcAuthService {
verification.setPublicKeyCredential(credential); verification.setPublicKeyCredential(credential);
req.setVerification(verification); req.setVerification(verification);
return this.grpcService.auth.verifyMyPasswordless( return this.grpcService.auth.verifyMyPasswordless(req, null).then((resp) => resp.toObject());
req, null,
).then(resp => resp.toObject());
} }
public sendMyPasswordlessLink(): Promise<SendMyPasswordlessLinkResponse.AsObject> { public sendMyPasswordlessLink(): Promise<SendMyPasswordlessLinkResponse.AsObject> {
const req = new SendMyPasswordlessLinkRequest(); const req = new SendMyPasswordlessLinkRequest();
return this.grpcService.auth.sendMyPasswordlessLink(req, null).then(resp => resp.toObject()); return this.grpcService.auth.sendMyPasswordlessLink(req, null).then((resp) => resp.toObject());
} }
public addMyPasswordlessLink(): Promise<AddMyPasswordlessLinkResponse.AsObject> { public addMyPasswordlessLink(): Promise<AddMyPasswordlessLinkResponse.AsObject> {
const req = new AddMyPasswordlessLinkRequest(); const req = new AddMyPasswordlessLinkRequest();
return this.grpcService.auth.addMyPasswordlessLink(req, null).then(resp => resp.toObject()); return this.grpcService.auth.addMyPasswordlessLink(req, null).then((resp) => resp.toObject());
} }
public removeMyMultiFactorOTP(): Promise<RemoveMyAuthFactorOTPResponse.AsObject> { public removeMyMultiFactorOTP(): Promise<RemoveMyAuthFactorOTPResponse.AsObject> {
return this.grpcService.auth.removeMyAuthFactorOTP( return this.grpcService.auth
new RemoveMyAuthFactorOTPRequest(), null, .removeMyAuthFactorOTP(new RemoveMyAuthFactorOTPRequest(), null)
).then(resp => resp.toObject()); .then((resp) => resp.toObject());
} }
public verifyMyMultiFactorOTP(code: string): Promise<VerifyMyAuthFactorOTPResponse.AsObject> { public verifyMyMultiFactorOTP(code: string): Promise<VerifyMyAuthFactorOTPResponse.AsObject> {
const req = new VerifyMyAuthFactorOTPRequest(); const req = new VerifyMyAuthFactorOTPRequest();
req.setCode(code); req.setCode(code);
return this.grpcService.auth.verifyMyAuthFactorOTP(req, null).then(resp => resp.toObject()); return this.grpcService.auth.verifyMyAuthFactorOTP(req, null).then((resp) => resp.toObject());
} }
public verifyMyPhone(code: string): Promise<VerifyMyPhoneResponse.AsObject> { public verifyMyPhone(code: string): Promise<VerifyMyPhoneResponse.AsObject> {
const req = new VerifyMyPhoneRequest(); const req = new VerifyMyPhoneRequest();
req.setCode(code); req.setCode(code);
return this.grpcService.auth.verifyMyPhone(req, null).then(resp => resp.toObject()); return this.grpcService.auth.verifyMyPhone(req, null).then((resp) => resp.toObject());
} }
public listMyUserChanges(limit: number, sequence: number): Promise<ListMyUserChangesResponse.AsObject> { public listMyUserChanges(limit: number, sequence: number): Promise<ListMyUserChangesResponse.AsObject> {
@ -579,6 +577,6 @@ export class GrpcAuthService {
query.setSequence(sequence); query.setSequence(sequence);
} }
req.setQuery(query); req.setQuery(query);
return this.grpcService.auth.listMyUserChanges(req, null).then(resp => resp.toObject()); return this.grpcService.auth.listMyUserChanges(req, null).then((resp) => resp.toObject());
} }
} }

View File

@ -754,7 +754,9 @@
}, },
"PRIVATELABELING_POLICY": { "PRIVATELABELING_POLICY": {
"TITLE": "Private Labeling", "TITLE": "Private Labeling",
"DESCRIPTION": "Definiere das Erscheinungsbild des Logins." "BTN":"Datei auswählen",
"DESCRIPTION": "Definiere das Erscheinungsbild des Logins.",
"ACTIVATEPREVIEW":"Preview aktivieren"
}, },
"LOGIN_POLICY": { "LOGIN_POLICY": {
"TITLE": "Login Richtlinien", "TITLE": "Login Richtlinien",
@ -1300,6 +1302,7 @@
} }
}, },
"NEXTSTEPS": { "NEXTSTEPS": {
"TITLE": "Nächste Schritte",
"0": { "0": {
"TITLE": "Rollen festlegen", "TITLE": "Rollen festlegen",
"DESC": "Erfassen Sie Rollen für ihr Projekt" "DESC": "Erfassen Sie Rollen für ihr Projekt"
@ -1388,7 +1391,7 @@
"TOKENTYPE": "Auth Token Typ", "TOKENTYPE": "Auth Token Typ",
"TOKENTYPE0": "Bearer Token", "TOKENTYPE0": "Bearer Token",
"TOKENTYPE1": "JWT", "TOKENTYPE1": "JWT",
"UNSECUREREDIRECT": "Ich hoffe, Du weisst, was Du tust.", "UNSECUREREDIRECT": "Wir hoffen, Du weisst, was Du tust.",
"OVERVIEWSECTION": "Übersicht", "OVERVIEWSECTION": "Übersicht",
"OVERVIEWTITLE": "Deine Konfiguration ist bereit. Du kannst sie hier nochmals prüfen.", "OVERVIEWTITLE": "Deine Konfiguration ist bereit. Du kannst sie hier nochmals prüfen.",
"ACCESSTOKENROLEASSERTION": "Benutzerrollen dem Access Token hinzufügen", "ACCESSTOKENROLEASSERTION": "Benutzerrollen dem Access Token hinzufügen",
@ -1480,6 +1483,7 @@
}, },
"LANGUAGES": { "LANGUAGES": {
"de": "Deutsch", "de": "Deutsch",
"it": "Italienisch",
"en": "Englisch" "en": "Englisch"
}, },
"MEMBER": { "MEMBER": {

View File

@ -35,7 +35,7 @@
"SECURITYANDPRIVACY_DESC": "Manage Your Information and Security Settings", "SECURITYANDPRIVACY_DESC": "Manage Your Information and Security Settings",
"SECURITYANDPRIVACY_BUTTON": "Personalise Information and Security", "SECURITYANDPRIVACY_BUTTON": "Personalise Information and Security",
"CHANGE_PWD": "Change Password", "CHANGE_PWD": "Change Password",
"PROTECTION": "Organisational Policies", "PROTECTION": "Organizational Policies",
"PROTECTION_DESC": "Manage your organisational guidelines. Explore some pre-packaged solutions that save you time and ensure security.", "PROTECTION_DESC": "Manage your organisational guidelines. Explore some pre-packaged solutions that save you time and ensure security.",
"PROTECTION_BUTTON": "Explore", "PROTECTION_BUTTON": "Explore",
"PROJECTS": "Create and Manage Your Applications and Projects", "PROJECTS": "Create and Manage Your Applications and Projects",
@ -301,8 +301,8 @@
"EXTERNALIDP": { "EXTERNALIDP": {
"TITLE": "External Identity Providers", "TITLE": "External Identity Providers",
"DESC": "", "DESC": "",
"IDPCONFIGID": "Idp Config ID", "IDPCONFIGID": "IDP Config ID",
"IDPNAME": "Idp Name", "IDPNAME": "IDP Name",
"USERDISPLAYNAME": "External Name", "USERDISPLAYNAME": "External Name",
"EXTERNALUSERID": "External User ID", "EXTERNALUSERID": "External User ID",
"DIALOG": { "DIALOG": {
@ -331,7 +331,7 @@
"STATE2": "Inactive", "STATE2": "Inactive",
"STATE3": "Deleted", "STATE3": "Deleted",
"STATE4": "Locked", "STATE4": "Locked",
"STATE5": "Supend", "STATE5": "Suspended",
"STATE6": "Initial" "STATE6": "Initial"
}, },
"PROFILE": { "PROFILE": {
@ -356,7 +356,7 @@
"CURRENT":"Current Picture", "CURRENT":"Current Picture",
"PREVIEW":"Preview", "PREVIEW":"Preview",
"DELETESUCCESS":"Deleted successfully!", "DELETESUCCESS":"Deleted successfully!",
"CROPPERERROR":"An error while uploading your file failed. Try a different format and size if necessary." "CROPPERERROR":"An error while uploading your file occurred. Try a different format and size if necessary."
} }
}, },
"MACHINE": { "MACHINE": {
@ -595,7 +595,7 @@
"VERIFICATION_VALIDATION_ONGOING": "A verification token has already been requested. Click on the button to trigger a verification check.", "VERIFICATION_VALIDATION_ONGOING": "A verification token has already been requested. Click on the button to trigger a verification check.",
"VERIFICATION_VALIDATION_ONGOING_TYPE": "Type of the token:", "VERIFICATION_VALIDATION_ONGOING_TYPE": "Type of the token:",
"VERIFICATION_SUCCESSFUL": "Domain successfully verified!", "VERIFICATION_SUCCESSFUL": "Domain successfully verified!",
"REQUESTNEWTOKEN": "Request new Token", "REQUESTNEWTOKEN": "Request new token",
"TYPES": { "TYPES": {
"1": "HTTP", "1": "HTTP",
"2": "DNS" "2": "DNS"
@ -659,7 +659,7 @@
"POSTAL_CODE": "Postal Code", "POSTAL_CODE": "Postal Code",
"COUNTRY": "Country", "COUNTRY": "Country",
"TITLE": "Zitadel Tier", "TITLE": "Zitadel Tier",
"DESCRIPTION": "Zitadel works with Stripe to simplify invoicing. The following link redirects to Stripe.com.", "DESCRIPTION": "Zitadel works with Stripe to simplify invoicing. The following link redirects to stripe.com.",
"QUESTIONS": "For questions regarding payments contact our support ", "QUESTIONS": "For questions regarding payments contact our support ",
"BTN": "Change Tier" "BTN": "Change Tier"
}, },
@ -716,7 +716,7 @@
"BTN":"Select File", "BTN":"Select File",
"ACTIVATEPREVIEW":"Apply configuration", "ACTIVATEPREVIEW":"Apply configuration",
"DARK":"Dark Mode", "DARK":"Dark Mode",
"LIGHT":"Lighg Mode", "LIGHT":"Light Mode",
"CHANGEVIEW":"Change View", "CHANGEVIEW":"Change View",
"ACTIVATED":"Policy changes are now LIVE", "ACTIVATED":"Policy changes are now LIVE",
"THEME":"Theme", "THEME":"Theme",
@ -1483,6 +1483,7 @@
}, },
"LANGUAGES": { "LANGUAGES": {
"de": "German", "de": "German",
"it": "Italian",
"en": "English" "en": "English"
}, },
"MEMBER": { "MEMBER": {

File diff suppressed because it is too large Load Diff

View File

@ -25,5 +25,21 @@ You will see the default texts in the input field and you can overwrite them by
![Message Texts](/img/console_login_texts.png) ![Message Texts](/img/console_login_texts.png)
## Reset to default ## Reset to default
If you don't like your customization anymore click the "reset policy" button. If you don't like your customization anymore click the "reset policy" button.
All your settings will be removed and the default settings of the system will trigger. All your settings will be removed and the default settings of the system will trigger.
## Internationalization
ZITADELs support for languages will be extended with time.
If you need support for a specific language we highly recommend you to write translation files for the missing language.
ZITADEL loads translations from three files:
- [Console translations](https://github.com/caos/zitadel/tree/main/console/src/assets/i18n)
- [Login interface texts](https://github.com/caos/zitadel/tree/main/internal/ui/login/static/i18n)
- [Email Notifcation texts](https://github.com/caos/zitadel/tree/main/internal/notification/static/i18n)
- [Common translations](https://github.com/caos/zitadel/tree/main/internal/static/i18n) for success or error toasts
Make sure you set the locale as the name. Later on, language header will determine which file gets displayed.

View File

@ -0,0 +1,42 @@
InitCode:
Title: ZITADEL - Inizializzare l'utente
PreHeader: Inizializzare l'utente
Subject: Inizializzare l'utente
Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
Text: Questo utente è stato creato in ZITADEL. Usa il nome utente {{.PreferredLoginName}} per accedere. Per favore, clicca il pulsante per finire il processo di inizializzazione. (Codice {{.Codice}}) Se non hai richiesto questa mail, per favore ignorala.
ButtonText: Termina
PasswordReset:
Title: ZITADEL - Ripristina la password
PreHeader: Ripristina la password
Subject: Ripristina la password
Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
Text: Abbiamo ricevuto una richiesta di reimpostazione della password. Per favore clicca il pulsante per resettare la tua password. (Codice {{.Codice}}) Se non hai richiesto questa mail, ignorala.
ButtonText: Ripristina
VerifyEmail:
Title: ZITADEL - Verifica l'e-mail
PreHeader: Verifica l'e-mail
Subject: Verifica l'e-mail
Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
Text: È stata aggiunta una nuova email. Per favore fai clic sul pulsante per verificare la tua mail. (Codice {{.Codice}}) Se non hai aggiunto una nuova email, ignora questa email.
ButtonText: Verifica
VerifyPhone:
Title: ZITADEL - Verifica il telefono
PreHeader: Verifica il telefono
Subject: Verifica il telefono
Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
Text: È stato aggiunto un nuovo numero di telefono. Usa il seguente codice per verificarlo {{.Code}}
ButtonText: Verifica
DomainClaimed:
Title: ZITADEL - Il dominio è stato rivendicato
PreHeader: Cambiare email / nome utente
Subject: Il dominio è stato rivendicato
Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
Text: Il dominio {{.Domain}} è stato rivendicato da un'organizzazione. Il tuo attuale utente {{.Username}} non fa parte di questa organizzazione. Perciò dovrai cambiare la tua email quando farai il login. Abbiamo creato un nome utente temporaneo ({{.TempUsername}}) per questo login.
ButtonText: Accedi
PasswordlessRegistration:
Title: ZITADEL - Aggiungere autenticazione passwordless
PreHeader: Aggiungi l'autenticazione passwordless
Subject: Aggiungi l'autenticazione passwordless
Greeting: 'Ciao {{.FirstName}} {{.LastName}},'
Text: Abbiamo ricevuto una richiesta per aggiungere l'autenticazione passwordless. Usa il pulsante qui sotto per aggiungere il tuo token o dispositivo per il login senza password.
ButtonText: Attiva passwordless

View File

@ -18,7 +18,7 @@ Errors:
SetPublicFailed: Bucket konnte nicht auf public gesetzt werden SetPublicFailed: Bucket konnte nicht auf public gesetzt werden
Object: Object:
PutFailed: Objekt konnte nicht erstellt werden PutFailed: Objekt konnte nicht erstellt werden
GetFaieled: Objekt konnte nicht gelesen werden GetFailed: Objekt konnte nicht gelesen werden
PresignedTokenFailed: Signiertes Token konnte nicht erstellt werden PresignedTokenFailed: Signiertes Token konnte nicht erstellt werden
ListFailed: Objektliste konnte nicht gelesen werden ListFailed: Objektliste konnte nicht gelesen werden
RemoveFailed: Objekt konnte nicht gelöscht werden RemoveFailed: Objekt konnte nicht gelöscht werden
@ -190,7 +190,7 @@ Errors:
NotExisting: Org IAM Policy existiert nicht NotExisting: Org IAM Policy existiert nicht
AlreadyExists: Org IAM Policy existiert bereits AlreadyExists: Org IAM Policy existiert bereits
Project: Project:
ProjectIDMissing: Project Id fehlt ProjectIDMissing: Project ID fehlt
AlreadyExists: Project existiert bereits auf der Organisation AlreadyExists: Project existiert bereits auf der Organisation
OrgNotExisting: Organisation existiert nicht OrgNotExisting: Organisation existiert nicht
UserNotExisting: User existiert nicht UserNotExisting: User existiert nicht
@ -242,7 +242,7 @@ Errors:
MemberInvalid: Member ist ungültig MemberInvalid: Member ist ungültig
MemberAlreadyExisting: Member existiert bereits MemberAlreadyExisting: Member existiert bereits
MemberNotExisting: Member existiert nicht MemberNotExisting: Member existiert nicht
IDMissing: Id fehlt IDMissing: ID fehlt
GlobalOrgMissing: Globale Organisation fehlt GlobalOrgMissing: Globale Organisation fehlt
GlobalOrgAlreadySet: Globale Organisation wurde bereits gesetzt GlobalOrgAlreadySet: Globale Organisation wurde bereits gesetzt
IAMProjectIDMissing: IAM Project ID fehlt IAMProjectIDMissing: IAM Project ID fehlt
@ -266,7 +266,7 @@ Errors:
IDP: IDP:
AlreadyExists: Identitäts Provider existiert bereits AlreadyExists: Identitäts Provider existiert bereits
NotExisting: Identitäts Provider existiert nicht NotExisting: Identitäts Provider existiert nicht
Invalid: Idp Provider ist ungültig Invalid: IDP ist ungültig
IDPConfig: IDPConfig:
AlreadyExists: Identitäts Provider Konfiguration existiert bereits AlreadyExists: Identitäts Provider Konfiguration existiert bereits
NotInactive: Identitäts Provider Konfiguration nicht inaktive NotInactive: Identitäts Provider Konfiguration nicht inaktive
@ -325,7 +325,7 @@ Errors:
NotFound: Benutzer Berechtigung konnte nicht gefunden werden NotFound: Benutzer Berechtigung konnte nicht gefunden werden
Invalid: Benutzer Berechtigung ist ungültig Invalid: Benutzer Berechtigung ist ungültig
NotChanged: Benutzer Berechtigung wurde nicht verändert NotChanged: Benutzer Berechtigung wurde nicht verändert
IDMissing: Id fehlt IDMissing: ID fehlt
NotActive: Benutzer Berechtigung ist nicht aktiv NotActive: Benutzer Berechtigung ist nicht aktiv
NotInactive: Benutzer Berechtigung ist nicht deaktiviert NotInactive: Benutzer Berechtigung ist nicht deaktiviert
NoPermissionForProject: Benutzer hat keine Rechte auf diesem Projekt NoPermissionForProject: Benutzer hat keine Rechte auf diesem Projekt

View File

@ -17,8 +17,8 @@ Errors:
RemoveFailed: Bucket not deleted RemoveFailed: Bucket not deleted
SetPublicFailed: Could not set bucket to public SetPublicFailed: Could not set bucket to public
Object: Object:
PutFailed: Objekt not created PutFailed: Object not created
GetFaieled: Objekt could not be read GetFailed: Object could not be read
PresignedTokenFailed: Signed token could not be created PresignedTokenFailed: Signed token could not be created
ListFailed: Objectlist could not be read ListFailed: Objectlist could not be read
RemoveFailed: Object could not be removed RemoveFailed: Object could not be removed
@ -74,7 +74,7 @@ Errors:
Expired: Code is expired Expired: Code is expired
GeneratorAlgNotSupported: Unsupported generator algorithm GeneratorAlgNotSupported: Unsupported generator algorithm
Password: Password:
NotFound: Passoword not found NotFound: Password not found
Empty: Password is empty Empty: Password is empty
Invalid: Password is invalid Invalid: Password is invalid
NotSet: User has not set a password NotSet: User has not set a password
@ -216,7 +216,7 @@ Errors:
NotFound: Application not found NotFound: Application not found
Invalid: Application invalid Invalid: Application invalid
NotExisting: Application doesn't exist NotExisting: Application doesn't exist
NotActive:: Application is not active NotActive: Application is not active
NotInactive: Application is not inactive NotInactive: Application is not inactive
OIDCConfigInvalid: OIDC configuration is invalid OIDCConfigInvalid: OIDC configuration is invalid
APIConfigInvalid: API configuration is invalid APIConfigInvalid: API configuration is invalid
@ -285,7 +285,7 @@ Errors:
AlreadyExists: Default Message Text already exists AlreadyExists: Default Message Text already exists
Invalid: Default Message Text is invalid Invalid: Default Message Text is invalid
PasswordComplexityPolicy: PasswordComplexityPolicy:
NotFound: Default Private Label Policy not found NotFound: Default Password Complexity Policy not found
NotExisting: Default Password Complexity Policy not existing NotExisting: Default Password Complexity Policy not existing
AlreadyExists: Default Password Complexity Policy already existing AlreadyExists: Default Password Complexity Policy already existing
Empty: Default Password Complexity Policy empty Empty: Default Password Complexity Policy empty
@ -688,7 +688,7 @@ EventTypes:
changed: Project member changed changed: Project member changed
removed: Project member removed removed: Project member removed
cascade: cascade:
removeD: Project member cascade removed removed: Project member cascade removed
role: role:
added: Project role added added: Project role added
changed: Project role changed changed: Project role changed

View File

@ -0,0 +1,836 @@
Errors:
Internal: Si è verificato un errore interno
NoChangesFound: Nessun cambiamento
OriginNotAllowed: Origine non consentita
IDMissing: ID mancante
ResourceOwnerMissing: Resource Owner mancante
Assets:
EmptyKey: Asset key vuoto
Store:
NotInitialized: Assets storage non inizializzato
NotConfigured: Assets storage non configurato
Bucket:
Internal: Errore interno nella creazione
AlreadyExists: Bucket già esistente
CreateFailed: Bucket non creato
ListFailed: I Bucket non possono essere letti
RemoveFailed: Bucket non rimosso
SetPublicFailed: Impossibile impostare Bucket
Object:
PutFailed: Oggetto non creato
GetFailed: Oggetto non può essere letto
PresignedTokenFailed: Il token non può essere creato
ListFailed: La lista degli oggetti non può essere letta
RemoveFailed: L'oggetto non può essere rimosso
Limit:
ExceedsDefault: Il limite supera quello predefinito
User:
NotFound: L'utente non è stato trovato
AlreadyExists: L'utente già esistente
NotFoundOnOrg: L'utente non è stato trovato nell'organizzazione scelta
NotAllowedOrg: L'utente non è membro dell'organizzazione richiesta
UserIDMissing: ID utente mancante
OrgIamPolicyNil: Impostazione Org IAM mancante
EmailAsUsernameNotAllowed: L'e-mail non è consentita come nome utente
Invalid: I dati utente non sono validi
DomainNotAllowedAsUsername: Il dominio è già riservato e non può essere utilizzato
AlreadyInactive: Utente già inattivo
NotInactive: L'utente non è inattivo
ShouldBeActiveOrInitial: L'utente non è attivo o inizializzato
AlreadyInitialised: L'utente è già inizializzato
NotInitialised: L'utente non è ancora inizializzato
NotLocked: L'utente non è bloccato
NoChanges: Nessun cambiamento trovato
InitCodeNotFound: Codice di inizializzazione non trovato
UsernameNotChanged: Nome utente non cambiato
Profile:
NotFound: Profilo non trovato
NotChanged: Profilo non cambiato
Invalid: Dati non sono validi
Email:
NotFound: Email non trovata
Invalid: L'e-mail non è valida
AlreadyVerified: L'e-mail è già verificata
NotChanged: Email non cambiata
Phone:
NotFound: Telefono non trovato
Invalid: Il telefono non è valido
AlreadyVerified: Telefono già verificato
Address:
NotFound: Indirizzo non trovato
NotChanged: Indirizzo non cambiato
Machine:
Key:
NotFound: Machine Key non trovato
NotHuman: L'utente deve essere personale
NotMachine: L'utente deve essere tecnico
NotAllowedToLink: L'utente non è autorizzato a collegarsi con un provider di accesso esterno
Username:
AlreadyExists: Nome utente già preso
Reservied: Il nome utente è già preso
Code:
Empty: Il codice è vuoto
NotFound: Codice non trovato
Expired: Il codice è scaduto
GeneratorAlgNotSupported: L'algoritmo del generatore non è supportato
Password:
NotFound: Password non trovato
Empty: La password è vuota
Invalid: La password non è valida
NotSet: L'utente non ha impostato una password
PasswordComplexityPolicy:
NotFound: Impostazioni di complessità password non trovati
MinLength: La password è troppo corta
MinLengthNotAllowed: La lunghezza minima non è consentita
HasLower: La password deve contenere lettere minuscole
HasUpper: La password deve contenere lettere maiuscole
HasNumber: La password deve contenere un numero
HasSymbol: La password deve contenere il simbolo
ExternalIDP:
Invalid: IDP esterno non valido
IDPConfigNotExisting: IDP non valido per questa organizzazione
NotAllowed: IDP esterno non consentito su questa organizzazione
MinimumExternalIDPNeeded: Almeno un IDP deve essere aggiunto
AlreadyExists: IDP esterno già preso
NotFound: IDP esterno non trovato
MFA:
OTP:
AlreadyReady: Multifattore OTP (OneTimePassword) è già impostato
NotExisting: Multifattore OTP (OneTimePassword) non esistente
NotReady: Multifattore OTP (OneTimePassword) non è pronto
InvalidCode: Codice non valido
U2F:
NotExisting: U2F non esistente
Passwordless:
NotExisting: Passwordless non esistente
WebAuthN:
NotFound: WebAuthN Token non trovato
BeginRegisterFailed: WebAuthN inizializzazione non riuscita
MarshalError: Errore nel marshalling
ErrorOnParseCredential: Errore nell'analisi dei dati delle credenziali
CreateCredentialFailed: Errore nella creazione delle credenziali
BeginLoginFailed: WebAuthN inizializzazione login fallito
ValidateLoginFailed: Errore nella convalidazione delle credenziali
CloneWarning: Le credenziali possono essere copiate
RefreshToken:
Invalid: Refresh Token non è valido
NotFound: Refresh Token non trovato
Org:
AlreadyExists: Nome dell'organizzazione già preso
Invalid: L'organizzazione non è valida
AlreadyDeactivated: L'organizzazione è già disattivata
AlreadyActive: L'organizzazione è già attiva
Empty: L'organizzazione è vuota
NotFound: Organizzazione non trovata
NotChanged: Organizzazione non cambiata
InvalidDomain: Dominio non valido
DomainMissing: Dominio mancante
DomainNotOnOrg: Il dominio non esistente nell'organizzazione
DomainNotVerified: Il dominio non è verificato
DomainAlreadyVerified: Il dominio è già verificato
DomainVerificationTypeInvalid: Il tipo di verifica del dominio non è valido
DomainVerificationMissing: La verifica del dominio non è ancora iniziata
DomainVerificationFailed: Verifica del dominio fallita
PrimaryDomainNotDeletable: Il dominio primario non deve essere cancellato
DomainNotFound: Dominio non trovato
MemberIDMissing: ID membro mancante
MemberNotFound: Membro non trovato
InvalidMember: Il membro dell'organizzazione non è valido
UserIDMissing: ID utente mancante
PolicyAlreadyExists: Impostazione già esistente
PolicyNotExisting: Impostazione non esistente
IdpInvalid: La configurazione dell'IDP non è valida
IdpNotExisting: La configurazione IDP non esistente
OIDCConfigInvalid: La configurazione OIDC IDP non è valida
IdpIsNotOIDC: La configurazione IDP non è di tipo oidc
Domain:
AlreadyExists: Il dominio già esistente
IDP:
InvalidSearchQuery: Parametro di ricerca non valido
LoginPolicy:
NotFound: Impostazioni di accesso non trovati
Invalid: Impostazioni di accesso non sono validi
NotExisting: Impostazioni di accesso non esistenti
AlreadyExists: Impostazioni di accesso già esistenti
IdpProviderAlreadyExisting: IDP già esistente
IdpProviderNotExisting: IDP non esistente
MFA:
AlreadyExists: Multifactor già esistente
NotExisting: Multifattore non esistente
Unspecified: Multifattore non valido
MailTemplate:
NotFound: Mail template predefinito non trovato
NotChanged: Mail template predefinito non è stato cambiato
AlreadyExists: Mail template predefinito già esistente
Invalid: Mail template predefinito non è valido
CustomMessageText:
NotFound: Testo predefinito non trovato
NotChanged: Il testo predefinito non è stato cambiato
AlreadyExists: Il testo predefinito già eistente
Invalid: Il testo predefinito non è valido
PasswordComplexity:
NotFound: Impostazioni di complessità della password non trovati
Empty: Mancano le impostazioni di complessità della password
NotExisting: Impostazioni di complessità della password non esistenti
AlreadyExists: Impostazioni di complessità della password sono già esistenti
PasswordLockout:
NotFound: Impostazioni di blocco della password non trovati
Empty: Mancano le impostazioni di blocco della password
NotExisting: Le impostazioni di blocco della password non esistenti
AlreadyExists: Le impostazioni di blocco della password sono già esistenti
PasswordAge:
NotFound: Impostazioni di validità della password
Empty: Impostazioni di validità della password mancanti
NotExisting: Impostazioni di validità della password non esistenti
AlreadyExists: Impostazioni di validità della password sono già esistenti
OrgIAM:
Empty: Mancano le impostazioni Org IAM
NotExisting: Impostazioni Org IAM non esistenti
AlreadyExists: Impostazioni Org IAM già esistenti
Project:
ProjectIDMissing: ID del progetto mancante
AlreadyExists: Il progetto è già stato creato nell'organizzazione
OrgNotExisting: L'organizzazione non esistente
UserNotExisting: L'utente non esistente
CouldNotGenerateClientSecret: Impossibile generare il segreto del cliente
Invalid: Il progetto non è valido
NotActive: Il progetto non è attivo
NotInactive: Il progetto non è disattivato
NotFound: Progetto non trovato
UserIDMissing: ID utente mancante
Member:
NotFound: Membro del progetto non trovato
Invalid: Il membro del progetto non è valido
AlreadyExists: Il membro del progetto già esistente
NotExisting: Il membro del progetto non esistente
MinimumOneRoleNeeded: Almeno un ruolo deve essere aggiunto
Role:
AlreadyExists: Ruolo è già esistente
Invalid: Ruolo non è valido
NotExisting: Ruolo non esistente
IDMissing: ID mancante
App:
AlreadyExists: L'applicazione già esistente
NotFound: Applicazione non trovata
Invalid: Applicazione non valida
NotExisting: L'applicazione non esiste
NotActive: L'applicazione non è attiva
NotInactive: L'applicazione non è inattiva
OIDCConfigInvalid: La configurazione OIDC non è valida
APIConfigInvalid: La configurazione API non è valida
IsNotOIDC: L'applicazione non è di tipo oidc
IsNotAPI: L'applicazione non è di tipo API
OIDCAuthMethodNoSecret: Il metodo di autorizzazione OIDC scelto non richiede un segreto
APIAuthMethodNoSecret: Il metodo di autorizzazione API scelto non richiede un segreto
AuthMethodNoPrivateKeyJWT: Il metodo di autorizzazione scelto non richiede una chiave
ClientSecretInvalid: Il segreto del cliente non è valido
RequiredFieldsMissing: Mancano alcuni campi obbligatori
Grant:
AlreadyExists: Grant del progetto già esistente
NotFound: Grant non trovato
Invalid: Grant del progetto non è valido
NotExisting: Grant del progetto non esistente
HasNotExistingRole: Uno dei ruoli assegnati non è esistente nel progetto
NotActive: Grant del progetto non è attivo
NotInactive: Grant del progetto non è inattivo
UserIDMisisng: ID utente mancante
IAM:
Member:
RolesNotChanged: I ruoli non sono stati cambiati
MemberInvalid: Il membro non è valido
MemberAlreadyExisting: Il membro già esistente
MemberNotExisting: Il membro non esistente
IDMissing: ID mancante
GlobalOrgMissing: Manca un'organizzazione globale
GlobalOrgAlreadySet: L'organizzazione globale è già stata impostata
IAMProjectIDMissing: Manca l'ID del progetto IAM
IamProjectAlreadySet: L'ID del progetto IAM è già stato impostato
IdpInvalid: La configurazione dell'IDP non è valida
IdpNotExisting: La configurazione IDP non esiste
OIDCConfigInvalid: La configurazione OIDC IDP non è valida
IdpIsNotOIDC: La configurazione IDP non è di tipo OIDC
LoginPolicyInvalid: Impostazioni di accesso non sono validi
LoginPolicyNotExisting: Impostazioni di accesso non esistenti
IdpProviderInvalid: IDP non è valido
LoginPolicy:
NotFound: Impostazioni di accesso predefinite non trovate
NotChanged: Le impostazioni di accesso predefinite non sono state cambiate
NotExisting: Impostazioni di accesso predefinite non esistenti
AlreadyExists: Impostazioni di accesso predefinite già esistenti
MFA:
AlreadyExists: Multifattore già esistente
NotExisting: Multifattore non esistente
Unspecified: Multifattore non valido
IDP:
AlreadyExists: IDP già esistente
NotExisting: IDP non esiste
Invalid: IDP non valido
IDPConfig:
AlreadyExists: La configurazione del IDP già esistente
NotInactive: Configurazione del IDP non inattiva
NotActive: Configurazione del IDP non attiva
LabelPolicy:
NotFound: Private Labelling predefinita non trovata
NotChanged: Private Labelling non è stata cambiata
MailTemplate:
NotFound: Mail template predefinito non trovato
NotChanged: Mail template predefinito non è stato cambiato
AlreadyExists: Mail template predefinito già esistente
Invalid: Mail template predefinito non è valido
CustomMessageText:
NotFound: Testo del mail predefinito non trovato
NotChanged: Il testo predefinito del mail non è stato cambiato
AlreadyExists: Il testo del mail predefinito già esistente
Invalid: Il testo del mail predefinito non è valido
PasswordComplexityPolicy:
NotFound: Impostazioni di complessità della password predefinite non trovati
NotExisting: Impostazioni di complessità della password predefinite non esistenti
AlreadyExists: Impostazioni di complessità della password predefinite già esistenti
Empty: Le impostazioni di complessità della password predefinite non sono state trovate
NotChanged: Le impostazioni di complessità della password predefinite non sono state cambiate
PasswordAgePolicy:
NotFound: Le impostazioni di validità della password predefinite non trovate
NotExisting: Le impostazioni di validità della password predefinite non esistono
AlreadyExists: Le impostazioni di validità della password predefinite già esistenti
Empty: Le impostazioni di validità della password predefinite vuote
NotChanged: Le impostazioni di validità della password non sono state cambiate
PasswordLockoutPolicy:
NotFound: Impostazioni di blocco della password predefinite non trovate
NotExisting: Impostazioni di blocco della password predefinite non esistenti
AlreadyExists: Impostazioni di blocco della password predefinite già esistenti
Empty: Impostazioni di blocco della password predefinite sono vuote
NotChanged: Le impostazioni di blocco della password predefinite non sono state cambiate
OrgIAMPolicy:
NotFound: Impostazioni Org IAM non trovate
Empty: Impostazioni Org IAM mancanti
NotExisting: Impostazioni Org IAM non esistenti
AlreadyExists: Impostazioni Org IAM già esistenti
NotChanged: Impostazioni Org IAM non sono state cambiate
Policy:
AlreadyExists: Impostazioni già esistenti
Label:
Invalid:
PrimaryColor: Il colore primario non è un valore di colore HEX valido
BackgroundColor: Il colore di sfondo non è un valore di colore HEX valido
WarnColor: Warn color non è un valore di colore HEX valido
FontColor: Il colore del carattere non è un valore di colore HEX valido
PrimaryColorDark: Il colore primario (modo scuro) non è un valore di colore HEX valido
BackgroundColorDark: Il colore di sfondo (modo scuro) non è un valore di colore HEX valido
WarnColorDark: Warn color (dark mode) non è un valore di colore HEX valido
FontColorDark: Il colore del carattere (modalità scura) non è un valore di colore HEX valido
UserGrant:
AlreadyExists: User Grant già esistente
NotFound: User Grant non trovato
Invalid: User Grant non è valido
NotChanged: User Grant non è stata cambiato
IDMissing: ID mancante
NotActive: User Grant non è attivo
NotInactive: User Grant non è disattivato
NoPermissionForProject: L'utente non ha permessi su questo progetto
RoleKeyNotFound: Ruolo non trovato
Member:
AlreadyExists: Il membro è già esistente
IDPConfig:
AlreadyExists: La configurazione IDP con questo nome già esistente
NotExisting: La configurazione del IDP non esiste
Changes:
NotFound: Nessuna storia trovata
Token:
NotFound: Token non trovato
UserSession:
NotFound: Sessione non trovata
Key:
ExpireBeforeNow: La data di scadenza è passata
Login:
LoginPolicy:
MFA:
ForceAndNotConfigured: Multifactor è configurato come richiesto, ma nessun provider è configurato. Contatta il tuo amministratore di sistema.
Step:
Started:
AlreadyExists: Il passo iniziato già esistente
Done:
AlreadyExists: Il passo fatto già esistente
Features:
NotChanged: La caratteristica non è cambiata
CustomText:
AlreadyExists: Il testo personalizzato già esistente
Invalid: Testo personalizzato non valido
NotFound: Testo personalizzato non trovato
TranslationFile:
ReadError: Errore nella lettura del file di traduzione
MergeError: Il file di traduzione non può essere unito alle traduzioni personalizzate
NotFound: Il file di traduzione non esiste
MetaData:
NotFound: Metadati non trovati
NoData: L'elenco dei metadati è vuoto
Invalid: I metadati non sono validi
KeyNotExisting: Una o più chiavi non esistono
Action:
Invalid: L'azione non è valida
NotFound: L'azione non trovata
NotActive: L'azione non è attiva
NotInactive: L'azione non è inattiva
Flow:
FlowTypeMissing: FlowType mancante
Empty: Flow è già vuoto
WrongTriggerType: TriggerType non è valido
NoChanges: Nessun cambiamento
ActionIDsNotExist: Gli ActionID non esistono
Query:
CloseRows: Lo statement SQL non può essere terminato
SQLStatement: Lo statement SQL non può essere creato
InvalidRequest: La richiesta non è valida
EventTypes:
user:
added: Utente aggiunto
selfregistered: L'utente si è registrato
initialization:
code:
added: Codice di inizializzazione generato
sent: Codice di inizializzazione inviato
check:
succeeded: Controllo dell'inizializzazione riuscito
failed: Controllo dell'inizializzazione fallito
token:
added: Access Token creato
username:
reserved: Nome utente riservato
released: Nome utente rilasciato
email:
reserved: Indirizzo e-mail riservato
released: Indirizzo e-mail rilasciato
changed: Indirizzo e-mail cambiato
verified: Indirizzo e-mail verificato
verification:
failed: Verifica dell'indirizzo e-mail non riuscita
code:
added: Codice di verifica dell'indirizzo e-mail generato
sent: Codice di verifica dell'indirizzo e-mail inviato
machine:
added: Utente tecnico aggiunto
changed: Utente tecnico cambiato
key:
added: Chiave aggiunta
removed: Chiave rimossa
human:
added: Persona aggiunta
selfregistered: Persona registrata
avatar:
added: Avatar aggiunto
removed: Avatar rimosso
initialization:
code:
added: Codice di inizializzazione generato
sent: Codice di inizializzazione inviato
check:
succeeded: Controllo dell'inizializzazione riuscito
failed: Controllo dell'inizializzazione fallito
username:
reserved: Nome utente riservato
released: Nome utente rilasciato
email:
changed: Indirizzo e-mail cambiato
verified: Indirizzo e-mail verificato
verification:
failed: Verificazione dell'indirizzo e-mail non riuscita
code:
added: Codice di verifica generato
sent: Codice di verifica inviato
password:
changed: Password cambiata
code:
added: Codice password generato
sent: Codice password inviato
check:
succeeded: Controllo della password riuscito
failed: Controllo della password fallito
externallogin:
check:
succeeded: Accesso esterno riuscito
externalidp:
added: IDP esterno aggiunto
removed: IDP esterno rimosso
cascade:
removed: Cascata IDP rimossa
phone:
changed: Numero di telefono cambiato
verified: Numero di telefono verificato
verification:
failed: Verificazione del numero di telefono non riuscita
code:
added: Codice del numero di telefono generato
sent: Codice del numero di telefono inviato
removed: Numero di telefono rimosso
profile:
changed: Profilo cambiato
address:
changed: Indirizzo cambiato
mfa:
otp:
added: OTP aggiunto
verified: OTP verificato
removed: OTP rimosso
check:
succeeded: Controllo OTP riuscito
failed: Controllo OTP fallito
u2f:
token:
added: Aggiunto il U2F Token
verified: U2F Token verificato
removed: U2F Token rimosso
begin:
login: Controllo U2F avviato
check:
succeeded: Controllo U2F riuscito
failed: Controllo U2F fallito
signcount:
changed: Il checksum del U2F Token è stato cambiato
init:
skipped: Inizializzazione saltata
passwordless:
token:
added: Aggiunto il token per l'autenticazione passwordless
verified: Token per l'autenticazione passwordless verificato
removed: Token per l'autenticazione passwordless rimosso
begin:
login: Avviata l'autenticazione passwordless
check:
succeeded: Controllo dell'autenticazione passwordless riuscito
failed: Controllo dell'autenticazione passwordless fallito
signcount:
changed: Il checksum è stato cambiato
initialization:
code:
added: Aggiunto il codice di inizializzazione
sent: Codice di inizializzazione inviato
requested: Richiesta del codice di inizializzazione
check:
succeeded: Codice di inizializzazione controllato con successo
failed: Controllo del codice di inizializzazione fallito
signed:
out: L'utente è uscito
refresh:
token:
added: Refresh Token creato
renewed: Refresh Token rinnovato
removed: Refresh Token rimosso
locked: Utente bloccato
unlocked: Utente sbloccato
deactivated: Utente disattivato
reactivated: Utente riattivato
removed: Utente rimosso
password:
changed: Password cambiata
code:
added: Codice password generato
sent: Codice password inviato
check:
succeeded: Controllo della password riuscito
failed: Controllo della password fallito
phone:
changed: Numero di telefono cambiato
verified: Numero di telefono verificato
verification:
failed: Verifica del numero di telefono non riuscita
code:
added: Codice del numero di telefono generato
sent: Codice del numero di telefono inviato
profile:
changed: Profilo utente cambiato
address:
changed: Indirizzo utente cambiato
mfa:
otp:
added: OTP aggiunto
verified: OTP verificato
removed: OTP rimosso
check:
succeeded: Controllo OTP riuscito
failed: Controllo OTP fallito
init:
skipped: Inizializzazione saltata
signed:
out: L'utente è uscito
grant:
added: Autorizzazione aggiunta
changed: Autorizzazione cambiata
removed: Autorizzazione rimossa
deactivated: Autorizzazione disattivata
reactivated: Autorizzazione riattivata
reserved: Autorizzazione riservata
released: Autorizzazione rilasciata
cascade:
removed: Autorizzazione rimossa
changed: Autorizzazione cambiata
org:
added: Organizzazione aggiunta
changed: Organizzazione cambiata
deactivated: Organizzazione disattivata
reactivated: Organizzazione riattivata
removed: Organizzazione rimossa
domain:
added: Dominio aggiunto
verification:
added: Aggiunta la verifica del dominio
failed: Verifica del dominio fallita
verified: Dominio verificato
removed: Dominio rimosso
primary:
set: Set di dominio primario
reserved: Dominio riservato
released: Dominio rilasciato
features:
set: Caratteristica aggiunta
removed: Caratteristica rimossa
name:
reserved: Nome dell'organizzazione riservato
released: Nome dell'organizzazione rilasciata
member:
added: Membro dell'organizzazione aggiunto
changed: Membro dell'organizzazione cambiato
removed: Membro dell'organizzazione rimosso
cascade:
removeD: Cascata di membri dell'organizzazione rimossa
iam:
policy:
added: Impostazioni IAM aggiunti
changed: Impostazioni IAM cambiate
removed: Impostazioni IAM rimosse
idp:
config:
added: Configurazione IDP aggiunta
changed: Configurazione IDP cambiata
removed: Configurazione IDP rimossa
deactivated: Configurazione IDP disattivata
reactivated: Configurazione IDP riattivata
oidc:
config:
added: Aggiunta la configurazione IDP OIDC
changed: Configurazione IDP OIDC modificata
saml:
config:
added: Aggiunta la configurazione IDP SAML
changed: Configurazione IDP SAML modificata
customtext:
set: Testo personalizzato salvato
removed: Testo personalizzato rimosso
template:
removed: Template personalizzato rimosso
policy:
login:
added: Le mpostazioni di accesso sono state aggiunte con successo.
changed: Impostazioni di accesso modificate
removed: Impostazioni di accesso rimosse
idpprovider:
added: IDP aggiunto alle impostazioni di accesso
removed: IDP rimosso dalle impostazioni di accesso
secondfactor:
added: Secondo fattore aggiunto alle impostazioni di accesso
removed: Secondo fattore rimosso dalle impostazioni di accesso
multifactor:
added: Aggiunto il fattore multiplo alle impostazioni di accesso
removed: Fattore multiplo rimosso dalle impostazioni di accesso
password:
complexity:
added: Le impostazioni di complessità delle password sono state aggiunte con successo
changed: Le impostazioni di complessità delle password sono state cambiate
removed: Le impostazioni di complessità della password sono state rimosse
age:
added: Le impostazioni di validità della password
changed: Le impostazioni di validità della password sono state cambiate
removed: Le impostazioni di validità della password sono state rimosse con successo
lockout:
added: Le impostazioni di blocco della password sono state aggiunte con successo.
changed: Le impostazioni di blocco della password sono state cambiate
removed: Le impostazioni di blocco della password sono state rimosse con successo
label:
added: Impostazioni Private Labelling aggiunte
changed: Impostazioni Private Labelling cambiate
activated: Impostazioni Private Labelling attivate
removed: Impostazioni Private Labelling rimosse
logo:
added: Logo aggiunto
removed: Logo rimosso
dark:
added: Logo (modalità scura) aggiunto
removed: Logo (modalità scura) rimosso
icon:
added: Icona aggiunta
removed: Icona rimossa
dark:
added: Icona (modalità scura) aggiunta
removed: Icona (modalità scura) rimossa
font:
added: Font aggiunto
removed: Font rimosso
assets:
removed: Asset rimosse
privacy:
added: Informativa sulla privacy e termini e condizioni aggiunti
changed: Informativa sulla privacy e termini e condizioni cambiati
removed: Informativa sulla privacy e termini e condizioni rimossi
flow:
trigger_actions:
set: azioni salvate
cascade:
removed: Azioni a cascata rimosse
removed: Azioni rimosse
project:
added: Progetto aggiunto
changed: Progetto cambiato
deactivated: Progetto disattivato
reactivated: Progetto riattivato
removed: Progetto rimosso
member:
added: Membro del progetto aggiunto
changed: Membro del progetto cambiato
removed: Membro del progetto rimosso
cascade:
removeD: Cascata di membri del progetto rimossa
role:
added: Ruolo del progetto aggiunto
changed: Il ruolo del progetto è cambiato
removed: Ruolo del progetto rimosso
grant:
added: Grant aggiunto
changed: Grant cambiato
removed: Grant rimosso
deactivated: Grant disattivato
reactivated: Grant riattivato
cascade:
changed: Grant cambiato
member:
added: Grant Member aggiunto
changed: Grant Member cambiato
removed: Grant Member rimosso
cascade:
removed: Cascata di Grant Member rimossa
application:
added: Applicazione aggiunta
changed: Applicazione cambiata
removed: Applicazione rimossa
deactivated: Applicazione disattivata
reactivated: Applicazione riattivata
oidc:
secret:
check:
succeeded: Validazione OIDC Client Secret riuscita
failed: VAidazione OIDC Client Secret fallita
key:
added: Chiave di applicazione aggiunta
removed: Chiave di applicazione rimossa
config:
oidc:
added: Configurazione OIDC aggiunta
changed: Configurazione OIDC modificata
secret:
changed: Segreto OIDC cambiato
api:
added: Configurazione API aggiunta
changed: Configurazione API modificata
secret:
changed: Segreto API cambiato
policy:
password:
complexity:
added: Le impostazioni di complessità delle password sono state aggiunte con successo
changed: Le impostazioni di complessità delle password sono state cambiate
age:
added: Le impostazioni di validità della password sono state aggiunte con successo.
changed: Le impostazioni di validità della password sono state cambiate
lockout:
added: Le impostazioni di blocco della password sono state aggiunte.
changed: Le impostazioni di blocco della password sono state cambiate.
iam:
setup:
started: Avviato il setup di ZITADEL
done: setup di ZITADEL fatto
global:
org:
set: Organizzazione glabale di ZITADEL salvata
project:
iam:
set: progetto ZITADEL salvato
member:
added: ZITADEL membro aggiunto
changed: ZITADEL membro cambiato
removed: ZITADEL membro rimosso
cascade:
removeD: Membro ZITADEL rimosso a cascata
idp:
config:
added: Configurazione IDP aggiunta
changed: Configurazione IDP cambiata
removed: Configurazione IDP rimossa
deactivated: Configurazione IDP disattivata
reactivated: Configurazione IDP riattivata
oidc:
config:
added: Aggiunta la configurazione IDP OIDC
changed: Configurazione IDP OIDC modificata
saml:
config:
added: Aggiunta la configurazione IDP SAML
changed: Configurazione IDP SAML modificata
policy:
login:
added: Le impostazioni di accesso predefinite sono state aggiunte.
changed: Le impostazioni di accesso predefinite sono state cambiate.
idpprovider:
added: IDP aggiunto alle impostazioni di accesso predefinite
removed: IDP rimosso dalle impostazioni di accesso predefinite
label:
added: Le impostazioni Private Labelling sono state aggiunte.
changed: Le impostazioni Private Labelling sono state cambiate.
activated: Private Labelling attivato
logo:
added: Logo aggiunto
removed: Logo rimosso
dark:
added: Logo (modalità scura) aggiunto
removed: Logo (modalità scura) rimosso
icon:
added: Icona aggiunta
removed: Icona rimossa
dark:
added: Icona (modalità scura) aggiunta
removed: Icona (modalità scura) rimossa
font:
added: Font aggiunto
removed: Font rimosso
assets:
removed: Asset rimosse
key_pair:
added: Keypair aggiunto
action:
added: Azione aggiunta
changed: Azione cambiata
deactivated: Azione disattivata
reactivated: Azione riattivata
removed: Azione rimossa
Application:
OIDC:
V1:
NotCompliant: La tua configurazione non è conforme e differisce dallo standard OIDC 1.0.
NoRedirectUris: Deve essere registrato almeno un URI di reindirizzamento.
NotAllCombinationsAreAllowed: La configurazione è conforme, ma non tutte le combinazioni possibili sono permesse.
Code:
RedirectUris:
HttpOnlyForWeb: Grant Type Implicit consente reindirizzamenti http solo per AppType Web
CustomOnlyForNative: Grant Type permette solo URI di reindirizzamento personalizzati per AppType native (ad esempio appname:// )
Implicit:
RedirectUris:
CustomNotAllowed: Grant Type non permette URI di reindirizzamento personalizzati
HttpNotAllowed: Grant Type implicito non permette URI di reindirizzamento http
HttpLocalhostOnlyForNative: http://localhost redirect uri è consentito solo per le applicazioni native.
Native:
AuthMethodType:
NotNone: Le applicazioni native dovrebbero avere authmethodtype none.
RedirectUris:
MustBeHttpLocalhost: Gli URI di reindirizzamento devono iniziare con il proprio protocollo, http://127.0.0.1, http://[::1] o http://localhost.
UserAgent:
AuthMethodType:
NotNone: L'app agente utente dovrebbe avere authmethodtype none.
GrantType:
Refresh:
NoAuthCode: Refresh Token consentito solo in combinazione con Authorization Code.

View File

@ -103,7 +103,7 @@ InitMFAU2F:
ErrorRetry: Retry, create a new challenge or choose a different method. ErrorRetry: Retry, create a new challenge or choose a different method.
InitMFADone: InitMFADone:
Title: Multifcator Verification done Title: Multifactor Verification done
Description: Multifactor verification successfully done. The multifactor has to be entered on each login. Description: Multifactor verification successfully done. The multifactor has to be entered on each login.
NextButtonText: next NextButtonText: next
CancelButtonText: cancel CancelButtonText: cancel
@ -114,7 +114,7 @@ MFAProvider:
ChooseOther: or choose an other option ChooseOther: or choose an other option
VerifyMFAOTP: VerifyMFAOTP:
Title: Verify Multificator Title: Verify Multifactor
Description: Verify your multifactor Description: Verify your multifactor
CodeLabel: Code CodeLabel: Code
NextButtonText: next NextButtonText: next
@ -122,8 +122,8 @@ VerifyMFAOTP:
VerifyMFAU2F: VerifyMFAU2F:
Title: Multifactor Verification Title: Multifactor Verification
Description: Verify your multifactor U2F / WebAuthN token Description: Verify your multifactor U2F / WebAuthN token
NotSupported: WebAuthN wird durch deinen Browser nicht unterstützt. Stelle sicher, dass du die aktuelle Version installiert hast oder nutze einen anderen (z.B. Chrome, Safari, Firefox) NotSupported: WebAuthN is not supported by your browser. Make sure you are using the newest version or change your browser to a supported one (Chrome, Safari, Firefox)
ErrorRetry: Versuche es erneut, erstelle eine neue Abfrage oder wähle einen andere Methode. ErrorRetry: Retry, create a new request or choose a other method.
ValidateTokenButtonText: Validate Token ValidateTokenButtonText: Validate Token
Passwordless: Passwordless:
@ -173,7 +173,7 @@ PasswordChangeDone:
PasswordResetDone: PasswordResetDone:
Title: Reset link set Title: Reset link set
Description: Check your email to to reset your password. Description: Check your email to reset your password.
NextButtonText: next NextButtonText: next
EmailVerification: EmailVerification:

View File

@ -0,0 +1,365 @@
Login:
Title: Bentornato!
Description: Inserisci i tuoi dati di accesso.
TitleLinking: Accesso per il collegamento degli utenti
DescriptionLinking: Inserisci i tuoi dati di accesso per collegare il tuo utente esterno con un utente ZITADEL.
LoginNameLabel: Nome di accesso
UsernamePlaceHolder: nome utente
LoginnamePlaceHolder: nomeutente@dominio
ExternalUserDescription: Accedi con un utente esterno.
MustBeMemberOfOrg: 'L''utente deve essere membro dell''organizzazione {{.OrgName}}.'
RegisterButtonText: registrare
NextButtonText: Avanti
SelectAccount:
Title: Seleziona l'account
Description: Usa il tuo account ZITADEL
TitleLinking: Seleziona l'account per il collegamento dell'utente
DescriptionLinking: Seleziona il tuo account da collegare al tuo utente esterno.
OtherUser: Altro utente
SessionState0: attivo
SessionState1: inattivo
MustBeMemberOfOrg: 'L''utente deve essere membro dell''organizzazione {{.OrgName}}.'
Password:
Title: Password
Description: Inserisci i tuoi dati di accesso.
PasswordLabel: Password
MinLength: Lunghezza minima
HasUppercase: Lettera maiuscola
HasLowercase: Lettera minuscola
HasNumber: Numero
HasSymbol: Simbolo
Confirmation: Conferma password
ResetLinkText: Password dimenticata?
BackButtonText: indietro
NextButtonText: Avanti
UsernameChange:
Title: Cambia nome utente
Description: Imposta il tuo nuovo nome utente
UsernameLabel: Nome utente
CancelButtonText: annulla
NextButtonText: Avanti
UsernameChangeDone:
Title: Nome utente cambiato
Description: Il tuo nome utente è stato cambiato con successo.
NextButtonText: Avanti
InitPassword:
Title: Impostare la password
Description: Hai ricevuto un codice, che devi inserire nel modulo sottostante, per impostare la tua nuova password.
CodeLabel: Codice
NewPasswordLabel: Nuova password
NewPasswordConfirmLabel: Conferma la password
ResendButtonText: rispedisci
NextButtonText: Avanti
InitPasswordDone:
Title: Set di password
Description: Password impostata con successo
NextButtonText: Avanti
CancelButtonText: annulla
InitUser:
Title: Attivare l'utente
Description: Hai ricevuto un codice, che devi inserire nel modulo sottostante, per verificare la tua email e impostare la tua nuova password.
CodeLabel: Codice
NewPasswordLabel: Nuova password
NewPasswordConfirmLabel: Conferma la password
NextButtonText: Avanti
ResendButtonText: rispedisci
InitUserDone:
Title: Utente attivato
Description: Email verificata e password impostata con successo
NextButtonText: Avanti
CancelButtonText: annulla
InitMFAPrompt:
Title: Configurazione a più fattori
Description: Vuoi impostare l'autenticazione a più fattori?
Provider0: OTP (One Time Password)
Provider1: U2F (2° fattore universale)
NextButtonText: Avanti
SkipButtonText: salta
InitMFAOTP:
Title: Verifica a più fattori
Description: Verifica il tuo multifattore.
OTPDescription: Scannerizza il codice con la tua app di autenticazione (ad esempio Google Authenticator) o copia la chiave segreta e inserisci il codice generato nel campo sottostante.
SecretLabel: Chiave
CodeLabel: Codice
NextButtonText: Avanti
CancelButtonText: annulla
InitMFAU2F:
Title: Configurazione a più fattori U2F / WebAuthN
Description: Aggiungi il tuo Token fornendo un nome e cliccando sul pulsante 'Registra'.
TokenNameLabel: Nome del token / dispositivo
NotSupported: WebAuthN non è supportato dal tuo browser. Assicurati che sia aggiornato o usane uno diverso (ad esempio Chrome, Safari, Firefox)
RegisterTokenButtonText: Registra
ErrorRetry: Riprova, crea una nuova richiesta o scegli un metodo diverso.
InitMFADone:
Title: Verificazione a più fattori effettuata
Description: La verificazione del multifattore eseguita con successo. Il multifattore è richiesto ad ogni login.
NextButtonText: Avanti
CancelButtonText: annulla
MFAProvider:
Provider0: OTP (One Time Password)
Provider1: U2F (2° fattore universale)
ChooseOther: o scegli un'altra opzione
VerifyMFAOTP:
Title: Verificazione del Multificator
Description: Verifica il tuo multifattore
CodeLabel: Codice
NextButtonText: Avanti
VerifyMFAU2F:
Title: Verificazione a più fattori
Description: Verifica il tuo token U2F / WebAuthN
NotSupported: WebAuthN non è supportato dal tuo browser. Assicurati di avere l'ultima versione installata o usane una diversa (per esempio Chrome, Safari, Firefox).
ErrorRetry: Prova di nuovo, crea una nuova richiesta o scegli un metodo diverso.
ValidateTokenButtonText: Verifica
Passwordless:
Title: Accesso senza password
Description: Verifica il tuo token
NotSupported: WebAuthN non è supportato dal tuo browser. Assicurati che sia aggiornato o usane uno diverso (ad esempio Chrome, Safari, Firefox)
ErrorRetry: Riprova, crea una nuova richiesta o scegli un metodo diverso.
LoginWithPwButtonText: Accedi con password
ValidateTokenButtonText: Verifica
PasswordlessPrompt:
Title: Autenticazione passwordless
Description: Vuoi impostare il login senza password?
DescriptionInit: Devi impostare il login senza password. Usa il link che ti è stato inviato per registrare il tuo dispositivo.
PasswordlessButtonText: Continua
NextButtonText: Avanti
SkipButtonText: salta
PasswordlessRegistration:
Title: Configurazione dell'autenticazione senza password
Description: Aggiungi il tuo Token fornendo un nome e poi cliccando sul pulsante 'Registra'.
TokenNameLabel: Nome del token / dispositivo
NotSupported: WebAuthN non è supportato dal tuo browser. Assicurati che sia aggiornato o usane uno diverso (ad esempio Chrome, Safari, Firefox)
RegisterTokenButtonText: Registra
ErrorRetry: Riprova, crea una nuova richiesta o scegli un metodo diverso.
PasswordlessRegistrationDone:
Title: Configurazione dell'autenticazione senza password
Description: Token per lautenticazione passwordless aggiunto con successo.
DescriptionClose: Ora puoi chiudere questa finestra.
NextButtonText: Avanti
CancelButtonText: annulla
PasswordChange:
Title: Reimposta password
Description: Cambia la tua password. Inserisci la tua vecchia e la nuova password.
OldPasswordLabel: Vecchia password
NewPasswordLabel: Nuova password
NewPasswordConfirmLabel: Conferma della password
CancelButtonText: annulla
NextButtonText: Avanti
PasswordChangeDone:
Title: Reimposta password
Description: La tua password è stata cambiata con successo.
NextButtonText: Avanti
PasswordResetDone:
Title: Link per il cambiamento inviato
Description: Controlla la tua email per reimpostare la tua password.
NextButtonText: Avanti
EmailVerification:
Title: Verifica email
Description: Ti abbiamo inviato un'e-mail per verificare il tuo indirizzo. Inserisci il codice nel campo sottostante.
CodeLabel: Codice
NextButtonText: Avanti
ResendButtonText: rispedisci
EmailVerificationDone:
Title: Verificazione email effettuata
Description: La tua email è stata verificata con successo.
NextButtonText: Avanti
CancelButtonText: annulla
LoginButtonText: Accedi
RegisterOption:
Title: Opzioni di registrazione
Description: Scegli come vuoi registrarti
RegisterUsernamePasswordButtonText: Con nome utente e password
ExternalLoginDescription: o registrarsi con un utente esterno
RegistrationUser:
Title: Registrazione
Description: Inserisci i tuoi dati utente. La tua email sarà usata come nome di accesso.
DescriptionOrgRegister: Inserisci i tuoi dati utente.
EmailLabel: email
UsernameLabel: Nome utente
FirstnameLabel: Nome
LastnameLabel: Cognome
LanguageLabel: Lingua
German: Tedesco
English: Inglese
GenderLabel: Genere
Female: Femminile
Male: Maschile
Diverse: diverso / X
PasswordLabel: Password
PasswordConfirmLabel: Conferma della password
TosAndPrivacyLabel: Termini di servizio
TosConfirm: Accetto i
TosLinkText: Termini di servizio
TosConfirmAnd: e
PrivacyLinkText: l'informativa sulla privacy
ExternalLogin: o registrati con un utente esterno
BackButtonText: indietro
NextButtonText: Avanti
ExternalRegistrationUserOverview:
Title: Registrazione utente esterno
Description: Abbiamo preso i tuoi dati utente dal provider selezionato. Ora puoi cambiarli o completarli.
EmailLabel: E-mail
UsernameLabel: Nome utente
FirstnameLabel: Nome
LastnameLabel: Cognome
NicknameLabel: Soprannome
PhoneLabel: Numero di telefono
LanguageLabel: Lingua
German: Tedesco
English: Inglese
TosAndPrivacyLabel: Termini di servizio
TosConfirm: Accetto i
TosLinkText: Termini di servizio
TosConfirmAnd: e
PrivacyLinkText: l'informativa sulla privacy
ExternalLogin: o registrati con un utente esterno
BackButtonText: indietro
NextButtonText: salva
RegistrationOrg:
Title: Registrazione dell'organizzazione
Description: Inserisci il tuo nome di organizzazione e i tuoi dati utente.
OrgNameLabel: Nome dell'organizzazione
EmailLabel: E-mail
UsernameLabel: Nome utente
FirstnameLabel: Nome
LastnameLabel: Cognome
PasswordLabel: Password
PasswordConfirmLabel: Conferma della password
TosAndPrivacyLabel: Termini di servizio
TosConfirm: Accetto i
TosLinkText: Termini di servizio
TosConfirmAnd: e
PrivacyLinkText: l'informativa sulla privacy
SaveButtonText: Salva
LoginSuccess:
Title: Accesso riuscito
AutoRedirectDescription: Sarai reindirizzato automaticamente alla tua applicazione. In caso contrario, clicca sul pulsante sottostante. Dopo puoi chiudere la finestra.
RedirectedDescription: Ora puoi chiudere la finestra.
NextButtonText: Avanti
LogoutDone:
Title: Disconnesso
Description: Ti sei disconnesso con successo.
LoginButtonText: Accedi
LinkingUsersDone:
Title: Collegamento utente
Description: Collegamento fatto.
CancelButtonText: annulla
NextButtonText: Avanti
ExternalNotFoundOption:
Title: Utente esterno
Description: Utente esterno non trovato. Vuoi collegare il tuo utente o registrarne uno nuovo automaticamente.
LinkButtonText: Link
AutoRegisterButtonText: Registra automaticamente
TosAndPrivacyLabel: Termini di servizio
TosConfirm: Accetto i
TosLinkText: Termini di servizio
TosConfirmAnd: e
PrivacyLinkText: l'informativa sulla privacy
Footer:
PoweredBy: Alimentato da
Tos: Termini di servizio
PrivacyPolicy: l'informativa sulla privacy
Help: Aiuto
HelpLink: 'https://docs.zitadel.ch/docs/manuals/user-login'
Errors:
Internal: Si è verificato un errore interno
AuthRequest:
NotFound: Impossibile trovare authrequest
UserAgentNotCorresponding: User Agent non corrisponde
UserAgentNotFound: User Agent ID non trovato
TokenNotFound: Token non trovato
RequestTypeNotSupported: Il tipo di richiesta non è supportato
MissingParameters: Mancano i parametri richiesti
User:
NotFound: L'utente non è stato trovato
Inactive: L'utente è inattivo
NotFoundOnOrg: L'utente non è stato trovato nell'organizzazione scelta
NotAllowedOrg: L'utente non è membro dell'organizzazione richiesta
NotMatchingUserID: Utente e authrequest non corrispondono
UserIDMissing: UserID è vuoto
Invalid: I dati del utente non sono validi
DomainNotAllowedAsUsername: Il dominio è già riservato e non può essere utilizzato
NotAllowedToLink: L'utente non è autorizzato a collegarsi con un provider di accesso esterno
Password:
ConfirmationWrong: La conferma della password è sbagliata
Empty: La password è vuota
Invalid: La password non è valida
InvalidAndLocked: La password non è valida e l'utente è bloccato, contatta il tuo amministratore.
PasswordComplexityPolicy:
NotFound: Impostazioni della password non trovate
MinLength: La password è troppo corta
HasLower: La password deve contenere una lettera minuscola
HasUpper: La password deve contenere la lettera maiuscola
HasNumber: La password deve contenere un numero
HasSymbol: La password deve contenere il simbolo
Code:
Expired: Il codice è scaduto
Invalid: Il codice non è valido
Empty: Il codice è vuoto
CryptoCodeNil: Il codice criptato è null
NotFound: Impossibile trovare il codice
GeneratorAlgNotSupported: Algoritmo generatore non supportato
EmailVerify:
UserIDEmpty: UserID è vuoto
ExternalData:
CouldNotRead: I dati esterni non possono essere letti correttamente
MFA:
NoProviders: Nessun fornitore multifattore disponibile
OTP:
AlreadyReady: Multifactor OTP (OneTimePassword) è già impostato
NotExisting: Multifactor OTP (OneTimePassword) non esiste
InvalidCode: Codice non valido
NotReady: Multifattore OTP (OneTimePassword) non è pronto
Locked: L'utente è bloccato
SomethingWentWrong: Qualcosa è andato storto
NotActive: L'utente non è attivo
ExternalIDP:
IDPTypeNotImplemented: Il tipo di IDP non è implementato
NotAllowed: Provider di accesso esterno non consentito
IDPConfigIDEmpty: L'ID del fornitore di identità è vuoto
ExternalUserIDEmpty: L'ID utente esterno è vuoto
UserDisplayNameEmpty: Il nome visualizzato dell'utente è vuoto
NoExternalUserData: Nessun dato utente esterno ricevuto
GrantRequired: Accesso non possibile. L'utente deve avere almeno una sovvenzione sull'applicazione. Contatta il tuo amministratore.
ProjectRequired: Accesso non possibile. L'organizzazione dell'utente deve essere concessa al progetto. Contatta il tuo amministratore.
IdentityProvider:
InvalidConfig: La configurazione dell'Identity Provider non è valida
IAM:
LockoutPolicy:
NotExisting: Impostazioni di blocco non esistenti
optional: (opzionale)