@cosmicdrift/kumiko-locale-de 0.316.0 → 0.318.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/src/__tests__/en-catalog.ts +40 -0
- package/src/__tests__/formal.test.ts +9 -0
- package/src/formal.ts +3 -0
- package/src/strings.ts +41 -0
- package/src/web.ts +16 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-locale-de",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.318.0",
|
|
4
4
|
"description": "German UI and mail copy for Kumiko framework screens. Opt in by mounting localeDe() + localeDeClient().",
|
|
5
5
|
"license": "BUSL-1.1",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@cosmicdrift/kumiko-framework": "0.
|
|
31
|
+
"@cosmicdrift/kumiko-framework": "0.318.0"
|
|
32
32
|
},
|
|
33
33
|
"publishConfig": {
|
|
34
34
|
"registry": "https://registry.npmjs.org",
|
|
@@ -276,6 +276,43 @@ export const frameworkEnCatalog: Readonly<Record<string, string>> = {
|
|
|
276
276
|
"auth.verifyEmail.successBody": "Thanks! You can sign in now.",
|
|
277
277
|
"auth.verifyEmail.successTitle": "Email verified",
|
|
278
278
|
"auth.verifyEmail.verifying": "Verifying email …",
|
|
279
|
+
"billing-foundation.errors.alreadyOnPlan": "This tenant is already on that plan.",
|
|
280
|
+
"billing-foundation.errors.foreignProviderCustomer":
|
|
281
|
+
"This customer account does not belong to your tenant.",
|
|
282
|
+
"billing-foundation.errors.noActiveSubscription":
|
|
283
|
+
"This tenant has no active subscription to switch.",
|
|
284
|
+
"billing-foundation.errors.planSwitchNotSupported":
|
|
285
|
+
"This provider does not support switching plans.",
|
|
286
|
+
"billing-foundation.errors.planTiersShareProduct":
|
|
287
|
+
"Each plan needs its own Stripe product. Contact support.",
|
|
288
|
+
"billing-foundation.errors.priceUnavailable": "This plan's price is temporarily unavailable.",
|
|
289
|
+
"billing-foundation.errors.providerHasNoPriceCatalog":
|
|
290
|
+
"This provider has no known prices configured.",
|
|
291
|
+
"billing-foundation.errors.providerMismatch":
|
|
292
|
+
"This tenant's subscription is on a different provider than the plan catalog. Contact support to migrate.",
|
|
293
|
+
"billing-foundation.errors.redirectOriginNotAllowed":
|
|
294
|
+
"This redirect URL is not allowed for this app.",
|
|
295
|
+
"billing-foundation.errors.subscriptionExists":
|
|
296
|
+
"This tenant already has an active subscription. Switch plans instead.",
|
|
297
|
+
"billing-foundation.errors.unknownPrice": "This price is not recognized.",
|
|
298
|
+
"billing-foundation.plans.billingDisabled":
|
|
299
|
+
"Billing is not active yet. Your current plan stays in place.",
|
|
300
|
+
"billing-foundation.plans.choose": "Choose {plan}",
|
|
301
|
+
"billing-foundation.plans.currentPlan": "Current plan",
|
|
302
|
+
"billing-foundation.plans.everyInterval.day": "every {count} days",
|
|
303
|
+
"billing-foundation.plans.everyInterval.month": "every {count} months",
|
|
304
|
+
"billing-foundation.plans.everyInterval.week": "every {count} weeks",
|
|
305
|
+
"billing-foundation.plans.everyInterval.year": "every {count} years",
|
|
306
|
+
"billing-foundation.plans.manage": "Manage subscription",
|
|
307
|
+
"billing-foundation.plans.paymentPending": "Payment is still being completed.",
|
|
308
|
+
"billing-foundation.plans.perInterval.day": "/ day",
|
|
309
|
+
"billing-foundation.plans.perInterval.month": "/ month",
|
|
310
|
+
"billing-foundation.plans.perInterval.week": "/ week",
|
|
311
|
+
"billing-foundation.plans.perInterval.year": "/ year",
|
|
312
|
+
"billing-foundation.plans.priceUnavailable": "Price not available",
|
|
313
|
+
"billing-foundation.plans.purchaseNotAllowed": "Only administrators can change the plan.",
|
|
314
|
+
"billing-foundation.plans.subscriptionPending": "Your plan change is being processed.",
|
|
315
|
+
"billing-foundation.plans.switch": "Switch to {plan}",
|
|
279
316
|
"cap-counter:entity:cap-counter:field:capName": "Cap",
|
|
280
317
|
"cap-counter:entity:cap-counter:field:lastSoftWarnedAt": "Last soft warning",
|
|
281
318
|
"cap-counter:entity:cap-counter:field:periodStart": "Period start",
|
|
@@ -573,6 +610,8 @@ export const frameworkEnCatalog: Readonly<Record<string, string>> = {
|
|
|
573
610
|
"kumiko.widget.drawer.restore": "Restore drawer width",
|
|
574
611
|
"kumiko.widget.error.title": "Couldn't load.",
|
|
575
612
|
"kumiko.widget.loading": "Loading…",
|
|
613
|
+
"kumiko.planCard.current": "Current plan",
|
|
614
|
+
"kumiko.planCard.priceUnavailable": "Price not available",
|
|
576
615
|
"kumiko.widget.step-bar.done": "Done",
|
|
577
616
|
"kumiko.widget.upload.done": "Uploaded",
|
|
578
617
|
"kumiko.widget.upload.error": "Failed",
|
|
@@ -682,6 +721,7 @@ export const frameworkEnCatalog: Readonly<Record<string, string>> = {
|
|
|
682
721
|
"screen:auth-mfa-disable.title": "Disable two-factor authentication",
|
|
683
722
|
"screen:auth-mfa-enable.title": "Two-factor authentication",
|
|
684
723
|
"screen:auth-mfa-regenerate-recovery.title": "Generate new recovery codes",
|
|
724
|
+
"screen:billing-plans.title": "Billing",
|
|
685
725
|
"screen:branding-settings.title": "Branding",
|
|
686
726
|
"screen:cap-list.title": "Usage caps",
|
|
687
727
|
"screen:delivery-log.title": "Delivery log",
|
|
@@ -42,6 +42,15 @@ describe("locale-de formal overrides", () => {
|
|
|
42
42
|
);
|
|
43
43
|
});
|
|
44
44
|
|
|
45
|
+
test("localeDeClient always ships the formal overrides under de-x-formal", () => {
|
|
46
|
+
for (const address of ["informal", "formal"] as const) {
|
|
47
|
+
const formal = localeDeClient({ address }).translations["de-x-formal"];
|
|
48
|
+
expect(formal["auth.resetPassword.intro"]).toBe(
|
|
49
|
+
localeDeFormalOverrides["auth.resetPassword.intro"],
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
45
54
|
test("localeDeClient defaults to informal and switches to formal on request", () => {
|
|
46
55
|
expect(localeDeClient().translations["de"]["auth.resetPassword.intro"]).toBe(
|
|
47
56
|
"Wähle ein neues Passwort mit mindestens 8 Zeichen.",
|
package/src/formal.ts
CHANGED
|
@@ -82,6 +82,9 @@ export const localeDeFormalOverrides: Readonly<Record<string, string>> = {
|
|
|
82
82
|
"auth.verifyEmail.errorBody":
|
|
83
83
|
"Der Link ist ungültig oder abgelaufen. Bitte fordern Sie eine neue Bestätigungs-Mail an.",
|
|
84
84
|
"auth.verifyEmail.successBody": "Danke! Sie können sich jetzt anmelden.",
|
|
85
|
+
"billing-foundation.plans.billingDisabled":
|
|
86
|
+
"Die Abrechnung ist noch nicht aktiv. Ihr aktueller Tarif bleibt bestehen.",
|
|
87
|
+
"billing-foundation.plans.subscriptionPending": "Ihr Tarifwechsel wird gerade verarbeitet.",
|
|
85
88
|
"custom-fields.form.createMode": "Speichern Sie zuerst den Eintrag, um Custom-Felder zu setzen.",
|
|
86
89
|
"dispatcher.errors.network":
|
|
87
90
|
"Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut.",
|
package/src/strings.ts
CHANGED
|
@@ -288,6 +288,44 @@ export const localeDeBundle: Readonly<Record<string, string>> = {
|
|
|
288
288
|
"auth.verifyEmail.successBody": "Danke! Du kannst dich jetzt anmelden.",
|
|
289
289
|
"auth.verifyEmail.successTitle": "E-Mail bestätigt",
|
|
290
290
|
"auth.verifyEmail.verifying": "E-Mail wird bestätigt …",
|
|
291
|
+
"billing-foundation.errors.alreadyOnPlan": "Dieser Mandant ist bereits auf diesem Tarif.",
|
|
292
|
+
"billing-foundation.errors.foreignProviderCustomer":
|
|
293
|
+
"Dieses Kundenkonto gehört nicht zu diesem Mandanten.",
|
|
294
|
+
"billing-foundation.errors.noActiveSubscription":
|
|
295
|
+
"Dieser Mandant hat kein aktives Abo zum Wechseln.",
|
|
296
|
+
"billing-foundation.errors.planSwitchNotSupported":
|
|
297
|
+
"Dieser Anbieter unterstützt keinen Tarifwechsel.",
|
|
298
|
+
"billing-foundation.errors.planTiersShareProduct":
|
|
299
|
+
"Jeder Tarif braucht ein eigenes Stripe-Produkt. Bitte den Support kontaktieren.",
|
|
300
|
+
"billing-foundation.errors.priceUnavailable":
|
|
301
|
+
"Der Preis dieses Tarifs ist vorübergehend nicht verfügbar.",
|
|
302
|
+
"billing-foundation.errors.providerHasNoPriceCatalog":
|
|
303
|
+
"Für diesen Anbieter sind keine Preise konfiguriert.",
|
|
304
|
+
"billing-foundation.errors.providerMismatch":
|
|
305
|
+
"Das Abo dieses Mandanten läuft über einen anderen Anbieter als der Tarifkatalog. Bitte den Support für eine Migration kontaktieren.",
|
|
306
|
+
"billing-foundation.errors.redirectOriginNotAllowed":
|
|
307
|
+
"Diese Weiterleitungs-URL ist für diese App nicht erlaubt.",
|
|
308
|
+
"billing-foundation.errors.subscriptionExists":
|
|
309
|
+
"Dieser Mandant hat bereits ein aktives Abo. Wechsle stattdessen den Tarif.",
|
|
310
|
+
"billing-foundation.errors.unknownPrice": "Dieser Preis ist nicht bekannt.",
|
|
311
|
+
"billing-foundation.plans.billingDisabled":
|
|
312
|
+
"Die Abrechnung ist noch nicht aktiv. Dein aktueller Tarif bleibt bestehen.",
|
|
313
|
+
"billing-foundation.plans.choose": "{plan} wählen",
|
|
314
|
+
"billing-foundation.plans.currentPlan": "Aktueller Tarif",
|
|
315
|
+
"billing-foundation.plans.everyInterval.day": "alle {count} Tage",
|
|
316
|
+
"billing-foundation.plans.everyInterval.month": "alle {count} Monate",
|
|
317
|
+
"billing-foundation.plans.everyInterval.week": "alle {count} Wochen",
|
|
318
|
+
"billing-foundation.plans.everyInterval.year": "alle {count} Jahre",
|
|
319
|
+
"billing-foundation.plans.manage": "Abo verwalten",
|
|
320
|
+
"billing-foundation.plans.paymentPending": "Zahlung wird noch abgeschlossen.",
|
|
321
|
+
"billing-foundation.plans.perInterval.day": "/ Tag",
|
|
322
|
+
"billing-foundation.plans.perInterval.month": "/ Monat",
|
|
323
|
+
"billing-foundation.plans.perInterval.week": "/ Woche",
|
|
324
|
+
"billing-foundation.plans.perInterval.year": "/ Jahr",
|
|
325
|
+
"billing-foundation.plans.priceUnavailable": "Preis nicht verfügbar",
|
|
326
|
+
"billing-foundation.plans.purchaseNotAllowed": "Nur Administratoren können den Tarif ändern.",
|
|
327
|
+
"billing-foundation.plans.subscriptionPending": "Dein Tarifwechsel wird gerade verarbeitet.",
|
|
328
|
+
"billing-foundation.plans.switch": "Zu {plan} wechseln",
|
|
291
329
|
"cap-counter:entity:cap-counter:field:capName": "Limit",
|
|
292
330
|
"cap-counter:entity:cap-counter:field:lastSoftWarnedAt": "Letzte Soft-Warnung",
|
|
293
331
|
"cap-counter:entity:cap-counter:field:periodStart": "Periodenstart",
|
|
@@ -591,6 +629,8 @@ export const localeDeBundle: Readonly<Record<string, string>> = {
|
|
|
591
629
|
"kumiko.widget.drawer.restore": "Drawer-Breite zurücksetzen",
|
|
592
630
|
"kumiko.widget.error.title": "Konnte nicht geladen werden.",
|
|
593
631
|
"kumiko.widget.loading": "Lade…",
|
|
632
|
+
"kumiko.planCard.current": "Aktueller Tarif",
|
|
633
|
+
"kumiko.planCard.priceUnavailable": "Preis nicht verfügbar",
|
|
594
634
|
"kumiko.widget.step-bar.done": "Erledigt",
|
|
595
635
|
"kumiko.widget.upload.done": "Hochgeladen",
|
|
596
636
|
"kumiko.widget.upload.error": "Fehlgeschlagen",
|
|
@@ -701,6 +741,7 @@ export const localeDeBundle: Readonly<Record<string, string>> = {
|
|
|
701
741
|
"screen:auth-mfa-disable.title": "Zwei-Faktor-Authentifizierung deaktivieren",
|
|
702
742
|
"screen:auth-mfa-enable.title": "Zwei-Faktor-Authentifizierung",
|
|
703
743
|
"screen:auth-mfa-regenerate-recovery.title": "Neue Recovery-Codes erzeugen",
|
|
744
|
+
"screen:billing-plans.title": "Abrechnung",
|
|
704
745
|
"screen:branding-settings.title": "Branding",
|
|
705
746
|
"screen:cap-list.title": "Nutzungslimits",
|
|
706
747
|
"screen:delivery-log.title": "Zustellprotokoll",
|
package/src/web.ts
CHANGED
|
@@ -1,15 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { formalLocaleTag } from "@cosmicdrift/kumiko-framework/ui-types";
|
|
2
|
+
import { type GermanAddress, germanBundleFor, localeDeFormalOverrides } from "./formal";
|
|
2
3
|
import { localeDeBundle } from "./strings";
|
|
3
4
|
|
|
4
5
|
export type { GermanAddress };
|
|
5
6
|
export { localeDeBundle };
|
|
6
7
|
|
|
8
|
+
const GERMAN = "de" as const;
|
|
9
|
+
const GERMAN_FORMAL = formalLocaleTag(GERMAN);
|
|
10
|
+
|
|
11
|
+
// `address` sets the default wording under "de"; the formal overrides are
|
|
12
|
+
// always shipped under "de-x-formal" too, so a surface wrapped in
|
|
13
|
+
// FormalityProvider("formal") says "Sie" even when the app default is "du".
|
|
7
14
|
export function localeDeClient(options?: { readonly address?: GermanAddress }): {
|
|
8
15
|
readonly name: "locale-de";
|
|
9
|
-
readonly translations: {
|
|
16
|
+
readonly translations: {
|
|
17
|
+
readonly [GERMAN]: Readonly<Record<string, string>>;
|
|
18
|
+
readonly [GERMAN_FORMAL]: Readonly<Record<string, string>>;
|
|
19
|
+
};
|
|
10
20
|
} {
|
|
11
21
|
return {
|
|
12
22
|
name: "locale-de",
|
|
13
|
-
translations: {
|
|
23
|
+
translations: {
|
|
24
|
+
[GERMAN]: germanBundleFor(options?.address ?? "informal"),
|
|
25
|
+
[GERMAN_FORMAL]: localeDeFormalOverrides,
|
|
26
|
+
},
|
|
14
27
|
};
|
|
15
28
|
}
|