Browse Source

Merge 866fe4ad80 into be3207ab65

pull/15648/merge
Oleksandra Matviienko 2 days ago
committed by GitHub
parent
commit
3af81a7c73
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 32
      application/src/main/java/org/thingsboard/server/controller/UserController.java
  2. 17
      application/src/main/java/org/thingsboard/server/service/entitiy/user/DefaultUserService.java
  3. 5
      application/src/main/java/org/thingsboard/server/service/entitiy/user/TbUserService.java
  4. 96
      application/src/test/java/org/thingsboard/server/controller/AuthControllerTest.java
  5. 19
      common/data/src/main/java/org/thingsboard/server/common/data/UserPasswordResetLink.java
  6. 6
      ui-ngx/src/app/core/http/user.service.ts
  7. 57
      ui-ngx/src/app/modules/home/pages/user/password-reset-link-dialog.component.html
  8. 69
      ui-ngx/src/app/modules/home/pages/user/password-reset-link-dialog.component.ts
  9. 6
      ui-ngx/src/app/modules/home/pages/user/user.component.html
  10. 4
      ui-ngx/src/app/modules/home/pages/user/user.module.ts
  11. 25
      ui-ngx/src/app/modules/home/pages/user/users-table-config.resolver.ts
  12. 5
      ui-ngx/src/app/shared/models/user.model.ts
  13. 5
      ui-ngx/src/assets/locale/locale.constant-ar_AE.json
  14. 5
      ui-ngx/src/assets/locale/locale.constant-ca_ES.json
  15. 5
      ui-ngx/src/assets/locale/locale.constant-cs_CZ.json
  16. 5
      ui-ngx/src/assets/locale/locale.constant-da_DK.json
  17. 5
      ui-ngx/src/assets/locale/locale.constant-de_DE.json
  18. 5
      ui-ngx/src/assets/locale/locale.constant-el_GR.json
  19. 5
      ui-ngx/src/assets/locale/locale.constant-en_US.json
  20. 5
      ui-ngx/src/assets/locale/locale.constant-es_ES.json
  21. 5
      ui-ngx/src/assets/locale/locale.constant-fa_IR.json
  22. 5
      ui-ngx/src/assets/locale/locale.constant-fr_FR.json
  23. 5
      ui-ngx/src/assets/locale/locale.constant-it_IT.json
  24. 5
      ui-ngx/src/assets/locale/locale.constant-ja_JP.json
  25. 5
      ui-ngx/src/assets/locale/locale.constant-ka_GE.json
  26. 5
      ui-ngx/src/assets/locale/locale.constant-ko_KR.json
  27. 5
      ui-ngx/src/assets/locale/locale.constant-lt_LT.json
  28. 5
      ui-ngx/src/assets/locale/locale.constant-lv_LV.json
  29. 5
      ui-ngx/src/assets/locale/locale.constant-nl_BE.json
  30. 5
      ui-ngx/src/assets/locale/locale.constant-nl_NL.json
  31. 5
      ui-ngx/src/assets/locale/locale.constant-no_NO.json
  32. 5
      ui-ngx/src/assets/locale/locale.constant-pl_PL.json
  33. 5
      ui-ngx/src/assets/locale/locale.constant-pt_BR.json
  34. 5
      ui-ngx/src/assets/locale/locale.constant-ro_RO.json
  35. 5
      ui-ngx/src/assets/locale/locale.constant-sl_SI.json
  36. 5
      ui-ngx/src/assets/locale/locale.constant-tr_TR.json
  37. 5
      ui-ngx/src/assets/locale/locale.constant-uk_UA.json
  38. 5
      ui-ngx/src/assets/locale/locale.constant-zh_CN.json
  39. 5
      ui-ngx/src/assets/locale/locale.constant-zh_TW.json

32
application/src/main/java/org/thingsboard/server/controller/UserController.java

@ -44,6 +44,7 @@ import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.UserActivationLink;
import org.thingsboard.server.common.data.UserEmailInfo;
import org.thingsboard.server.common.data.UserPasswordResetLink;
import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
import org.thingsboard.server.common.data.exception.ThingsboardException;
@ -251,6 +252,37 @@ public class UserController extends BaseController {
return tbUserService.getActivationLink(securityUser.getTenantId(), securityUser.getCustomerId(), userId, request);
}
@ApiOperation(value = "Get password reset link (getPasswordResetLink)",
notes = "Generate and return a password reset link for the specified user. " +
"Issues a fresh reset token, invalidating any previously issued reset token for this user. " +
"Available only for users that are already activated and whose account is enabled. " +
"The base url for the link is configurable in the general settings of system administrator. " + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH)
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
@GetMapping(value = "/user/{userId}/passwordResetLink", produces = "text/plain")
@ResponseBody
public String getPasswordResetLink(@Parameter(description = USER_ID_PARAM_DESCRIPTION)
@PathVariable(USER_ID) String strUserId,
HttpServletRequest request) throws ThingsboardException {
return getPasswordResetLinkInfo(strUserId, request).value();
}
@ApiOperation(value = "Get password reset link info (getPasswordResetLinkInfo)",
notes = "Generate and return a password reset link info for the specified user. " +
"Issues a fresh reset token, invalidating any previously issued reset token for this user. " +
"Available only for users that are already activated and whose account is enabled. " +
"The base url for the link is configurable in the general settings of system administrator. " + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH)
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
@GetMapping(value = "/user/{userId}/passwordResetLinkInfo")
public UserPasswordResetLink getPasswordResetLinkInfo(@Parameter(description = USER_ID_PARAM_DESCRIPTION)
@PathVariable(USER_ID) String strUserId,
HttpServletRequest request) throws ThingsboardException {
checkParameter(USER_ID, strUserId);
UserId userId = new UserId(toUUID(strUserId));
checkUserId(userId, Operation.WRITE_CREDENTIALS);
SecurityUser securityUser = getCurrentUser();
return tbUserService.getPasswordResetLink(securityUser.getTenantId(), securityUser.getCustomerId(), userId, request);
}
@ApiOperation(value = "Delete User (deleteUser)",
notes = "Deletes the User, it's credentials and all the relations (from and to the User). " +
"Referencing non-existing User Id will cause an error. " + SYSTEM_OR_TENANT_AUTHORITY_PARAGRAPH)

17
application/src/main/java/org/thingsboard/server/service/entitiy/user/DefaultUserService.java

@ -23,6 +23,7 @@ import org.thingsboard.rule.engine.api.MailService;
import org.thingsboard.server.common.data.EntityType;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.UserActivationLink;
import org.thingsboard.server.common.data.UserPasswordResetLink;
import org.thingsboard.server.common.data.audit.ActionType;
import org.thingsboard.server.common.data.exception.ThingsboardErrorCode;
import org.thingsboard.server.common.data.exception.ThingsboardException;
@ -97,4 +98,20 @@ public class DefaultUserService extends AbstractTbEntityService implements TbUse
}
}
@Override
public UserPasswordResetLink getPasswordResetLink(TenantId tenantId, CustomerId customerId, UserId userId, HttpServletRequest request) throws ThingsboardException {
UserCredentials userCredentials = userService.findUserCredentialsByUserId(tenantId, userId);
if (!userCredentials.isEnabled()) {
if (userCredentials.getActivateToken() != null) {
throw new ThingsboardException("User is not yet activated!", ThingsboardErrorCode.BAD_REQUEST_PARAMS);
}
throw new ThingsboardException("User account is disabled!", ThingsboardErrorCode.BAD_REQUEST_PARAMS);
}
userCredentials = userService.generatePasswordResetToken(userCredentials);
userCredentials = userService.saveUserCredentials(tenantId, userCredentials);
String baseUrl = systemSecurityService.getBaseUrl(tenantId, customerId, request);
String link = baseUrl + "/api/noauth/resetPassword?resetToken=" + userCredentials.getResetToken();
return new UserPasswordResetLink(link, userCredentials.getResetTokenTtl());
}
}

5
application/src/main/java/org/thingsboard/server/service/entitiy/user/TbUserService.java

@ -16,8 +16,9 @@
package org.thingsboard.server.service.entitiy.user;
import jakarta.servlet.http.HttpServletRequest;
import org.thingsboard.server.common.data.UserActivationLink;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.UserActivationLink;
import org.thingsboard.server.common.data.UserPasswordResetLink;
import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.TenantId;
@ -31,4 +32,6 @@ public interface TbUserService {
UserActivationLink getActivationLink(TenantId tenantId, CustomerId customerId, UserId userId, HttpServletRequest request) throws ThingsboardException;
UserPasswordResetLink getPasswordResetLink(TenantId tenantId, CustomerId customerId, UserId userId, HttpServletRequest request) throws ThingsboardException;
}

96
application/src/test/java/org/thingsboard/server/controller/AuthControllerTest.java

@ -27,6 +27,7 @@ import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.UserActivationLink;
import org.thingsboard.server.common.data.UserPasswordResetLink;
import org.thingsboard.server.common.data.id.UserId;
import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.common.data.security.UserCredentials;
@ -294,6 +295,93 @@ public class AuthControllerTest extends AbstractControllerTest {
assertThat(getUser(user.getId()).getAdditionalInfo().get("userActivated").asBoolean()).isTrue();
}
@Test
public void testGetPasswordResetLink() throws Exception {
loginTenantAdmin();
User user = new User();
user.setAuthority(Authority.TENANT_ADMIN);
user.setEmail("tenant-admin-reset@thingsboard.org");
User savedUser = createUserAndLogin(user, "initialPassword1");
loginTenantAdmin();
String resetLink = getPasswordResetLink(savedUser);
assertThat(resetLink).contains("/api/noauth/resetPassword?resetToken=");
UserPasswordResetLink resetLinkInfo = getPasswordResetLinkInfo(savedUser);
assertThat(resetLinkInfo.value()).contains("/api/noauth/resetPassword?resetToken=");
assertThat(resetLinkInfo.ttlMs()).isPositive();
// verify the link works end-to-end (use the freshest one)
String resetToken = StringUtils.substringAfterLast(resetLinkInfo.value(), "resetToken=");
Mockito.doNothing().when(mailService).sendPasswordWasResetEmail(anyString(), anyString());
doPost("/api/noauth/resetPassword", JacksonUtil.newObjectNode()
.put("resetToken", resetToken)
.put("password", "newPassword1"))
.andExpect(status().isOk());
resetTokens();
loginUser(savedUser.getEmail(), "newPassword1");
}
@Test
public void testGetPasswordResetLinkRegeneratesToken() throws Exception {
loginTenantAdmin();
User user = new User();
user.setAuthority(Authority.TENANT_ADMIN);
user.setEmail("tenant-admin-reset-regen@thingsboard.org");
User savedUser = createUserAndLogin(user, "initialPassword1");
loginTenantAdmin();
UserPasswordResetLink first = getPasswordResetLinkInfo(savedUser);
UserPasswordResetLink second = getPasswordResetLinkInfo(savedUser);
assertThat(second.value()).isNotEqualTo(first.value());
// first token must now be invalid — second one wins
String firstToken = StringUtils.substringAfterLast(first.value(), "resetToken=");
doPost("/api/noauth/resetPassword", JacksonUtil.newObjectNode()
.put("resetToken", firstToken)
.put("password", "newPassword1"))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.message", is("Invalid reset token!")));
}
@Test
public void testGetPasswordResetLinkForNotYetActivatedUser() throws Exception {
loginTenantAdmin();
User user = new User();
user.setAuthority(Authority.TENANT_ADMIN);
user.setEmail("tenant-admin-reset-not-activated@thingsboard.org");
user = doPost("/api/user", user, User.class);
doGet("/api/user/" + user.getId() + "/passwordResetLinkInfo")
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.message", is("User is not yet activated!")));
}
@Test
public void testGetPasswordResetLinkForDisabledUser() throws Exception {
loginTenantAdmin();
User user = new User();
user.setAuthority(Authority.TENANT_ADMIN);
user.setEmail("tenant-admin-reset-disabled@thingsboard.org");
User savedUser = createUserAndLogin(user, "initialPassword1");
loginTenantAdmin();
doPost("/api/user/" + savedUser.getId() + "/userCredentialsEnabled?userCredentialsEnabled=false")
.andExpect(status().isOk());
doGet("/api/user/" + savedUser.getId() + "/passwordResetLinkInfo")
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.message", is("User account is disabled!")));
}
@Test
public void testGetPasswordResetLinkForbiddenForCustomerUser() throws Exception {
loginCustomerUser();
doGet("/api/user/" + customerUserId + "/passwordResetLinkInfo")
.andExpect(status().isForbidden());
}
@Test
public void testGetPageWithoutRedirect() throws Exception {
doGet("/login").andExpect(status().isOk());
@ -322,4 +410,12 @@ public class AuthControllerTest extends AbstractControllerTest {
return doGet("/api/user/" + user.getId() + "/activationLinkInfo", UserActivationLink.class);
}
private String getPasswordResetLink(User user) throws Exception {
return doGet("/api/user/" + user.getId() + "/passwordResetLink", String.class);
}
private UserPasswordResetLink getPasswordResetLinkInfo(User user) throws Exception {
return doGet("/api/user/" + user.getId() + "/passwordResetLinkInfo", UserPasswordResetLink.class);
}
}

19
common/data/src/main/java/org/thingsboard/server/common/data/UserPasswordResetLink.java

@ -0,0 +1,19 @@
/**
* Copyright © 2016-2026 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.common.data;
public record UserPasswordResetLink(String value, long ttlMs) {
}

6
ui-ngx/src/app/core/http/user.service.ts

@ -16,7 +16,7 @@
import { Injectable } from '@angular/core';
import { defaultHttpOptionsFromConfig, RequestConfig } from './http-utils';
import { ActivationLinkInfo, User, UserEmailInfo } from '@shared/models/user.model';
import { ActivationLinkInfo, PasswordResetLinkInfo, User, UserEmailInfo } from '@shared/models/user.model';
import { Observable } from 'rxjs';
import { HttpClient, HttpParams } from '@angular/common/http';
import { PageLink } from '@shared/models/page/page-link';
@ -81,6 +81,10 @@ export class UserService {
return this.http.get<ActivationLinkInfo>(`/api/user/${userId}/activationLinkInfo`, defaultHttpOptionsFromConfig(config));
}
public getPasswordResetLinkInfo(userId: string, config?: RequestConfig): Observable<PasswordResetLinkInfo> {
return this.http.get<PasswordResetLinkInfo>(`/api/user/${userId}/passwordResetLinkInfo`, defaultHttpOptionsFromConfig(config));
}
public sendActivationEmail(email: string, config?: RequestConfig) {
const encodeEmail = encodeURIComponent(email);
return this.http.post(`/api/user/sendActivationMail?email=${encodeEmail}`, null, defaultHttpOptionsFromConfig(config));

57
ui-ngx/src/app/modules/home/pages/user/password-reset-link-dialog.component.html

@ -0,0 +1,57 @@
<!--
Copyright © 2016-2026 The Thingsboard Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<form style="min-width: 400px; position: relative;">
<mat-toolbar color="primary">
<h2 translate>user.password-reset-link</h2>
<span class="flex-1"></span>
<button mat-icon-button
(click)="close()"
type="button">
<mat-icon class="material-icons">close</mat-icon>
</button>
</mat-toolbar>
<mat-progress-bar color="warn" mode="indeterminate" *ngIf="isLoading$ | async">
</mat-progress-bar>
<div style="height: 4px;" *ngIf="!(isLoading$ | async)"></div>
<div mat-dialog-content tb-toast toastTarget="passwordResetLinkDialogContent">
<div class="mat-content flex flex-col">
<span [innerHTML]="'user.password-reset-link-text' | translate: {passwordResetLink: passwordResetLink, passwordResetLinkTtl: passwordResetLinkTtl}"></span>
<div class="flex flex-row items-center justify-start">
<pre class="tb-highlight flex-1"><code>{{ passwordResetLink }}</code></pre>
<button mat-icon-button
color="primary"
ngxClipboard
cbContent="{{ passwordResetLink }}"
(cbOnSuccess)="onPasswordResetLinkCopied()"
matTooltip="{{ 'user.copy-password-reset-link' | translate }}"
matTooltipPosition="above">
<mat-icon svgIcon="mdi:clipboard-arrow-left"></mat-icon>
</button>
</div>
</div>
</div>
<div mat-dialog-actions class="flex items-center justify-end">
<button mat-button color="primary"
type="button"
cdkFocusInitial
[disabled]="(isLoading$ | async)"
(click)="close()">
{{ 'action.ok' | translate }}
</button>
</div>
</form>

69
ui-ngx/src/app/modules/home/pages/user/password-reset-link-dialog.component.ts

@ -0,0 +1,69 @@
///
/// Copyright © 2016-2026 The Thingsboard Authors
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
import { Component, Inject } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { Store } from '@ngrx/store';
import { AppState } from '@core/core.state';
import { TranslateService } from '@ngx-translate/core';
import { ActionNotificationShow } from '@core/notification/notification.actions';
import { DialogComponent } from '@shared/components/dialog.component';
import { Router } from '@angular/router';
import { PasswordResetLinkInfo } from '@shared/models/user.model';
import { MillisecondsToTimeStringPipe } from '@shared/pipe/milliseconds-to-time-string.pipe';
export interface PasswordResetLinkDialogData {
passwordResetLinkInfo: PasswordResetLinkInfo;
}
@Component({
selector: 'tb-password-reset-link-dialog',
templateUrl: './password-reset-link-dialog.component.html',
standalone: false
})
export class PasswordResetLinkDialogComponent extends DialogComponent<PasswordResetLinkDialogComponent, void> {
passwordResetLink: string;
passwordResetLinkTtl: string;
constructor(protected store: Store<AppState>,
protected router: Router,
@Inject(MAT_DIALOG_DATA) public data: PasswordResetLinkDialogData,
public dialogRef: MatDialogRef<PasswordResetLinkDialogComponent, void>,
private translate: TranslateService,
private millisecondsToTimeStringPipe: MillisecondsToTimeStringPipe) {
super(store, router, dialogRef);
this.passwordResetLink = this.data.passwordResetLinkInfo.value;
this.passwordResetLinkTtl = this.millisecondsToTimeStringPipe.transform(this.data.passwordResetLinkInfo.ttlMs);
}
close(): void {
this.dialogRef.close();
}
onPasswordResetLinkCopied() {
this.store.dispatch(new ActionNotificationShow(
{
message: this.translate.instant('user.password-reset-link-copied-message'),
type: 'success',
target: 'passwordResetLinkDialogContent',
duration: 1200,
verticalPosition: 'bottom',
horizontalPosition: 'left'
}));
}
}

6
ui-ngx/src/app/modules/home/pages/user/user.component.html

@ -40,6 +40,12 @@
[class.!hidden]="isEdit || isUserActivated()">
{{'user.display-activation-link' | translate }}
</button>
<button mat-raised-button color="primary"
[disabled]="(isLoading$ | async)"
(click)="onEntityAction($event, 'displayPasswordResetLink')"
[class.!hidden]="isEdit || !isUserActivated() || !isUserCredentialsEnabled()">
{{'user.display-password-reset-link' | translate }}
</button>
<button mat-raised-button color="primary"
[disabled]="(isLoading$ | async)"
(click)="onEntityAction($event, 'resendActivation')"

4
ui-ngx/src/app/modules/home/pages/user/user.module.ts

@ -21,6 +21,7 @@ import { UserComponent } from '@modules/home/pages/user/user.component';
import { UserRoutingModule } from '@modules/home/pages/user/user-routing.module';
import { AddUserDialogComponent } from '@modules/home/pages/user/add-user-dialog.component';
import { ActivationLinkDialogComponent } from '@modules/home/pages/user/activation-link-dialog.component';
import { PasswordResetLinkDialogComponent } from '@modules/home/pages/user/password-reset-link-dialog.component';
import { HomeComponentsModule } from '@modules/home/components/home-components.module';
import { UserTabsComponent } from '@home/pages/user/user-tabs.component';
@ -29,7 +30,8 @@ import { UserTabsComponent } from '@home/pages/user/user-tabs.component';
UserComponent,
UserTabsComponent,
AddUserDialogComponent,
ActivationLinkDialogComponent
ActivationLinkDialogComponent,
PasswordResetLinkDialogComponent
],
imports: [
CommonModule,

25
ui-ngx/src/app/modules/home/pages/user/users-table-config.resolver.ts

@ -45,6 +45,10 @@ import {
ActivationLinkDialogComponent,
ActivationLinkDialogData
} from '@modules/home/pages/user/activation-link-dialog.component';
import {
PasswordResetLinkDialogComponent,
PasswordResetLinkDialogData
} from '@modules/home/pages/user/password-reset-link-dialog.component';
import { ActionNotificationShow } from '@core/notification/notification.actions';
import { NULL_UUID } from '@shared/models/id/has-uuid';
import { TenantService } from '@app/core/http/tenant.service';
@ -207,6 +211,24 @@ export class UsersTableConfigResolver {
);
}
displayPasswordResetLink($event: Event, user: User) {
if ($event) {
$event.stopPropagation();
}
this.userService.getPasswordResetLinkInfo(user.id.id).subscribe(
(passwordResetLinkInfo) => {
this.dialog.open<PasswordResetLinkDialogComponent, PasswordResetLinkDialogData,
void>(PasswordResetLinkDialogComponent, {
disableClose: true,
panelClass: ['tb-dialog', 'tb-fullscreen-dialog'],
data: {
passwordResetLinkInfo
}
});
}
);
}
resendActivation($event: Event, user: User) {
if ($event) {
$event.stopPropagation();
@ -248,6 +270,9 @@ export class UsersTableConfigResolver {
case 'displayActivationLink':
this.displayActivationLink(action.event, action.entity);
return true;
case 'displayPasswordResetLink':
this.displayPasswordResetLink(action.event, action.entity);
return true;
case 'resendActivation':
this.resendActivation(action.event, action.entity);
return true;

5
ui-ngx/src/app/shared/models/user.model.ts

@ -63,6 +63,11 @@ export interface ActivationLinkInfo {
ttlMs: number;
}
export interface PasswordResetLinkInfo {
value: string;
ttlMs: number;
}
export interface AuthUser {
sub: string;
scopes: string[];

5
ui-ngx/src/assets/locale/locale.constant-ar_AE.json

@ -5840,6 +5840,11 @@
"activation-link-text": "لتنشيط المستخدم، استخدم الرابط التالي: <a href='{{activationLink}}' target='_blank'>رابط التنشيط</a> :",
"copy-activation-link": "نسخ رابط التنشيط",
"activation-link-copied-message": "تم نسخ رابط تنشيط المستخدم إلى الحافظة",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "التفاصيل",
"login-as-tenant-admin": "تسجيل الدخول كمسؤول المستأجر",
"login-as-customer-user": "تسجيل الدخول كمستخدم العميل",

5
ui-ngx/src/assets/locale/locale.constant-ca_ES.json

@ -4316,6 +4316,11 @@
"activation-link-text": "Per activar l'usuari, utilitza el següent enllaç: <a href='{{activationLink}}' target='_blank'>Activar Usuari</a> :",
"copy-activation-link": "Copiar enllaç d'activació",
"activation-link-copied-message": "L'enllaç d'activació s'ha copiat al porta-retalls",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"selected-users": "{ count, plural, =1 {1 usuario} other {# usuaris} } seleccionats",
"search": "Buscar usuaris",
"details": "Detalls",

5
ui-ngx/src/assets/locale/locale.constant-cs_CZ.json

@ -2666,6 +2666,11 @@
"activation-link-text": "Pro aktivaci uživatele použijte následující <a href='{{activationLink}}' target='_blank'>aktivační odkaz</a> :",
"copy-activation-link": "Kopírovat aktivační odkaz",
"activation-link-copied-message": "Aktivační odkaz uživatele byl zkopírován do schránky",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Detail",
"login-as-tenant-admin": "Přihlásit se jako administrátor tenanta",
"login-as-customer-user": "Přihlásit se jako uživatel zákazníka",

5
ui-ngx/src/assets/locale/locale.constant-da_DK.json

@ -6596,6 +6596,11 @@
"activation-link-text": "For at aktivere brugeren, brug følgende <a href='{{activationLink}}' target='_blank'>aktiveringslink</a> (udløber om {{activationLinkTtl}}):",
"copy-activation-link": "Kopiér aktiveringslink",
"activation-link-copied-message": "Brugeraktiveringslink blev kopieret til udklipsholder",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Detaljer",
"login-as-tenant-admin": "Log ind som Lejeradministrator",
"login-as-customer-user": "Log ind som Kundebruger",

5
ui-ngx/src/assets/locale/locale.constant-de_DE.json

@ -6596,6 +6596,11 @@
"activation-link-text": "Um den Benutzer zu aktivieren, verwenden Sie folgenden <a href='{{activationLink}}' target='_blank'>Aktivierungslink</a> (gültig für {{activationLinkTtl}}):",
"copy-activation-link": "Aktivierungslink kopieren",
"activation-link-copied-message": "Benutzeraktivierungslink wurde in die Zwischenablage kopiert",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Details",
"login-as-tenant-admin": "Als Tenant-Admin anmelden",
"login-as-customer-user": "Als Kundenbenutzer anmelden",

5
ui-ngx/src/assets/locale/locale.constant-el_GR.json

@ -6596,6 +6596,11 @@
"activation-link-text": "Για να ενεργοποιήσετε τον χρήστη, χρησιμοποιήστε τον παρακάτω <a href='{{activationLink}}' target='_blank'>σύνδεσμο ενεργοποίησης</a> (λήγει σε {{activationLinkTtl}}) :",
"copy-activation-link": "Αντιγραφή συνδέσμου ενεργοποίησης",
"activation-link-copied-message": "Ο σύνδεσμος ενεργοποίησης χρήστη αντιγράφηκε στο πρόχειρο",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Λεπτομέρειες",
"login-as-tenant-admin": "Σύνδεση ως διαχειριστής ενοικιαστή",
"login-as-customer-user": "Σύνδεση ως χρήστης πελάτη",

5
ui-ngx/src/assets/locale/locale.constant-en_US.json

@ -6618,6 +6618,11 @@
"activation-link-text": "In order to activate user use the following <a href='{{activationLink}}' target='_blank'>activation link</a> (expires in {{activationLinkTtl}}) :",
"copy-activation-link": "Copy activation link",
"activation-link-copied-message": "User activation link has been copied to clipboard",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Details",
"login-as-tenant-admin": "Login as Tenant Admin",
"login-as-customer-user": "Login as Customer User",

5
ui-ngx/src/assets/locale/locale.constant-es_ES.json

@ -6596,6 +6596,11 @@
"activation-link-text": "Para activar el usuario use el siguiente <a href='{{activationLink}}' target='_blank'>enlace de activación</a> (expira en {{activationLinkTtl}}) :",
"copy-activation-link": "Copiar enlace de activación",
"activation-link-copied-message": "El enlace de activación del usuario ha sido copiado al portapapeles",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Detalles",
"login-as-tenant-admin": "Iniciar sesión como administrador del tenant",
"login-as-customer-user": "Iniciar sesión como usuario del Customer",

5
ui-ngx/src/assets/locale/locale.constant-fa_IR.json

@ -1384,6 +1384,11 @@
"activation-link-text": ": </a>استفاده کنيد <a href='{{activationLink}}' target='_blank'> جهت فعال سازي کاربر، از پيوند فعال سازي زير",
"copy-activation-link": "رونوشت پيوند فعال سازي",
"activation-link-copied-message": "پيوند فعال سازي کاربر در حافظه موقت رونوشت شد",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "جزئيات",
"login-as-tenant-admin": "ورود به عنوان کاربر مدير",
"login-as-customer-user": "ورود به عنوان کاربر مشتري"

5
ui-ngx/src/assets/locale/locale.constant-fr_FR.json

@ -6596,6 +6596,11 @@
"activation-link-text": "Pour activer l'utilisateur, utilisez le <a href='{{activationLink}}' target='_blank'>lien d'activation</a> suivant (expire dans {{activationLinkTtl}}) :",
"copy-activation-link": "Copier le lien d'activation",
"activation-link-copied-message": "Le lien d'activation de l'utilisateur a été copié dans le presse-papiers",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Détails",
"login-as-tenant-admin": "Se connecter en tant qu'administrateur locataire",
"login-as-customer-user": "Se connecter en tant qu'utilisateur client",

5
ui-ngx/src/assets/locale/locale.constant-it_IT.json

@ -6596,6 +6596,11 @@
"activation-link-text": "Per attivare l'utente utilizza il seguente <a href='{{activationLink}}' target='_blank'>link di attivazione</a> (scade tra {{activationLinkTtl}}):",
"copy-activation-link": "Copia link di attivazione",
"activation-link-copied-message": "Il link di attivazione utente è stato copiato negli appunti",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Dettagli",
"login-as-tenant-admin": "Accedi come amministratore tenant",
"login-as-customer-user": "Accedi come utente cliente",

5
ui-ngx/src/assets/locale/locale.constant-ja_JP.json

@ -6596,6 +6596,11 @@
"activation-link-text": "ユーザーをアクティベートするには、次の<a href='{{activationLink}}' target='_blank'>アクティベーションリンク</a>を使用してください(有効期限:{{activationLinkTtl}}):",
"copy-activation-link": "アクティベーションリンクをコピー",
"activation-link-copied-message": "ユーザーアクティベーションリンクがクリップボードにコピーされました",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "詳細",
"login-as-tenant-admin": "テナント管理者としてログイン",
"login-as-customer-user": "顧客ユーザーとしてログイン",

5
ui-ngx/src/assets/locale/locale.constant-ka_GE.json

@ -1509,6 +1509,11 @@
"activation-link-text": "იმისთვის რომ გააქტიუროთ მომხმარებეკი გამოიყენეთ შემდეგი <a href='{{activationLink}}' target='_blank'>აქტივაციის ბმული</a> :",
"copy-activation-link": "აქტივაციის ბმული დაკოპირება",
"activation-link-copied-message": "აქტივაციის ბმული დაკოპირებულია კლიპბორდში",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "დეტალები",
"login-as-tenant-admin": "შესვლა როგორც ტენანტ ადმინი",
"login-as-customer-user": "შესვლა, როგორც კლიენტის მომხმარებელი",

5
ui-ngx/src/assets/locale/locale.constant-ko_KR.json

@ -2075,6 +2075,11 @@
"activation-link-text": "사용자를 활성화 하려면 <a href='{{activationLink}}' target='_blank'>활성화 링크</a>로 접속하세요 :",
"copy-activation-link": "활성화 링크 복사",
"activation-link-copied-message": "사용자 활성화 링크가 클립보드로 복사되었습니다.",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "상세",
"login-as-tenant-admin": "테넌트 관리자로 로그인",
"login-as-customer-user": "커스터머 사용자로 로그인",

5
ui-ngx/src/assets/locale/locale.constant-lt_LT.json

@ -6579,6 +6579,11 @@
"activation-link-text": "Norėdami aktyvuoti vartotoją, paspauskite <a href='{{activationLink}}' target='_blank'>nuorodą</a>:",
"copy-activation-link": "Kopijuoti aktyvavimo nuorodą",
"activation-link-copied-message": "Vartotojo aktyvavimo nuoroda nukopijuota į iškarpinę",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Informacija",
"login-as-tenant-admin": "Prisijungti kaip valdytojo administratorius",
"login-as-customer-user": "Prisijungti kaip kliento vartotojas",

5
ui-ngx/src/assets/locale/locale.constant-lv_LV.json

@ -1431,6 +1431,11 @@
"activation-link-text": "Lai aktivizētu lietotāju, lieto sekojošo <a href='{{activationLink}}' target='_blank'>aktivizācijas saiti</a> :",
"copy-activation-link": "Kopēt aktivizācijas saiti",
"activation-link-copied-message": "Lietotāja aktivizācijas saite ir kopēta uz starpliktuvi",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Detaļas",
"login-as-tenant-admin": "Login kā īrnieka administrātors",
"login-as-customer-user": "Login kā klienta lietotājs"

5
ui-ngx/src/assets/locale/locale.constant-nl_BE.json

@ -5354,6 +5354,11 @@
"activation-link-text": "Om de gebruiker te activeren gebruikt u de volgende <a href='{{activationLink}}' target='_blank'>activation link</a>:",
"copy-activation-link": "Activeringslink kopiëren",
"activation-link-copied-message": "De activeringslink van de gebruiker is gekopieerd naar het klembord",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Details",
"login-as-tenant-admin": "Aanmelden als tenantbeheerder",
"login-as-customer-user": "Inloggen als klantgebruiker",

5
ui-ngx/src/assets/locale/locale.constant-nl_NL.json

@ -6596,6 +6596,11 @@
"activation-link-text": "Om de gebruiker te activeren, gebruik de volgende <a href='{{activationLink}}' target='_blank'>activatielink</a> (vervalt over {{activationLinkTtl}}) :",
"copy-activation-link": "Kopieer activatielink",
"activation-link-copied-message": "Gebruikersactivatielink is gekopieerd naar klembord",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Details",
"login-as-tenant-admin": "Inloggen als tenantbeheerder",
"login-as-customer-user": "Inloggen als klantgebruiker",

5
ui-ngx/src/assets/locale/locale.constant-no_NO.json

@ -6596,6 +6596,11 @@
"activation-link-text": "For å aktivere brukeren, bruk følgende <a href='{{activationLink}}' target='_blank'>aktiveringslenke</a> (utløper om {{activationLinkTtl}}) :",
"copy-activation-link": "Kopier aktiveringslenke",
"activation-link-copied-message": "Brukerens aktiveringslenke er kopiert til utklippstavlen",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Detaljer",
"login-as-tenant-admin": "Logg inn som leietakeradministrator",
"login-as-customer-user": "Logg inn som kundebruker",

5
ui-ngx/src/assets/locale/locale.constant-pl_PL.json

@ -5739,6 +5739,11 @@
"activation-link-text": "Aby aktywować użytkownika, użyj poniższych opcji <a href='{{activationLink}}' target='_blank'>link aktywacyjny</a> :",
"copy-activation-link": "Skopiuj link aktywacyjny",
"activation-link-copied-message": "Link aktywacyjny użytkownika został skopiowany do schowka",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Szczegóły",
"login-as-tenant-admin": "Zaloguj się jako administrator tenanta",
"login-as-customer-user": "Zaloguj się jako użytkownik-klient",

5
ui-ngx/src/assets/locale/locale.constant-pt_BR.json

@ -6596,6 +6596,11 @@
"activation-link-text": "Para ativar o usuário, utilize o seguinte <a href='{{activationLink}}' target='_blank'>link de ativação</a> (expira em {{activationLinkTtl}}) :",
"copy-activation-link": "Copiar link de ativação",
"activation-link-copied-message": "Link de ativação do usuário copiado para a área de transferência",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Detalhes",
"login-as-tenant-admin": "Entrar como administrador do tenant",
"login-as-customer-user": "Entrar como usuário do cliente",

5
ui-ngx/src/assets/locale/locale.constant-ro_RO.json

@ -1494,6 +1494,11 @@
"activation-link-text": "Pentru activarea contului, folosiți link: <a href='{{activationLink}}' target='_blank'></a>",
"copy-activation-link": "Copiază link activare",
"activation-link-copied-message": "Link-ul de activare utilizator a fost copiat în clipboard",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Detalii",
"login-as-tenant-admin": "Acces ca locatar administrator",
"login-as-customer-user": "Acces ca utilizator client",

5
ui-ngx/src/assets/locale/locale.constant-sl_SI.json

@ -2076,6 +2076,11 @@
"activation-link-text": "Če želite uporabnika aktivirati, uporabite naslednjo <a href='{{activationLink}}' target='_blank'>aktivacijsko povezavo</a> :",
"copy-activation-link": "Kopiraj aktivacijsko povezavo",
"activation-link-copied-message": "Povezava za aktiviranje uporabnika je bila kopirana v odložišče",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Podrobnosti",
"login-as-tenant-admin": "Prijava kot skrbnik najemnika",
"login-as-customer-user": "Prijavi se kot uporabnik stranke",

5
ui-ngx/src/assets/locale/locale.constant-tr_TR.json

@ -6596,6 +6596,11 @@
"activation-link-text": "Kullanıcıyı etkinleştirmek için şu <a href='{{activationLink}}' target='_blank'>aktivasyon bağlantısını</a> kullanın ({{activationLinkTtl}} içinde sona erer):",
"copy-activation-link": "Aktivasyon bağlantısını kopyala",
"activation-link-copied-message": "Kullanıcı aktivasyon bağlantısı panoya kopyalandı",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Detaylar",
"login-as-tenant-admin": "Kiracı Yöneticisi olarak giriş yap",
"login-as-customer-user": "Müşteri kullanıcısı olarak giriş yap",

5
ui-ngx/src/assets/locale/locale.constant-uk_UA.json

@ -6596,6 +6596,11 @@
"activation-link-text": "Для активації користувача використовуйте наступне <a href='{{activationLink}}' target='_blank'>посилання для активації</a> (термін дії закінчується через {{activationLinkTtl}}) :",
"copy-activation-link": "Копіювати посилання для активації",
"activation-link-copied-message": "Посилання для активації користувача було скопійовано в буфер обміну",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "Деталі",
"login-as-tenant-admin": "Увійти як адміністратор тенанта",
"login-as-customer-user": "Увійти як користувач клієнта",

5
ui-ngx/src/assets/locale/locale.constant-zh_CN.json

@ -6596,6 +6596,11 @@
"activation-link-text": "要激活用户,请使用以下<a href='{{activationLink}}' target='_blank'>激活链接</a>({{activationLinkTtl}}后过期):",
"copy-activation-link": "复制激活链接",
"activation-link-copied-message": "用户激活链接已复制到剪贴板",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "详情",
"login-as-tenant-admin": "以租户管理员身份登录",
"login-as-customer-user": "以客户用户身份登录",

5
ui-ngx/src/assets/locale/locale.constant-zh_TW.json

@ -3172,6 +3172,11 @@
"activation-link-text": "使用該連結 <a href='{{activationLink}}' target='_blank'>啟動</a> 啟動用戶:",
"copy-activation-link": "複製用戶啟動連結",
"activation-link-copied-message": "用戶啟動連結已經複製到剪貼板",
"display-password-reset-link": "Display password reset link",
"password-reset-link": "User password reset link",
"password-reset-link-text": "In order to reset user password use the following <a href='{{passwordResetLink}}' target='_blank'>password reset link</a> (expires in {{passwordResetLinkTtl}}) :",
"copy-password-reset-link": "Copy password reset link",
"password-reset-link-copied-message": "Password reset link has been copied to clipboard",
"details": "詳細訊息",
"login-as-tenant-admin": "以租戶管理者帳號登入",
"login-as-customer-user": "以顧客用戶帳號登入",

Loading…
Cancel
Save