();
+ protected taxInformation: TaxInformation;
+
constructor(
@Inject(DIALOG_DATA) private dialogParams: ChangePlanDialogParams,
private dialogRef: DialogRef,
@@ -189,6 +195,7 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
private organizationApiService: OrganizationApiServiceAbstraction,
private configService: ConfigService,
private billingApiService: BillingApiServiceAbstraction,
+ private taxService: TaxServiceAbstraction,
) {}
async ngOnInit(): Promise {
@@ -267,6 +274,11 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
this.setInitialPlanSelection();
this.loading = false;
+
+ const taxInfo = await this.organizationApiService.getTaxInfo(this.organizationId);
+ this.taxInformation = TaxInformation.from(taxInfo);
+
+ this.refreshSalesTax();
}
setInitialPlanSelection() {
@@ -402,6 +414,12 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
}
this.selectedPlan = plan;
this.formGroup.patchValue({ productTier: plan.productTier });
+
+ try {
+ this.refreshSalesTax();
+ } catch {
+ this.estimatedTax = 0;
+ }
}
ngOnDestroy() {
@@ -567,12 +585,6 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
);
}
- get taxCharges() {
- return this.taxComponent != null && this.taxComponent.taxRate != null
- ? (this.taxComponent.taxRate / 100) * this.passwordManagerSubtotal
- : 0;
- }
-
get passwordManagerSeats() {
if (this.selectedPlan.productTier === ProductTierType.Families) {
return this.selectedPlan.PasswordManager.baseSeats;
@@ -584,15 +596,15 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
if (this.organization.useSecretsManager) {
return (
this.passwordManagerSubtotal +
- this.additionalStorageTotal(this.selectedPlan) +
- this.secretsManagerSubtotal +
- this.taxCharges || 0
+ this.additionalStorageTotal(this.selectedPlan) +
+ this.secretsManagerSubtotal +
+ this.estimatedTax
);
}
return (
this.passwordManagerSubtotal +
- this.additionalStorageTotal(this.selectedPlan) +
- this.taxCharges || 0
+ this.additionalStorageTotal(this.selectedPlan) +
+ this.estimatedTax
);
}
@@ -645,8 +657,8 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
}
changedCountry() {
- if (this.deprecateStripeSourcesAPI && this.paymentV2Component && this.taxComponent) {
- this.paymentV2Component.showBankAccount = this.taxComponent.country === "US";
+ if (this.deprecateStripeSourcesAPI && this.paymentV2Component) {
+ this.paymentV2Component.showBankAccount = this.taxInformation.country === "US";
if (
!this.paymentV2Component.showBankAccount &&
@@ -654,8 +666,8 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
) {
this.paymentV2Component.select(PaymentMethodType.Card);
}
- } else if (this.paymentComponent && this.taxComponent) {
- this.paymentComponent!.hideBank = this.taxComponent?.taxFormGroup?.value.country !== "US";
+ } else if (this.paymentComponent && this.taxInformation) {
+ this.paymentComponent!.hideBank = this.taxInformation.country !== "US";
// Bank Account payments are only available for US customers
if (
this.paymentComponent.hideBank &&
@@ -667,9 +679,14 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
}
}
+ protected taxInformationChanged(event: TaxInformation): void {
+ this.taxInformation = event;
+ this.changedCountry();
+ this.refreshSalesTax();
+ }
+
submit = async () => {
- if (!this.taxComponent?.taxFormGroup.valid && this.taxComponent?.taxFormGroup.touched) {
- this.taxComponent?.taxFormGroup.markAllAsTouched();
+ if (this.taxComponent !== undefined && !this.taxComponent.validate()) {
return;
}
@@ -723,8 +740,8 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
this.formGroup.controls.premiumAccessAddon.value;
request.planType = this.selectedPlan.type;
if (this.showPayment) {
- request.billingAddressCountry = this.taxComponent.taxFormGroup?.value.country;
- request.billingAddressPostalCode = this.taxComponent.taxFormGroup?.value.postalCode;
+ request.billingAddressCountry = this.taxInformation.country;
+ request.billingAddressPostalCode = this.taxInformation.postalCode;
}
// Secrets Manager
@@ -735,15 +752,9 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
const tokenizedPaymentSource = await this.paymentV2Component.tokenize();
const updatePaymentMethodRequest = new UpdatePaymentMethodRequest();
updatePaymentMethodRequest.paymentSource = tokenizedPaymentSource;
- updatePaymentMethodRequest.taxInformation = {
- country: this.taxComponent.country,
- postalCode: this.taxComponent.postalCode,
- taxId: this.taxComponent.taxId,
- line1: this.taxComponent.line1,
- line2: this.taxComponent.line2,
- city: this.taxComponent.city,
- state: this.taxComponent.state,
- };
+ updatePaymentMethodRequest.taxInformation = ExpandedTaxInfoUpdateRequest.From(
+ this.taxInformation,
+ );
await this.billingApiService.updateOrganizationPaymentMethod(
this.organizationId,
@@ -754,8 +765,8 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
const paymentRequest = new PaymentRequest();
paymentRequest.paymentToken = tokenResult[0];
paymentRequest.paymentMethodType = tokenResult[1];
- paymentRequest.country = this.taxComponent.taxFormGroup?.value.country;
- paymentRequest.postalCode = this.taxComponent.taxFormGroup?.value.postalCode;
+ paymentRequest.country = this.taxInformation.country;
+ paymentRequest.postalCode = this.taxInformation.postalCode;
await this.organizationApiService.updatePayment(this.organizationId, paymentRequest);
}
}
@@ -944,4 +955,48 @@ export class ChangePlanDialogComponent implements OnInit, OnDestroy {
manageSelectableProduct(index: number) {
return index;
}
+
+ private refreshSalesTax(): void {
+ if (!this.taxInformation.country || !this.taxInformation.postalCode) {
+ return;
+ }
+
+ const request: PreviewOrganizationInvoiceRequest = {
+ organizationId: this.organizationId,
+ passwordManager: {
+ additionalStorage: 0,
+ plan: this.selectedPlan?.type,
+ seats: this.sub.seats,
+ },
+ taxInformation: {
+ postalCode: this.taxInformation.postalCode,
+ country: this.taxInformation.country,
+ taxId: this.taxInformation.taxId,
+ },
+ };
+
+ if (this.organization.useSecretsManager) {
+ request.secretsManager = {
+ seats: this.sub.smSeats,
+ additionalMachineAccounts: this.sub.smServiceAccounts,
+ };
+ }
+
+ this.taxService
+ .previewOrganizationInvoice(request)
+ .then((invoice) => {
+ this.estimatedTax = invoice.taxAmount;
+ })
+ .catch((error) => {
+ this.toastService.showToast({
+ title: "",
+ variant: "error",
+ message: this.i18nService.t(error.message),
+ });
+ });
+ }
+
+ protected canUpdatePaymentInformation(): boolean {
+ return this.upgradeRequiresPaymentMethod || this.showPayment || this.isPaymentSourceEmpty();
+ }
}
diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.html b/apps/web/src/app/billing/organizations/organization-plans.component.html
index e1b74abea71..d37f95e3aa2 100644
--- a/apps/web/src/app/billing/organizations/organization-plans.component.html
+++ b/apps/web/src/app/billing/organizations/organization-plans.component.html
@@ -335,7 +335,7 @@
>{{ "additionalUsers" | i18n }}:
{{ "users" | i18n }}:
- {{ formGroup.controls["additionalSeats"].value || 0 }} ×
+ {{ formGroup.controls.additionalSeats.value || 0 }} ×
{{
(selectablePlan.isAnnual
? selectablePlan.PasswordManager.seatPrice / 12
@@ -355,7 +355,7 @@
*ngIf="selectablePlan.PasswordManager.hasAdditionalStorageOption"
>
{{ "additionalStorageGb" | i18n }}:
- {{ formGroup.controls["additionalStorage"].value || 0 }} ×
+ {{ formGroup.controls.additionalStorage.value || 0 }} ×
{{
(selectablePlan.isAnnual
? selectablePlan.PasswordManager.additionalStoragePricePerGb / 12
@@ -388,7 +388,7 @@
>{{ "additionalUsers" | i18n }}:
{{ "users" | i18n }}:
- {{ formGroup.controls["additionalSeats"].value || 0 }} ×
+ {{ formGroup.controls.additionalSeats.value || 0 }} ×
{{ selectablePlan.PasswordManager.seatPrice | currency: "$" }}
{{ "monthAbbr" | i18n }} =
{{
@@ -403,7 +403,7 @@
*ngIf="selectablePlan.PasswordManager.hasAdditionalStorageOption"
>
{{ "additionalStorageGb" | i18n }}:
- {{ formGroup.controls["additionalStorage"].value || 0 }} ×
+ {{ formGroup.controls.additionalStorage.value || 0 }} ×
{{ selectablePlan.PasswordManager.additionalStoragePricePerGb | currency: "$" }}
{{ "monthAbbr" | i18n }} =
{{ additionalStorageTotal(selectablePlan) | currency: "$" }} /{{ "month" | i18n }}
@@ -440,7 +440,12 @@
-
+
{{ "passwordManagerPlanPrice" | i18n }}: {{ passwordManagerSubtotal | currency: "USD $" }}
@@ -450,7 +455,7 @@
- {{ "estimatedTax" | i18n }}: {{ taxCharges | currency: "USD $" }}
+ {{ "estimatedTax" | i18n }}: {{ estimatedTax | currency: "USD $" }}
diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.ts b/apps/web/src/app/billing/organizations/organization-plans.component.ts
index e7a011792ae..4592f8de894 100644
--- a/apps/web/src/app/billing/organizations/organization-plans.component.ts
+++ b/apps/web/src/app/billing/organizations/organization-plans.component.ts
@@ -12,7 +12,9 @@ import {
import { FormBuilder, Validators } from "@angular/forms";
import { Router } from "@angular/router";
import { Subject, takeUntil } from "rxjs";
+import { debounceTime } from "rxjs/operators";
+import { ManageTaxInformationComponent } from "@bitwarden/angular/billing/components";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
@@ -26,9 +28,12 @@ import { OrganizationUpgradeRequest } from "@bitwarden/common/admin-console/mode
import { ProviderOrganizationCreateRequest } from "@bitwarden/common/admin-console/models/request/provider/provider-organization-create.request";
import { ProviderResponse } from "@bitwarden/common/admin-console/models/response/provider/provider.response";
import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions";
+import { TaxServiceAbstraction } from "@bitwarden/common/billing/abstractions/tax.service.abstraction";
import { PaymentMethodType, PlanType, ProductTierType } from "@bitwarden/common/billing/enums";
+import { TaxInformation } from "@bitwarden/common/billing/models/domain";
import { ExpandedTaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/expanded-tax-info-update.request";
import { PaymentRequest } from "@bitwarden/common/billing/models/request/payment.request";
+import { PreviewOrganizationInvoiceRequest } from "@bitwarden/common/billing/models/request/preview-organization-invoice.request";
import { UpdatePaymentMethodRequest } from "@bitwarden/common/billing/models/request/update-payment-method.request";
import { BillingResponse } from "@bitwarden/common/billing/models/response/billing.response";
import { OrganizationSubscriptionResponse } from "@bitwarden/common/billing/models/response/organization-subscription.response";
@@ -50,7 +55,6 @@ import { OrganizationCreateModule } from "../../admin-console/organizations/crea
import { BillingSharedModule, secretsManagerSubscribeFormFactory } from "../shared";
import { PaymentV2Component } from "../shared/payment/payment-v2.component";
import { PaymentComponent } from "../shared/payment/payment.component";
-import { TaxInfoComponent } from "../shared/tax-info.component";
interface OnSuccessArgs {
organizationId: string;
@@ -72,13 +76,14 @@ const Allowed2020PlansForLegacyProviders = [
export class OrganizationPlansComponent implements OnInit, OnDestroy {
@ViewChild(PaymentComponent) paymentComponent: PaymentComponent;
@ViewChild(PaymentV2Component) paymentV2Component: PaymentV2Component;
- @ViewChild(TaxInfoComponent) taxComponent: TaxInfoComponent;
+ @ViewChild(ManageTaxInformationComponent) taxComponent: ManageTaxInformationComponent;
- @Input() organizationId: string;
+ @Input() organizationId?: string;
@Input() showFree = true;
@Input() showCancel = false;
@Input() acceptingSponsorship = false;
@Input() currentPlan: PlanResponse;
+
selectedFile: File;
@Input()
@@ -93,6 +98,8 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
private _productTier = ProductTierType.Free;
+ protected taxInformation: TaxInformation;
+
@Input()
get plan(): PlanType {
return this._plan;
@@ -149,7 +156,10 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
billing: BillingResponse;
provider: ProviderResponse;
- private destroy$ = new Subject
();
+ protected estimatedTax: number = 0;
+ protected total: number = 0;
+
+ private destroy$: Subject = new Subject();
constructor(
private apiService: ApiService,
@@ -168,6 +178,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
private toastService: ToastService,
private configService: ConfigService,
private billingApiService: BillingApiServiceAbstraction,
+ private taxService: TaxServiceAbstraction,
) {
this.selfHosted = this.platformUtilsService.isSelfHost();
}
@@ -181,6 +192,9 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.organization = await this.organizationService.get(this.organizationId);
this.billing = await this.organizationApiService.getBilling(this.organizationId);
this.sub = await this.organizationApiService.getSubscription(this.organizationId);
+ this.taxInformation = await this.organizationApiService.getTaxInfo(this.organizationId);
+ } else {
+ this.taxInformation = await this.apiService.getTaxInfo();
}
if (!this.selfHosted) {
@@ -241,6 +255,16 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
this.loading = false;
+
+ this.formGroup.valueChanges.pipe(debounceTime(1000), takeUntil(this.destroy$)).subscribe(() => {
+ this.refreshSalesTax();
+ });
+
+ this.secretsManagerForm.valueChanges
+ .pipe(debounceTime(1000), takeUntil(this.destroy$))
+ .subscribe(() => {
+ this.refreshSalesTax();
+ });
}
ngOnDestroy() {
@@ -438,17 +462,6 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
return this.selectedPlan.trialPeriodDays != null;
}
- get taxCharges() {
- return this.taxComponent != null && this.taxComponent.taxRate != null
- ? (this.taxComponent.taxRate / 100) *
- (this.passwordManagerSubtotal + this.secretsManagerSubtotal)
- : 0;
- }
-
- get total() {
- return this.passwordManagerSubtotal + this.secretsManagerSubtotal + this.taxCharges || 0;
- }
-
get paymentDesc() {
if (this.acceptingSponsorship) {
return this.i18nService.t("paymentSponsored");
@@ -554,9 +567,9 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.changedProduct();
}
- changedCountry() {
+ protected changedCountry(): void {
if (this.deprecateStripeSourcesAPI) {
- this.paymentV2Component.showBankAccount = this.taxComponent.country === "US";
+ this.paymentV2Component.showBankAccount = this.taxInformation?.country === "US";
if (
!this.paymentV2Component.showBankAccount &&
this.paymentV2Component.selected === PaymentMethodType.BankAccount
@@ -564,7 +577,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.paymentV2Component.select(PaymentMethodType.Card);
}
} else {
- this.paymentComponent.hideBank = this.taxComponent.taxFormGroup?.value.country !== "US";
+ this.paymentComponent.hideBank = this.taxInformation?.country !== "US";
if (
this.paymentComponent.hideBank &&
this.paymentComponent.method === PaymentMethodType.BankAccount
@@ -575,28 +588,31 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
}
- cancel() {
+ protected onTaxInformationChanged(event: TaxInformation): void {
+ this.taxInformation = event;
+ this.changedCountry();
+ this.refreshSalesTax();
+ }
+
+ protected cancel(): void {
this.onCanceled.emit();
}
- setSelectedFile(event: Event) {
+ protected setSelectedFile(event: Event): void {
const fileInputEl = event.target;
this.selectedFile = fileInputEl.files.length > 0 ? fileInputEl.files[0] : null;
}
submit = async () => {
- if (this.taxComponent) {
- if (!this.taxComponent?.taxFormGroup.valid) {
- this.taxComponent?.taxFormGroup.markAllAsTouched();
- return;
- }
+ if (this.taxComponent && !this.taxComponent.validate()) {
+ return;
}
if (this.singleOrgPolicyBlock) {
return;
}
const doSubmit = async (): Promise => {
- let orgId: string = null;
+ let orgId: string;
if (this.createOrganization) {
const orgKey = await this.keyService.makeOrgKey();
const key = orgKey[0].encryptedString;
@@ -607,11 +623,9 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
const collectionCt = collection.encryptedString;
const orgKeys = await this.keyService.makeKeyPair(orgKey[1]);
- if (this.selfHosted) {
- orgId = await this.createSelfHosted(key, collectionCt, orgKeys);
- } else {
- orgId = await this.createCloudHosted(key, collectionCt, orgKeys, orgKey[1]);
- }
+ orgId = this.selfHosted
+ ? await this.createSelfHosted(key, collectionCt, orgKeys)
+ : await this.createCloudHosted(key, collectionCt, orgKeys, orgKey[1]);
this.toastService.showToast({
variant: "success",
@@ -619,7 +633,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
message: this.i18nService.t("organizationReadyToGo"),
});
} else {
- orgId = await this.updateOrganization(orgId);
+ orgId = await this.updateOrganization();
this.toastService.showToast({
variant: "success",
title: null,
@@ -653,7 +667,63 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.messagingService.send("organizationCreated", { organizationId });
};
- private async updateOrganization(orgId: string) {
+ protected get showTaxIdField(): boolean {
+ switch (this.formGroup.controls.productTier.value) {
+ case ProductTierType.Free:
+ case ProductTierType.Families:
+ return false;
+ default:
+ return true;
+ }
+ }
+
+ private refreshSalesTax(): void {
+ if (this.formGroup.controls.plan.value == PlanType.Free) {
+ this.estimatedTax = 0;
+ return;
+ }
+
+ if (!this.taxComponent.validate()) {
+ return;
+ }
+
+ const request: PreviewOrganizationInvoiceRequest = {
+ organizationId: this.organizationId,
+ passwordManager: {
+ additionalStorage: this.formGroup.controls.additionalStorage.value,
+ plan: this.formGroup.controls.plan.value,
+ seats: this.formGroup.controls.additionalSeats.value,
+ },
+ taxInformation: {
+ postalCode: this.taxInformation.postalCode,
+ country: this.taxInformation.country,
+ taxId: this.taxInformation.taxId,
+ },
+ };
+
+ if (this.secretsManagerForm.controls.enabled.value === true) {
+ request.secretsManager = {
+ seats: this.secretsManagerForm.controls.userSeats.value,
+ additionalMachineAccounts: this.secretsManagerForm.controls.additionalServiceAccounts.value,
+ };
+ }
+
+ this.taxService
+ .previewOrganizationInvoice(request)
+ .then((invoice) => {
+ this.estimatedTax = invoice.taxAmount;
+ this.total = invoice.totalAmount;
+ })
+ .catch((error) => {
+ this.toastService.showToast({
+ title: "",
+ variant: "error",
+ message: this.i18nService.t(error.message),
+ });
+ });
+ }
+
+ private async updateOrganization() {
const request = new OrganizationUpgradeRequest();
request.additionalSeats = this.formGroup.controls.additionalSeats.value;
request.additionalStorageGb = this.formGroup.controls.additionalStorage.value;
@@ -661,8 +731,8 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.selectedPlan.PasswordManager.hasPremiumAccessOption &&
this.formGroup.controls.premiumAccessAddon.value;
request.planType = this.selectedPlan.type;
- request.billingAddressCountry = this.taxComponent.taxFormGroup?.value.country;
- request.billingAddressPostalCode = this.taxComponent.taxFormGroup?.value.postalCode;
+ request.billingAddressCountry = this.taxInformation?.country;
+ request.billingAddressPostalCode = this.taxInformation?.postalCode;
// Secrets Manager
this.buildSecretsManagerRequest(request);
@@ -671,10 +741,9 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
if (this.deprecateStripeSourcesAPI) {
const updatePaymentMethodRequest = new UpdatePaymentMethodRequest();
updatePaymentMethodRequest.paymentSource = await this.paymentV2Component.tokenize();
- const expandedTaxInfoUpdateRequest = new ExpandedTaxInfoUpdateRequest();
- expandedTaxInfoUpdateRequest.country = this.taxComponent.country;
- expandedTaxInfoUpdateRequest.postalCode = this.taxComponent.postalCode;
- updatePaymentMethodRequest.taxInformation = expandedTaxInfoUpdateRequest;
+ updatePaymentMethodRequest.taxInformation = ExpandedTaxInfoUpdateRequest.From(
+ this.taxInformation,
+ );
await this.billingApiService.updateOrganizationPaymentMethod(
this.organizationId,
updatePaymentMethodRequest,
@@ -684,8 +753,8 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
const paymentRequest = new PaymentRequest();
paymentRequest.paymentToken = paymentToken;
paymentRequest.paymentMethodType = paymentMethodType;
- paymentRequest.country = this.taxComponent.taxFormGroup?.value.country;
- paymentRequest.postalCode = this.taxComponent.taxFormGroup?.value.postalCode;
+ paymentRequest.country = this.taxInformation?.country;
+ paymentRequest.postalCode = this.taxInformation?.postalCode;
await this.organizationApiService.updatePayment(this.organizationId, paymentRequest);
}
}
@@ -709,7 +778,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
collectionCt: string,
orgKeys: [string, EncString],
orgKey: SymmetricCryptoKey,
- ) {
+ ): Promise {
const request = new OrganizationCreateRequest();
request.key = key;
request.collectionName = collectionCt;
@@ -738,15 +807,13 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.selectedPlan.PasswordManager.hasPremiumAccessOption &&
this.formGroup.controls.premiumAccessAddon.value;
request.planType = this.selectedPlan.type;
- request.billingAddressPostalCode = this.taxComponent.taxFormGroup?.value.postalCode;
- request.billingAddressCountry = this.taxComponent.taxFormGroup?.value.country;
- if (this.taxComponent.taxFormGroup?.value.includeTaxId) {
- request.taxIdNumber = this.taxComponent.taxFormGroup?.value.taxId;
- request.billingAddressLine1 = this.taxComponent.taxFormGroup?.value.line1;
- request.billingAddressLine2 = this.taxComponent.taxFormGroup?.value.line2;
- request.billingAddressCity = this.taxComponent.taxFormGroup?.value.city;
- request.billingAddressState = this.taxComponent.taxFormGroup?.value.state;
- }
+ request.billingAddressPostalCode = this.taxInformation?.postalCode;
+ request.billingAddressCountry = this.taxInformation?.country;
+ request.taxIdNumber = this.taxInformation?.taxId;
+ request.billingAddressLine1 = this.taxInformation?.line1;
+ request.billingAddressLine2 = this.taxInformation?.line2;
+ request.billingAddressCity = this.taxInformation?.city;
+ request.billingAddressState = this.taxInformation?.state;
}
// Secrets Manager
diff --git a/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.html b/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.html
index 78f9955d31a..2c2dba938bc 100644
--- a/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.html
+++ b/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.html
@@ -63,20 +63,5 @@
{{ "paymentChargedWithUnpaidSubscription" | i18n }}
-
-
- {{ "taxInformation" | i18n }}
- {{ "taxInformationDesc" | i18n }}
-
-
-
diff --git a/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.ts b/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.ts
index 4ed35461c72..270ba54f70d 100644
--- a/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.ts
+++ b/apps/web/src/app/billing/organizations/payment-method/organization-payment-method.component.ts
@@ -1,7 +1,7 @@
// FIXME: Update this file to be type safe and remove this and next line
// @ts-strict-ignore
import { Location } from "@angular/common";
-import { Component, OnDestroy, ViewChild } from "@angular/core";
+import { Component, OnDestroy } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { ActivatedRoute, Router } from "@angular/router";
import { from, lastValueFrom, switchMap } from "rxjs";
@@ -11,7 +11,6 @@ import { OrganizationService } from "@bitwarden/common/admin-console/abstraction
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions";
import { PaymentMethodType } from "@bitwarden/common/billing/enums";
-import { ExpandedTaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/expanded-tax-info-update.request";
import { VerifyBankAccountRequest } from "@bitwarden/common/billing/models/request/verify-bank-account.request";
import { OrganizationSubscriptionResponse } from "@bitwarden/common/billing/models/response/organization-subscription.response";
import { PaymentSourceResponse } from "@bitwarden/common/billing/models/response/payment-source.response";
@@ -22,7 +21,6 @@ import { DialogService, ToastService } from "@bitwarden/components";
import { FreeTrial } from "../../../core/types/free-trial";
import { TrialFlowService } from "../../services/trial-flow.service";
-import { TaxInfoComponent } from "../../shared";
import {
AddCreditDialogResult,
openAddCreditDialog,
@@ -36,8 +34,6 @@ import {
templateUrl: "./organization-payment-method.component.html",
})
export class OrganizationPaymentMethodComponent implements OnDestroy {
- @ViewChild(TaxInfoComponent) taxInfoComponent: TaxInfoComponent;
-
organizationId: string;
isUnpaid = false;
accountCredit: number;
@@ -155,6 +151,7 @@ export class OrganizationPaymentMethodComponent implements OnDestroy {
data: {
initialPaymentMethod: this.paymentSource?.type,
organizationId: this.organizationId,
+ productTier: this.organization?.productTierType,
},
});
@@ -170,6 +167,7 @@ export class OrganizationPaymentMethodComponent implements OnDestroy {
data: {
initialPaymentMethod: this.paymentSource?.type,
organizationId: this.organizationId,
+ productTier: this.organization?.productTierType,
},
});
const result = await lastValueFrom(dialogRef.closed);
@@ -183,32 +181,6 @@ export class OrganizationPaymentMethodComponent implements OnDestroy {
}
};
- protected updateTaxInformation = async (): Promise => {
- this.taxInfoComponent.taxFormGroup.updateValueAndValidity();
- this.taxInfoComponent.taxFormGroup.markAllAsTouched();
-
- if (this.taxInfoComponent.taxFormGroup.invalid) {
- return;
- }
-
- const request = new ExpandedTaxInfoUpdateRequest();
- request.country = this.taxInfoComponent.country;
- request.postalCode = this.taxInfoComponent.postalCode;
- request.taxId = this.taxInfoComponent.taxId;
- request.line1 = this.taxInfoComponent.line1;
- request.line2 = this.taxInfoComponent.line2;
- request.city = this.taxInfoComponent.city;
- request.state = this.taxInfoComponent.state;
-
- await this.billingApiService.updateOrganizationTaxInformation(this.organizationId, request);
-
- this.toastService.showToast({
- variant: "success",
- title: null,
- message: this.i18nService.t("taxInfoUpdated"),
- });
- };
-
protected verifyBankAccount = async (request: VerifyBankAccountRequest): Promise => {
await this.billingApiService.verifyOrganizationBankAccount(this.organizationId, request);
this.toastService.showToast({
diff --git a/apps/web/src/app/billing/organizations/sm-adjust-subscription.component.ts b/apps/web/src/app/billing/organizations/sm-adjust-subscription.component.ts
index 4a4f309c68b..fc7a188f967 100644
--- a/apps/web/src/app/billing/organizations/sm-adjust-subscription.component.ts
+++ b/apps/web/src/app/billing/organizations/sm-adjust-subscription.component.ts
@@ -5,6 +5,8 @@ import { FormBuilder, Validators } from "@angular/forms";
import { Subject, takeUntil } from "rxjs";
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
+import { InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
+import { OrganizationData } from "@bitwarden/common/admin-console/models/data/organization.data";
import { OrganizationSmSubscriptionUpdateRequest } from "@bitwarden/common/billing/models/request/organization-sm-subscription-update.request";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
@@ -104,6 +106,7 @@ export class SecretsManagerAdjustSubscriptionComponent implements OnInit, OnDest
private i18nService: I18nService,
private platformUtilsService: PlatformUtilsService,
private toastService: ToastService,
+ private internalOrganizationService: InternalOrganizationServiceAbstraction,
) {}
ngOnInit() {
@@ -157,11 +160,20 @@ export class SecretsManagerAdjustSubscriptionComponent implements OnInit, OnDest
? this.formGroup.value.maxAutoscaleServiceAccounts
: null;
- await this.organizationApiService.updateSecretsManagerSubscription(
+ const response = await this.organizationApiService.updateSecretsManagerSubscription(
this.organizationId,
request,
);
+ const organization = await this.internalOrganizationService.get(this.organizationId);
+
+ const organizationData = new OrganizationData(response, {
+ isMember: organization.isMember,
+ isProviderUser: organization.isProviderUser,
+ });
+
+ await this.internalOrganizationService.upsert(organizationData);
+
this.toastService.showToast({
variant: "success",
title: null,
diff --git a/apps/web/src/app/billing/services/reseller-warning.service.ts b/apps/web/src/app/billing/services/reseller-warning.service.ts
new file mode 100644
index 00000000000..bfd5be3233a
--- /dev/null
+++ b/apps/web/src/app/billing/services/reseller-warning.service.ts
@@ -0,0 +1,142 @@
+import { Injectable } from "@angular/core";
+
+import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
+import { OrganizationBillingMetadataResponse } from "@bitwarden/common/billing/models/response/organization-billing-metadata.response";
+import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
+
+export interface ResellerWarning {
+ type: "info" | "warning";
+ message: string;
+}
+
+@Injectable({ providedIn: "root" })
+export class ResellerWarningService {
+ private readonly RENEWAL_WARNING_DAYS = 14;
+ private readonly GRACE_PERIOD_DAYS = 30;
+
+ constructor(private i18nService: I18nService) {}
+
+ getWarning(
+ organization: Organization,
+ organizationBillingMetadata: OrganizationBillingMetadataResponse,
+ ): ResellerWarning | null {
+ if (!organization.hasReseller) {
+ return null; // If no reseller, return null immediately
+ }
+
+ // Check for past due warning first (highest priority)
+ if (this.shouldShowPastDueWarning(organizationBillingMetadata)) {
+ const gracePeriodEnd = this.getGracePeriodEndDate(organizationBillingMetadata.invoiceDueDate);
+ if (!gracePeriodEnd) {
+ return null;
+ }
+ return {
+ type: "warning",
+ message: this.i18nService.t(
+ "resellerPastDueWarning",
+ organization.providerName,
+ this.formatDate(gracePeriodEnd),
+ ),
+ } as ResellerWarning;
+ }
+
+ // Check for open invoice warning
+ if (this.shouldShowInvoiceWarning(organizationBillingMetadata)) {
+ const invoiceCreatedDate = organizationBillingMetadata.invoiceCreatedDate;
+ const invoiceDueDate = organizationBillingMetadata.invoiceDueDate;
+ if (!invoiceCreatedDate || !invoiceDueDate) {
+ return null;
+ }
+ return {
+ type: "info",
+ message: this.i18nService.t(
+ "resellerOpenInvoiceWarning",
+ organization.providerName,
+ this.formatDate(organizationBillingMetadata.invoiceCreatedDate),
+ this.formatDate(organizationBillingMetadata.invoiceDueDate),
+ ),
+ } as ResellerWarning;
+ }
+
+ // Check for renewal warning
+ if (this.shouldShowRenewalWarning(organizationBillingMetadata)) {
+ const subPeriodEndDate = organizationBillingMetadata.subPeriodEndDate;
+ if (!subPeriodEndDate) {
+ return null;
+ }
+
+ return {
+ type: "info",
+ message: this.i18nService.t(
+ "resellerRenewalWarning",
+ organization.providerName,
+ this.formatDate(organizationBillingMetadata.subPeriodEndDate),
+ ),
+ } as ResellerWarning;
+ }
+
+ return null;
+ }
+
+ private shouldShowRenewalWarning(
+ organizationBillingMetadata: OrganizationBillingMetadataResponse,
+ ): boolean {
+ if (
+ !organizationBillingMetadata.hasSubscription ||
+ !organizationBillingMetadata.subPeriodEndDate
+ ) {
+ return false;
+ }
+ const renewalDate = new Date(organizationBillingMetadata.subPeriodEndDate);
+ const daysUntilRenewal = Math.ceil(
+ (renewalDate.getTime() - Date.now()) / (1000 * 60 * 60 * 24),
+ );
+ return daysUntilRenewal <= this.RENEWAL_WARNING_DAYS;
+ }
+
+ private shouldShowInvoiceWarning(
+ organizationBillingMetadata: OrganizationBillingMetadataResponse,
+ ): boolean {
+ if (
+ !organizationBillingMetadata.hasOpenInvoice ||
+ !organizationBillingMetadata.invoiceDueDate
+ ) {
+ return false;
+ }
+ const invoiceDueDate = new Date(organizationBillingMetadata.invoiceDueDate);
+ return invoiceDueDate > new Date();
+ }
+
+ private shouldShowPastDueWarning(
+ organizationBillingMetadata: OrganizationBillingMetadataResponse,
+ ): boolean {
+ if (
+ !organizationBillingMetadata.hasOpenInvoice ||
+ !organizationBillingMetadata.invoiceDueDate
+ ) {
+ return false;
+ }
+ const invoiceDueDate = new Date(organizationBillingMetadata.invoiceDueDate);
+ return invoiceDueDate <= new Date() && !organizationBillingMetadata.isSubscriptionUnpaid;
+ }
+
+ private getGracePeriodEndDate(dueDate: Date | null): Date | null {
+ if (!dueDate) {
+ return null;
+ }
+ const gracePeriodEnd = new Date(dueDate);
+ gracePeriodEnd.setDate(gracePeriodEnd.getDate() + this.GRACE_PERIOD_DAYS);
+ return gracePeriodEnd;
+ }
+
+ private formatDate(date: Date | null): string {
+ if (!date) {
+ return "N/A";
+ }
+ return new Date(date).toLocaleDateString("en-US", {
+ month: "short",
+ day: "2-digit",
+ year: "numeric",
+ });
+ }
+}
diff --git a/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html b/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html
index e41d3d961cd..bb06f87ca03 100644
--- a/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html
+++ b/apps/web/src/app/billing/shared/adjust-payment-dialog/adjust-payment-dialog-v2.component.html
@@ -5,7 +5,12 @@
[showBankAccount]="!!organizationId"
[initialPaymentMethod]="initialPaymentMethod"
>
-
+
-
+
{{ "zipPostalCode" | i18n }}
-
-
-
-
diff --git a/apps/web/src/app/billing/shared/tax-info.component.ts b/apps/web/src/app/billing/shared/tax-info.component.ts
index 8ebec5e1dfe..214364e4cf2 100644
--- a/apps/web/src/app/billing/shared/tax-info.component.ts
+++ b/apps/web/src/app/billing/shared/tax-info.component.ts
@@ -1,31 +1,20 @@
// FIXME: Update this file to be type safe and remove this and next line
// @ts-strict-ignore
-import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core";
+import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core";
import { FormControl, FormGroup, Validators } from "@angular/forms";
import { ActivatedRoute } from "@angular/router";
import { Subject, takeUntil } from "rxjs";
+import { debounceTime } from "rxjs/operators";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
+import { TaxServiceAbstraction } from "@bitwarden/common/billing/abstractions/tax.service.abstraction";
+import { CountryListItem } from "@bitwarden/common/billing/models/domain";
import { ExpandedTaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/expanded-tax-info-update.request";
-import { TaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/tax-info-update.request";
-import { TaxInfoResponse } from "@bitwarden/common/billing/models/response/tax-info.response";
-import { TaxRateResponse } from "@bitwarden/common/billing/models/response/tax-rate.response";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { SharedModule } from "../../shared";
-type TaxInfoView = Omit
& {
- includeTaxId: boolean;
- [key: string]: unknown;
-};
-
-type CountryList = {
- name: string;
- value: string;
- disabled: boolean;
-};
-
@Component({
selector: "app-tax-info",
templateUrl: "tax-info.component.html",
@@ -33,359 +22,68 @@ type CountryList = {
imports: [SharedModule],
})
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
-export class TaxInfoComponent implements OnInit {
- @Input() trialFlow = false;
- @Output() onCountryChanged = new EventEmitter();
+export class TaxInfoComponent implements OnInit, OnDestroy {
private destroy$ = new Subject();
+ @Input() trialFlow = false;
+ @Output() countryChanged = new EventEmitter();
+ @Output() taxInformationChanged: EventEmitter = new EventEmitter();
+
taxFormGroup = new FormGroup({
- country: new FormControl(null, [Validators.required]),
- postalCode: new FormControl(null),
- includeTaxId: new FormControl(null),
- taxId: new FormControl(null),
- line1: new FormControl(null),
- line2: new FormControl(null),
- city: new FormControl(null),
- state: new FormControl(null),
+ country: new FormControl(null, [Validators.required]),
+ postalCode: new FormControl(null, [Validators.required]),
+ taxId: new FormControl(null),
+ line1: new FormControl(null),
+ line2: new FormControl(null),
+ city: new FormControl(null),
+ state: new FormControl(null),
});
+ protected isTaxSupported: boolean;
+
loading = true;
organizationId: string;
providerId: string;
- taxInfo: TaxInfoView = {
- taxId: null,
- line1: null,
- line2: null,
- city: null,
- state: null,
- postalCode: null,
- country: "US",
- includeTaxId: false,
- };
- countryList: CountryList[] = [
- { name: "-- Select --", value: "", disabled: false },
- { name: "United States", value: "US", disabled: false },
- { name: "China", value: "CN", disabled: false },
- { name: "France", value: "FR", disabled: false },
- { name: "Germany", value: "DE", disabled: false },
- { name: "Canada", value: "CA", disabled: false },
- { name: "United Kingdom", value: "GB", disabled: false },
- { name: "Australia", value: "AU", disabled: false },
- { name: "India", value: "IN", disabled: false },
- { name: "", value: "-", disabled: true },
- { name: "Afghanistan", value: "AF", disabled: false },
- { name: "Åland Islands", value: "AX", disabled: false },
- { name: "Albania", value: "AL", disabled: false },
- { name: "Algeria", value: "DZ", disabled: false },
- { name: "American Samoa", value: "AS", disabled: false },
- { name: "Andorra", value: "AD", disabled: false },
- { name: "Angola", value: "AO", disabled: false },
- { name: "Anguilla", value: "AI", disabled: false },
- { name: "Antarctica", value: "AQ", disabled: false },
- { name: "Antigua and Barbuda", value: "AG", disabled: false },
- { name: "Argentina", value: "AR", disabled: false },
- { name: "Armenia", value: "AM", disabled: false },
- { name: "Aruba", value: "AW", disabled: false },
- { name: "Austria", value: "AT", disabled: false },
- { name: "Azerbaijan", value: "AZ", disabled: false },
- { name: "Bahamas", value: "BS", disabled: false },
- { name: "Bahrain", value: "BH", disabled: false },
- { name: "Bangladesh", value: "BD", disabled: false },
- { name: "Barbados", value: "BB", disabled: false },
- { name: "Belarus", value: "BY", disabled: false },
- { name: "Belgium", value: "BE", disabled: false },
- { name: "Belize", value: "BZ", disabled: false },
- { name: "Benin", value: "BJ", disabled: false },
- { name: "Bermuda", value: "BM", disabled: false },
- { name: "Bhutan", value: "BT", disabled: false },
- { name: "Bolivia, Plurinational State of", value: "BO", disabled: false },
- { name: "Bonaire, Sint Eustatius and Saba", value: "BQ", disabled: false },
- { name: "Bosnia and Herzegovina", value: "BA", disabled: false },
- { name: "Botswana", value: "BW", disabled: false },
- { name: "Bouvet Island", value: "BV", disabled: false },
- { name: "Brazil", value: "BR", disabled: false },
- { name: "British Indian Ocean Territory", value: "IO", disabled: false },
- { name: "Brunei Darussalam", value: "BN", disabled: false },
- { name: "Bulgaria", value: "BG", disabled: false },
- { name: "Burkina Faso", value: "BF", disabled: false },
- { name: "Burundi", value: "BI", disabled: false },
- { name: "Cambodia", value: "KH", disabled: false },
- { name: "Cameroon", value: "CM", disabled: false },
- { name: "Cape Verde", value: "CV", disabled: false },
- { name: "Cayman Islands", value: "KY", disabled: false },
- { name: "Central African Republic", value: "CF", disabled: false },
- { name: "Chad", value: "TD", disabled: false },
- { name: "Chile", value: "CL", disabled: false },
- { name: "Christmas Island", value: "CX", disabled: false },
- { name: "Cocos (Keeling) Islands", value: "CC", disabled: false },
- { name: "Colombia", value: "CO", disabled: false },
- { name: "Comoros", value: "KM", disabled: false },
- { name: "Congo", value: "CG", disabled: false },
- { name: "Congo, the Democratic Republic of the", value: "CD", disabled: false },
- { name: "Cook Islands", value: "CK", disabled: false },
- { name: "Costa Rica", value: "CR", disabled: false },
- { name: "Côte d'Ivoire", value: "CI", disabled: false },
- { name: "Croatia", value: "HR", disabled: false },
- { name: "Cuba", value: "CU", disabled: false },
- { name: "Curaçao", value: "CW", disabled: false },
- { name: "Cyprus", value: "CY", disabled: false },
- { name: "Czech Republic", value: "CZ", disabled: false },
- { name: "Denmark", value: "DK", disabled: false },
- { name: "Djibouti", value: "DJ", disabled: false },
- { name: "Dominica", value: "DM", disabled: false },
- { name: "Dominican Republic", value: "DO", disabled: false },
- { name: "Ecuador", value: "EC", disabled: false },
- { name: "Egypt", value: "EG", disabled: false },
- { name: "El Salvador", value: "SV", disabled: false },
- { name: "Equatorial Guinea", value: "GQ", disabled: false },
- { name: "Eritrea", value: "ER", disabled: false },
- { name: "Estonia", value: "EE", disabled: false },
- { name: "Ethiopia", value: "ET", disabled: false },
- { name: "Falkland Islands (Malvinas)", value: "FK", disabled: false },
- { name: "Faroe Islands", value: "FO", disabled: false },
- { name: "Fiji", value: "FJ", disabled: false },
- { name: "Finland", value: "FI", disabled: false },
- { name: "French Guiana", value: "GF", disabled: false },
- { name: "French Polynesia", value: "PF", disabled: false },
- { name: "French Southern Territories", value: "TF", disabled: false },
- { name: "Gabon", value: "GA", disabled: false },
- { name: "Gambia", value: "GM", disabled: false },
- { name: "Georgia", value: "GE", disabled: false },
- { name: "Ghana", value: "GH", disabled: false },
- { name: "Gibraltar", value: "GI", disabled: false },
- { name: "Greece", value: "GR", disabled: false },
- { name: "Greenland", value: "GL", disabled: false },
- { name: "Grenada", value: "GD", disabled: false },
- { name: "Guadeloupe", value: "GP", disabled: false },
- { name: "Guam", value: "GU", disabled: false },
- { name: "Guatemala", value: "GT", disabled: false },
- { name: "Guernsey", value: "GG", disabled: false },
- { name: "Guinea", value: "GN", disabled: false },
- { name: "Guinea-Bissau", value: "GW", disabled: false },
- { name: "Guyana", value: "GY", disabled: false },
- { name: "Haiti", value: "HT", disabled: false },
- { name: "Heard Island and McDonald Islands", value: "HM", disabled: false },
- { name: "Holy See (Vatican City State)", value: "VA", disabled: false },
- { name: "Honduras", value: "HN", disabled: false },
- { name: "Hong Kong", value: "HK", disabled: false },
- { name: "Hungary", value: "HU", disabled: false },
- { name: "Iceland", value: "IS", disabled: false },
- { name: "Indonesia", value: "ID", disabled: false },
- { name: "Iran, Islamic Republic of", value: "IR", disabled: false },
- { name: "Iraq", value: "IQ", disabled: false },
- { name: "Ireland", value: "IE", disabled: false },
- { name: "Isle of Man", value: "IM", disabled: false },
- { name: "Israel", value: "IL", disabled: false },
- { name: "Italy", value: "IT", disabled: false },
- { name: "Jamaica", value: "JM", disabled: false },
- { name: "Japan", value: "JP", disabled: false },
- { name: "Jersey", value: "JE", disabled: false },
- { name: "Jordan", value: "JO", disabled: false },
- { name: "Kazakhstan", value: "KZ", disabled: false },
- { name: "Kenya", value: "KE", disabled: false },
- { name: "Kiribati", value: "KI", disabled: false },
- { name: "Korea, Democratic People's Republic of", value: "KP", disabled: false },
- { name: "Korea, Republic of", value: "KR", disabled: false },
- { name: "Kuwait", value: "KW", disabled: false },
- { name: "Kyrgyzstan", value: "KG", disabled: false },
- { name: "Lao People's Democratic Republic", value: "LA", disabled: false },
- { name: "Latvia", value: "LV", disabled: false },
- { name: "Lebanon", value: "LB", disabled: false },
- { name: "Lesotho", value: "LS", disabled: false },
- { name: "Liberia", value: "LR", disabled: false },
- { name: "Libya", value: "LY", disabled: false },
- { name: "Liechtenstein", value: "LI", disabled: false },
- { name: "Lithuania", value: "LT", disabled: false },
- { name: "Luxembourg", value: "LU", disabled: false },
- { name: "Macao", value: "MO", disabled: false },
- { name: "Macedonia, the former Yugoslav Republic of", value: "MK", disabled: false },
- { name: "Madagascar", value: "MG", disabled: false },
- { name: "Malawi", value: "MW", disabled: false },
- { name: "Malaysia", value: "MY", disabled: false },
- { name: "Maldives", value: "MV", disabled: false },
- { name: "Mali", value: "ML", disabled: false },
- { name: "Malta", value: "MT", disabled: false },
- { name: "Marshall Islands", value: "MH", disabled: false },
- { name: "Martinique", value: "MQ", disabled: false },
- { name: "Mauritania", value: "MR", disabled: false },
- { name: "Mauritius", value: "MU", disabled: false },
- { name: "Mayotte", value: "YT", disabled: false },
- { name: "Mexico", value: "MX", disabled: false },
- { name: "Micronesia, Federated States of", value: "FM", disabled: false },
- { name: "Moldova, Republic of", value: "MD", disabled: false },
- { name: "Monaco", value: "MC", disabled: false },
- { name: "Mongolia", value: "MN", disabled: false },
- { name: "Montenegro", value: "ME", disabled: false },
- { name: "Montserrat", value: "MS", disabled: false },
- { name: "Morocco", value: "MA", disabled: false },
- { name: "Mozambique", value: "MZ", disabled: false },
- { name: "Myanmar", value: "MM", disabled: false },
- { name: "Namibia", value: "NA", disabled: false },
- { name: "Nauru", value: "NR", disabled: false },
- { name: "Nepal", value: "NP", disabled: false },
- { name: "Netherlands", value: "NL", disabled: false },
- { name: "New Caledonia", value: "NC", disabled: false },
- { name: "New Zealand", value: "NZ", disabled: false },
- { name: "Nicaragua", value: "NI", disabled: false },
- { name: "Niger", value: "NE", disabled: false },
- { name: "Nigeria", value: "NG", disabled: false },
- { name: "Niue", value: "NU", disabled: false },
- { name: "Norfolk Island", value: "NF", disabled: false },
- { name: "Northern Mariana Islands", value: "MP", disabled: false },
- { name: "Norway", value: "NO", disabled: false },
- { name: "Oman", value: "OM", disabled: false },
- { name: "Pakistan", value: "PK", disabled: false },
- { name: "Palau", value: "PW", disabled: false },
- { name: "Palestinian Territory, Occupied", value: "PS", disabled: false },
- { name: "Panama", value: "PA", disabled: false },
- { name: "Papua New Guinea", value: "PG", disabled: false },
- { name: "Paraguay", value: "PY", disabled: false },
- { name: "Peru", value: "PE", disabled: false },
- { name: "Philippines", value: "PH", disabled: false },
- { name: "Pitcairn", value: "PN", disabled: false },
- { name: "Poland", value: "PL", disabled: false },
- { name: "Portugal", value: "PT", disabled: false },
- { name: "Puerto Rico", value: "PR", disabled: false },
- { name: "Qatar", value: "QA", disabled: false },
- { name: "Réunion", value: "RE", disabled: false },
- { name: "Romania", value: "RO", disabled: false },
- { name: "Russian Federation", value: "RU", disabled: false },
- { name: "Rwanda", value: "RW", disabled: false },
- { name: "Saint Barthélemy", value: "BL", disabled: false },
- { name: "Saint Helena, Ascension and Tristan da Cunha", value: "SH", disabled: false },
- { name: "Saint Kitts and Nevis", value: "KN", disabled: false },
- { name: "Saint Lucia", value: "LC", disabled: false },
- { name: "Saint Martin (French part)", value: "MF", disabled: false },
- { name: "Saint Pierre and Miquelon", value: "PM", disabled: false },
- { name: "Saint Vincent and the Grenadines", value: "VC", disabled: false },
- { name: "Samoa", value: "WS", disabled: false },
- { name: "San Marino", value: "SM", disabled: false },
- { name: "Sao Tome and Principe", value: "ST", disabled: false },
- { name: "Saudi Arabia", value: "SA", disabled: false },
- { name: "Senegal", value: "SN", disabled: false },
- { name: "Serbia", value: "RS", disabled: false },
- { name: "Seychelles", value: "SC", disabled: false },
- { name: "Sierra Leone", value: "SL", disabled: false },
- { name: "Singapore", value: "SG", disabled: false },
- { name: "Sint Maarten (Dutch part)", value: "SX", disabled: false },
- { name: "Slovakia", value: "SK", disabled: false },
- { name: "Slovenia", value: "SI", disabled: false },
- { name: "Solomon Islands", value: "SB", disabled: false },
- { name: "Somalia", value: "SO", disabled: false },
- { name: "South Africa", value: "ZA", disabled: false },
- { name: "South Georgia and the South Sandwich Islands", value: "GS", disabled: false },
- { name: "South Sudan", value: "SS", disabled: false },
- { name: "Spain", value: "ES", disabled: false },
- { name: "Sri Lanka", value: "LK", disabled: false },
- { name: "Sudan", value: "SD", disabled: false },
- { name: "Suriname", value: "SR", disabled: false },
- { name: "Svalbard and Jan Mayen", value: "SJ", disabled: false },
- { name: "Swaziland", value: "SZ", disabled: false },
- { name: "Sweden", value: "SE", disabled: false },
- { name: "Switzerland", value: "CH", disabled: false },
- { name: "Syrian Arab Republic", value: "SY", disabled: false },
- { name: "Taiwan", value: "TW", disabled: false },
- { name: "Tajikistan", value: "TJ", disabled: false },
- { name: "Tanzania, United Republic of", value: "TZ", disabled: false },
- { name: "Thailand", value: "TH", disabled: false },
- { name: "Timor-Leste", value: "TL", disabled: false },
- { name: "Togo", value: "TG", disabled: false },
- { name: "Tokelau", value: "TK", disabled: false },
- { name: "Tonga", value: "TO", disabled: false },
- { name: "Trinidad and Tobago", value: "TT", disabled: false },
- { name: "Tunisia", value: "TN", disabled: false },
- { name: "Turkey", value: "TR", disabled: false },
- { name: "Turkmenistan", value: "TM", disabled: false },
- { name: "Turks and Caicos Islands", value: "TC", disabled: false },
- { name: "Tuvalu", value: "TV", disabled: false },
- { name: "Uganda", value: "UG", disabled: false },
- { name: "Ukraine", value: "UA", disabled: false },
- { name: "United Arab Emirates", value: "AE", disabled: false },
- { name: "United States Minor Outlying Islands", value: "UM", disabled: false },
- { name: "Uruguay", value: "UY", disabled: false },
- { name: "Uzbekistan", value: "UZ", disabled: false },
- { name: "Vanuatu", value: "VU", disabled: false },
- { name: "Venezuela, Bolivarian Republic of", value: "VE", disabled: false },
- { name: "Viet Nam", value: "VN", disabled: false },
- { name: "Virgin Islands, British", value: "VG", disabled: false },
- { name: "Virgin Islands, U.S.", value: "VI", disabled: false },
- { name: "Wallis and Futuna", value: "WF", disabled: false },
- { name: "Western Sahara", value: "EH", disabled: false },
- { name: "Yemen", value: "YE", disabled: false },
- { name: "Zambia", value: "ZM", disabled: false },
- { name: "Zimbabwe", value: "ZW", disabled: false },
- ];
- taxRates: TaxRateResponse[];
+ countryList: CountryListItem[] = this.taxService.getCountries();
constructor(
private apiService: ApiService,
private route: ActivatedRoute,
private logService: LogService,
private organizationApiService: OrganizationApiServiceAbstraction,
+ private taxService: TaxServiceAbstraction,
) {}
get country(): string {
- return this.taxFormGroup.get("country").value;
- }
-
- set country(country: string) {
- this.taxFormGroup.get("country").setValue(country);
+ return this.taxFormGroup.controls.country.value;
}
get postalCode(): string {
- return this.taxFormGroup.get("postalCode").value;
- }
-
- set postalCode(postalCode: string) {
- this.taxFormGroup.get("postalCode").setValue(postalCode);
- }
-
- get includeTaxId(): boolean {
- return this.taxFormGroup.get("includeTaxId").value;
- }
-
- set includeTaxId(includeTaxId: boolean) {
- this.taxFormGroup.get("includeTaxId").setValue(includeTaxId);
+ return this.taxFormGroup.controls.postalCode.value;
}
get taxId(): string {
- return this.taxFormGroup.get("taxId").value;
- }
-
- set taxId(taxId: string) {
- this.taxFormGroup.get("taxId").setValue(taxId);
+ return this.taxFormGroup.controls.taxId.value;
}
get line1(): string {
- return this.taxFormGroup.get("line1").value;
- }
-
- set line1(line1: string) {
- this.taxFormGroup.get("line1").setValue(line1);
+ return this.taxFormGroup.controls.line1.value;
}
get line2(): string {
- return this.taxFormGroup.get("line2").value;
- }
-
- set line2(line2: string) {
- this.taxFormGroup.get("line2").setValue(line2);
+ return this.taxFormGroup.controls.line2.value;
}
get city(): string {
- return this.taxFormGroup.get("city").value;
- }
-
- set city(city: string) {
- this.taxFormGroup.get("city").setValue(city);
+ return this.taxFormGroup.controls.city.value;
}
get state(): string {
- return this.taxFormGroup.get("state").value;
+ return this.taxFormGroup.controls.state.value;
}
- set state(state: string) {
- this.taxFormGroup.get("state").setValue(state);
+ get showTaxIdField(): boolean {
+ return !!this.organizationId;
}
async ngOnInit() {
@@ -402,22 +100,13 @@ export class TaxInfoComponent implements OnInit {
try {
const taxInfo = await this.organizationApiService.getTaxInfo(this.organizationId);
if (taxInfo) {
- this.taxId = taxInfo.taxId;
- this.state = taxInfo.state;
- this.line1 = taxInfo.line1;
- this.line2 = taxInfo.line2;
- this.city = taxInfo.city;
- this.state = taxInfo.state;
- this.postalCode = taxInfo.postalCode;
- this.country = taxInfo.country || "US";
- this.includeTaxId =
- this.countrySupportsTax(this.country) &&
- (!!taxInfo.taxId ||
- !!taxInfo.line1 ||
- !!taxInfo.line2 ||
- !!taxInfo.city ||
- !!taxInfo.state);
- this.setTaxInfoObject();
+ this.taxFormGroup.controls.taxId.setValue(taxInfo.taxId);
+ this.taxFormGroup.controls.state.setValue(taxInfo.state);
+ this.taxFormGroup.controls.line1.setValue(taxInfo.line1);
+ this.taxFormGroup.controls.line2.setValue(taxInfo.line2);
+ this.taxFormGroup.controls.city.setValue(taxInfo.city);
+ this.taxFormGroup.controls.postalCode.setValue(taxInfo.postalCode);
+ this.taxFormGroup.controls.country.setValue(taxInfo.country);
}
} catch (e) {
this.logService.error(e);
@@ -426,119 +115,79 @@ export class TaxInfoComponent implements OnInit {
try {
const taxInfo = await this.apiService.getTaxInfo();
if (taxInfo) {
- this.postalCode = taxInfo.postalCode;
- this.country = taxInfo.country || "US";
+ this.taxFormGroup.controls.postalCode.setValue(taxInfo.postalCode);
+ this.taxFormGroup.controls.country.setValue(taxInfo.country);
}
- this.setTaxInfoObject();
} catch (e) {
this.logService.error(e);
}
}
- if (this.country === "US") {
- this.taxFormGroup.get("postalCode").setValidators([Validators.required]);
- this.taxFormGroup.get("postalCode").updateValueAndValidity();
- }
+ this.isTaxSupported = await this.taxService.isCountrySupported(
+ this.taxFormGroup.controls.country.value,
+ );
- if (this.country !== "US") {
- this.onCountryChanged.emit();
- }
+ this.countryChanged.emit();
});
- this.taxFormGroup
- .get("country")
- .valueChanges.pipe(takeUntil(this.destroy$))
+ this.taxFormGroup.controls.country.valueChanges
+ .pipe(debounceTime(1000), takeUntil(this.destroy$))
.subscribe((value) => {
- if (value === "US") {
- this.taxFormGroup.get("postalCode").setValidators([Validators.required]);
- } else {
- this.taxFormGroup.get("postalCode").clearValidators();
- }
- this.taxFormGroup.get("postalCode").updateValueAndValidity();
- this.setTaxInfoObject();
- this.changeCountry();
+ this.taxService
+ .isCountrySupported(this.taxFormGroup.controls.country.value)
+ .then((isSupported) => {
+ this.isTaxSupported = isSupported;
+ })
+ .catch(() => {
+ this.isTaxSupported = false;
+ })
+ .finally(() => {
+ if (!this.isTaxSupported) {
+ this.taxFormGroup.controls.taxId.setValue(null);
+ this.taxFormGroup.controls.line1.setValue(null);
+ this.taxFormGroup.controls.line2.setValue(null);
+ this.taxFormGroup.controls.city.setValue(null);
+ this.taxFormGroup.controls.state.setValue(null);
+ }
+
+ this.countryChanged.emit();
+ });
+ this.taxInformationChanged.emit();
});
- try {
- const taxRates = await this.apiService.getTaxRates();
- if (taxRates) {
- this.taxRates = taxRates.data;
- }
- } catch (e) {
- this.logService.error(e);
- } finally {
- this.loading = false;
- }
+ this.taxFormGroup.controls.postalCode.valueChanges
+ .pipe(debounceTime(1000), takeUntil(this.destroy$))
+ .subscribe(() => {
+ this.taxInformationChanged.emit();
+ });
+
+ this.taxFormGroup.controls.taxId.valueChanges
+ .pipe(debounceTime(1000), takeUntil(this.destroy$))
+ .subscribe(() => {
+ this.taxInformationChanged.emit();
+ });
+
+ this.loading = false;
}
- get taxRate() {
- if (this.taxRates != null) {
- const localTaxRate = this.taxRates.find(
- (x) => x.country === this.country && x.postalCode === this.postalCode,
- );
- return localTaxRate?.rate ?? null;
- }
- }
-
- setTaxInfoObject() {
- this.taxInfo.country = this.country;
- this.taxInfo.postalCode = this.postalCode;
- this.taxInfo.includeTaxId = this.includeTaxId;
- this.taxInfo.taxId = this.taxId;
- this.taxInfo.line1 = this.line1;
- this.taxInfo.line2 = this.line2;
- this.taxInfo.city = this.city;
- this.taxInfo.state = this.state;
- }
-
- get showTaxIdCheckbox() {
- return (
- (this.organizationId || this.providerId) &&
- this.country !== "US" &&
- this.countrySupportsTax(this.taxInfo.country)
- );
- }
-
- get showTaxIdFields() {
- return (
- (this.organizationId || this.providerId) &&
- this.includeTaxId &&
- this.countrySupportsTax(this.country)
- );
- }
-
- getTaxInfoRequest(): TaxInfoUpdateRequest {
- if (this.organizationId || this.providerId) {
- const request = new ExpandedTaxInfoUpdateRequest();
- request.country = this.country;
- request.postalCode = this.postalCode;
-
- if (this.includeTaxId) {
- request.taxId = this.taxId;
- request.line1 = this.line1;
- request.line2 = this.line2;
- request.city = this.city;
- request.state = this.state;
- } else {
- request.taxId = null;
- request.line1 = null;
- request.line2 = null;
- request.city = null;
- request.state = null;
- }
- return request;
- } else {
- const request = new TaxInfoUpdateRequest();
- request.postalCode = this.postalCode;
- request.country = this.country;
- return request;
- }
+ ngOnDestroy() {
+ this.destroy$.next();
+ this.destroy$.complete();
}
submitTaxInfo(): Promise {
this.taxFormGroup.updateValueAndValidity();
this.taxFormGroup.markAllAsTouched();
- const request = this.getTaxInfoRequest();
+
+ const request = new ExpandedTaxInfoUpdateRequest();
+ request.country = this.country;
+ request.postalCode = this.postalCode;
+ request.taxId = this.taxId;
+ request.line1 = this.line1;
+ request.line2 = this.line2;
+ request.city = this.city;
+ request.state = this.state;
+
return this.organizationId
? this.organizationApiService.updateTaxInfo(
this.organizationId,
@@ -546,97 +195,4 @@ export class TaxInfoComponent implements OnInit {
)
: this.apiService.putTaxInfo(request);
}
-
- changeCountry() {
- if (!this.countrySupportsTax(this.country)) {
- this.includeTaxId = false;
- this.taxId = null;
- this.line1 = null;
- this.line2 = null;
- this.city = null;
- this.state = null;
- this.setTaxInfoObject();
- }
- this.onCountryChanged.emit();
- }
-
- countrySupportsTax(countryCode: string) {
- return this.taxSupportedCountryCodes.includes(countryCode);
- }
-
- private taxSupportedCountryCodes: string[] = [
- "CN",
- "FR",
- "DE",
- "CA",
- "GB",
- "AU",
- "IN",
- "AD",
- "AR",
- "AT",
- "BE",
- "BO",
- "BR",
- "BG",
- "CL",
- "CO",
- "CR",
- "HR",
- "CY",
- "CZ",
- "DK",
- "DO",
- "EC",
- "EG",
- "SV",
- "EE",
- "FI",
- "GE",
- "GR",
- "HK",
- "HU",
- "IS",
- "ID",
- "IQ",
- "IE",
- "IL",
- "IT",
- "JP",
- "KE",
- "KR",
- "LV",
- "LI",
- "LT",
- "LU",
- "MY",
- "MT",
- "MX",
- "NL",
- "NZ",
- "NO",
- "PE",
- "PH",
- "PL",
- "PT",
- "RO",
- "RU",
- "SA",
- "RS",
- "SG",
- "SK",
- "SI",
- "ZA",
- "ES",
- "SE",
- "CH",
- "TW",
- "TH",
- "TR",
- "UA",
- "AE",
- "UY",
- "VE",
- "VN",
- ];
}
diff --git a/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts b/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts
index 49c4abe4dc1..287cee510b3 100644
--- a/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts
+++ b/apps/web/src/app/key-management/migrate-encryption/migrate-legacy-encryption.component.ts
@@ -90,7 +90,7 @@ export class MigrateFromLegacyEncryptionComponent {
});
if (deleteFolders) {
- await this.folderApiService.deleteAll();
+ await this.folderApiService.deleteAll(activeUser.id);
await this.syncService.fullSync(true, true);
await this.submit();
return;
diff --git a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component.ts b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component.ts
index d68e3b9d732..b7f99fb7b44 100644
--- a/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component.ts
+++ b/apps/web/src/app/vault/individual-vault/bulk-action-dialogs/bulk-move-dialog/bulk-move-dialog.component.ts
@@ -3,8 +3,9 @@
import { DialogConfig, DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject, OnInit } from "@angular/core";
import { FormBuilder, Validators } from "@angular/forms";
-import { firstValueFrom, Observable } from "rxjs";
+import { firstValueFrom, map, Observable } from "rxjs";
+import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
@@ -47,6 +48,8 @@ export class BulkMoveDialogComponent implements OnInit {
});
folders$: Observable;
+ private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id));
+
constructor(
@Inject(DIALOG_DATA) params: BulkMoveDialogParams,
private dialogRef: DialogRef,
@@ -55,12 +58,14 @@ export class BulkMoveDialogComponent implements OnInit {
private i18nService: I18nService,
private folderService: FolderService,
private formBuilder: FormBuilder,
+ private accountService: AccountService,
) {
this.cipherIds = params.cipherIds ?? [];
}
async ngOnInit() {
- this.folders$ = this.folderService.folderViews$;
+ const activeUserId = await firstValueFrom(this.activeUserId$);
+ this.folders$ = this.folderService.folderViews$(activeUserId);
this.formGroup.patchValue({
folderId: (await firstValueFrom(this.folders$))[0].id,
});
diff --git a/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts b/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts
index 4d181a0510d..88af1ef601b 100644
--- a/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts
+++ b/apps/web/src/app/vault/individual-vault/folder-add-edit.component.ts
@@ -61,7 +61,7 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent {
}
try {
- await this.folderApiService.delete(this.folder.id);
+ await this.folderApiService.delete(this.folder.id, await firstValueFrom(this.activeUserId$));
this.toastService.showToast({
variant: "success",
title: null,
@@ -82,10 +82,10 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent {
}
try {
- const activeAccountId = (await firstValueFrom(this.accountSerivce.activeAccount$)).id;
+ const activeAccountId = await firstValueFrom(this.activeUserId$);
const userKey = await this.keyService.getUserKeyWithLegacySupport(activeAccountId);
const folder = await this.folderService.encrypt(this.folder, userKey);
- this.formPromise = this.folderApiService.save(folder);
+ this.formPromise = this.folderApiService.save(folder, activeAccountId);
await this.formPromise;
this.platformUtilsService.showToast(
"success",
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.spec.ts b/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.spec.ts
index 0386a20adbb..47003d51cae 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.spec.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.spec.ts
@@ -63,7 +63,7 @@ describe("vault filter service", () => {
singleOrgPolicy = new ReplaySubject(1);
organizationService.memberOrganizations$ = organizations;
- folderService.folderViews$ = folderViews;
+ folderService.folderViews$.mockReturnValue(folderViews);
collectionService.decryptedCollections$ = collectionViews;
policyService.policyAppliesToActiveUser$
.calledWith(PolicyType.PersonalOwnership)
@@ -81,6 +81,7 @@ describe("vault filter service", () => {
i18nService,
stateProvider,
collectionService,
+ accountService,
);
collapsedGroupingsState = stateProvider.activeUser.getFake(COLLAPSED_GROUPINGS);
});
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts b/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts
index c4ac3dc2d70..97b44132e60 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/services/vault-filter.service.ts
@@ -21,6 +21,7 @@ import { OrganizationService } from "@bitwarden/common/admin-console/abstraction
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
+import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { ActiveUserState, StateProvider } from "@bitwarden/common/platform/state";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
@@ -45,6 +46,8 @@ const NestingDelimiter = "/";
@Injectable()
export class VaultFilterService implements VaultFilterServiceAbstraction {
+ private activeUserId$ = this.accountService.activeAccount$.pipe(map((a) => a?.id));
+
organizationTree$: Observable> = combineLatest([
this.organizationService.memberOrganizations$,
this.policyService.policyAppliesToActiveUser$(PolicyType.SingleOrg),
@@ -57,8 +60,14 @@ export class VaultFilterService implements VaultFilterServiceAbstraction {
protected _organizationFilter = new BehaviorSubject(null);
- filteredFolders$: Observable = this.folderService.folderViews$.pipe(
- combineLatestWith(this.cipherService.cipherViews$, this._organizationFilter),
+ filteredFolders$: Observable = this.activeUserId$.pipe(
+ switchMap((userId) =>
+ combineLatest([
+ this.folderService.folderViews$(userId),
+ this.cipherService.cipherViews$,
+ this._organizationFilter,
+ ]),
+ ),
switchMap(([folders, ciphers, org]) => {
return this.filterFolders(folders, ciphers, org);
}),
@@ -95,6 +104,7 @@ export class VaultFilterService implements VaultFilterServiceAbstraction {
protected i18nService: I18nService,
protected stateProvider: StateProvider,
protected collectionService: CollectionService,
+ protected accountService: AccountService,
) {}
async getCollectionNodeFromTree(id: string) {
diff --git a/apps/web/src/app/vault/individual-vault/view.component.spec.ts b/apps/web/src/app/vault/individual-vault/view.component.spec.ts
index b26c55d46e8..bde9f564c4a 100644
--- a/apps/web/src/app/vault/individual-vault/view.component.spec.ts
+++ b/apps/web/src/app/vault/individual-vault/view.component.spec.ts
@@ -5,11 +5,14 @@ import { mock } from "jest-mock-extended";
import { CollectionService } from "@bitwarden/admin-console/common";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
+import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service";
+import { mockAccountServiceWith } from "@bitwarden/common/spec";
+import { UserId } from "@bitwarden/common/types/guid";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
@@ -63,6 +66,7 @@ describe("ViewComponent", () => {
useValue: mock(),
},
{ provide: ConfigService, useValue: mock() },
+ { provide: AccountService, useValue: mockAccountServiceWith("UserId" as UserId) },
{
provide: CipherAuthorizationService,
useValue: {
diff --git a/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.service.ts b/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.service.ts
index c4ac9d73df7..e2d713649f5 100644
--- a/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.service.ts
+++ b/apps/web/src/app/vault/org-vault/vault-filter/vault-filter.service.ts
@@ -4,6 +4,7 @@ import { map, Observable, ReplaySubject, Subject } from "rxjs";
import { CollectionAdminView, CollectionService } from "@bitwarden/admin-console/common";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
+import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { StateProvider } from "@bitwarden/common/platform/state";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
@@ -32,6 +33,7 @@ export class VaultFilterService extends BaseVaultFilterService implements OnDest
i18nService: I18nService,
stateProvider: StateProvider,
collectionService: CollectionService,
+ accountService: AccountService,
) {
super(
organizationService,
@@ -41,6 +43,7 @@ export class VaultFilterService extends BaseVaultFilterService implements OnDest
i18nService,
stateProvider,
collectionService,
+ accountService,
);
}
diff --git a/apps/web/src/app/vault/org-vault/vault.component.html b/apps/web/src/app/vault/org-vault/vault.component.html
index 52f3ea026ff..512f97144de 100644
--- a/apps/web/src/app/vault/org-vault/vault.component.html
+++ b/apps/web/src/app/vault/org-vault/vault.component.html
@@ -19,6 +19,18 @@
+
+
+ {{ resellerWarning?.message }}
+
+
(false);
protected currentSearchText$: Observable;
protected freeTrial$: Observable;
+ protected resellerWarning$: Observable;
/**
* A list of collections that the user can assign items to and edit those items within.
* @protected
@@ -203,6 +208,7 @@ export class VaultComponent implements OnInit, OnDestroy {
private destroy$ = new Subject();
protected addAccessStatus$ = new BehaviorSubject(0);
private extensionRefreshEnabled: boolean;
+ private resellerManagedOrgAlert: boolean;
private vaultItemDialogRef?: DialogRef | undefined;
private readonly unpaidSubscriptionDialog$ = this.organizationService.organizations$.pipe(
@@ -259,6 +265,7 @@ export class VaultComponent implements OnInit, OnDestroy {
private trialFlowService: TrialFlowService,
protected billingApiService: BillingApiServiceAbstraction,
private organizationBillingService: OrganizationBillingServiceAbstraction,
+ private resellerWarningService: ResellerWarningService,
) {}
async ngOnInit() {
@@ -266,6 +273,10 @@ export class VaultComponent implements OnInit, OnDestroy {
FeatureFlag.ExtensionRefresh,
);
+ this.resellerManagedOrgAlert = await this.configService.getFeatureFlag(
+ FeatureFlag.ResellerManagedOrgAlert,
+ );
+
this.trashCleanupWarning = this.i18nService.t(
this.platformUtilsService.isSelfHost()
? "trashCleanupWarningSelfHosted"
@@ -612,6 +623,16 @@ export class VaultComponent implements OnInit, OnDestroy {
}),
);
+ this.resellerWarning$ = organization$.pipe(
+ filter((org) => org.isOwner && this.resellerManagedOrgAlert),
+ switchMap((org) =>
+ from(this.billingApiService.getOrganizationBillingMetadata(org.id)).pipe(
+ map((metadata) => ({ org, metadata })),
+ ),
+ ),
+ map(({ org, metadata }) => this.resellerWarningService.getWarning(org, metadata)),
+ );
+
firstSetup$
.pipe(
switchMap(() => this.refresh$),
diff --git a/apps/web/src/locales/af/messages.json b/apps/web/src/locales/af/messages.json
index 2e8c1fdea10..f86b6ab497b 100644
--- a/apps/web/src/locales/af/messages.json
+++ b/apps/web/src/locales/af/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/ar/messages.json b/apps/web/src/locales/ar/messages.json
index 91a223bc83f..ed843a62cd1 100644
--- a/apps/web/src/locales/ar/messages.json
+++ b/apps/web/src/locales/ar/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/az/messages.json b/apps/web/src/locales/az/messages.json
index 1b3685420ce..b8111a0e997 100644
--- a/apps/web/src/locales/az/messages.json
+++ b/apps/web/src/locales/az/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Güncəlllənən vergi məlumatı"
},
+ "billingInvalidTaxIdError": {
+ "message": "Yararsız vergi kimliyi, bunun xəta olduğunu düşünürsünüzsə, dəstək komandası ilə əlaqə saxlayın."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Vergi kimliyi nömrənizi doğrulaya bilmədik, bunun xəta olduğunu düşünürsünüzsə, dəstək komandası ilə əlaqə saxlayın."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Yararsız vergi kimliyi, bunun xəta olduğunu düşünürsünüzsə, dəstək komandası ilə əlaqə saxlayın."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "Faktura önizləməsi zamanı bir xəta baş verdi. Lütfən daha sonra yenidən sınayın."
+ },
"unverified": {
"message": "Doğrulanmayıb"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Təşkilat adı 50 xarakterdən çox ola bilməz."
+ },
+ "resellerRenewalWarning": {
+ "message": "Abunəliyiniz tezliklə yenilənəcək. Kəsintisiz xidməti təmin etmək və yeniləməni $RENEWAL_DATE$ tarixindən əvvəl təsdiqləmək üçün $RESELLER$ ilə əlaqə saxlayın.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Abunəliyinizə aid faktura $ISSUED_DATE$ tarixində təqdim edildi. Kəsintisiz xidməti təmin etmək və yeniləməni $DUE_DATE$ tarixindən əvvəl təsdiqləmək üçün $RESELLER$ ilə əlaqə saxlayın.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Abunəliyinizə aid faktura üzrə ödəniş edilmədi. Kəsintisiz xidməti təmin etmək və yeniləməni $GRACE_PERIOD_END$ tarixindən əvvəl təsdiqləmək üçün $RESELLER$ ilə əlaqə saxlayın.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/be/messages.json b/apps/web/src/locales/be/messages.json
index 335dcbbe650..ea705b38b4e 100644
--- a/apps/web/src/locales/be/messages.json
+++ b/apps/web/src/locales/be/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/bg/messages.json b/apps/web/src/locales/bg/messages.json
index 4a0f650bd3f..1f5fb8d8c7e 100644
--- a/apps/web/src/locales/bg/messages.json
+++ b/apps/web/src/locales/bg/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Обновена данъчна информация"
},
+ "billingInvalidTaxIdError": {
+ "message": "Неправилен данъчен идентификатор. Ако смятате, че това е грешка, свържете се с поддръжката."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Не успяхме да потвърдим Вашия данъчен идентификатор. Ако смятате, че това е грешка, свържете се с поддръжката."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Неправилен данъчен идентификатор. Ако смятате, че това е грешка, свържете се с поддръжката."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "Възникна грешка при преглеждането на фактурата. Опитайте отново по-късно."
+ },
"unverified": {
"message": "Непотвърден"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Името на организацията не може да бъде по-дълго от 50 знака."
+ },
+ "resellerRenewalWarning": {
+ "message": "Вашият абонамент ще бъде подновен скоро. За да подсигурите, че услугата няма да има прекъсвания, свържете се с $RESELLER$ и потвърдете подновяването преди $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Фактура за абонамента Ви беше издадена на $ISSUED_DATE$. За да подсигурите, че услугата няма да има прекъсвания, свържете се с $RESELLER$ и потвърдете подновяването преди $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Фактурата за абонамента Ви не е била платена. За да подсигурите, че услугата няма да има прекъсвания, свържете се с $RESELLER$ и потвърдете подновяването преди $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/bn/messages.json b/apps/web/src/locales/bn/messages.json
index 3860a66b925..56a04f3d870 100644
--- a/apps/web/src/locales/bn/messages.json
+++ b/apps/web/src/locales/bn/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/bs/messages.json b/apps/web/src/locales/bs/messages.json
index 1604eb20677..3e9c4525b04 100644
--- a/apps/web/src/locales/bs/messages.json
+++ b/apps/web/src/locales/bs/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/ca/messages.json b/apps/web/src/locales/ca/messages.json
index 38684e8aefa..1cf16dcc0fd 100644
--- a/apps/web/src/locales/ca/messages.json
+++ b/apps/web/src/locales/ca/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/cs/messages.json b/apps/web/src/locales/cs/messages.json
index 0fdac8e60f3..64ce764de82 100644
--- a/apps/web/src/locales/cs/messages.json
+++ b/apps/web/src/locales/cs/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Aktualizované daňové údaje"
},
+ "billingInvalidTaxIdError": {
+ "message": "Neplatné DIČ. Pokud se domníváte, že se jedná o chybu, kontaktujte podporu."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Nebyli jsme schopni ověřit Vaše DIČ. Pokud se domníváte, že se jedná o chybu, kontaktujte podporu."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Neplatné DIČ. Pokud se domníváte, že se jedná o chybu, kontaktujte podporu."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "Při náhledu faktury došlo k chybě. Opakujte akci později."
+ },
"unverified": {
"message": "Neověřeno"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Název organizace nesmí přesáhnout 50 znaků."
+ },
+ "resellerRenewalWarning": {
+ "message": "Vaše předplatné se brzy obnoví. Chcete-li zajistit nepřerušenou službu, kontaktujte $RESELLER$ pro potvrzení obnovení před $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Faktura pro Vaše předplatné byla vystavena dne $ISSUED_DATE$. Chcete-li zajistit nepřerušovanou službu, kontaktujte $RESELLER$ pro potvrzení obnovení před $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Faktura za Vaše předplatné nebyla zaplacena. Chcete-li zajistit nepřerušovanou službu, kontaktujte $RESELLER$ pro potvrzení obnovení před $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/cy/messages.json b/apps/web/src/locales/cy/messages.json
index c774497eae2..c0c39c91d30 100644
--- a/apps/web/src/locales/cy/messages.json
+++ b/apps/web/src/locales/cy/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/da/messages.json b/apps/web/src/locales/da/messages.json
index 86bb1145217..f71e1feeb3b 100644
--- a/apps/web/src/locales/da/messages.json
+++ b/apps/web/src/locales/da/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Opdaterede momsoplysninger"
},
+ "billingInvalidTaxIdError": {
+ "message": "Ugyldigt moms-ID. Mener man, at dette er en fejl, kontakt venligst supporten."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Moms-ID kan ikke bekræftes. Mener man, at dette er en fejl, kontakt venligst supporten."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Ugyldigt moms-ID. Mener man, at dette er en fejl, kontakt venligst supporten."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "En fejl opstod under forhåndsvisning af fakturaen. Forsøg igen senere."
+ },
"unverified": {
"message": "Ubekræftet"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organisationsnavn må ikke overstige 50 tegn."
+ },
+ "resellerRenewalWarning": {
+ "message": "Abonnementet fornyes snart. For at sikre uafbrudt tjeneste, kontakt $RESELLER$ for at bekræfte fornyelsen inden $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "En faktura for abonnementet er udstedt pr. $ISSUED_DATE$. For at sikre uafbrudt tjeneste, kontakt $RESELLER$ for at bekræfte fornyelsen inden $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Fakturaen for abonnementet er ikke blevet betalt. For at sikre uafbrudt tjeneste, kontakt $RESELLER$ for at bekræfte fornyelsen inden $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/de/messages.json b/apps/web/src/locales/de/messages.json
index 4ed75be054f..93422471457 100644
--- a/apps/web/src/locales/de/messages.json
+++ b/apps/web/src/locales/de/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Steuerinformationen aktualisiert"
},
+ "billingInvalidTaxIdError": {
+ "message": "Ungültige Steuer-ID. Wenn du glaubst, dass dies ein Fehler ist, wende dich bitte an den Support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Wir konnten deine Steuer-ID nicht überprüfen. Wenn du glaubst, dass dies ein Fehler ist, kontaktiere bitte den Support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Ungültige Steuer-ID. Wenn du glaubst, dass dies ein Fehler ist, wende dich bitte an den Support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "Bei der Vorschau der Rechnung ist ein Fehler aufgetreten. Bitte versuche es später erneut."
+ },
"unverified": {
"message": "Nicht verifiziert"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Der Name der Organisation darf 50 Zeichen nicht überschreiten."
+ },
+ "resellerRenewalWarning": {
+ "message": "Dein Abonnement wird bald verlängert. Um einen ununterbrochenen Betrieb zu gewährleisten, kontaktiere $RESELLER$ um deine Verlängerung vor dem $RENEWAL_DATE$ zu bestätigen.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Eine Rechnung für dein Abonnement wurde am $ISSUED_DATE$ ausgestellt. Um einen ununterbrochenen Betrieb zu gewährleisten, kontaktiere $RESELLER$, um deine Verlängerung vor dem $DUE_DATE$ zu bestätigen.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Die Rechnung für dein Abonnement wurde nicht bezahlt. Um einen ununterbrochenen Betrieb zu gewährleisten, kontaktiere $RESELLER$, um deine Verlängerung vor dem $GRACE_PERIOD_END$ zu bestätigen.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/el/messages.json b/apps/web/src/locales/el/messages.json
index 50a327b1fa1..42d24fae72d 100644
--- a/apps/web/src/locales/el/messages.json
+++ b/apps/web/src/locales/el/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Τα φορολογικά στοιχεία ενημερώθηκαν"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index acbb348048c..08e08ccad15 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -9275,6 +9275,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10011,5 +10023,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/en_GB/messages.json b/apps/web/src/locales/en_GB/messages.json
index 3da937ec266..f37aa8150cf 100644
--- a/apps/web/src/locales/en_GB/messages.json
+++ b/apps/web/src/locales/en_GB/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organisation name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/en_IN/messages.json b/apps/web/src/locales/en_IN/messages.json
index dd507896e56..ec67bb192c9 100644
--- a/apps/web/src/locales/en_IN/messages.json
+++ b/apps/web/src/locales/en_IN/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid Aadhaar ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your Aadhaar ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid Aadhaar ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organisation name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To ensure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/eo/messages.json b/apps/web/src/locales/eo/messages.json
index 06225dba76f..0170c225c03 100644
--- a/apps/web/src/locales/eo/messages.json
+++ b/apps/web/src/locales/eo/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/es/messages.json b/apps/web/src/locales/es/messages.json
index f2548036c2a..3c3d7bb135d 100644
--- a/apps/web/src/locales/es/messages.json
+++ b/apps/web/src/locales/es/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/et/messages.json b/apps/web/src/locales/et/messages.json
index 21096b3f710..700c748add8 100644
--- a/apps/web/src/locales/et/messages.json
+++ b/apps/web/src/locales/et/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/eu/messages.json b/apps/web/src/locales/eu/messages.json
index 19de255284b..4c7719ada13 100644
--- a/apps/web/src/locales/eu/messages.json
+++ b/apps/web/src/locales/eu/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/fa/messages.json b/apps/web/src/locales/fa/messages.json
index bb422bf70ae..fe0ba063a7b 100644
--- a/apps/web/src/locales/fa/messages.json
+++ b/apps/web/src/locales/fa/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/fi/messages.json b/apps/web/src/locales/fi/messages.json
index a5d576d349d..234cfb0ee3e 100644
--- a/apps/web/src/locales/fi/messages.json
+++ b/apps/web/src/locales/fi/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Verotiedot muutettiin"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Vahvistamaton"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/fil/messages.json b/apps/web/src/locales/fil/messages.json
index 6257f2b5eaf..f5a9b078984 100644
--- a/apps/web/src/locales/fil/messages.json
+++ b/apps/web/src/locales/fil/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/fr/messages.json b/apps/web/src/locales/fr/messages.json
index c9f87b19267..e6c402293f8 100644
--- a/apps/web/src/locales/fr/messages.json
+++ b/apps/web/src/locales/fr/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Informations sur les taxes mises à jour"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Non vérifié"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Le nom de l'organisation ne doit pas dépasser 50 caractères."
+ },
+ "resellerRenewalWarning": {
+ "message": "Votre abonnement sera renouvelé bientôt. Pour assurer un service sans interruption, contactez $RESELLER$ pour confirmer votre renouvellement avant $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Une facture pour votre abonnement a été émise sur $ISSUED_DATE$. Pour assurer un service sans interruption, contactez $RESELLER$ pour confirmer votre renouvellement avant $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "La facture de votre abonnement n'a pas été payée. Pour assurer un service sans interruption, contactez $RESELLER$ pour confirmer votre renouvellement avant $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/gl/messages.json b/apps/web/src/locales/gl/messages.json
index 7fd7be8395d..986350b0637 100644
--- a/apps/web/src/locales/gl/messages.json
+++ b/apps/web/src/locales/gl/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/he/messages.json b/apps/web/src/locales/he/messages.json
index 32e51d6a037..9c4ef530721 100644
--- a/apps/web/src/locales/he/messages.json
+++ b/apps/web/src/locales/he/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/hi/messages.json b/apps/web/src/locales/hi/messages.json
index 3f2bd5897e6..82a0c12a390 100644
--- a/apps/web/src/locales/hi/messages.json
+++ b/apps/web/src/locales/hi/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/hr/messages.json b/apps/web/src/locales/hr/messages.json
index 5a397cd4b14..7b77ae9d58f 100644
--- a/apps/web/src/locales/hr/messages.json
+++ b/apps/web/src/locales/hr/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Ažurirane porezne informacije"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Nepotvrđeno"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Naziv organizacije ne može biti duži od 50 znakova."
+ },
+ "resellerRenewalWarning": {
+ "message": "Tvoja će se pretplata uskoro obnoviti. Za neprekinutu uslugu, kontaktiraj $RESELLER$ za potvrdu obnove prije $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Za tvoju je pretplatu $ISSUED_DATE$ izdana faktura. Za neprekinutu uslugu, kontaktiraj $RESELLER$ za potvrdu obnove prije $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Faktura za tvoju pretplatu nije plaćena. Za neprekinutu uslugu, kontaktiraj $RESELLER$ za potvrdu obnovu prije $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/hu/messages.json b/apps/web/src/locales/hu/messages.json
index 682f080fb87..ecd7db04ca1 100644
--- a/apps/web/src/locales/hu/messages.json
+++ b/apps/web/src/locales/hu/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Frissített adó információ"
},
+ "billingInvalidTaxIdError": {
+ "message": "Érvénytelen az adóazonosító. Ha úgy gondoljuk, hogy ez hiba, forduljunk az ügyfélszolgálathoz."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Nem lehetett ellenőrizni az adóazonosítót. Ha úgy gondoljuk, hogy ez hiba, forduljunk az ügyfélszolgálathoz."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Érvénytelen az adóazonosító. Ha úgy gondoljuk, hogy ez hiba, forduljunk az ügyfélszolgálathoz."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "Hiba történt a számla előnézete közben. Próbáljuk újra később."
+ },
"unverified": {
"message": "Nem ellenőrzött"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "A szervezet neve nem haladhatja meg az 50 karaktert."
+ },
+ "resellerRenewalWarning": {
+ "message": "Az előfizetés hamarosan megújul. A folyamatos szolgáltatás biztosítása érdekében lépjünk kapcsolatba $RESELLER$ viszonteladóval és erősítsük meg a megújítást $RENEWAL_DATE$ előtt.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Az előfizetésről szóló számla kiállítása $ISSUED_DATE$ napon történt. A megszakítás nélküli szolgáltatás biztosítása érdekében lépjünk kapcsolatba $RESELLER$ viszonteladóval és erősítsük meg a megújítást $DUE_DATE$ előtt.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Az előfizetésről szóló számla nem lett kfizetve. A folyamatos szolgáltatás biztosítása érdekében lépjünk kapcsolatba $RESELLER$ viszonteladóval és erősítsük meg a megújítást $GRACE_PERIOD_END$ előtt.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/id/messages.json b/apps/web/src/locales/id/messages.json
index 877a6b21261..7517cac5ae5 100644
--- a/apps/web/src/locales/id/messages.json
+++ b/apps/web/src/locales/id/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/it/messages.json b/apps/web/src/locales/it/messages.json
index 36bcc07a023..0154a3c8c78 100644
--- a/apps/web/src/locales/it/messages.json
+++ b/apps/web/src/locales/it/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Informazioni fiscali aggiornate"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Non verificato"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/ja/messages.json b/apps/web/src/locales/ja/messages.json
index 343818e3ad4..6b3b6f13b46 100644
--- a/apps/web/src/locales/ja/messages.json
+++ b/apps/web/src/locales/ja/messages.json
@@ -3,22 +3,22 @@
"message": "すべてのアプリ"
},
"criticalApplications": {
- "message": "Critical applications"
+ "message": "きわめて重要なアプリ"
},
"accessIntelligence": {
- "message": "Access Intelligence"
+ "message": "アクセス インテリジェンス"
},
"riskInsights": {
- "message": "Risk Insights"
+ "message": "リスク分析"
},
"passwordRisk": {
- "message": "Password Risk"
+ "message": "パスワードのリスク"
},
"reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "message": "危険なパスワード(強度が低い、流出済み、再利用)を、アプリをまたいで調査します。特に重要なアプリを選択して、危険なパスワードに優先対応するようユーザーに促しましょう。"
},
"dataLastUpdated": {
- "message": "Data last updated: $DATE$",
+ "message": "データの最終更新: $DATE$",
"placeholders": {
"date": {
"content": "$1",
@@ -33,10 +33,10 @@
"message": "メンバーを削除"
},
"restoreMembers": {
- "message": "Restore members"
+ "message": "メンバーを復元"
},
"cannotRestoreAccessError": {
- "message": "Cannot restore organization access"
+ "message": "組織へのアクセスを復元できません"
},
"allApplicationsWithCount": {
"message": "すべてのアプリ ($COUNT$)",
@@ -48,10 +48,10 @@
}
},
"createNewLoginItem": {
- "message": "Create new login item"
+ "message": "新しいログインアイテムを作成"
},
"criticalApplicationsWithCount": {
- "message": "Critical applications ($COUNT$)",
+ "message": "特に重要なアプリ ($COUNT$)",
"placeholders": {
"count": {
"content": "$1",
@@ -69,7 +69,7 @@
}
},
"noAppsInOrgTitle": {
- "message": "No applications found in $ORG NAME$",
+ "message": "$ORG NAME$ にアプリが見つかりませんでした",
"placeholders": {
"org name": {
"content": "$1",
@@ -78,22 +78,22 @@
}
},
"noAppsInOrgDescription": {
- "message": "As users save logins, applications appear here, showing any at-risk passwords. Mark critical apps and notify users to update passwords."
+ "message": "ユーザーがログイン情報を保存すると、アプリがここに表示され、リスクの高いパスワードがあれば表示されます。特に重要なアプリはマークして、パスワードを更新するようにユーザーに通知しましょう。"
},
"noCriticalAppsTitle": {
- "message": "You haven't marked any applications as a Critical"
+ "message": "重要なアプリとしてマークしたものがありません"
},
"noCriticalAppsDescription": {
- "message": "Select your most critical applications to discover at-risk passwords, and notify users to change those passwords."
+ "message": "特に重要なアプリケーションを選択して、危険なパスワードを発見し、ユーザーにパスワードを変更するよう通知しましょう。"
},
"markCriticalApps": {
- "message": "Mark critical apps"
+ "message": "重要なアプリをマークする"
},
"markAppAsCritical": {
- "message": "Mark app as critical"
+ "message": "重要なアプリとしてマーク"
},
"appsMarkedAsCritical": {
- "message": "Apps marked as critical"
+ "message": "重要なアプリとしてマークされました"
},
"application": {
"message": "アプリ"
@@ -102,13 +102,13 @@
"message": "リスクがあるパスワード"
},
"requestPasswordChange": {
- "message": "Request password change"
+ "message": "パスワードの変更を要求する"
},
"totalPasswords": {
"message": "合計パスワード数"
},
"searchApps": {
- "message": "Search applications"
+ "message": "アプリを検索"
},
"atRiskMembers": {
"message": "リスクがあるメンバー"
@@ -469,7 +469,7 @@
"message": "パスワードの自動生成"
},
"generatePassphrase": {
- "message": "Generate passphrase"
+ "message": "パスフレーズを生成"
},
"checkPassword": {
"message": "パスワードが漏洩していないか確認する"
@@ -572,7 +572,7 @@
"message": "セキュアメモ"
},
"typeSshKey": {
- "message": "SSH key"
+ "message": "SSH 鍵"
},
"typeLoginPlural": {
"message": "ログイン"
@@ -733,11 +733,11 @@
"description": "Copy password to clipboard"
},
"copyPassphrase": {
- "message": "Copy passphrase",
+ "message": "パスフレーズをコピー",
"description": "Copy passphrase to clipboard"
},
"passwordCopied": {
- "message": "Password copied"
+ "message": "パスワードをコピーしました"
},
"copyUsername": {
"message": "ユーザー名のコピー",
@@ -994,7 +994,7 @@
"message": "Bitwarden アプリで「デバイスでログイン」の設定をする必要があります。別のオプションが必要ですか?"
},
"needAnotherOptionV1": {
- "message": "Need another option?"
+ "message": "別の選択肢が必要ですか?"
},
"loginWithMasterPassword": {
"message": "マスターパスワードでログイン"
@@ -1009,13 +1009,13 @@
"message": "別のログイン方法を使用する"
},
"logInWithPasskey": {
- "message": "Log in with passkey"
+ "message": "パスキーでログイン"
},
"useSingleSignOn": {
- "message": "Use single sign-on"
+ "message": "シングルサインオンを使用する"
},
"welcomeBack": {
- "message": "Welcome back"
+ "message": "ようこそ"
},
"invalidPasskeyPleaseTryAgain": {
"message": "無効なパスキーです。もう一度やり直してください。"
@@ -1099,7 +1099,7 @@
"message": "アカウントの作成"
},
"newToBitwarden": {
- "message": "New to Bitwarden?"
+ "message": "Bitwarden は初めてですか?"
},
"setAStrongPassword": {
"message": "強力なパスワードを設定する"
@@ -1117,13 +1117,13 @@
"message": "ログイン"
},
"logInToBitwarden": {
- "message": "Log in to Bitwarden"
+ "message": "Bitwarden にログイン"
},
"authenticationTimeout": {
- "message": "Authentication timeout"
+ "message": "認証のタイムアウト"
},
"authenticationSessionTimedOut": {
- "message": "The authentication session timed out. Please restart the login process."
+ "message": "認証セッションの有効期限が切れました。ログイン操作を最初からやり直してください。"
},
"verifyIdentity": {
"message": "本人確認"
@@ -1294,7 +1294,7 @@
"message": "このコレクション内のアイテムをすべて表示する権限がありません。"
},
"youDoNotHavePermissions": {
- "message": "You do not have permissions to this collection"
+ "message": "このコレクションの利用権限がありません"
},
"noCollectionsInList": {
"message": "表示するコレクションがありません"
@@ -1321,10 +1321,10 @@
"message": "デバイスに通知を送信しました。"
},
"aNotificationWasSentToYourDevice": {
- "message": "A notification was sent to your device"
+ "message": "お使いのデバイスに通知が送信されました"
},
"makeSureYourAccountIsUnlockedAndTheFingerprintEtc": {
- "message": "Make sure your account is unlocked and the fingerprint phrase matches on the other device"
+ "message": "アカウントがロック解除されていることと、フィンガープリントフレーズが他の端末と一致していることを確認してください"
},
"versionNumber": {
"message": "バージョン $VERSION_NUMBER$",
@@ -1658,25 +1658,25 @@
"message": "パスワードの履歴"
},
"generatorHistory": {
- "message": "Generator history"
+ "message": "生成履歴"
},
"clearGeneratorHistoryTitle": {
- "message": "Clear generator history"
+ "message": "生成履歴を消去"
},
"cleargGeneratorHistoryDescription": {
- "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?"
+ "message": "続行すると、すべてのエントリは生成履歴から完全に削除されます。続行してもよろしいですか?"
},
"noPasswordsInList": {
"message": "表示するパスワードがありません"
},
"clearHistory": {
- "message": "Clear history"
+ "message": "履歴を消去"
},
"nothingToShow": {
- "message": "Nothing to show"
+ "message": "表示するものがありません"
},
"nothingGeneratedRecently": {
- "message": "You haven't generated anything recently"
+ "message": "最近生成したものはありません"
},
"clear": {
"message": "消去する",
@@ -1786,7 +1786,7 @@
"message": "これらの操作はやり直せないため注意してください!"
},
"dangerZoneDescSingular": {
- "message": "Careful, this action is not reversible!"
+ "message": "この操作は元に戻せないため注意してください!"
},
"deauthorizeSessions": {
"message": "セッションの承認を取り消す"
@@ -1801,7 +1801,7 @@
"message": "全てのセッションを無効化"
},
"accountIsOwnedMessage": {
- "message": "This account is owned by $ORGANIZATIONNAME$",
+ "message": "このアカウントは $ORGANIZATIONNAME$ が所有しています",
"placeholders": {
"organizationName": {
"content": "$1",
@@ -3430,7 +3430,7 @@
}
},
"viewAllLogInOptions": {
- "message": "View all log in options"
+ "message": "すべてのログインオプションを表示"
},
"viewAllLoginOptions": {
"message": "すべてのログインオプションを表示"
@@ -3883,13 +3883,13 @@
"message": "ブラウザを更新"
},
"generatingRiskInsights": {
- "message": "Generating your risk insights..."
+ "message": "リスク分析を生成しています..."
},
"updateBrowserDesc": {
"message": "サポートされていないブラウザを使用しています。ウェブ保管庫が正しく動作しないかもしれません。"
},
"freeTrialEndPromptCount": {
- "message": "Your free trial ends in $COUNT$ days.",
+ "message": "無料体験はあと $COUNT$ 日で終了します。",
"placeholders": {
"count": {
"content": "$1",
@@ -3898,7 +3898,7 @@
}
},
"freeTrialEndPromptMultipleDays": {
- "message": "$ORGANIZATION$, your free trial ends in $COUNT$ days.",
+ "message": "$ORGANIZATION$ 様、無料体験はあと $COUNT$ 日で終了します。",
"placeholders": {
"count": {
"content": "$2",
@@ -3911,7 +3911,7 @@
}
},
"freeTrialEndPromptTomorrow": {
- "message": "$ORGANIZATION$, your free trial ends tomorrow.",
+ "message": "$ORGANIZATION$ 様、無料体験は明日で終了します。",
"placeholders": {
"organization": {
"content": "$1",
@@ -3920,10 +3920,10 @@
}
},
"freeTrialEndPromptTomorrowNoOrgName": {
- "message": "Your free trial ends tomorrow."
+ "message": "無料体験は明日終了します。"
},
"freeTrialEndPromptToday": {
- "message": "$ORGANIZATION$, your free trial ends today.",
+ "message": "$ORGANIZATION$ 様、無料体験は本日終了します。",
"placeholders": {
"organization": {
"content": "$1",
@@ -3932,16 +3932,16 @@
}
},
"freeTrialEndingTodayWithoutOrgName": {
- "message": "Your free trial ends today."
+ "message": "無料体験は本日で終了します。"
},
"clickHereToAddPaymentMethod": {
- "message": "Click here to add a payment method."
+ "message": "支払い方法を追加するにはここをクリックしてください。"
},
"joinOrganization": {
"message": "組織に参加"
},
"joinOrganizationName": {
- "message": "Join $ORGANIZATIONNAME$",
+ "message": "$ORGANIZATIONNAME$ に参加",
"placeholders": {
"organizationName": {
"content": "$1",
@@ -4492,7 +4492,7 @@
"description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
},
"youWillBeNotifiedOnceTheRequestIsApproved": {
- "message": "You will be notified once the request is approved"
+ "message": "リクエストが承認されると通知されます"
},
"free": {
"message": "無料",
@@ -4725,10 +4725,10 @@
"message": "組織のシングルサインオンポータルを使用してログインします。開始するには組織の識別子を入力してください。"
},
"singleSignOnEnterOrgIdentifier": {
- "message": "Enter your organization's SSO identifier to begin"
+ "message": "組織の SSO ID を入力して開始します"
},
"singleSignOnEnterOrgIdentifierText": {
- "message": "To log in with your SSO provider, enter your organization's SSO identifier to begin. You may need to enter this SSO identifier when you log in from a new device."
+ "message": "SSO プロバイダーでログインするには、組織の SSO ID を入力して開始します。新しいデバイスからログインする際に、この SSO ID を入力する必要がある場合があります。"
},
"enterpriseSingleSignOn": {
"message": "組織のシングルサインオン"
@@ -4798,7 +4798,7 @@
"message": "ユーザーが他の組織に参加できないように制限します。"
},
"singleOrgPolicyDesc": {
- "message": "Restrict members from joining other organizations. This policy is required for organizations that have enabled domain verification."
+ "message": "メンバーに対し、他の組織への参加を制限します。ドメイン認証を有効にしている組織では、このポリシーは必須となります。"
},
"singleOrgBlockCreateMessage": {
"message": "現在の組織には、複数の組織に参加することを許可していないポリシーがあります。 組織の管理者に連絡するか、別の Bitwarden アカウントから登録してください。"
@@ -4807,7 +4807,7 @@
"message": "オーナーまたは管理者でなく、すでに他の組織のメンバーであるメンバーは組織から削除されます。"
},
"singleOrgPolicyMemberWarning": {
- "message": "Non-compliant members will be placed in revoked status until they leave all other organizations. Administrators are exempt and can restore members once compliance is met."
+ "message": "ポリシーに準拠していないメンバーは、他のすべての組織から退出するまで失効状態になります。これは管理者には適用されず、管理者はコンプライアンスが満たされたメンバーを復元できます。"
},
"requireSso": {
"message": "シングルサインオン認証"
@@ -5635,10 +5635,10 @@
"message": "除外します。このアクションには適用されません。"
},
"nonCompliantMembersTitle": {
- "message": "Non-compliant members"
+ "message": "非準拠のメンバー"
},
"nonCompliantMembersError": {
- "message": "Members that are non-compliant with the Single organization or Two-step login policy cannot be restored until they adhere to the policy requirements"
+ "message": "単一組織ポリシーまたは2段階ログインポリシーに準拠していないメンバーは、ポリシー要件を遵守するまで復元できません。"
},
"fingerprint": {
"message": "指紋"
@@ -6437,7 +6437,7 @@
"message": "エンティティ ID が URL でない場合は必須です。"
},
"offerNoLongerValid": {
- "message": "This offer is no longer valid. Contact your organization administrators for more information."
+ "message": "このオファーは無効になりました。詳しくは組織の管理者にお問い合わせください。"
},
"openIdOptionalCustomizations": {
"message": "オプションのカスタマイズ"
@@ -6529,10 +6529,10 @@
"message": "ユーザー名を生成"
},
"generateEmail": {
- "message": "Generate email"
+ "message": "メールアドレスを生成"
},
"spinboxBoundariesHint": {
- "message": "Value must be between $MIN$ and $MAX$.",
+ "message": "値は $MIN$ から $MAX$ の間でなければなりません。",
"description": "Explains spin box minimum and maximum values to the user",
"placeholders": {
"min": {
@@ -6546,7 +6546,7 @@
}
},
"passwordLengthRecommendationHint": {
- "message": " Use $RECOMMENDED$ characters or more to generate a strong password.",
+ "message": " 強力なパスワードを生成するには、 $RECOMMENDED$ 文字以上を使用してください。",
"description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).",
"placeholders": {
"recommended": {
@@ -6556,7 +6556,7 @@
}
},
"passphraseNumWordsRecommendationHint": {
- "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.",
+ "message": " 強力なパスフレーズを生成するには、 $RECOMMENDED$ 単語以上を使用してください。",
"description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).",
"placeholders": {
"recommended": {
@@ -6671,11 +6671,11 @@
"message": "外部転送サービスを使用してメールエイリアスを生成します。"
},
"forwarderDomainName": {
- "message": "Email domain",
+ "message": "メールアドレスのドメイン",
"description": "Labels the domain name email forwarder service option"
},
"forwarderDomainNameHint": {
- "message": "Choose a domain that is supported by the selected service",
+ "message": "選択したサービスでサポートされているドメインを選択してください",
"description": "Guidance provided for email forwarding services that support multiple email domains."
},
"forwarderError": {
@@ -8101,16 +8101,16 @@
"message": "ログイン開始"
},
"rememberThisDeviceToMakeFutureLoginsSeamless": {
- "message": "Remember this device to make future logins seamless"
+ "message": "このデバイスを記憶して今後のログインをシームレスにする"
},
"deviceApprovalRequired": {
"message": "デバイスの承認が必要です。以下から承認オプションを選択してください:"
},
"deviceApprovalRequiredV2": {
- "message": "Device approval required"
+ "message": "デバイスの承認が必要です"
},
"selectAnApprovalOptionBelow": {
- "message": "Select an approval option below"
+ "message": "以下の承認オプションを選択してください"
},
"rememberThisDevice": {
"message": "このデバイスを記憶する"
@@ -8342,7 +8342,7 @@
"message": "ユーザーのメールアドレスがありません"
},
"activeUserEmailNotFoundLoggingYouOut": {
- "message": "Active user email not found. Logging you out."
+ "message": "アクティブなユーザーメールアドレスが見つかりません。ログアウトします。"
},
"deviceTrusted": {
"message": "信頼されたデバイス"
@@ -8440,10 +8440,10 @@
"message": "組織のコレクションに関する挙動を管理します"
},
"limitCollectionCreationDesc": {
- "message": "Limit collection creation to owners and admins"
+ "message": "コレクションの作成を所有者と管理者のみに制限"
},
"limitCollectionDeletionDesc": {
- "message": "Limit collection deletion to owners and admins"
+ "message": "コレクションの削除を所有者と管理者のみに制限"
},
"allowAdminAccessToAllCollectionItemsDesc": {
"message": "所有者と管理者はすべてのコレクションとアイテムを管理できます"
@@ -8491,7 +8491,7 @@
"message": "サーバー URL"
},
"selfHostBaseUrl": {
- "message": "Self-host server URL",
+ "message": "自己ホスト型サーバー URL",
"description": "Label for field requesting a self-hosted integration service URL"
},
"aliasDomain": {
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "更新された税情報"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "未認証"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/ka/messages.json b/apps/web/src/locales/ka/messages.json
index 2a61cd89766..cc4dc222103 100644
--- a/apps/web/src/locales/ka/messages.json
+++ b/apps/web/src/locales/ka/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/km/messages.json b/apps/web/src/locales/km/messages.json
index c5a77826c9e..36ab0050700 100644
--- a/apps/web/src/locales/km/messages.json
+++ b/apps/web/src/locales/km/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/kn/messages.json b/apps/web/src/locales/kn/messages.json
index ec7241be790..e1fd4cc9ac9 100644
--- a/apps/web/src/locales/kn/messages.json
+++ b/apps/web/src/locales/kn/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/ko/messages.json b/apps/web/src/locales/ko/messages.json
index 59c0e15ee33..7966191f530 100644
--- a/apps/web/src/locales/ko/messages.json
+++ b/apps/web/src/locales/ko/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/lv/messages.json b/apps/web/src/locales/lv/messages.json
index 8f8ae16320c..0b830e6dc9a 100644
--- a/apps/web/src/locales/lv/messages.json
+++ b/apps/web/src/locales/lv/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Atjaunināta nodokļu informācija"
},
+ "billingInvalidTaxIdError": {
+ "message": "Nederīgs nodokļu identifikators. Ja ir pārliecība, ka tā ir kļūda, lūgums sazināties ar atbalstu."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Mēs nevarējām pārbaudīt nodokļu identifikatoru. Ja ir pārliecība, ka tā ir kļūda, lūgums sazināties ar atbalstu."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Nederīgs nodokļu identifikators. Ja ir pārliecība, ka tā ir kļūda, lūgums sazināties ar atbalstu."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "Rēķina priekšskatīšanas laikā atgadījās kļūda. Lūgums vēlāk mēģināt vēlreiz."
+ },
"unverified": {
"message": "Neapliecināts"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Apvienības nosaukums nevar pārsniegt 50 rakstzīmes."
+ },
+ "resellerRenewalWarning": {
+ "message": "Abonements drīz tiks atjaunots. Lai nodrošinātu nepārtrauktu pakalpojumu, pirms $RENEWAL_DATE$ jāsazinās ar $RESELLER$, lai apstiprinātu atjaunošanu.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Rēķins par abonementu tika izdots $ISSUED_DATE$. Lai nodrošinātu nepārtrauktu pakalpojumu, pirms $DUE_DATE$ jāsazinās ar $RESELLER$, lai apstiprinātu atjaunošanu.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Rēķins par abonementu nav apmaksāts. Lai nodrošinātu nepārtrauktu pakalpojumu, pirms $GRACE_PERIOD_END$ jāsazināš ar $RESELLER$, lai apstiprinātu atjaunošanu.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/ml/messages.json b/apps/web/src/locales/ml/messages.json
index bca6a172b62..c6f9aa8d853 100644
--- a/apps/web/src/locales/ml/messages.json
+++ b/apps/web/src/locales/ml/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/mr/messages.json b/apps/web/src/locales/mr/messages.json
index c5a77826c9e..36ab0050700 100644
--- a/apps/web/src/locales/mr/messages.json
+++ b/apps/web/src/locales/mr/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/my/messages.json b/apps/web/src/locales/my/messages.json
index c5a77826c9e..36ab0050700 100644
--- a/apps/web/src/locales/my/messages.json
+++ b/apps/web/src/locales/my/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/nb/messages.json b/apps/web/src/locales/nb/messages.json
index caf22428259..af26fc4df94 100644
--- a/apps/web/src/locales/nb/messages.json
+++ b/apps/web/src/locales/nb/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/ne/messages.json b/apps/web/src/locales/ne/messages.json
index 345b8945460..e51fb3ced67 100644
--- a/apps/web/src/locales/ne/messages.json
+++ b/apps/web/src/locales/ne/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/nl/messages.json b/apps/web/src/locales/nl/messages.json
index 4e6e29704b6..cd72a94251c 100644
--- a/apps/web/src/locales/nl/messages.json
+++ b/apps/web/src/locales/nl/messages.json
@@ -952,7 +952,7 @@
"message": "Uitgelogd"
},
"loggedOutDesc": {
- "message": "You have been logged out of your account."
+ "message": "Je bent afgemeld bij je account."
},
"loginExpired": {
"message": "Je inlogsessie is verlopen."
@@ -1126,7 +1126,7 @@
"message": "De verificatiesessie is verlopen. Start het inlogproces opnieuw op."
},
"verifyIdentity": {
- "message": "Verify your Identity"
+ "message": "Controleer je identiteit"
},
"logInInitiated": {
"message": "Inloggen gestart"
@@ -1254,7 +1254,7 @@
"message": "E-mailadres"
},
"yourVaultIsLockedV2": {
- "message": "Je kluis is vergrendeld."
+ "message": "Je kluis is vergrendeld"
},
"yourAccountIsLocked": {
"message": "Je account is vergrendeld"
@@ -1450,7 +1450,7 @@
"message": "Wijzig de verzamelingen waarmee dit item gedeeld is. Alleen organisatiegebruikers met toegang tot deze verzamelingen kunnen dit item inzien."
},
"deleteSelectedItemsDesc": {
- "message": "Je hebt $COUNT$ item(s) geselecteerd om te verwijderen. Weet je zeker dat je al deze items wilt verwijderen?",
+ "message": "$COUNT$ item(s) worden naar de prullenbak gestuurd.",
"placeholders": {
"count": {
"content": "$1",
@@ -1471,7 +1471,7 @@
"message": "Weet je zeker dat je wilt doorgaan?"
},
"moveSelectedItemsDesc": {
- "message": "Choose a folder that you would like to add the $COUNT$ selected item(s) to.",
+ "message": "Kies een map waaraan je de $COUNT$ geselecteerde item(s) wilt toevoegen.",
"placeholders": {
"count": {
"content": "$1",
@@ -1506,10 +1506,10 @@
"message": "UUID kopiëren"
},
"errorRefreshingAccessToken": {
- "message": "Access Token Refresh Error"
+ "message": "Fout bij vernieuwen toegangstoken"
},
"errorRefreshingAccessTokenDesc": {
- "message": "No refresh token or API keys found. Please try logging out and logging back in."
+ "message": "Geen verversingstoken of API-sleutels gevonden. Probeer uit te loggen en weer in te loggen."
},
"warning": {
"message": "Waarschuwing"
@@ -1590,7 +1590,7 @@
"message": "Dit bestand is beveiligd met een wachtwoord. Voer het bestandswachtwoord in om gegevens te importeren."
},
"exportSuccess": {
- "message": "Je kluisgegevens zijn geëxporteerd."
+ "message": "Kluisgegevens geëxporteerd"
},
"passwordGenerator": {
"message": "Wachtwoordgenerator"
@@ -1870,11 +1870,11 @@
"description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new login instead. (Optional second half: You may need to wait until your administrator confirms your organization membership.)"
},
"onboardingImportDataDetailsPartTwoNoOrgs": {
- "message": " aanmaken.",
+ "message": " in plaats daarvan.",
"description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead."
},
"onboardingImportDataDetailsPartTwoWithOrgs": {
- "message": " aanmaken. Je moet misschien wachten tot je beheerder je organisatielidmaatschap bevestigt.",
+ "message": " in plaats daarvan. Je moet misschien wachten tot je beheerder je organisatielidmaatschap bevestigt.",
"description": "This will be part of a larger sentence, that will read like this: If you don't have any data to import, you can create a new item instead. You may need to wait until your administrator confirms your organization membership."
},
"importError": {
@@ -1884,7 +1884,7 @@
"message": "Er was een probleem met de data die je probeerde te importeren. Los de onderstaande fouten op in het bronbestand en probeer het opnieuw."
},
"importSuccess": {
- "message": "De gegevens zijn in je kluis geïmporteerd."
+ "message": "Gegevens succesvol geïmporteerd"
},
"importSuccessNumberOfItems": {
"message": "Een totaal van $AMOUNT$ items zijn geïmporteerd.",
@@ -2752,7 +2752,7 @@
"message": "Weet je zeker dat je wilt opzeggen? Je verliest toegang tot alle functionaliteiten van dit abonnement aan het einde van deze betalingscyclus."
},
"canceledSubscription": {
- "message": "Het abonnement is opgezegd."
+ "message": "Abonnement geannuleerd"
},
"neverExpires": {
"message": "Vervalt nooit"
@@ -3138,7 +3138,7 @@
"message": "Je nieuwe organisatie is klaar voor gebruik!"
},
"organizationUpgraded": {
- "message": "Je organisatie is bijgewerkt."
+ "message": "Organisatie bijgewerkt"
},
"leave": {
"message": "Verlaten"
@@ -3147,7 +3147,7 @@
"message": "Weet je zeker dat je deze organisatie wilt verlaten?"
},
"leftOrganization": {
- "message": "Je hebt de organisatie verlaten."
+ "message": "Je hebt de organisatie verlaten"
},
"defaultCollection": {
"message": "Standaardverzameling"
@@ -3285,7 +3285,7 @@
"message": "Eigenaar"
},
"ownerDesc": {
- "message": "De gebruiker met de hoogste toegangsrechten. Deze gebruiker kan alle aspecten van je organisatie beheren."
+ "message": "De gebruiker met de hoogste toegangsrechten. Deze gebruiker kan alle aspecten van je organisatie beheren"
},
"clientOwnerDesc": {
"message": "Deze gebruiker moet onafhankelijk zijn van de provider. Als de provider is losgekoppeld van de organisatie, blijft deze gebruiker eigenaar van de organisatie."
@@ -3294,22 +3294,22 @@
"message": "Beheerder"
},
"adminDesc": {
- "message": "Beheerders hebben toegang tot alle items, verzamelingen en gebruikers binnen je organisatie en kunnen deze ook beheren."
+ "message": "Beheerders hebben toegang tot alle items, verzamelingen en gebruikers binnen je organisatie en kunnen deze ook beheren"
},
"user": {
"message": "Gebruiker"
},
"userDesc": {
- "message": "Een standaardgebruiker met toegang tot de verzamelingen van je organisatie."
+ "message": "Items openen en toevoegen aan toegewezen collecties"
},
"all": {
"message": "Alle"
},
"addAccess": {
- "message": "Add Access"
+ "message": "Toegang toevoegen"
},
"addAccessFilter": {
- "message": "Add Access Filter"
+ "message": "Toegangsfilter toevoegen"
},
"refresh": {
"message": "Verversen"
@@ -3351,16 +3351,16 @@
"message": "Bitwarden Secrets Manager"
},
"loggedIn": {
- "message": "Ingelogd."
+ "message": "Ingelogd"
},
"changedPassword": {
- "message": "Accountwachtwoord veranderd."
+ "message": "Accountwachtwoord veranderd"
},
"enabledUpdated2fa": {
- "message": "Tweestapsaanmelding geactiveerd/bijgewerkt."
+ "message": "Inloggen in twee stappen opgeslagen"
},
"disabled2fa": {
- "message": "Tweestapsaanmelding uitgeschakeld."
+ "message": "Inloggen in twee stappen uitgeschakeld"
},
"recovered2fa": {
"message": "Account hersteld van tweestapsaanmelding."
@@ -3385,7 +3385,7 @@
"description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device."
},
"exportedVault": {
- "message": "Kluis geëxporteerd."
+ "message": "Kluis geëxporteerd"
},
"exportedOrganizationVault": {
"message": "Organisatiekluis geëxporteerd."
@@ -3808,7 +3808,7 @@
"message": "Wijzig de groep waar deze gebruiker bij hoort."
},
"invitedUsers": {
- "message": "Gebruiker(s) uitgenodigd."
+ "message": "Gebruiker(s) uitgenodigd"
},
"resendInvitation": {
"message": "Uitnodiging opnieuw versturen"
@@ -3817,7 +3817,7 @@
"message": "E-mail opnieuw versturen"
},
"hasBeenReinvited": {
- "message": "$USER$ is opnieuw uitgenodigd.",
+ "message": "$USER$ opnieuw uitgenodigd",
"placeholders": {
"user": {
"content": "$1",
@@ -3865,7 +3865,7 @@
"message": "Kijk in het postvak IN van je e-mail voor een verificatielink."
},
"emailVerified": {
- "message": "Je e-mailadres is geverifieerd."
+ "message": "Account e-mail geverifieerd"
},
"emailVerifiedV2": {
"message": "E-mailadres geverifieerd"
@@ -4089,7 +4089,7 @@
"message": "Als je de bankrekening niet verifieert mis je een betaling waardoor je abonnement wordt uitgeschakeld."
},
"verifiedBankAccount": {
- "message": "Bankrekening geverifieerd."
+ "message": "Bankrekening geverifieerd"
},
"bankAccount": {
"message": "Bankrekening"
@@ -4181,10 +4181,10 @@
"message": "Aanpassingen aan je abonnement leiden tot evenredige wijzigingen in je factuurtotaal. Als nieuwe gebruikers je gebruikersplaatsen overschrijden, ontvang je onmiddellijk een afschrijving voor de extra gebruikers."
},
"smStandaloneTrialSeatCountUpdateMessageFragment1": {
- "message": "If you want to add additional"
+ "message": "Als je aanvullende"
},
"smStandaloneTrialSeatCountUpdateMessageFragment2": {
- "message": "seats without the bundled offer, please contact"
+ "message": "plaatsen zonder de gebundelde aanbieding, neem dan contact op met"
},
"subscriptionUserSeatsLimitedAutoscale": {
"message": "Aanpassingen aan je abonnement leiden tot evenredige wijzigingen in je factuurtotaal. Als nieuwe gebruikers je gebruikersplaatsen overschrijden, ontvang je onmiddellijk een afschrijving voor de extra gebruikers tot het aantal van $MAX$ gebruikersplaatsen is bereikt.",
@@ -4394,7 +4394,7 @@
"description": "ex. Date this password was updated"
},
"organizationIsDisabled": {
- "message": "Organisatie uitgeschakeld."
+ "message": "Organisatie opgeschort"
},
"secretsAccessSuspended": {
"message": "Opgeschorte organisaties zijn niet toegankelijk. Neem contact op met de eigenaar van je organisatie voor hulp."
@@ -4662,7 +4662,7 @@
}
},
"permanentlyDeletedItemId": {
- "message": "Definitief verwijderd item $ID$.",
+ "message": "Item $ID$ permanent verwijderd",
"placeholders": {
"id": {
"content": "$1",
@@ -4683,7 +4683,7 @@
"message": "Herstelde items"
},
"restoredItemId": {
- "message": "Hersteld item $ID$.",
+ "message": "Item $ID$ hersteld",
"placeholders": {
"id": {
"content": "$1",
@@ -5102,7 +5102,7 @@
}
},
"emergencyApproved": {
- "message": "Noodtoegang goedgekeurd."
+ "message": "Noodtoegang goedgekeurd"
},
"emergencyRejected": {
"message": "Noodtoegang afgewezen"
@@ -5194,7 +5194,7 @@
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'"
},
"customDescNonEnterpriseLink": {
- "message": "Enterprise feature",
+ "message": "enterprise functie",
"description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'"
},
"customDescNonEnterpriseEnd": {
@@ -5533,7 +5533,7 @@
"message": "Wachtwoord opnieuw ingesteld!"
},
"resetPasswordEnrollmentWarning": {
- "message": "Inschrijving stelt organisatiebeheerders in staat om je hoofdwachtwoord te wijzigen. Weet je zeker dat je wilt inschrijven?"
+ "message": "Registratie geeft organisatiebeheerders de mogelijkheid om je hoofdwachtwoord te wijzigen"
},
"accountRecoveryPolicy": {
"message": "Accountherstel-administratie"
@@ -5617,10 +5617,10 @@
"message": "Bulkactie status"
},
"bulkConfirmMessage": {
- "message": "Succesvol bevestigd."
+ "message": "Succesvol bevestigd"
},
"bulkReinviteMessage": {
- "message": "Succesvol opnieuw uitgenodigd."
+ "message": "Succesvol opnieuw uitgenodigd"
},
"bulkRemovedMessage": {
"message": "Succesvol verwijderd"
@@ -5632,7 +5632,7 @@
"message": "Toegang tot de organisatie hersteld"
},
"bulkFilteredMessage": {
- "message": "Uitgezonderd, niet van toepassing voor deze actie."
+ "message": "Uitgesloten, niet van toepassing op deze actie"
},
"nonCompliantMembersTitle": {
"message": "Niet-conforme leden"
@@ -5671,7 +5671,7 @@
"message": "Providernaam"
},
"providerSetup": {
- "message": "De provider is ingesteld."
+ "message": "Provider succesvol ingesteld"
},
"clients": {
"message": "Apparaten"
@@ -5757,7 +5757,7 @@
}
},
"providerIsDisabled": {
- "message": "Provider is uitgeschakeld."
+ "message": "Aanbieder geschorst"
},
"providerUpdated": {
"message": "Provider bijgewerkt"
@@ -5835,7 +5835,7 @@
"message": "Minuten"
},
"vaultTimeoutPolicyInEffect": {
- "message": "Het beleid van je organisatie heeft invloed op de time-out van je kluis. De maximaal toegestane time-out voor je kluis is $HOURS$ uur en $MINUTES$ minuten",
+ "message": "Het beleid van je organisatie heeft invloed op de time-out van je kluis. De maximaal toegestane time-out voor je kluis is $HOURS$ uur en $MINUTES$ minuten.",
"placeholders": {
"hours": {
"content": "$1",
@@ -6037,7 +6037,7 @@
"message": "Onderteken authenticatie aanvragen"
},
"ssoSettingsSaved": {
- "message": "Single Sign-On configuratie is opgeslagen."
+ "message": "Single sign-on configuratie opgeslagen"
},
"sponsoredFamilies": {
"message": "Gratis Bitwarden Families"
@@ -6196,7 +6196,7 @@
"message": "Hoofdwachtwoord verwijderen"
},
"removedMasterPassword": {
- "message": "Hoofdwachtwoord verwijderd."
+ "message": "Hoofdwachtwoord verwijderd"
},
"allowSso": {
"message": "SSO-authenticatie toestaan"
@@ -6319,37 +6319,37 @@
"message": "Het roteren van het factureringssynchronisatietoken maakt het vorige token ongeldig."
},
"selfHostedServer": {
- "message": "self-hosted"
+ "message": "zelf gehost"
},
"customEnvironment": {
- "message": "Custom environment"
+ "message": "Aangepaste omgeving"
},
"selfHostedBaseUrlHint": {
- "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com"
+ "message": "Geef de basis URL op van je on-premises gehoste Bitwarden installatie. Voorbeeld: https://bitwarden.company.com"
},
"selfHostedCustomEnvHeader": {
- "message": "For advanced configuration, you can specify the base URL of each service independently."
+ "message": "Voor geavanceerde configuratie kun je de basis URL van elke service onafhankelijk opgeven."
},
"selfHostedEnvFormInvalid": {
- "message": "You must add either the base Server URL or at least one custom environment."
+ "message": "Je moet de basis URL van de server of ten minste één aangepaste omgeving toevoegen."
},
"apiUrl": {
- "message": "API server URL"
+ "message": "API-server URL"
},
"webVaultUrl": {
- "message": "Web vault server URL"
+ "message": "Webkluisserver URL"
},
"identityUrl": {
- "message": "Identity server URL"
+ "message": "Identiteitsserver URL"
},
"notificationsUrl": {
- "message": "Notifications server URL"
+ "message": "Meldingen server URL"
},
"iconsUrl": {
- "message": "Icons server URL"
+ "message": "Pictogrammen server URL"
},
"environmentSaved": {
- "message": "Environment URLs saved"
+ "message": "Omgevings-URL's opgeslagen"
},
"selfHostingTitle": {
"message": "Zelfgehost"
@@ -6358,7 +6358,7 @@
"message": "Voor het instellen van je organisatie op je eigen server, moet je je licentiebestand uploaden. Om gratis Families-plannen en geavanceerde factureringsmogelijkheden voor je zelfgehoste organisatie te ondersteunen, moet je factureringssynchronisatie instellen."
},
"billingSyncApiKeyRotated": {
- "message": "Token geroteerd."
+ "message": "Token geroteerd"
},
"billingSyncKeyDesc": {
"message": "Er is een factureringssynchronisatietoken van de abonnementsinstellingen van je cloudorganisatie vereist voor het afronden van dit formulier."
@@ -6679,7 +6679,7 @@
"description": "Guidance provided for email forwarding services that support multiple email domains."
},
"forwarderError": {
- "message": "$SERVICENAME$ error: $ERRORMESSAGE$",
+ "message": "$SERVICENAME$ fout: $ERRORMESSAGE$",
"description": "Reports an error returned by a forwarding service to the user.",
"placeholders": {
"servicename": {
@@ -6693,11 +6693,11 @@
}
},
"forwarderGeneratedBy": {
- "message": "Generated by Bitwarden.",
+ "message": "Gegenereerd door Bitwarden.",
"description": "Displayed with the address on the forwarding service's configuration screen."
},
"forwarderGeneratedByWithWebsite": {
- "message": "Website: $WEBSITE$. Generated by Bitwarden.",
+ "message": "Website: $WEBSITE$. Gegenereerd door Bitwarden.",
"description": "Displayed with the address on the forwarding service's configuration screen.",
"placeholders": {
"WEBSITE": {
@@ -6707,7 +6707,7 @@
}
},
"forwaderInvalidToken": {
- "message": "Invalid $SERVICENAME$ API token",
+ "message": "Ongeldig $SERVICENAME$ API token",
"description": "Displayed when the user's API token is empty or rejected by the forwarding service.",
"placeholders": {
"servicename": {
@@ -6717,7 +6717,7 @@
}
},
"forwaderInvalidTokenWithMessage": {
- "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$",
+ "message": "Ongeldige $SERVICENAME$ API token: $ERRORMESSAGE$",
"description": "Displayed when the user's API token is rejected by the forwarding service with an error message.",
"placeholders": {
"servicename": {
@@ -6731,7 +6731,7 @@
}
},
"forwarderNoAccountId": {
- "message": "Unable to obtain $SERVICENAME$ masked email account ID.",
+ "message": "Kan $SERVICENAME$ gemaskeerde e-mailaccount-ID niet verkrijgen.",
"description": "Displayed when the forwarding service fails to return an account ID.",
"placeholders": {
"servicename": {
@@ -6741,7 +6741,7 @@
}
},
"forwarderNoDomain": {
- "message": "Invalid $SERVICENAME$ domain.",
+ "message": "Ongeldig $SERVICENAME$ domein.",
"description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.",
"placeholders": {
"servicename": {
@@ -6751,7 +6751,7 @@
}
},
"forwarderNoUrl": {
- "message": "Invalid $SERVICENAME$ url.",
+ "message": "Ongeldige $SERVICENAME$ url.",
"description": "Displayed when the url of the forwarding service wasn't supplied.",
"placeholders": {
"servicename": {
@@ -6761,7 +6761,7 @@
}
},
"forwarderUnknownError": {
- "message": "Unknown $SERVICENAME$ error occurred.",
+ "message": "Onbekende $SERVICENAME$ fout opgetreden.",
"description": "Displayed when the forwarding service failed due to an unknown error.",
"placeholders": {
"servicename": {
@@ -6771,7 +6771,7 @@
}
},
"forwarderUnknownForwarder": {
- "message": "Unknown forwarder: '$SERVICENAME$'.",
+ "message": "Onbekende doorstuurder: '$SERVICENAME$'.",
"description": "Displayed when the forwarding service is not supported.",
"placeholders": {
"servicename": {
@@ -7478,7 +7478,7 @@
"message": "Geef toegang tot collecties door ze aan deze groep toe te voegen."
},
"restrictedCollectionAssignmentDesc": {
- "message": "You can only assign collections you manage."
+ "message": "Je kunt alleen verzamelingen toewijzen die je beheert."
},
"selectMembers": {
"message": "Leden selecteren"
@@ -7700,7 +7700,7 @@
"message": "Groepen selecteren"
},
"userPermissionOverrideHelperDesc": {
- "message": "Permissions set for a member will replace permissions set by that member's group."
+ "message": "Rechten ingesteld voor een lid vervangen de rechten ingesteld door de groep van dat lid."
},
"noMembersOrGroupsAdded": {
"message": "Geen leden of groepen toegevoegd"
@@ -7904,7 +7904,7 @@
"message": "Werk je versleutelingsinstellingen bij om aan de nieuwe beveiligingsaanbevelingen te voldoen en de bescherming van je account te verbeteren."
},
"kdfSettingsChangeLogoutWarning": {
- "message": "Proceeding will log you out of all active sessions. You will need to log back in and complete two-step login, if any. We recommend exporting your vault before changing your encryption settings to prevent data loss."
+ "message": "Als je doorgaat, log je uit van alle actieve sessies. Je zult opnieuw moeten inloggen en, indien van toepassing, tweestapsverificatie moeten voltooien. We raden aan om je kluis te exporteren voordat je je versleutelingsinstellingen wijzigt om gegevensverlies te voorkomen."
},
"secretsManager": {
"message": "Secrets Manager"
@@ -8559,10 +8559,10 @@
"message": "Je hebt geen toegang om deze collectie te beheren."
},
"grantAddAccessCollectionWarningTitle": {
- "message": "Missing Can Manage Permissions"
+ "message": "Ontbrekende Kan beheren machtigingen"
},
"grantAddAccessCollectionWarning": {
- "message": "Grant Can manage permissions to allow full collection management including deletion of collection."
+ "message": "Kan beheren machtigingen verlenen voor volledig verzamelingsbeheer, inclusief het verwijderen van verzamelingen."
},
"grantCollectionAccess": {
"message": "Groepen of mensen toegang tot deze collectie geven."
@@ -8660,7 +8660,7 @@
"message": "Het is niet mogelijk om jezelf toe te voegen aan groepen."
},
"cannotAddYourselfToCollections": {
- "message": "You cannot add yourself to collections."
+ "message": "Je kunt jezelf niet toevoegen aan verzamelingen."
},
"assign": {
"message": "Toewijzen"
@@ -9112,25 +9112,25 @@
}
},
"createNewClientToManageAsProvider": {
- "message": "Create a new client organization to manage as a Provider. Additional seats will be reflected in the next billing cycle."
+ "message": "Maak een nieuwe clientorganisatie aan om te beheren als Aanbieder. Extra plaatsen worden weergegeven in de volgende factureringscyclus."
},
"selectAPlan": {
- "message": "Select a plan"
+ "message": "Selecteer een plan"
},
"thirtyFivePercentDiscount": {
- "message": "35% Discount"
+ "message": "35% korting"
},
"monthPerMember": {
- "message": "month per member"
+ "message": "maand per lid"
},
"seats": {
- "message": "Seats"
+ "message": "Personen"
},
"addOrganization": {
- "message": "Add organization"
+ "message": "Organisatie toevoegen"
},
"createdNewClient": {
- "message": "Successfully created new client"
+ "message": "Nieuwe klant succesvol aangemaakt"
},
"noAccess": {
"message": "Geen toegang"
@@ -9139,16 +9139,16 @@
"message": "Deze collectie is alleen toegankelijk vanaf de admin console"
},
"organizationOptionsMenu": {
- "message": "Toggle Organization Menu"
+ "message": "Organisatiemenu togglen"
},
"vaultItemSelect": {
- "message": "Select vault item"
+ "message": "Kluisitem selecteren"
},
"collectionItemSelect": {
- "message": "Select collection item"
+ "message": "Verzamelitem selecteren"
},
"manageBillingFromProviderPortalMessage": {
- "message": "Manage billing from the Provider Portal"
+ "message": "Facturering beheren vanuit het aanbiederportaal"
},
"continueSettingUpFreeTrial": {
"message": "Doorgaan met het instellen van je gratis proefperiode van Bitwarden"
@@ -9169,7 +9169,7 @@
"message": "Voer je organisatie-informatie voor Enterprise in"
},
"viewItemsIn": {
- "message": "View items in $NAME$",
+ "message": "Bekijk items in $NAME$",
"description": "Button to view the contents of a folder or collection",
"placeholders": {
"name": {
@@ -9179,7 +9179,7 @@
}
},
"backTo": {
- "message": "Back to $NAME$",
+ "message": "Terug naar $NAME$",
"description": "Navigate back to a previous folder or collection",
"placeholders": {
"name": {
@@ -9189,11 +9189,11 @@
}
},
"back": {
- "message": "Back",
+ "message": "Terug",
"description": "Button text to navigate back"
},
"removeItem": {
- "message": "Remove $NAME$",
+ "message": "$NAME$ verwijderen",
"description": "Remove a selected option, such as a folder or collection",
"placeholders": {
"name": {
@@ -9203,13 +9203,13 @@
}
},
"viewInfo": {
- "message": "View info"
+ "message": "Bekijk info"
},
"viewAccess": {
- "message": "View access"
+ "message": "Toegang bekijken"
},
"noCollectionsSelected": {
- "message": "You have not selected any collections."
+ "message": "Je hebt geen verzamelingen geselecteerd."
},
"updateName": {
"message": "Naam bijwerken"
@@ -9218,7 +9218,7 @@
"message": "Organisatienaam bijgewerkt"
},
"providerPlan": {
- "message": "Managed Service Provider"
+ "message": "Beheerde dienstaanbieder"
},
"managedServiceProvider": {
"message": "Managed service provider"
@@ -9227,10 +9227,10 @@
"message": "Multi-organisatie onderneming"
},
"orgSeats": {
- "message": "Organization Seats"
+ "message": "Organisatie plaatsen"
},
"providerDiscount": {
- "message": "$AMOUNT$% Discount",
+ "message": "$AMOUNT$% korting",
"placeholders": {
"amount": {
"content": "$1",
@@ -9239,7 +9239,7 @@
}
},
"lowKDFIterationsBanner": {
- "message": "Laag aantal KDF-iteraties. Verhoog je iteraties om de veiligheid van je account te verbeteren,"
+ "message": "Laag aantal KDF-iteraties. Verhoog je iteraties om de veiligheid van je account te verbeteren."
},
"changeKDFSettings": {
"message": "KDF-instellingen wijzigen"
@@ -9251,10 +9251,10 @@
"message": "Bescherm je gezin of bedrijf"
},
"upgradeOrganizationCloseSecurityGaps": {
- "message": "Close security gaps with monitoring reports"
+ "message": "Beveiligingslekken dichten met bewakingsrapporten"
},
"upgradeOrganizationCloseSecurityGapsDesc": {
- "message": "Stay ahead of security vulnerabilities by upgrading to a paid plan for enhanced monitoring."
+ "message": "Blijf kwetsbaarheden in de beveiliging voor door te upgraden naar een betaald plan voor verbeterde monitoring."
},
"approveAllRequests": {
"message": "Alle verzoeken goedkeuren"
@@ -9269,13 +9269,25 @@
"message": "Bitcoin"
},
"updatedTaxInformation": {
- "message": "Updated tax information"
+ "message": "Bijgewerkte belastinggegevens"
+ },
+ "billingInvalidTaxIdError": {
+ "message": "Ongeldig btw-nummer, als je denkt dat dit een fout is, neem dan contact op met support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We konden je btw-nummer niet valideren, als je denkt dat dit een fout is, neem dan contact op met support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Ongeldig btw-nummer, als je denkt dat dit een fout is, neem dan contact op met support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "Er is een fout opgetreden met het weergeven van de factuur. Probeer het later nog eens."
},
"unverified": {
- "message": "Unverified"
+ "message": "Niet-geverifieerd"
},
"verified": {
- "message": "Verified"
+ "message": "Geverifieerd"
},
"viewSecret": {
"message": "Geheim weergeven"
@@ -9698,7 +9710,7 @@
"message": "Je Secrets Manager-abonnement zal upgraden naar het geselecteerde abonnement"
},
"bitwardenPasswordManager": {
- "message": "Bitwarden Password Manager"
+ "message": "Bitwarden Wachtwoordbeheerder"
},
"secretsManagerComplimentaryPasswordManager": {
"message": "Je gratis eenjarige Password Manager-abonnement zal veranderen naar het geselecteerde abonnement. Er worden pas kosten in rekening gebracht als de gratis periode voorbij is."
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organisatienaam mag niet langer zijn dan 50 tekens."
+ },
+ "resellerRenewalWarning": {
+ "message": "Je abonnement wordt binnenkort verlengd. Neem voor $RENEWAL_DATE$ contact op met $RESELLER$ om je verlenging te bevestigen en een ononderbroken service te verzekeren.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Er is een factuur voor je abonnement aangemaakt op $ISSUED_DATE$. Neem contact op met $RESELLER$ voor $DUE_DATE$ om je verlenging te bevestigen en een ononderbroken service te verzekeren.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "De factuur voor je abonnement is niet betaald. Neem contact op met $RESELLER$ voor $GRACE_PERIOD_END$ om je verlenging te bevestigen en een ononderbroken service te verzekeren.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/nn/messages.json b/apps/web/src/locales/nn/messages.json
index 7951e875fe8..0e3c134ba4d 100644
--- a/apps/web/src/locales/nn/messages.json
+++ b/apps/web/src/locales/nn/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/or/messages.json b/apps/web/src/locales/or/messages.json
index c5a77826c9e..36ab0050700 100644
--- a/apps/web/src/locales/or/messages.json
+++ b/apps/web/src/locales/or/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/pl/messages.json b/apps/web/src/locales/pl/messages.json
index 67d63ce9b33..58e4de95317 100644
--- a/apps/web/src/locales/pl/messages.json
+++ b/apps/web/src/locales/pl/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Zaktualizowane informacje podatkowe"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Niezweryfikowane"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/pt_BR/messages.json b/apps/web/src/locales/pt_BR/messages.json
index 5461370c663..463b7f5e060 100644
--- a/apps/web/src/locales/pt_BR/messages.json
+++ b/apps/web/src/locales/pt_BR/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Informações fiscais atualizadas"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Não verificado"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/pt_PT/messages.json b/apps/web/src/locales/pt_PT/messages.json
index 28b65826f02..57a2eee7cf5 100644
--- a/apps/web/src/locales/pt_PT/messages.json
+++ b/apps/web/src/locales/pt_PT/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Informações fiscais atualizadas"
},
+ "billingInvalidTaxIdError": {
+ "message": "Número de identificação fiscal inválido. Se considerar que se trata de um erro, contacte a assistência."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Não foi possível validar o seu número de identificação fiscal. Se considerar que se trata de um erro, contacte a assistência."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Número de identificação fiscal inválido. Se considerar que se trata de um erro, contacte a assistência."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "Ocorreu um erro ao pré-visualizar a fatura. Por favor, tente novamente mais tarde."
+ },
"unverified": {
"message": "Não verificado"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "O nome da organização não pode exceder 50 caracteres."
+ },
+ "resellerRenewalWarning": {
+ "message": "A sua subscrição será renovada em breve. Para garantir um serviço ininterrupto, contacte a $RESELLER$ para confirmar a sua renovação antes de $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "A fatura da sua subscrição foi emitida a $ISSUED_DATE$. Para garantir um serviço ininterrupto, contacte a $RESELLER$ para confirmar a sua renovação antes de $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "A fatura da sua subscrição não foi paga. Para garantir um serviço ininterrupto, contacte a $RESELLER$ para confirmar a sua renovação antes de $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/ro/messages.json b/apps/web/src/locales/ro/messages.json
index 5fdb6ab5e68..18ff0b2158f 100644
--- a/apps/web/src/locales/ro/messages.json
+++ b/apps/web/src/locales/ro/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/ru/messages.json b/apps/web/src/locales/ru/messages.json
index fd309722f46..89209f2fa52 100644
--- a/apps/web/src/locales/ru/messages.json
+++ b/apps/web/src/locales/ru/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Обновление сведений о налогах"
},
+ "billingInvalidTaxIdError": {
+ "message": "Недействительный ID, если вы считаете, что это ошибка, обратитесь в службу поддержки."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Мы не смогли подтвердить ваш ID, если вы считаете, что это ошибка, обратитесь в службу поддержки."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Недействительный ID, если вы считаете, что это ошибка, обратитесь в службу поддержки."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "При подготовке счета произошла ошибка. Пожалуйста, повторите попытку позже."
+ },
"unverified": {
"message": "Неверифицирован"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Название организации не может превышать 50 символов."
+ },
+ "resellerRenewalWarning": {
+ "message": "Ваша подписка скоро будет продлена. Чтобы гарантировать непрерывность сервиса, свяжитесь с $RESELLER$ для подтверждения продления до $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Счет за вашу подписку был выставлен $ISSUED_DATE$. Чтобы гарантировать непрерывность сервиса, свяжитесь с $RESELLER$, чтобы подтвердить продление подписки до $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Счет за вашу подписку не был оплачен. Чтобы гарантировать непрерывность сервиса, свяжитесь с $RESELLER$ для подтверждения продления до $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/si/messages.json b/apps/web/src/locales/si/messages.json
index 3dfac52754f..0649f83f519 100644
--- a/apps/web/src/locales/si/messages.json
+++ b/apps/web/src/locales/si/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/sk/messages.json b/apps/web/src/locales/sk/messages.json
index 947e459b8fd..dbffa25048c 100644
--- a/apps/web/src/locales/sk/messages.json
+++ b/apps/web/src/locales/sk/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Aktualizované daňové informácie"
},
+ "billingInvalidTaxIdError": {
+ "message": "Neplatne číslo pre DPH, ak myslíte že ide o chybu, kontaktujte prosím zákaznícku podporu."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Nepodarilo sa nám overiť vaše číslo pre DPH, ak myslíte že ide o chybu, kontaktujte prosím zákaznícku podporu."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Neplatne číslo pre DPH, ak myslíte že ide o chybu, kontaktujte prosím zákaznícku podporu."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "Pri vytváraní náhľadu faktúry nastala chyba. Prosím skúste to neskor."
+ },
"unverified": {
"message": "Neoverený"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Meno organizácie nemôže mať viac ako 50 znakov."
+ },
+ "resellerRenewalWarning": {
+ "message": "Vaše predplatné sa čoskoro obnoví. Aby ste si zabezpečili nepretržitú prevádzku, kontaktujte $RESELLER$ a potvrďte obnovenie pred $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Faktúra za vaše predplatné bola vystavená dňa $ISSUED_DATE$. Aby ste si zabezpečili nepretržitú prevádzku, kontaktujte $RESELLER$ a potvrďte obnovenie predplatného pred $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Faktúra za vaše predplatné nebola uhradená. Aby ste si zabezpečili nepretržitú prevádzku, kontaktujte $RESELLER$ a potvrďte obnovenie pred $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/sl/messages.json b/apps/web/src/locales/sl/messages.json
index 55aceaecf2b..9a9535aebaa 100644
--- a/apps/web/src/locales/sl/messages.json
+++ b/apps/web/src/locales/sl/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/sr/messages.json b/apps/web/src/locales/sr/messages.json
index 17e82485f8c..e15d6d66653 100644
--- a/apps/web/src/locales/sr/messages.json
+++ b/apps/web/src/locales/sr/messages.json
@@ -3889,7 +3889,7 @@
"message": "Користите неподржани веб прегледач. Веб сеф можда неће правилно функционисати."
},
"freeTrialEndPromptCount": {
- "message": "Your free trial ends in $COUNT$ days.",
+ "message": "Ваша проба се завршава за $COUNT$ дана.",
"placeholders": {
"count": {
"content": "$1",
@@ -3898,7 +3898,7 @@
}
},
"freeTrialEndPromptMultipleDays": {
- "message": "$ORGANIZATION$, your free trial ends in $COUNT$ days.",
+ "message": "$ORGANIZATION$, Ваша проба са завршава за $COUNT$ дана.",
"placeholders": {
"count": {
"content": "$2",
@@ -3911,7 +3911,7 @@
}
},
"freeTrialEndPromptTomorrow": {
- "message": "$ORGANIZATION$, your free trial ends tomorrow.",
+ "message": "$ORGANIZATION$, Ваша проба са завршава сутра.",
"placeholders": {
"organization": {
"content": "$1",
@@ -3920,10 +3920,10 @@
}
},
"freeTrialEndPromptTomorrowNoOrgName": {
- "message": "Your free trial ends tomorrow."
+ "message": "Ваша бесплатна пробна се завршава сутра."
},
"freeTrialEndPromptToday": {
- "message": "$ORGANIZATION$, your free trial ends today.",
+ "message": "$ORGANIZATION$, Ваша проба са завршава данас.",
"placeholders": {
"organization": {
"content": "$1",
@@ -3932,10 +3932,10 @@
}
},
"freeTrialEndingTodayWithoutOrgName": {
- "message": "Your free trial ends today."
+ "message": "Ваша бесплатна пробна се завршава данас."
},
"clickHereToAddPaymentMethod": {
- "message": "Click here to add a payment method."
+ "message": "Кликните овде да додате начин плаћања."
},
"joinOrganization": {
"message": "Придружи Организацију"
@@ -4492,7 +4492,7 @@
"description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
},
"youWillBeNotifiedOnceTheRequestIsApproved": {
- "message": "You will be notified once the request is approved"
+ "message": "Бићете обавештени када захтев буде одобрен"
},
"free": {
"message": "Бесплатно",
@@ -6529,7 +6529,7 @@
"message": "Генериши име"
},
"generateEmail": {
- "message": "Generate email"
+ "message": "Генеришите имејл"
},
"spinboxBoundariesHint": {
"message": "Value must be between $MIN$ and $MAX$.",
@@ -9018,7 +9018,7 @@
"message": "Употребите Bitwarden Secrets Manager SDK на следећим програмским језицима да направите сопствене апликације."
},
"ssoDescStart": {
- "message": "Configure",
+ "message": "Подеси",
"description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure single sign-on for Bitwarden using the implementation guide for your Identity Provider."
},
"ssoDescEnd": {
@@ -9032,7 +9032,7 @@
"message": "SCIM"
},
"scimIntegrationDescStart": {
- "message": "Configure ",
+ "message": "Подеси ",
"description": "This represents the beginning of a sentence, broken up to include links. The full sentence will be 'Configure SCIM (System for Cross-domain Identity Management) to automatically provision users and groups to Bitwarden using the implementation guide for your Identity Provider"
},
"scimIntegrationDescEnd": {
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Ажуриране пореске информације"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Непроверено"
},
@@ -9885,22 +9897,22 @@
"message": "Descriptor code"
},
"importantNotice": {
- "message": "Important notice"
+ "message": "Важно обавештење"
},
"setupTwoStepLogin": {
- "message": "Set up two-step login"
+ "message": "Поставити дво-степенску пријаву"
},
"newDeviceVerificationNoticeContentPage1": {
- "message": "Bitwarden will send a code to your account email to verify logins from new devices starting in February 2025."
+ "message": "Bitwarden ће послати кôд на имејл вашег налога за верификовање пријављивања са нових уређаја почевши од фебруара 2025."
},
"newDeviceVerificationNoticeContentPage2": {
- "message": "You can set up two-step login as an alternative way to protect your account or change your email to one you can access."
+ "message": "Можете да подесите пријаву у два корака као алтернативни начин да заштитите свој налог или да промените свој имејл у један који можете да приступите."
},
"remindMeLater": {
- "message": "Remind me later"
+ "message": "Подсети ме касније"
},
"newDeviceVerificationNoticePageOneFormContent": {
- "message": "Do you have reliable access to your email, $EMAIL$?",
+ "message": "Да ли имате поуздан приступ својим имејлом, $EMAIL$?",
"placeholders": {
"email": {
"content": "$1",
@@ -9909,19 +9921,19 @@
}
},
"newDeviceVerificationNoticePageOneEmailAccessNo": {
- "message": "No, I do not"
+ "message": "Не, ненам"
},
"newDeviceVerificationNoticePageOneEmailAccessYes": {
- "message": "Yes, I can reliably access my email"
+ "message": "Да, могу поуздано да приступим овим имејлом"
},
"turnOnTwoStepLogin": {
- "message": "Turn on two-step login"
+ "message": "Упалити дво-степенску пријаву"
},
"changeAcctEmail": {
- "message": "Change account email"
+ "message": "Променити имејл налога"
},
"removeMembers": {
- "message": "Remove members"
+ "message": "Уклони чланове"
},
"claimedDomains": {
"message": "Claimed domains"
@@ -9954,7 +9966,7 @@
"message": "Claimed"
},
"domainStatusUnderVerification": {
- "message": "Under verification"
+ "message": "Под провером"
},
"claimedDomainsDesc": {
"message": "Claim a domain to own all member accounts whose email address matches the domain. Members will be able to skip the SSO identifier when logging in. Administrators will also be able to delete member accounts."
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/sr_CS/messages.json b/apps/web/src/locales/sr_CS/messages.json
index 6dd5fed6736..b2cd3a877d4 100644
--- a/apps/web/src/locales/sr_CS/messages.json
+++ b/apps/web/src/locales/sr_CS/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/sv/messages.json b/apps/web/src/locales/sv/messages.json
index b4d2fb7aa8d..14d7bc4572c 100644
--- a/apps/web/src/locales/sv/messages.json
+++ b/apps/web/src/locales/sv/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/te/messages.json b/apps/web/src/locales/te/messages.json
index c5a77826c9e..36ab0050700 100644
--- a/apps/web/src/locales/te/messages.json
+++ b/apps/web/src/locales/te/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/th/messages.json b/apps/web/src/locales/th/messages.json
index 5d2da786d83..c731b9ff87e 100644
--- a/apps/web/src/locales/th/messages.json
+++ b/apps/web/src/locales/th/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/tr/messages.json b/apps/web/src/locales/tr/messages.json
index fb821407a16..ba53ebe7dd4 100644
--- a/apps/web/src/locales/tr/messages.json
+++ b/apps/web/src/locales/tr/messages.json
@@ -3,22 +3,22 @@
"message": "Tüm uygulamalar"
},
"criticalApplications": {
- "message": "Critical applications"
+ "message": "Kritik uygulamalar"
},
"accessIntelligence": {
"message": "Access Intelligence"
},
"riskInsights": {
- "message": "Risk Insights"
+ "message": "Risk İçgörüleri"
},
"passwordRisk": {
- "message": "Password Risk"
+ "message": "Parola Riski"
},
"reviewAtRiskPasswords": {
- "message": "Review at-risk passwords (weak, exposed, or reused) across applications. Select your most critical applications to prioritize security actions for your users to address at-risk passwords."
+ "message": "Uygulamalar genelinde risk altındaki parolaları (zayıf, açık veya yeniden kullanılan) gözden geçirin. Kullanıcılarınız için risk altındaki parolalara yönelik güvenlik eylemlerine öncelik vermek üzere en kritik uygulamalarınızı seçin."
},
"dataLastUpdated": {
- "message": "Data last updated: $DATE$",
+ "message": "Veri son güncellenme tarihi: $DATE$",
"placeholders": {
"date": {
"content": "$1",
@@ -30,10 +30,10 @@
"message": "Bildirilen üyeler"
},
"revokeMembers": {
- "message": "Revoke members"
+ "message": "Üyeleri iptal et"
},
"restoreMembers": {
- "message": "Restore members"
+ "message": "Üyeleri geri yükle"
},
"cannotRestoreAccessError": {
"message": "Cannot restore organization access"
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Doğrulanmadı"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/uk/messages.json b/apps/web/src/locales/uk/messages.json
index 89d538e1a2a..c17befc27ce 100644
--- a/apps/web/src/locales/uk/messages.json
+++ b/apps/web/src/locales/uk/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Податкову інформацію оновлено"
},
+ "billingInvalidTaxIdError": {
+ "message": "Недійсний ІПН. Якщо ви вважаєте це помилкою, зверніться до служби підтримки."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "Не вдалося перевірити ваш ІПН. Якщо ви вважаєте це помилкою, зверніться до служби підтримки."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Недійсний ІПН. Якщо ви вважаєте це помилкою, зверніться до служби підтримки."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "Під час перегляду рахунку виникла помилка. Повторіть спробу пізніше."
+ },
"unverified": {
"message": "Не перевірений"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Назва організації не може перевищувати 50 символів."
+ },
+ "resellerRenewalWarning": {
+ "message": "Ваша передплата невдовзі поновиться. Щоб забезпечити безперебійну роботу, зверніться до $RESELLER$ для підтвердження поновлення до $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "Рахунок за вашу передплату випущено $ISSUED_DATE$. Щоб забезпечити безперебійну роботу, зверніться до $RESELLER$ для підтвердження поновлення до $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "Рахунок за вашу передплату ще не сплачено. Щоб забезпечити безперебійну роботу, зверніться до $RESELLER$ для підтвердження поновлення до $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/vi/messages.json b/apps/web/src/locales/vi/messages.json
index c8300de6fbf..9f4156014c6 100644
--- a/apps/web/src/locales/vi/messages.json
+++ b/apps/web/src/locales/vi/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "Updated tax information"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "Unverified"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/zh_CN/messages.json b/apps/web/src/locales/zh_CN/messages.json
index e0856dc4350..f293adcf62a 100644
--- a/apps/web/src/locales/zh_CN/messages.json
+++ b/apps/web/src/locales/zh_CN/messages.json
@@ -1006,7 +1006,7 @@
"message": "保持此窗口打开然后按照浏览器的提示操作。"
},
"useADifferentLogInMethod": {
- "message": "使用不同的登录方式"
+ "message": "使用其他登录方式"
},
"logInWithPasskey": {
"message": "使用通行密钥登录"
@@ -1521,7 +1521,7 @@
"message": "确认机密导出"
},
"exportWarningDesc": {
- "message": "本次导出包含未加密格式的密码库数据。您不应该通过不安全的渠道(例如电子邮件)来存储或发送此导出文件。用完后请立即将其删除。"
+ "message": "此导出包含未加密格式的密码库数据。您不应该通过不安全的渠道(例如电子邮件)来存储或发送此导出文件。使用完后请立即将其删除。"
},
"exportSecretsWarningDesc": {
"message": "本次导出包含未加密格式的机密数据。您不应该通过不安全的渠道(例如电子邮件)来存储或发送此导出文件。用完后请立即将其删除。"
@@ -1716,7 +1716,7 @@
"message": "请重新登录。"
},
"logBackInOthersToo": {
- "message": "请重新登录。如果您还在使用其他 Bitwarden 应用,也请注销并重新登陆。"
+ "message": "请重新登录。如果您还在使用其他 Bitwarden 应用程序,也请注销并重新登陆。"
},
"changeMasterPassword": {
"message": "修改主密码"
@@ -1997,13 +1997,13 @@
"message": "域名规则"
},
"domainRulesDesc": {
- "message": "如果您在多个不同网站之间使用同一个登陆信息,您可以把这些网站标记为「通用」。Bitwarden 会为您设置「全局」域名。"
+ "message": "如果您在多个不同网站域名中使用同一个登录信息,您可以把这些网站标记为「等效」。「全局」域名是由 Bitwarden 为您预先创建的域名。"
},
"globalEqDomains": {
- "message": "全局通用域名"
+ "message": "全局等效域名"
},
"customEqDomains": {
- "message": "自定义通用域名"
+ "message": "自定义等效域名"
},
"exclude": {
"message": "排除"
@@ -2018,7 +2018,7 @@
"message": "添加自定义域名"
},
"newCustomDomainDesc": {
- "message": "输入用逗号分隔的域名列表。只能输入「基础」域名,不要输入子域名。例如,输入「google.com」而不是「www.google.com」。您也可以输入「androidapp://package.name」以将 Android 应用程序与其他网站域名关联。"
+ "message": "输入用逗号分隔的域名列表。只能输入「基础」域名,不要输入子域名。例如,输入「google.com」而不是「www.google.com」。您也可以输入「androidapp://package.name」以将 Android App 与其他网站域名关联。"
},
"customDomainX": {
"message": "自定义域名 $INDEX$",
@@ -2039,7 +2039,7 @@
"message": "强制两步登录"
},
"twoStepLoginDesc": {
- "message": "在登录时要求使用额外的步骤来保护您的账户。"
+ "message": "在登录时要求执行额外的步骤来保护您的账户。"
},
"twoStepLoginTeamsDesc": {
"message": "为您的组织启用两步登录。"
@@ -2055,7 +2055,7 @@
"message": "要实施 Duo 方式的两步登录,请使用下面的选项。"
},
"twoStepLoginOrganizationSsoDesc": {
- "message": "如果您已设置或计划设置 SSO,两步登录可能已经通过您的身份提供程序实施了。"
+ "message": "如果您已设置或计划设置 SSO,两步登录可能已经通过您的身份提供程序强制实施了。"
},
"twoStepLoginRecoveryWarning": {
"message": "启用两步登录可能会将您永久锁定在 Bitwarden 账户之外。如果您无法使用常规的两步登录提供程序(例如您丢失了设备),则可以使用恢复代码访问您的账户。如果您失去对您账户的访问,Bitwarden 支持也无法帮助您。我们建议您记下或打印恢复代码,并将其妥善保管。"
@@ -2135,7 +2135,7 @@
}
},
"continueToExternalUrlDesc": {
- "message": "您将离开 Bitwarden 并将在新窗口中启动一个外部网站。"
+ "message": "您将离开 Bitwarden 并将在新窗口中打开一个外部网站。"
},
"twoStepContinueToBitwardenUrlTitle": {
"message": "前往 bitwarden.com 吗?"
@@ -2180,13 +2180,13 @@
"message": "保存表单。"
},
"twoFactorYubikeyWarning": {
- "message": "由于平台的限制,YubiKey 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在无法使用 YubiKey 时可以访问您的账户。支持的平台:"
+ "message": "由于平台限制,YubiKey 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在无法使用 YubiKey 时可以访问您的账户。支持的平台:"
},
"twoFactorYubikeySupportUsb": {
"message": "具有可使用 YubiKey 的 USB 端口的设备上的网页版密码库、桌面应用程序、CLI 以及浏览器扩展。"
},
"twoFactorYubikeySupportMobile": {
- "message": "具有 NFC 功能或可使用 YubiKey 的数据端口的设备上的移动应用程序。"
+ "message": "具有 NFC 功能或可使用 YubiKey 的数据端口的设备上的移动 App。"
},
"yubikeyX": {
"message": "YubiKey $INDEX$",
@@ -2231,7 +2231,7 @@
"message": "禁用全部钥匙"
},
"twoFactorDuoDesc": {
- "message": "输入 Duo 管理面板提供的 Bitwarden 应用信息。"
+ "message": "输入 Duo 管理面板提供的 Bitwarden 应用程序信息。"
},
"twoFactorDuoClientId": {
"message": "Client ID"
@@ -2282,7 +2282,7 @@
"message": "保存表单。"
},
"twoFactorU2fWarning": {
- "message": "由于平台的限制,FIDO U2F 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在无法使用 FIDO U2F 时可以访问您的账户。支持的平台:"
+ "message": "由于平台限制,FIDO U2F 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在无法使用 FIDO U2F 时可以访问您的账户。支持的平台:"
},
"twoFactorU2fSupportWeb": {
"message": "桌面/笔记本电脑上支持 U2F 的浏览器(启用了 FIDO U2F 的 Chrome、Opera、Vivaldi 或 Firefox)中的网页版密码库和浏览器扩展。"
@@ -2297,7 +2297,7 @@
"message": "读取安全钥匙时出现问题,请重试。"
},
"twoFactorWebAuthnWarning": {
- "message": "由于平台限制,无法在所有 Bitwarden 应用程序中使用 WebAuthn。您应该启用另一个两步登录提供程序,以便在 WebAuthn 无法使用时可以访问您的账户。支持的平台有:"
+ "message": "由于平台限制,WebAuthn 不能在所有 Bitwarden 应用程序上使用。您应该启用另一个两步登录提供程序,以便在 WebAuthn 无法使用时可以访问您的账户。支持的平台有:"
},
"twoFactorWebAuthnSupportWeb": {
"message": "桌面/笔记本电脑上支持 WebAuthn 的浏览器(启用了 FIDO U2F 的 Chrome、Opera、Vivaldi 或 Firefox)中的网页密码库和浏览器扩展。"
@@ -3294,7 +3294,7 @@
"message": "管理员"
},
"adminDesc": {
- "message": "管理组织访问权限,所有集合,成员,报告以及安全设置"
+ "message": "管理组织的访问权限,所有集合、成员、报告,以及安全设置"
},
"user": {
"message": "用户"
@@ -4286,7 +4286,7 @@
"message": "为了提高安全性,我们更改了加密方案。请在下方输入您的主密码以立即更新您的加密密钥。"
},
"updateEncryptionKeyWarning": {
- "message": "更新加密密钥后,您需要注销所有正在使用的 Bitwarden 应用(比如移动 App 或者浏览器扩展)后重新登录。注销或者重新登录(这将下载新的加密密钥)失败可能会导致数据损坏。我们会尝试自动为您注销,但是,可能会有所延迟。"
+ "message": "更新加密密钥后,您需要注销所有正在使用的 Bitwarden 应用程序(比如移动 App 或者浏览器扩展)后重新登录。注销或者重新登录(这将下载新的加密密钥)失败可能会导致数据损坏。我们会尝试自动为您注销,但是,可能会有所延迟。"
},
"updateEncryptionKeyExportWarning": {
"message": "您保存的任何已加密导出也将变为无效。"
@@ -4304,7 +4304,7 @@
"message": "升级组织"
},
"upgradeOrganizationDesc": {
- "message": "本功能对免费组织不可用。切换到付费计划以解锁更多功能。"
+ "message": "此功能不适用于免费组织。请切换到付费计划以解锁更多功能。"
},
"createOrganizationStep1": {
"message": "创建组织:第一步"
@@ -4514,7 +4514,7 @@
"message": "您的 API 密钥可用于在 Bitwarden CLI 中进行身份验证。"
},
"userApiKeyWarning": {
- "message": "您的 API 密钥是另一套等效的身份验证机制。请严格保密。"
+ "message": "您的 API 密钥是一种替代身份验证机制。请严格保密。"
},
"oauth2ClientCredentials": {
"message": "OAuth 2.0 客户端凭据",
@@ -4707,7 +4707,7 @@
"message": "包括 VAT/GST 信息(可选)"
},
"taxIdNumber": {
- "message": "VAT/GST 税号"
+ "message": "VAT/GST 税务 ID"
},
"taxInfoUpdated": {
"message": "税务信息已更新。"
@@ -5998,16 +5998,16 @@
"message": "最小入站签名算法"
},
"spWantAssertionsSigned": {
- "message": "希望断言被签名"
+ "message": "要求使用签名的断言"
},
"spValidateCertificates": {
"message": "验证证书"
},
"spUniqueEntityId": {
- "message": "设置一个唯一的 SP 实体 ID"
+ "message": "设置专属的 SP 实体 ID"
},
"spUniqueEntityIdDesc": {
- "message": "生成您的组织独有的标识符"
+ "message": "为您的组织生成专属的标识符"
},
"idpEntityId": {
"message": "实体 ID"
@@ -8061,7 +8061,7 @@
}
},
"masterPasswordMinimumlength": {
- "message": "主密码长度最少为 $LENGTH$ 个字符。",
+ "message": "主密码长度必须至少为 $LENGTH$ 个字符。",
"placeholders": {
"length": {
"content": "$1",
@@ -8077,7 +8077,7 @@
"message": "忽略"
},
"notAvailableForFreeOrganization": {
- "message": "免费组织不能使用此功能。请联系您的组织所有者寻求升级。"
+ "message": "此功能不适用于免费组织。请联系您的组织所有者寻求升级。"
},
"smProjectSecretsNoItemsNoAccess": {
"message": "请联系您的组织的管理员来管理此工程的机密。",
@@ -9058,7 +9058,7 @@
"message": "使用适合您平台的实施指南为 Bitwarden 配置设备管理。"
},
"integrationCardTooltip": {
- "message": "启动 $INTEGRATION$ 实施指南。",
+ "message": "打开 $INTEGRATION$ 实施指南。",
"placeholders": {
"integration": {
"content": "$1",
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "更新了税务信息"
},
+ "billingInvalidTaxIdError": {
+ "message": "无效的税务 ID,如有疑问,请联系支持。"
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "我们无法验证您的税务 ID,如有疑问,请联系支持。"
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "无效的税务 ID,如有疑问,请联系支持。"
+ },
+ "billingPreviewInvoiceError": {
+ "message": "预览账单时出错。请稍后再试。"
+ },
"unverified": {
"message": "未验证"
},
@@ -9891,7 +9903,7 @@
"message": "设置两步登录"
},
"newDeviceVerificationNoticeContentPage1": {
- "message": "从 2025 年 02 月开始,Bitwarden 将向您的账户电子邮箱发送一个代码,以验证来自新设备的登录。"
+ "message": "从 2025 年 02 月起,当有来自新设备的登录时,Bitwarden 将向您的账户电子邮箱发送验证码。"
},
"newDeviceVerificationNoticeContentPage2": {
"message": "您可以设置两步登录作为保护账户的替代方法,或将您的电子邮箱更改为您可以访问的电子邮箱。"
@@ -9900,7 +9912,7 @@
"message": "稍后提醒我"
},
"newDeviceVerificationNoticePageOneFormContent": {
- "message": "您能可靠地访问您的电子邮箱 $EMAIL$ 吗?",
+ "message": "您能正常访问您的电子邮箱 $EMAIL$ 吗?",
"placeholders": {
"email": {
"content": "$1",
@@ -9912,7 +9924,7 @@
"message": "不,我不能"
},
"newDeviceVerificationNoticePageOneEmailAccessYes": {
- "message": "是的,我可以可靠地访问我的电子邮箱"
+ "message": "是的,我可以正常访问我的电子邮箱"
},
"turnOnTwoStepLogin": {
"message": "开启两步登录"
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "组织名称不能超过 50 个字符。"
+ },
+ "resellerRenewalWarning": {
+ "message": "您的订阅即将续订。为确保服务不中断,请在 $RENEWAL_DATE$ 之前联系 $RESELLER$ 确认您的续订。",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "您的订阅账单已于 $ISSUED_DATE$ 开具。为确保服务不中断,请在 $DUE_DATE$ 之前联系 $RESELLER$ 确认您的续订。",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "您的订阅账单尚未支付。为确保服务不中断,请在 $GRACE_PERIOD_END$ 之前联系 $RESELLER$ 确认您的续订。",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/apps/web/src/locales/zh_TW/messages.json b/apps/web/src/locales/zh_TW/messages.json
index bf15ea2a20a..ae60ea3cdb7 100644
--- a/apps/web/src/locales/zh_TW/messages.json
+++ b/apps/web/src/locales/zh_TW/messages.json
@@ -9271,6 +9271,18 @@
"updatedTaxInformation": {
"message": "已更新稅務資訊"
},
+ "billingInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingTaxIdTypeInferenceError": {
+ "message": "We were unable to validate your tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvalidTaxIdError": {
+ "message": "Invalid tax ID, if you believe this is an error please contact support."
+ },
+ "billingPreviewInvoiceError": {
+ "message": "An error occurred while previewing the invoice. Please try again later."
+ },
"unverified": {
"message": "未驗證"
},
@@ -10007,5 +10019,48 @@
},
"organizationNameMaxLength": {
"message": "Organization name cannot exceed 50 characters."
+ },
+ "resellerRenewalWarning": {
+ "message": "Your subscription will renew soon. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $RENEWAL_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "renewal_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ }
+ }
+ },
+ "resellerOpenInvoiceWarning": {
+ "message": "An invoice for your subscription was issued on $ISSUED_DATE$. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $DUE_DATE$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "issued_date": {
+ "content": "$2",
+ "example": "01/01/2024"
+ },
+ "due_date": {
+ "content": "$3",
+ "example": "01/15/2024"
+ }
+ }
+ },
+ "resellerPastDueWarning": {
+ "message": "The invoice for your subscription has not been paid. To insure uninterrupted service, contact $RESELLER$ to confirm your renewal before $GRACE_PERIOD_END$.",
+ "placeholders": {
+ "reseller": {
+ "content": "$1",
+ "example": "Reseller Name"
+ },
+ "grace_period_end": {
+ "content": "$2",
+ "example": "02/14/2024"
+ }
+ }
}
}
diff --git a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/risk-insights-report.service.ts b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/risk-insights-report.service.ts
index c5e9e3625de..1a01905ed74 100644
--- a/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/risk-insights-report.service.ts
+++ b/bitwarden_license/bit-common/src/tools/reports/risk-insights/services/risk-insights-report.service.ts
@@ -291,10 +291,11 @@ export class RiskInsightsReportService {
} as ApplicationHealthReportDetail;
if (isAtRisk) {
- (reportDetail.atRiskPasswordCount = reportDetail.atRiskPasswordCount + 1),
- (reportDetail.atRiskMemberDetails = this.getUniqueMembers(
- reportDetail.atRiskMemberDetails.concat(newUriDetail.cipherMembers),
- ));
+ reportDetail.atRiskPasswordCount = reportDetail.atRiskPasswordCount + 1;
+ reportDetail.atRiskMemberDetails = this.getUniqueMembers(
+ reportDetail.atRiskMemberDetails.concat(newUriDetail.cipherMembers),
+ );
+ reportDetail.atRiskMemberCount += reportDetail.atRiskMemberDetails.length;
}
reportDetail.memberCount = reportDetail.memberDetails.length;
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.html b/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.html
index 33a20444c2b..74aa468c42e 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.html
+++ b/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.html
@@ -29,7 +29,7 @@
-
+
{{ "submit" | i18n }}
diff --git a/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.ts b/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.ts
index 46fd6989681..f773db6c11c 100644
--- a/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.ts
+++ b/bitwarden_license/bit-web/src/app/admin-console/providers/setup/setup.component.ts
@@ -111,9 +111,7 @@ export class SetupComponent implements OnInit, OnDestroy {
try {
this.formGroup.markAllAsTouched();
- const formIsValid = this.formGroup.valid && this.manageTaxInformationComponent.touch();
-
- if (!formIsValid) {
+ if (!this.manageTaxInformationComponent.validate() || !this.formGroup.valid) {
return;
}
@@ -131,14 +129,11 @@ export class SetupComponent implements OnInit, OnDestroy {
request.taxInfo.country = taxInformation.country;
request.taxInfo.postalCode = taxInformation.postalCode;
-
- if (taxInformation.includeTaxId) {
- request.taxInfo.taxId = taxInformation.taxId;
- request.taxInfo.line1 = taxInformation.line1;
- request.taxInfo.line2 = taxInformation.line2;
- request.taxInfo.city = taxInformation.city;
- request.taxInfo.state = taxInformation.state;
- }
+ request.taxInfo.taxId = taxInformation.taxId;
+ request.taxInfo.line1 = taxInformation.line1;
+ request.taxInfo.line2 = taxInformation.line2;
+ request.taxInfo.city = taxInformation.city;
+ request.taxInfo.state = taxInformation.state;
const provider = await this.providerApiService.postProviderSetup(this.providerId, request);
diff --git a/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.html b/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.html
index 0b041bd4c06..3f635656fb7 100644
--- a/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.html
+++ b/libs/angular/src/billing/components/manage-tax-information/manage-tax-information.component.html
@@ -1,7 +1,7 @@