feat(cnsl): docs link can be customized and custom button is available (#7840)

* feat: customize doc link and additional custom link

* feat: add e2e tests

* fix: update docs

* fix: add @peintnermax changes about cache

* fix: golangci-lint complains preparation.PrepareCommands

---------

Co-authored-by: Max Peintner <max@caos.ch>
This commit is contained in:
Miguel Cabrerizo
2024-05-13 16:01:50 +02:00
committed by GitHub
parent 6942324741
commit 15d5338b91
61 changed files with 1000 additions and 286 deletions

View File

@@ -1,11 +1,11 @@
<div class="footer-wrapper">
<div class="footer-row">
<div class="footer-links">
<a target="_blank" *ngIf="policy?.tosLink" rel="noreferrer" [href]="policy?.tosLink" external>
<div class="footer-links" *ngIf="authService.privacypolicy | async as pP">
<a target="_blank" *ngIf="pP?.tosLink" rel="noreferrer" [href]="pP?.tosLink" external>
<span>{{ 'FOOTER.LINKS.TOS' | translate }}</span>
<i class="las la-external-link-alt"></i>
</a>
<a target="_blank" *ngIf="policy?.privacyLink" rel="noreferrer" [href]="policy?.privacyLink" external>
<a target="_blank" *ngIf="pP?.privacyLink" rel="noreferrer" [href]="pP?.privacyLink" external>
<span>{{ 'FOOTER.LINKS.PP' | translate }}</span>
<i class="las la-external-link-alt"></i>
</a>

View File

@@ -8,16 +8,7 @@ import { faXTwitter } from '@fortawesome/free-brands-svg-icons';
templateUrl: './footer.component.html',
styleUrls: ['./footer.component.scss'],
})
export class FooterComponent implements OnInit {
public policy?: PrivacyPolicy.AsObject;
export class FooterComponent {
public faXTwitter = faXTwitter;
constructor(public authService: GrpcAuthService) {}
ngOnInit(): void {
this.authService.getMyPrivacyPolicy().then((policyResp) => {
if (policyResp.policy) {
this.policy = policyResp.policy;
}
});
}
}

View File

@@ -168,7 +168,11 @@
<span class="fill-space"></span>
<a class="doc-link" href="https://zitadel.com/docs" mat-stroked-button target="_blank">
<a class="custom-link" *ngIf="customLink && customLinkText" href="{{ customLink }}" mat-stroked-button target="_blank">
{{ customLinkText }}
</a>
<a class="doc-link" *ngIf="docsLink" href="{{ docsLink }}" mat-stroked-button target="_blank">
{{ 'MENU.DOCUMENTATION' | translate }}
</a>

View File

@@ -224,7 +224,8 @@
flex: 1;
}
.doc-link {
.doc-link,
.custom-link {
margin-right: 1rem;
@media only screen and (max-width: 800px) {

View File

@@ -1,5 +1,5 @@
import { ConnectedPosition, ConnectionPositionPair } from '@angular/cdk/overlay';
import { Component, ElementRef, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core';
import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';
import { Router } from '@angular/router';
import { BehaviorSubject, Observable, of, Subject } from 'rxjs';
import { Org } from 'src/app/proto/generated/zitadel/org_pb';
@@ -8,8 +8,8 @@ import { AuthenticationService } from 'src/app/services/authentication.service';
import { BreadcrumbService, BreadcrumbType } from 'src/app/services/breadcrumb.service';
import { GrpcAuthService } from 'src/app/services/grpc-auth.service';
import { ManagementService } from 'src/app/services/mgmt.service';
import { ActionKeysType } from '../action-keys/action-keys.component';
import { GetPrivacyPolicyResponse } from 'src/app/proto/generated/zitadel/management_pb';
@Component({
selector: 'cnsl-header',
@@ -31,6 +31,9 @@ export class HeaderComponent implements OnDestroy {
private destroy$: Subject<void> = new Subject();
public BreadcrumbType: any = BreadcrumbType;
public ActionKeysType: any = ActionKeysType;
public docsLink = 'https://zitadel.com/docs';
public customLink = '';
public customLinkText = '';
public positions: ConnectedPosition[] = [
new ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }, 0, 10),
@@ -47,7 +50,25 @@ export class HeaderComponent implements OnDestroy {
public mgmtService: ManagementService,
public breadcrumbService: BreadcrumbService,
public router: Router,
) {}
) {
this.loadData();
}
public async loadData(): Promise<any> {
const getData = (): Promise<GetPrivacyPolicyResponse.AsObject> => {
return this.mgmtService.getPrivacyPolicy();
};
getData()
.then((resp) => {
if (resp.policy) {
this.docsLink = resp.policy.docsLink;
this.customLink = resp.policy.customLink;
this.customLinkText = resp.policy.customLinkText;
}
})
.catch(() => {});
}
public ngOnDestroy() {
this.destroy$.next();

View File

@@ -9,6 +9,7 @@
color="warn"
(click)="resetDefault()"
mat-stroked-button
data-e2e="reset-button"
>
{{ 'POLICY.RESET' | translate }}
</button>
@@ -40,7 +41,23 @@
<cnsl-form-field class="privacy-policy-formfield">
<cnsl-label>{{ 'POLICY.PRIVACY_POLICY.SUPPORTEMAIL' | translate }}</cnsl-label>
<input cnslInput name="supportEmail" formControlName="supportEmail" />
<template [ngTemplateOutlet]="templateRef" [ngTemplateOutletContext]="{ key: 'supportEmail' }"></template>
</cnsl-form-field>
<cnsl-form-field class="privacy-policy-formfield">
<cnsl-label>{{ 'POLICY.PRIVACY_POLICY.CUSTOMLINK' | translate }}</cnsl-label>
<input cnslInput name="customLink" formControlName="customLink" />
<template [ngTemplateOutlet]="templateRef" [ngTemplateOutletContext]="{ key: 'customLink' }"></template>
</cnsl-form-field>
<cnsl-form-field class="privacy-policy-formfield">
<cnsl-label>{{ 'POLICY.PRIVACY_POLICY.CUSTOMLINKTEXT' | translate }}</cnsl-label>
<input cnslInput name="customLinkText" formControlName="customLinkText" />
</cnsl-form-field>
<cnsl-form-field class="privacy-policy-formfield">
<cnsl-label>{{ 'POLICY.PRIVACY_POLICY.DOCSLINK' | translate }}</cnsl-label>
<input cnslInput name="docsLink" formControlName="docsLink" />
<template [ngTemplateOutlet]="templateRef" [ngTemplateOutletContext]="{ key: 'docsLink' }"></template>
</cnsl-form-field>
</form>
</div>
@@ -53,6 +70,7 @@
color="primary"
type="submit"
mat-raised-button
data-e2e="save-button"
>
{{ 'ACTIONS.SAVE' | translate }}
</button>

View File

@@ -61,6 +61,9 @@ export class PrivacyPolicyComponent implements OnInit, OnDestroy {
privacyLink: ['', []],
helpLink: ['', []],
supportEmail: ['', []],
docsLink: ['', []],
customLink: ['', []],
customLinkText: ['', []],
});
this.canWrite$.pipe(take(1)).subscribe((canWrite) => {
@@ -107,6 +110,9 @@ export class PrivacyPolicyComponent implements OnInit, OnDestroy {
privacyLink: '',
helpLink: '',
supportEmail: '',
docsLink: '',
customLink: '',
customLinkText: '',
});
}
})
@@ -117,6 +123,9 @@ export class PrivacyPolicyComponent implements OnInit, OnDestroy {
privacyLink: '',
helpLink: '',
supportEmail: '',
docsLink: '',
customLink: '',
customLinkText: '',
});
});
}
@@ -129,11 +138,16 @@ export class PrivacyPolicyComponent implements OnInit, OnDestroy {
req.setTosLink(this.form.get('tosLink')?.value);
req.setHelpLink(this.form.get('helpLink')?.value);
req.setSupportEmail(this.form.get('supportEmail')?.value);
req.setDocsLink(this.form.get('docsLink')?.value);
req.setCustomLink(this.form.get('customLink')?.value);
req.setCustomLinkText(this.form.get('customLinkText')?.value);
(this.service as ManagementService)
.addCustomPrivacyPolicy(req)
.then(() => {
this.toast.showInfo('POLICY.PRIVACY_POLICY.SAVED', true);
this.loadData();
// Reload console as links may have changed
this.reloadConsole();
})
.catch((error) => this.toast.showError(error));
} else {
@@ -142,12 +156,17 @@ export class PrivacyPolicyComponent implements OnInit, OnDestroy {
req.setTosLink(this.form.get('tosLink')?.value);
req.setHelpLink(this.form.get('helpLink')?.value);
req.setSupportEmail(this.form.get('supportEmail')?.value);
req.setDocsLink(this.form.get('docsLink')?.value);
req.setCustomLink(this.form.get('customLink')?.value);
req.setCustomLinkText(this.form.get('customLinkText')?.value);
(this.service as ManagementService)
.updateCustomPrivacyPolicy(req)
.then(() => {
this.toast.showInfo('POLICY.PRIVACY_POLICY.SAVED', true);
this.loadData();
// Reload console as links may have changed
this.reloadConsole();
})
.catch((error) => this.toast.showError(error));
}
@@ -157,12 +176,17 @@ export class PrivacyPolicyComponent implements OnInit, OnDestroy {
req.setTosLink(this.form.get('tosLink')?.value);
req.setHelpLink(this.form.get('helpLink')?.value);
req.setSupportEmail(this.form.get('supportEmail')?.value);
req.setDocsLink(this.form.get('docsLink')?.value);
req.setCustomLink(this.form.get('customLink')?.value);
req.setCustomLinkText(this.form.get('customLinkText')?.value);
(this.service as AdminService)
.updatePrivacyPolicy(req)
.then(() => {
this.toast.showInfo('POLICY.PRIVACY_POLICY.SAVED', true);
this.loadData();
// Reload console as links may have changed
this.reloadConsole();
})
.catch((error) => this.toast.showError(error));
}
@@ -188,6 +212,7 @@ export class PrivacyPolicyComponent implements OnInit, OnDestroy {
.then(() => {
setTimeout(() => {
this.loadData();
window.location.reload();
}, 1000);
})
.catch((error) => {
@@ -209,4 +234,10 @@ export class PrivacyPolicyComponent implements OnInit, OnDestroy {
return false;
}
}
private reloadConsole(): void {
setTimeout(() => {
window.location.reload();
}, 1000);
}
}

View File

@@ -36,7 +36,7 @@ export const APPEARANCE_GROUP: SettingLinks = {
};
export const PRIVACY_POLICY: SettingLinks = {
i18nTitle: 'SETTINGS.LIST.PRIVACYPOLICY',
i18nTitle: 'DESCRIPTIONS.SETTINGS.PRIVACY_POLICY.TITLE',
i18nDesc: 'POLICY.PRIVACY_POLICY.DESCRIPTION',
iamRouterLink: ['/settings'],
orgRouterLink: ['/org-settings'],

View File

@@ -187,7 +187,7 @@ export const LOGINTEXTS: SidenavSetting = {
export const PRIVACYPOLICY: SidenavSetting = {
id: 'privacypolicy',
i18nKey: 'SETTINGS.LIST.PRIVACYPOLICY',
i18nKey: 'DESCRIPTIONS.SETTINGS.PRIVACY_POLICY.TITLE',
groupI18nKey: 'SETTINGS.GROUPS.OTHER',
requiredRoles: {
[PolicyComponentServiceType.MGMT]: ['policy.read'],

View File

@@ -27,7 +27,6 @@ import {
GetMyPhoneRequest,
GetMyPhoneResponse,
GetMyPrivacyPolicyRequest,
GetMyPrivacyPolicyResponse,
GetMyProfileRequest,
GetMyProfileResponse,
GetMyUserRequest,
@@ -99,11 +98,10 @@ import { ChangeQuery } from '../proto/generated/zitadel/change_pb';
import { MetadataQuery } from '../proto/generated/zitadel/metadata_pb';
import { ListQuery } from '../proto/generated/zitadel/object_pb';
import { Org, OrgFieldName, OrgQuery } from '../proto/generated/zitadel/org_pb';
import { LabelPolicy } from '../proto/generated/zitadel/policy_pb';
import { LabelPolicy, PrivacyPolicy } from '../proto/generated/zitadel/policy_pb';
import { Gender, MembershipQuery, User, WebAuthNVerification } from '../proto/generated/zitadel/user_pb';
import { GrpcService } from './grpc.service';
import { StorageKey, StorageLocation, StorageService } from './storage.service';
import { ThemeService } from './theme.service';
@Injectable({
providedIn: 'root',
@@ -137,11 +135,18 @@ export class GrpcAuthService {
>(undefined);
labelPolicyLoading$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);
public privacypolicy$!: Observable<PrivacyPolicy.AsObject>;
public privacypolicy: BehaviorSubject<PrivacyPolicy.AsObject | undefined> = new BehaviorSubject<
PrivacyPolicy.AsObject | undefined
>(undefined);
privacyPolicyLoading$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);
public zitadelPermissions: BehaviorSubject<string[]> = new BehaviorSubject<string[]>([]);
public readonly fetchedZitadelPermissions: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
public cachedOrgs: BehaviorSubject<Org.AsObject[]> = new BehaviorSubject<Org.AsObject[]>([]);
private cachedLabelPolicies: { [orgId: string]: LabelPolicy.AsObject } = {};
private cachedPrivacyPolicies: { [orgId: string]: PrivacyPolicy.AsObject } = {};
constructor(
private readonly grpcService: GrpcService,
@@ -169,6 +174,25 @@ export class GrpcAuthService {
},
});
this.privacypolicy$ = this.activeOrgChanged.pipe(
switchMap((org) => {
this.privacyPolicyLoading$.next(true);
return from(this.getMyPrivacyPolicy(org ? org.id : ''));
}),
filter((policy) => !!policy),
);
this.privacypolicy$.subscribe({
next: (policy) => {
this.privacypolicy.next(policy);
this.privacyPolicyLoading$.next(false);
},
error: (error) => {
console.error(error);
this.privacyPolicyLoading$.next(false);
},
});
this.user = forkJoin([
of(this.oauthService.getAccessToken()),
this.oauthService.events.pipe(
@@ -697,7 +721,23 @@ export class GrpcAuthService {
}
}
public getMyPrivacyPolicy(): Promise<GetMyPrivacyPolicyResponse.AsObject> {
return this.grpcService.auth.getMyPrivacyPolicy(new GetMyPrivacyPolicyRequest(), null).then((resp) => resp.toObject());
public getMyPrivacyPolicy(orgIdForCache?: string): Promise<PrivacyPolicy.AsObject> {
if (orgIdForCache && this.cachedPrivacyPolicies[orgIdForCache]) {
return Promise.resolve(this.cachedPrivacyPolicies[orgIdForCache]);
} else {
return this.grpcService.auth
.getMyPrivacyPolicy(new GetMyPrivacyPolicyRequest(), null)
.then((resp) => resp.toObject())
.then((resp) => {
if (resp.policy) {
if (orgIdForCache) {
this.cachedPrivacyPolicies[orgIdForCache] = resp.policy;
}
return Promise.resolve(resp.policy);
} else {
return Promise.reject();
}
});
}
}
}

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Външни връзки",
"DESCRIPTION": "Насочете вашите потребители към персонализирани външни ресурси, показани на страницата за вход. Потребителите трябва да приемат Условията за ползване и Политиката за поверителност, преди да могат да се регистрират."
"DESCRIPTION": "Насочете потребителите си към персонализирани външни ресурси, показани на страницата за вход. Потребителите трябва да приемат Общите условия и Политиката за поверителност, преди да могат да се регистрират. Променете връзката към вашата документация или задайте празен низ, за ​​да скриете бутона за документация от конзолата. Добавете персонализирана външна връзка и персонализиран текст за тази връзка в конзолата или ги оставете празни, за да скриете този бутон."
},
"SMTP_PROVIDER": {
"TITLE": "Настройки на SMTP",
@@ -1564,6 +1564,9 @@
"POLICYLINK": "Връзка към Политика за поверителност",
"HELPLINK": "Връзка към Помощ",
"SUPPORTEMAIL": "Имейл за поддръжка",
"DOCSLINK": "Връзка към документи (Console)",
"CUSTOMLINK": "Персонализирана връзка (Console)",
"CUSTOMLINKTEXT": "Персонализиран текст на връзката (Console)",
"SAVED": "Запазено успешно!",
"RESET_TITLE": "Възстановяване на стойностите по подразбиране",
"RESET_DESCRIPTION": "На път сте да възстановите връзките по подразбиране за TOS и Политика за поверителност. "

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Externí odkazy",
"DESCRIPTION": "Navede vaše uživatele k vlastním externím zdrojům zobrazeným na přihlašovací stránce. Uživatelé musí přijmout Podmínky služby a Zásady ochrany osobních údajů, než se mohou zaregistrovat."
"DESCRIPTION": "Naveďte své uživatele k vlastním externím zdrojům zobrazeným na přihlašovací stránce. Než se uživatelé mohou zaregistrovat, musí přijmout podmínky služby a zásady ochrany osobních údajů. Změňte odkaz na dokumentaci nebo nastavte prázdný řetězec, abyste skryli tlačítko dokumentace z konzoly. Přidejte vlastní externí odkaz a vlastní text pro tento odkaz v konzole nebo je nastavte na prázdné, abyste toto tlačítko skryli."
},
"SMTP_PROVIDER": {
"TITLE": "Nastavení SMTP",
@@ -1571,6 +1571,9 @@
"POLICYLINK": "Odkaz na Zásady ochrany osobních údajů",
"HELPLINK": "Odkaz na pomoc",
"SUPPORTEMAIL": "E-mailová podpora",
"DOCSLINK": "Odkaz na Dokumenty (Console)",
"CUSTOMLINK": "Vlastní odkaz (Console)",
"CUSTOMLINKTEXT": "Text vlastního odkazu (Console)",
"SAVED": "Úspěšně uloženo!",
"RESET_TITLE": "Obnovit výchozí hodnoty",
"RESET_DESCRIPTION": "Chystáte se obnovit výchozí odkazy pro Podmínky služby a Zásady ochrany osobních údajů. Opravdu chcete pokračovat?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Externe Links",
"DESCRIPTION": "Leite deine Benutzer zu benutzerdefinierten externen Ressourcen, die auf der Anmeldeseite angezeigt werden. Benutzer müssen die Allgemeinen Geschäftsbedingungen und die Datenschutzrichtlinie akzeptieren, bevor sie sich anmelden können."
"DESCRIPTION": "Leiten Sie Ihre Benutzer zu benutzerdefinierten externen Ressourcen, die auf der Anmeldeseite angezeigt werden. Benutzer müssen die Nutzungsbedingungen und Datenschutzrichtlinien akzeptieren, bevor sie sich anmelden können. Ändern Sie den Link zu Ihrer Dokumentation oder legen Sie eine leere Zeichenfolge fest, um die Dokumentationsschaltfläche in der Konsole auszublenden. Fügen Sie in der Konsole einen benutzerdefinierten externen Link und einen benutzerdefinierten Text für diesen Link hinzu oder setzen Sie sie leer, um diese Schaltfläche auszublenden."
},
"SMTP_PROVIDER": {
"TITLE": "SMTP-Einstellungen",
@@ -1570,6 +1570,9 @@
"POLICYLINK": "Link zur den Datenschutzrichtlinien",
"HELPLINK": "Link zur Hilfestellung",
"SUPPORTEMAIL": "Support E-Mail",
"DOCSLINK": "Link zu Dokumenten (Console)",
"CUSTOMLINK": "Benutzerdefinierter Link (Console)",
"CUSTOMLINKTEXT": "Benutzerdefinierter Linktext (Console)",
"SAVED": "Saved successfully!",
"RESET_TITLE": "Standardwerte wiederherstellen",
"RESET_DESCRIPTION": "Sie sind im Begriff die Standardlinks für die AGBs und Datenschutzrichtlinie wiederherzustellen. Wollen Sie fortfahren?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "External Links",
"DESCRIPTION": "Guide your users to custom external resources shown on the login page. Users need to accept the Terms of Service and Privacy Policy before they can sign up."
"DESCRIPTION": "Guide your users to custom external resources shown on the login page. Users need to accept the Terms of Service and Privacy Policy before they can sign up. Change the link to your documentation or set an empty string to hide the documentation button from the console. Add a custom external link and a custom text for that link in the console, or set them empty to hide that button."
},
"SMTP_PROVIDER": {
"TITLE": "SMTP Settings",
@@ -1335,7 +1335,7 @@
"DOMAIN": "Domain settings",
"LOGINTEXTS": "Login Interface Texts",
"BRANDING": "Branding",
"PRIVACYPOLICY": "Privacy Policy",
"PRIVACYPOLICY": "External links",
"OIDC": "OIDC Token lifetime and expiration",
"SECRETS": "Secret Generator",
"SECURITY": "Security settings",
@@ -1571,6 +1571,9 @@
"POLICYLINK": "Link to Privacy Policy",
"HELPLINK": "Link to Help",
"SUPPORTEMAIL": "Support Email",
"DOCSLINK": "Docs Link (Console)",
"CUSTOMLINK": "Custom Link (Console)",
"CUSTOMLINKTEXT": "Custom Link Text (Console)",
"SAVED": "Saved successfully!",
"RESET_TITLE": "Restore Default Values",
"RESET_DESCRIPTION": "You are about to restore the default Links for TOS and Privacy Policy. Do you really want to continue?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Enlaces Externos",
"DESCRIPTION": "Guía a tus usuarios hacia recursos externos personalizados mostrados en la página de inicio de sesión. Los usuarios necesitan aceptar los Términos de Servicio y la Política de Privacidad antes de que puedan registrarse."
"DESCRIPTION": "Guía a tus usuarios a recursos externos personalizados que se muestran en la página de inicio de sesión. Los usuarios deben aceptar los Términos de servicio y la Política de privacidad antes de poder registrarse. Cambia el enlace a tu documentación o introduce una cadena de texto vacía para ocultar el botón de documentación de la consola. Agrega un enlace externo personalizado y un texto personalizado para dicho enlace en la consola, o déjalos vacíos para ocultar ese botón."
},
"SMTP_PROVIDER": {
"TITLE": "Configuración de SMTP",
@@ -1572,6 +1572,9 @@
"POLICYLINK": "Enlace a Política de privacidad",
"HELPLINK": "Enlace de ayuda",
"SUPPORTEMAIL": "Email de soporte",
"DOCSLINK": "Enlace de documentos (Console)",
"CUSTOMLINK": "Enlace personalizado (Console)",
"CUSTOMLINKTEXT": "Texto de enlace personalizado (Console)",
"SAVED": "¡Se guardó con éxito!",
"RESET_TITLE": "Restaurar valores por defecto",
"RESET_DESCRIPTION": "Estás a punto de restaurar los enlaces por defecto para los TDS y la política de privacida. ¿Quieres continuar?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Liens Externes",
"DESCRIPTION": "Guide tes utilisateurs vers des ressources externes personnalisées affichées sur la page de connexion. Les utilisateurs doivent accepter les Termes de Service et la Politique de Confidentialité avant de pouvoir s'inscrire."
"DESCRIPTION": "Guidez vos utilisateurs vers des ressources externes personnalisées affichées sur la page de connexion. Les utilisateurs doivent accepter les conditions d'utilisation et la politique de confidentialité avant de pouvoir s'inscrire. Modifiez le lien vers votre documentation ou définissez une chaîne vide pour masquer le bouton de documentation de la console. Ajoutez un lien externe personnalisé et un texte personnalisé pour ce lien dans la console, ou définissez-les vides pour masquer ce bouton."
},
"SMTP_PROVIDER": {
"TITLE": "Paramètres SMTP",
@@ -1570,6 +1570,9 @@
"POLICYLINK": "Lien vers la politique de confidentialité",
"HELPLINK": "Lien vers l'aide",
"SUPPORTEMAIL": "E-mail d'assistance",
"DOCSLINK": "Lien Docs (Console)",
"CUSTOMLINK": "Lien personnalisé (Console)",
"CUSTOMLINKTEXT": "Texte de lien personnalisé (Console)",
"SAVED": "Enregistré avec succès !",
"RESET_TITLE": "Restaurer les valeurs par défaut",
"RESET_DESCRIPTION": "Vous êtes sur le point de restaurer les liens par défaut pour les CGS et la politique de confidentialité. Voulez-vous vraiment continuer ?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Link Esterni",
"DESCRIPTION": "Guida i tuoi utenti verso risorse esterne personalizzate mostrate nella pagina di login. Gli utenti devono accettare i Termini di Servizio e la Politica sulla Privacy prima che possano iscriversi."
"DESCRIPTION": "Guida i tuoi utenti alle risorse esterne personalizzate mostrate nella pagina di accesso. Gli utenti devono accettare i Termini di servizio e l'Informativa sulla privacy prima di potersi registrare. Cambia il collegamento alla tua documentazione o imposta una stringa vuota per nascondere il pulsante della documentazione dalla console. Aggiungi un collegamento esterno personalizzato e un testo personalizzato per quel collegamento nella console oppure impostali vuoti per nascondere quel pulsante."
},
"SMTP_PROVIDER": {
"TITLE": "Impostazioni SMTP",
@@ -1570,6 +1570,9 @@
"POLICYLINK": "Link all'informativa sulla privacy",
"HELPLINK": "link per l'aiuto",
"SUPPORTEMAIL": "e-mail di supporto",
"DOCSLINK": "Collegamento a Documenti (Console)",
"CUSTOMLINK": "Collegamento personalizzato (Console)",
"CUSTOMLINKTEXT": "Testo del collegamento personalizzato (Console)",
"SAVED": "Salvato con successo!",
"RESET_TITLE": "Ripristina i valori predefiniti",
"RESET_DESCRIPTION": "Stai per ripristinare i link predefiniti per i TOS e l'informativa sulla privacy. Vuoi davvero continuare?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "外部リンク",
"DESCRIPTION": "ログインページに表示されるカスタム外部リソースへのユーザーガイドです。ユーザーはサインアップする前に利用規約とプライバシーポリシーを受け入れる必要があります。"
"DESCRIPTION": "ログイン ページに表示されるカスタム外部リソースユーザーを誘導します。ユーザーはサインアップする前に、サービス利用規約とプライバシー ポリシーに同意する必要があります。ドキュメントへのリンクを変更するか、空の文字列を設定してコンソールからドキュメント ボタンを非表示にします。カスタム外部リンクとそのリンクのカスタム テキストをコンソールに追加するか、それらを空に設定してそのボタンを非表示にします。"
},
"SMTP_PROVIDER": {
"TITLE": "SMTP設定",
@@ -1566,6 +1566,10 @@
"TOSLINK": "利用規約へのリンク",
"POLICYLINK": "プライバシーポリシーへのリンク",
"HELPLINK": "ヘルプへのリンク",
"SUPPORTEMAIL": "サポートメール",
"DOCSLINK": "ドキュメントリンク (Console)",
"CUSTOMLINK": "カスタムリンク(Console)",
"CUSTOMLINKTEXT": "カスタム リンク テキスト (Console)",
"SAVED": "正常に保存されました!",
"RESET_TITLE": "デフォルト値を復元する",
"RESET_DESCRIPTION": "TOSおよびプライバシーポリシーのデフォルトリンクを復元しようとしています。本当によろしいですか"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Надворешни врски",
"DESCRIPTION": "Упатете ги вашите корисници кон прилагодени надворешни ресурси прикажани на страницата за најава. Корисниците треба да ги прифатат условите за користење и политиката за приватност пред да се регистрираат."
"DESCRIPTION": "Водете ги вашите корисници до сопствени надворешни ресурси прикажани на страницата за најавување. Корисниците треба да ги прифатат Условите за користење и Политиката за приватност пред да можат да се регистрираат. Променете ја врската до вашата документација или поставете празна низа за да го скриете копчето за документација од конзолата. Додајте приспособена надворешна врска и прилагоден текст за таа врска во конзолата или поставете ги празни за да го скриете тоа копче."
},
"SMTP_PROVIDER": {
"TITLE": "SMTP поставки",
@@ -1572,6 +1572,9 @@
"POLICYLINK": "Линк кон Политиката за приватност",
"HELPLINK": "Линк кон Помош",
"SUPPORTEMAIL": "Е-пошта за поддршка",
"DOCSLINK": "Врска за документи (Console)",
"CUSTOMLINK": "Прилагодена врска (Console)",
"CUSTOMLINKTEXT": "Текст за приспособена врска (Console)",
"SAVED": "Успешно зачувано!",
"RESET_TITLE": "Врати на стандардни вредности",
"RESET_DESCRIPTION": "Се подготвувате да ги вратите стандардните линкови за Условите за користење и Политиката за приватност. Дали сте сигурни дека сакате да продолжите?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Externe links",
"DESCRIPTION": "Leid je gebruikers naar aangepaste externe bronnen die worden getoond op de inlogpagina. Gebruikers moeten de Algemene Voorwaarden en het Privacybeleid accepteren voordat ze zich kunnen aanmelden."
"DESCRIPTION": "Leid uw gebruikers naar aangepaste externe bronnen die op de inlogpagina worden weergegeven. Gebruikers moeten de Servicevoorwaarden en het Privacybeleid accepteren voordat ze zich kunnen aanmelden. Wijzig de link naar uw documentatie of stel een lege string in om de documentatieknop voor de console te verbergen. Voeg een aangepaste externe link en een aangepaste tekst voor die link toe in de console, of stel ze leeg om die knop te verbergen."
},
"SMTP_PROVIDER": {
"TITLE": "SMTP-instellingen",
@@ -1571,6 +1571,9 @@
"POLICYLINK": "Link naar Privacybeleid",
"HELPLINK": "Link naar Help",
"SUPPORTEMAIL": "Ondersteuning Email",
"DOCSLINK": "Documentenlink (Console)",
"CUSTOMLINK": "Aangepaste link (Console)",
"CUSTOMLINKTEXT": "Aangepaste linktekst (Console)",
"SAVED": "Succesvol opgeslagen!",
"RESET_TITLE": "Herstel Standaard Waarden",
"RESET_DESCRIPTION": "U staat op het punt de standaard Links voor TOS en Privacybeleid te herstellen. Weet u zeker dat u wilt doorgaan?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Linki zewnętrzne",
"DESCRIPTION": "Przekieruj użytkowników do niestandardowych zasobów zewnętrznych pokazanych na stronie logowania. Użytkownicy muszą zaakceptować Warunki korzystania z usługi i Politykę prywatności, zanim będą mogli się zarejestrować."
"DESCRIPTION": "Poprowadź użytkowników do niestandardowych zasobów zewnętrznych wyświetlanych na stronie logowania. Użytkownicy muszą zaakceptować Warunki świadczenia usług i Politykę prywatności, zanim będą mogli się zarejestrować. Zmień łącze do dokumentacji lub ustaw pusty ciąg, aby ukryć przycisk dokumentacji w konsoli. Dodaj niestandardowy link zewnętrzny i niestandardowy tekst dla tego łącza w konsoli lub ustaw je puste, aby ukryć ten przycisk."
},
"SMTP_PROVIDER": {
"TITLE": "Ustawienia SMTP",
@@ -1570,6 +1570,9 @@
"POLICYLINK": "Link do polityki prywatności",
"HELPLINK": "Link do pomocy",
"SUPPORTEMAIL": "E-mail wsparcia",
"DOCSLINK": "Link do Dokumentów (Console)",
"CUSTOMLINK": "Link niestandardowy (Console)",
"CUSTOMLINKTEXT": "Niestandardowy tekst łącza (Console)",
"SAVED": "Pomyślnie zapisano!",
"RESET_TITLE": "Przywróć wartości domyślne",
"RESET_DESCRIPTION": "Masz zamiar przywrócić domyślne linki dla TOS i polityki prywatności. Czy na pewno chcesz kontynuować?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Links Externos",
"DESCRIPTION": "Guie seus usuários para recursos externos personalizados mostrados na página de login. Os usuários precisam aceitar os Termos de Serviço e a Política de Privacidade antes de poderem se inscrever."
"DESCRIPTION": "Oriente seus usuários sobre recursos externos personalizados mostrados na página de login. Os usuários precisam aceitar os Termos de Serviço e a Política de Privacidade antes de se inscreverem. Altere o link para sua documentação ou defina uma string vazia para ocultar o botão de documentação do console. Adicione um link externo personalizado e um texto personalizado para esse link no console ou deixe-os vazios para ocultar esse botão."
},
"SMTP_PROVIDER": {
"TITLE": "Configurações de SMTP",
@@ -1572,6 +1572,9 @@
"POLICYLINK": "Link para a Política de Privacidade",
"HELPLINK": "Link para Ajuda",
"SUPPORTEMAIL": "E-mail de suporte",
"DOCSLINK": "Link do Documentos (Console)",
"CUSTOMLINK": "Link personalizado (Console)",
"CUSTOMLINKTEXT": "Texto do link personalizado (Console)",
"SAVED": "Salvo com sucesso!",
"RESET_TITLE": "Restaurar valores padrão",
"RESET_DESCRIPTION": "Você está prestes a restaurar os Links padrão para TOS e Política de Privacidade. Deseja realmente continuar?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "Внешние ссылки",
"DESCRIPTION": "Направьте ваших пользователей к пользовательским внешним ресурсам, показанным на странице входа. Пользователи должны принять Условия обслуживания и Политику конфиденциальности, прежде чем они смогут зарегистрироваться."
"DESCRIPTION": "Guide your users to custom external resources shown on the login page. Users need to accept the Terms of Service and Privacy Policy before they can sign up. Change the link to your documentation or set an empty string to hide the documentation button from the console. Add a custom external link and a custom text for that link in the console, or set them empty to hide that button."
},
"SMTP_PROVIDER": {
"TITLE": "Настройки SMTP",
@@ -1626,6 +1626,9 @@
"POLICYLINK": "Ссылка на Политику конфиденциальности",
"HELPLINK": "Ссылка на Помощь",
"SUPPORTEMAIL": "Электронная почта поддержки",
"DOCSLINK": "Ссылка на Документы (Console)",
"CUSTOMLINK": "Пользовательская ссылка (Console)",
"CUSTOMLINKTEXT": "Пользовательский текст ссылки (Console)",
"SAVED": "Успешно сохранено!",
"RESET_TITLE": "Восстановить значения по умолчанию",
"RESET_DESCRIPTION": "Вы собираетесь восстановить ссылки по умолчанию для Пользовательского соглашения и Политики конфиденциальности. Вы действительно хотите продолжить?"

View File

@@ -129,7 +129,7 @@
},
"PRIVACY_POLICY": {
"TITLE": "外部链接",
"DESCRIPTION": "引导您的用户登录页面上显示的自定义外部资源。用户需要在注册前接受服务条款和隐私政策。"
"DESCRIPTION": "引导您的用户访问登录页面上显示的自定义外部资源。用户需要接受服务条款和隐私政策,然后才能注册。更改文档的链接或设置空字符串以在控制台中隐藏文档按钮。在控制台中添加自定义外部链接和该链接的自定义文本,或将它们设置为空以隐藏该按钮。"
},
"SMTP_PROVIDER": {
"TITLE": "SMTP设置",
@@ -1569,6 +1569,9 @@
"POLICYLINK": "链接到隐私政策",
"HELPLINK": "链接到帮助",
"SUPPORTEMAIL": "支持邮箱",
"DOCSLINK": "文档链接Console",
"CUSTOMLINK": "自定义链接Console",
"CUSTOMLINKTEXT": "自定义链接文本Console",
"SAVED": "保存成功!",
"RESET_TITLE": "恢复默认值",
"RESET_DESCRIPTION": "您即将恢复 TOS 和隐私政策的默认链接。你真的要继续吗?"