From 641884ecdf7748a0d47f57458eb033fe2e935c3a Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 11:40:11 +0200
Subject: [PATCH 001/122] add switchmap
---
src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts b/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts
index abee27205d..14f961250f 100644
--- a/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts
@@ -14,4 +14,5 @@ export {
of,
lastValueFrom,
firstValueFrom,
+ switchMap,
} from 'rxjs';
From 22a88d2a529708575ace39eb1c735aacc87fdf8a Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 11:40:35 +0200
Subject: [PATCH 002/122] add types for translation manifest
---
.../src/libs/extension-api/types.ts | 9 +++++++
.../core/extension-registry/models/index.ts | 2 ++
.../models/translations.model.ts | 26 +++++++++++++++++++
3 files changed, 37 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts
index c8545bb46d..f546cfefcf 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts
@@ -100,6 +100,15 @@ export interface ManifestClassWithClassConstructor extends Manifest
class: ClassConstructor;
}
+export interface ManifestDefaultExport extends ManifestWithLoader<{ default: T }> {
+ /**
+ * The file location of the javascript file to load
+ *
+ * @TJS-require
+ */
+ js?: string;
+}
+
export interface ManifestElement
extends ManifestWithLoader<{ default: ClassConstructor } | Omit> {
/**
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts
index 7c2d350740..fd0f09fc1f 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts
@@ -20,6 +20,7 @@ import type { ManifestSectionView } from './section-view.model.js';
import type { ManifestStore, ManifestTreeStore, ManifestItemStore } from './store.model.js';
import type { ManifestTheme } from './theme.model.js';
import type { ManifestTinyMcePlugin } from './tinymce-plugin.model.js';
+import type { ManifestTranslations } from './translations.model.js';
import type { ManifestTree } from './tree.model.js';
import type { ManifestTreeItem } from './tree-item.model.js';
import type { ManifestUserProfileApp } from './user-profile-app.model.js';
@@ -89,6 +90,7 @@ export type ManifestTypes =
| ManifestStore
| ManifestTheme
| ManifestTinyMcePlugin
+ | ManifestTranslations
| ManifestTree
| ManifestTreeItem
| ManifestTreeStore
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
new file mode 100644
index 0000000000..aa2afbd8a9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
@@ -0,0 +1,26 @@
+import type { ManifestDefaultExport } from '@umbraco-cms/backoffice/extension-api';
+
+export interface ManifestTranslations extends ManifestDefaultExport>> {
+ type: 'translations';
+ meta: MetaTranslations;
+}
+
+export interface MetaTranslations {
+ /**
+ * The culture of the translations.
+ * @example "en-US"
+ */
+ culture: string;
+
+ /**
+ * The translations.
+ * @example
+ * {
+ * "general": {
+ * "cancel": "Cancel",
+ * "close": "Close"
+ * }
+ * }
+ */
+ translations?: Record>;
+}
From ffe6e9eb56d100657c1486b2de06e13c12ba5544 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 11:40:42 +0200
Subject: [PATCH 003/122] add path
---
src/Umbraco.Web.UI.Client/tsconfig.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json
index d9e5e30ef8..08e457c693 100644
--- a/src/Umbraco.Web.UI.Client/tsconfig.json
+++ b/src/Umbraco.Web.UI.Client/tsconfig.json
@@ -35,6 +35,7 @@
"@umbraco-cms/backoffice/controller-api": ["src/libs/controller-api"],
"@umbraco-cms/backoffice/element-api": ["src/libs/element-api"],
"@umbraco-cms/backoffice/extension-api": ["src/libs/extension-api"],
+ "@umbraco-cms/backoffice/localization-api": ["src/libs/localization-api"],
"@umbraco-cms/backoffice/observable-api": ["src/libs/observable-api"],
// SHARED
From 3ba73f9023ddcbebe7203afced7718631503fc1d Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 11:40:52 +0200
Subject: [PATCH 004/122] add translation registry
---
.../src/libs/localization-api/index.ts | 1 +
.../registry/translation.registry.ts | 76 +++++++++++++++++++
2 files changed, 77 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
new file mode 100644
index 0000000000..adc93acd1a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
@@ -0,0 +1 @@
+export * from './registry/translation.registry.js';
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
new file mode 100644
index 0000000000..aa3b91720a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -0,0 +1,76 @@
+import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
+import { ReplaySubject } from '@umbraco-cms/backoffice/external/rxjs';
+
+export type UmbTranslationDictionary = Map;
+
+export class UmbTranslationRegistry {
+ #innerDictionary = new ReplaySubject(1);
+ #innerDictionaryValue: UmbTranslationDictionary = new Map();
+
+ get translations() {
+ return this.#innerDictionary.asObservable();
+ }
+
+ register(userCulture: string, fallbackCulture = 'en') {
+ // Reset the inner dictionary.
+ this.#innerDictionaryValue = new Map();
+
+ // Load new translations
+ umbExtensionsRegistry.extensionsOfType('translations').subscribe(async (extensions) => {
+ console.log(
+ '🚀 ~ file: translation.registry.ts:13 ~ UmbTranslationRegistry ~ this.#umbExtensionRegistry.extensionsOfType ~ extension:',
+ extensions,
+ userCulture,
+ fallbackCulture
+ );
+
+ await Promise.all(
+ extensions
+ .filter((x) => x.meta.culture === userCulture || x.meta.culture === fallbackCulture)
+ .map(async (extension) => {
+ // If extension contains a dictionary, add it to the inner dictionary.
+ if (extension.meta.translations) {
+ for (const [dictionaryName, dictionary] of Object.entries(extension.meta.translations)) {
+ this.#addOrUpdateDictionary(dictionaryName, dictionary);
+ }
+ }
+
+ // If extension contains a js file, load it and add the default dictionary to the inner dictionary.
+ if (extension.loader) {
+ const loader = await extension.loader();
+ if (loader.default) {
+ for (const [dictionaryName, dictionary] of Object.entries(loader.default)) {
+ this.#addOrUpdateDictionary(dictionaryName, dictionary);
+ }
+ }
+ }
+
+ // If extension contains a json file, load it and add the default dictionary to the inner dictionary.
+ if (extension.js) {
+ const js = await import(extension.js);
+ if (js.default) {
+ for (const [dictionaryName, dictionary] of Object.entries(js.default)) {
+ if (dictionary && typeof dictionary === 'object') {
+ this.#addOrUpdateDictionary(dictionaryName, dictionary as Record);
+ }
+ }
+ }
+ }
+ })
+ );
+ this.#innerDictionary.next(this.#innerDictionaryValue);
+ console.log(
+ '🚀 ~ file: translation.registry.ts:61 ~ UmbTranslationRegistry ~ this.#umbExtensionRegistry.extensionsOfType ~ innerDictionary:',
+ this.#innerDictionaryValue
+ );
+ });
+ }
+
+ #addOrUpdateDictionary(dictionaryName: string, dictionary: Record) {
+ for (const [key, value] of Object.entries(dictionary)) {
+ this.#innerDictionaryValue.set(`${dictionaryName}_${key}`, value);
+ }
+ }
+}
+
+export const umbTranslationRegistry = new UmbTranslationRegistry();
From 470cd4584824502087e2553cd8ed1737fda5fae9 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 11:41:14 +0200
Subject: [PATCH 005/122] add element and context to handle translations
---
.../src/packages/core/localization/index.ts | 3 +
.../packages/core/localization/lang/en.json | 5 ++
.../core/localization/localization.context.ts | 33 +++++++++
.../core/localization/localize.element.ts | 73 +++++++++++++++++++
.../packages/core/localization/manifests.ts | 17 +++++
5 files changed, 131 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/localization/lang/en.json
create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/localization/localization.context.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts
new file mode 100644
index 0000000000..ce27b7a269
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts
@@ -0,0 +1,3 @@
+export * from './localization.context.js';
+
+import './localize.element.js';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/lang/en.json b/src/Umbraco.Web.UI.Client/src/packages/core/localization/lang/en.json
new file mode 100644
index 0000000000..a56dd6159c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/lang/en.json
@@ -0,0 +1,5 @@
+{
+ "general": {
+ "logout": "Log out"
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localization.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localization.context.ts
new file mode 100644
index 0000000000..60f8f78b47
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localization.context.ts
@@ -0,0 +1,33 @@
+import { umbTranslationRegistry } from '@umbraco-cms/backoffice/localization-api';
+import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
+import { map, of, switchMap, type Observable } from '@umbraco-cms/backoffice/external/rxjs';
+
+export class UmbLocalizationContext {
+ get translations() {
+ return umbTranslationRegistry.translations;
+ }
+
+ /**
+ * Localize a key.
+ * If the key is not found, the fallback is returned.
+ * If the fallback is not provided, the key is returned.
+ * @param key The key to localize. The key is case sensitive.
+ * @param fallback The fallback text to use if the key is not found (default: undefined).
+ */
+ localize(key: string, fallback?: string): Observable {
+ return this.translations.pipe(map((dictionary) => dictionary.get(key) ?? fallback ?? ''));
+ }
+
+ /**
+ * Localize many keys at once.
+ * If a key is not found, the key is returned.
+ * @description This method combines the results of multiple calls to localize.
+ * @param keys
+ * @see localize
+ */
+ localizeMany(keys: string[]): Observable {
+ return of(...keys).pipe(switchMap((key) => this.localize(key)));
+ }
+}
+
+export const UMB_LOCALIZATION_CONTEXT = new UmbContextToken('UmbLocalizationContext');
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
new file mode 100644
index 0000000000..36f958e482
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -0,0 +1,73 @@
+import { UMB_LOCALIZATION_CONTEXT } from './localization.context.js';
+import { customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit';
+import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
+import type { Subscription } from '@umbraco-cms/backoffice/external/rxjs';
+
+/**
+ * This element allows you to localize a string with optional interpolation values.
+ * @element umb-localize
+ */
+@customElement('umb-localize')
+export class UmbLocalizeElement extends UmbLitElement {
+ @property({ type: String })
+ key!: string;
+
+ @state()
+ get value(): string {
+ return this.#value;
+ }
+
+ set value(value: string) {
+ const oldValue = this.#value;
+ this.#value = value;
+ this.requestUpdate('value', oldValue);
+ }
+
+ #value: string = '';
+ #localizationContext?: typeof UMB_LOCALIZATION_CONTEXT.TYPE;
+ #subscription?: Subscription;
+
+ constructor() {
+ super();
+ this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
+ this.#localizationContext = instance;
+ this.#load();
+ });
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this.#load();
+ }
+
+ disconnectedCallback(): void {
+ super.disconnectedCallback();
+ if (this.#subscription) {
+ this.#subscription.unsubscribe();
+ }
+ }
+
+ async #load() {
+ try {
+ if (this.#subscription) {
+ this.#subscription.unsubscribe();
+ }
+
+ this.#subscription = this.#localizationContext!.localize(this.key).subscribe((value) => {
+ this.value = value;
+ });
+ } catch (error: any) {
+ console.error('Failed to localize key:', this.key, error);
+ }
+ }
+
+ render() {
+ return this.value ? html`${this.value}` : html` `;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'umb-localize': UmbLocalizeElement;
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
new file mode 100644
index 0000000000..aeab9438f0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
@@ -0,0 +1,17 @@
+import { ManifestTypes } from '../extension-registry/index.js';
+import { ManifestTranslations } from '../extension-registry/models/translations.model.js';
+
+const translationManifests: Array = [
+ {
+ type: 'translations',
+ alias: 'Umb.Translations.En',
+ weight: -100,
+ name: 'English (UK)',
+ meta: {
+ culture: 'en',
+ },
+ loader: () => import('./lang/en.json'),
+ },
+];
+
+export const manifests: Array = [...translationManifests];
From a0ffdead8c023949ec33decdbde95b2762ead353 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 11:41:27 +0200
Subject: [PATCH 006/122] initialize through backoffice element
---
.../src/apps/backoffice/backoffice.element.ts | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index 983b190c0a..26c98c29da 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -1,3 +1,4 @@
+import { umbTranslationRegistry } from '@umbraco-cms/backoffice/localization-api';
import { UmbExtensionInitializer } from './extension.controller.js';
import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context.js';
import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit';
@@ -7,6 +8,7 @@ import {
UmbBundleExtensionInitializer,
UmbEntryPointExtensionInitializer,
} from '@umbraco-cms/backoffice/extension-api';
+import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import './components/index.js';
@@ -29,15 +31,24 @@ const CORE_PACKAGES = [
@customElement('umb-backoffice')
export class UmbBackofficeElement extends UmbLitElement {
- #extensionInitializer = new UmbExtensionInitializer(this, umbExtensionsRegistry);
+ #extensionInitializer;
constructor() {
super();
this.provideContext(UMB_BACKOFFICE_CONTEXT_TOKEN, new UmbBackofficeContext());
new UmbBundleExtensionInitializer(this, umbExtensionsRegistry);
new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry);
- new UmbExtensionInitializer(this, umbExtensionsRegistry);
+ this.#extensionInitializer = new UmbExtensionInitializer(this, umbExtensionsRegistry);
this.#extensionInitializer.setLocalPackages(CORE_PACKAGES);
+
+ this.consumeContext(UMB_AUTH, (auth) => {
+ this.observe(auth.currentUser, (user) => {
+ if (user) {
+ const languageIsoCode = user.languageIsoCode ?? 'en';
+ umbTranslationRegistry.register(languageIsoCode);
+ }
+ });
+ });
}
render() {
From d843e30200036636f655a3df1128aaf7ee1617fd Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 11:41:34 +0200
Subject: [PATCH 007/122] load initially in core package
---
src/Umbraco.Web.UI.Client/src/packages/core/index.ts | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts
index 22ae66ba90..c282da14d7 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts
@@ -1,5 +1,6 @@
import { UmbBackofficeNotificationContainerElement, UmbBackofficeModalContainerElement } from './components/index.js';
import { manifests as debugManifests } from './debug/manifests.js';
+import { manifests as localizationManifests } from './localization/manifests.js';
import { manifests as propertyActionManifests } from './property-action/manifests.js';
import { manifests as propertyEditorManifests } from './property-editor/manifests.js';
import { manifests as tinyMcePluginManifests } from './property-editor/uis/tiny-mce/plugins/manifests.js';
@@ -7,6 +8,7 @@ import { manifests as workspaceManifests } from './workspace/manifests.js';
import { manifests as modalManifests } from './modal/common/manifests.js';
import { manifests as themeManifests } from './themes/manifests.js';
+import { UMB_LOCALIZATION_CONTEXT, UmbLocalizationContext } from './localization/localization.context.js';
import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification';
import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal';
import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api';
@@ -17,6 +19,7 @@ import {
UmbClassExtensionsInitializer,
} from '@umbraco-cms/backoffice/extension-registry';
+export * from './localization/index.js';
export * from './action/index.js';
export * from './collection/index.js';
export * from './components/index.js';
@@ -42,6 +45,7 @@ export * from './workspace/index.js';
const manifests: Array = [
...debugManifests,
+ ...localizationManifests,
...propertyActionManifests,
...propertyEditorManifests,
...tinyMcePluginManifests,
@@ -61,6 +65,7 @@ export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => {
const modalContainerElement = new UmbBackofficeModalContainerElement();
host.appendChild(modalContainerElement);
+ new UmbContextProviderController(host, UMB_LOCALIZATION_CONTEXT, new UmbLocalizationContext());
new UmbContextProviderController(host, UMB_NOTIFICATION_CONTEXT_TOKEN, new UmbNotificationContext());
new UmbContextProviderController(host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, new UmbModalManagerContext(host));
};
From 418d8774e838eccbd68867453851dc7a15ef34f1 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 13:15:29 +0200
Subject: [PATCH 008/122] use in current-user-modal
---
.../modals/current-user/current-user-modal.element.ts | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
index eb2012cd16..660641e7f2 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
@@ -64,8 +64,12 @@ export class UmbCurrentUserModalElement extends UmbLitElement {
- Close
- Logout
+
+ Close
+
+
+ Log out
+
`;
From accc0284aaf171257e01b26cf5bee7de18180ece Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 13:40:17 +0200
Subject: [PATCH 009/122] move registry to localization-api and provide from
backoffice-element
---
.../src/apps/backoffice/backoffice.element.ts | 13 ++-------
.../src/libs/element-api/element.mixin.ts | 7 +++++
.../src/libs/localization-api/index.ts | 1 +
.../localization-api}/localization.context.ts | 22 +++++++++++++--
.../registry/translation.registry.ts | 11 +++++---
.../src/packages/core/index.ts | 2 --
.../src/packages/core/localization/index.ts | 2 --
.../core/localization/localize.element.ts | 28 +++++--------------
8 files changed, 44 insertions(+), 42 deletions(-)
rename src/Umbraco.Web.UI.Client/src/{packages/core/localization => libs/localization-api}/localization.context.ts (59%)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index 26c98c29da..89b841f194 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -1,4 +1,4 @@
-import { umbTranslationRegistry } from '@umbraco-cms/backoffice/localization-api';
+import { UMB_LOCALIZATION_CONTEXT, UmbLocalizationContext } from '@umbraco-cms/backoffice/localization-api';
import { UmbExtensionInitializer } from './extension.controller.js';
import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context.js';
import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit';
@@ -8,7 +8,6 @@ import {
UmbBundleExtensionInitializer,
UmbEntryPointExtensionInitializer,
} from '@umbraco-cms/backoffice/extension-api';
-import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import './components/index.js';
@@ -40,15 +39,7 @@ export class UmbBackofficeElement extends UmbLitElement {
new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry);
this.#extensionInitializer = new UmbExtensionInitializer(this, umbExtensionsRegistry);
this.#extensionInitializer.setLocalPackages(CORE_PACKAGES);
-
- this.consumeContext(UMB_AUTH, (auth) => {
- this.observe(auth.currentUser, (user) => {
- if (user) {
- const languageIsoCode = user.languageIsoCode ?? 'en';
- umbTranslationRegistry.register(languageIsoCode);
- }
- });
- });
+ this.provideContext(UMB_LOCALIZATION_CONTEXT, new UmbLocalizationContext(this, umbExtensionsRegistry));
}
render() {
diff --git a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
index 79f5328fb9..0edad0f539 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
@@ -11,6 +11,13 @@ import {
import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api';
export declare class UmbElement extends UmbControllerHostElement {
+ /**
+ * @description Observe a RxJS source of choice.
+ * @param {Observable} source RxJS source
+ * @param {method} callback Callback method called when data is changed.
+ * @return {UmbObserverController} Reference to a Observer Controller instance
+ * @memberof UmbElementMixin
+ */
observe(
source: Observable | { asObservable: () => Observable },
callback: (_value: T) => void,
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
index adc93acd1a..b89708c78d 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
@@ -1 +1,2 @@
export * from './registry/translation.registry.js';
+export * from './localization.context.js';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localization.context.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
similarity index 59%
rename from src/Umbraco.Web.UI.Client/src/packages/core/localization/localization.context.ts
rename to src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
index 60f8f78b47..da9854e58a 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localization.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
@@ -1,10 +1,28 @@
-import { umbTranslationRegistry } from '@umbraco-cms/backoffice/localization-api';
+import { UmbTranslationRegistry } from './registry/translation.registry.js';
+import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
+import { UmbElement } from '@umbraco-cms/backoffice/element-api';
+import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
import { map, of, switchMap, type Observable } from '@umbraco-cms/backoffice/external/rxjs';
export class UmbLocalizationContext {
+ #translationRegistry;
+
+ constructor(host: UmbElement, umbExtensionRegistry: UmbBackofficeExtensionRegistry) {
+ this.#translationRegistry = new UmbTranslationRegistry(umbExtensionRegistry);
+
+ host.consumeContext(UMB_AUTH, (auth) => {
+ host.observe(auth.currentUser, (user) => {
+ if (user) {
+ const languageIsoCode = user.languageIsoCode ?? 'en';
+ this.#translationRegistry.register(languageIsoCode);
+ }
+ });
+ });
+ }
+
get translations() {
- return umbTranslationRegistry.translations;
+ return this.#translationRegistry.translations;
}
/**
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index aa3b91720a..5f170f458e 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -1,12 +1,17 @@
-import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
+import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
import { ReplaySubject } from '@umbraco-cms/backoffice/external/rxjs';
export type UmbTranslationDictionary = Map;
export class UmbTranslationRegistry {
+ #extensionRegistry;
#innerDictionary = new ReplaySubject(1);
#innerDictionaryValue: UmbTranslationDictionary = new Map();
+ constructor(umbExtensionRegistry: UmbBackofficeExtensionRegistry) {
+ this.#extensionRegistry = umbExtensionRegistry;
+ }
+
get translations() {
return this.#innerDictionary.asObservable();
}
@@ -16,7 +21,7 @@ export class UmbTranslationRegistry {
this.#innerDictionaryValue = new Map();
// Load new translations
- umbExtensionsRegistry.extensionsOfType('translations').subscribe(async (extensions) => {
+ this.#extensionRegistry.extensionsOfType('translations').subscribe(async (extensions) => {
console.log(
'🚀 ~ file: translation.registry.ts:13 ~ UmbTranslationRegistry ~ this.#umbExtensionRegistry.extensionsOfType ~ extension:',
extensions,
@@ -72,5 +77,3 @@ export class UmbTranslationRegistry {
}
}
}
-
-export const umbTranslationRegistry = new UmbTranslationRegistry();
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts
index c282da14d7..564780c541 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts
@@ -8,7 +8,6 @@ import { manifests as workspaceManifests } from './workspace/manifests.js';
import { manifests as modalManifests } from './modal/common/manifests.js';
import { manifests as themeManifests } from './themes/manifests.js';
-import { UMB_LOCALIZATION_CONTEXT, UmbLocalizationContext } from './localization/localization.context.js';
import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification';
import { UmbModalManagerContext, UMB_MODAL_MANAGER_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal';
import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api';
@@ -65,7 +64,6 @@ export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => {
const modalContainerElement = new UmbBackofficeModalContainerElement();
host.appendChild(modalContainerElement);
- new UmbContextProviderController(host, UMB_LOCALIZATION_CONTEXT, new UmbLocalizationContext());
new UmbContextProviderController(host, UMB_NOTIFICATION_CONTEXT_TOKEN, new UmbNotificationContext());
new UmbContextProviderController(host, UMB_MODAL_MANAGER_CONTEXT_TOKEN, new UmbModalManagerContext(host));
};
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts
index ce27b7a269..2526dc55bf 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/index.ts
@@ -1,3 +1 @@
-export * from './localization.context.js';
-
import './localize.element.js';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 36f958e482..323e7ce1da 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -1,7 +1,7 @@
-import { UMB_LOCALIZATION_CONTEXT } from './localization.context.js';
+import { UMB_LOCALIZATION_CONTEXT } from '@umbraco-cms/backoffice/localization-api';
import { customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
-import type { Subscription } from '@umbraco-cms/backoffice/external/rxjs';
+import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api';
/**
* This element allows you to localize a string with optional interpolation values.
@@ -24,36 +24,22 @@ export class UmbLocalizeElement extends UmbLitElement {
}
#value: string = '';
- #localizationContext?: typeof UMB_LOCALIZATION_CONTEXT.TYPE;
- #subscription?: Subscription;
+ #subscription?: UmbObserverController;
constructor() {
super();
this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
- this.#localizationContext = instance;
- this.#load();
+ this.#load(instance);
});
}
- connectedCallback() {
- super.connectedCallback();
- this.#load();
- }
-
- disconnectedCallback(): void {
- super.disconnectedCallback();
- if (this.#subscription) {
- this.#subscription.unsubscribe();
- }
- }
-
- async #load() {
+ async #load(localizationContext: typeof UMB_LOCALIZATION_CONTEXT.TYPE) {
try {
if (this.#subscription) {
- this.#subscription.unsubscribe();
+ this.#subscription.destroy();
}
- this.#subscription = this.#localizationContext!.localize(this.key).subscribe((value) => {
+ this.#subscription = this.observe(localizationContext!.localize(this.key), (value) => {
this.value = value;
});
} catch (error: any) {
From 26c35c63ff65d775bfb3552c63787ac3de24a9b9 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 13:42:09 +0200
Subject: [PATCH 010/122] only emit if translation holds values
---
.../registry/translation.registry.ts | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 5f170f458e..0966b9193b 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -22,13 +22,6 @@ export class UmbTranslationRegistry {
// Load new translations
this.#extensionRegistry.extensionsOfType('translations').subscribe(async (extensions) => {
- console.log(
- '🚀 ~ file: translation.registry.ts:13 ~ UmbTranslationRegistry ~ this.#umbExtensionRegistry.extensionsOfType ~ extension:',
- extensions,
- userCulture,
- fallbackCulture
- );
-
await Promise.all(
extensions
.filter((x) => x.meta.culture === userCulture || x.meta.culture === fallbackCulture)
@@ -63,11 +56,11 @@ export class UmbTranslationRegistry {
}
})
);
- this.#innerDictionary.next(this.#innerDictionaryValue);
- console.log(
- '🚀 ~ file: translation.registry.ts:61 ~ UmbTranslationRegistry ~ this.#umbExtensionRegistry.extensionsOfType ~ innerDictionary:',
- this.#innerDictionaryValue
- );
+
+ // Notify subscribers that the inner dictionary has changed.
+ if (this.#innerDictionaryValue.size > 0) {
+ this.#innerDictionary.next(this.#innerDictionaryValue);
+ }
});
}
From d58179b19ae9590bce29112ac795100e84d8f915 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 13:50:48 +0200
Subject: [PATCH 011/122] add localization-api paths
---
src/Umbraco.Web.UI.Client/package.json | 1 +
src/Umbraco.Web.UI.Client/web-test-runner.config.mjs | 1 +
2 files changed, 2 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json
index e7ee061633..172aeef935 100644
--- a/src/Umbraco.Web.UI.Client/package.json
+++ b/src/Umbraco.Web.UI.Client/package.json
@@ -10,6 +10,7 @@
"./controller-api": "./dist-cms/libs/controller-api/index.js",
"./element-api": "./dist-cms/libs/element-api/index.js",
"./extension-api": "./dist-cms/libs/extension-api/index.js",
+ "./localization-api": "./dist-cms/libs/localization-api/index.js",
"./observable-api": "./dist-cms/libs/observable-api/index.js",
"./auth": "./dist-cms/shared/auth/index.js",
"./context": "./dist-cms/shared/context/index.js",
diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs
index bdae1ea01a..7523cce358 100644
--- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs
+++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs
@@ -48,6 +48,7 @@ export default {
'@umbraco-cms/backoffice/controller-api': './src/libs/controller-api/index.ts',
'@umbraco-cms/backoffice/element-api': './src/libs/element-api/index.ts',
'@umbraco-cms/backoffice/extension-api': './src/libs/extension-api/index.ts',
+ '@umbraco-cms/backoffice/localization-api': './src/libs/localization-api/index.ts',
'@umbraco-cms/backoffice/observable-api': './src/libs/observable-api/index.ts',
'@umbraco-cms/backoffice/auth': './src/shared/auth/index.ts',
From 5ceca8f5ef0404e424380fbc29555536092ca040 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 13:50:55 +0200
Subject: [PATCH 012/122] move assets to assets folder
---
.../src/{packages/core/localization => assets}/lang/en.json | 0
.../src/packages/core/localization/manifests.ts | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
rename src/Umbraco.Web.UI.Client/src/{packages/core/localization => assets}/lang/en.json (100%)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/lang/en.json b/src/Umbraco.Web.UI.Client/src/assets/lang/en.json
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/packages/core/localization/lang/en.json
rename to src/Umbraco.Web.UI.Client/src/assets/lang/en.json
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
index aeab9438f0..4bb52d028c 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
@@ -10,7 +10,7 @@ const translationManifests: Array = [
meta: {
culture: 'en',
},
- loader: () => import('./lang/en.json'),
+ loader: () => import('../../../assets/lang/en.json'),
},
];
From 88ea431c60a9cf9f8ebdeaba2896efb94504477a Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 13:54:30 +0200
Subject: [PATCH 013/122] use extension helpers to load translation extensions
---
.../registry/translation.registry.ts | 23 +++++--------------
1 file changed, 6 insertions(+), 17 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 0966b9193b..c5d76e949e 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -1,3 +1,4 @@
+import { hasDefaultExport, loadExtension } from '@umbraco-cms/backoffice/extension-api';
import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
import { ReplaySubject } from '@umbraco-cms/backoffice/external/rxjs';
@@ -31,27 +32,15 @@ export class UmbTranslationRegistry {
for (const [dictionaryName, dictionary] of Object.entries(extension.meta.translations)) {
this.#addOrUpdateDictionary(dictionaryName, dictionary);
}
+ return;
}
// If extension contains a js file, load it and add the default dictionary to the inner dictionary.
- if (extension.loader) {
- const loader = await extension.loader();
- if (loader.default) {
- for (const [dictionaryName, dictionary] of Object.entries(loader.default)) {
- this.#addOrUpdateDictionary(dictionaryName, dictionary);
- }
- }
- }
+ const loadedExtension = await loadExtension(extension);
- // If extension contains a json file, load it and add the default dictionary to the inner dictionary.
- if (extension.js) {
- const js = await import(extension.js);
- if (js.default) {
- for (const [dictionaryName, dictionary] of Object.entries(js.default)) {
- if (dictionary && typeof dictionary === 'object') {
- this.#addOrUpdateDictionary(dictionaryName, dictionary as Record);
- }
- }
+ if (loadedExtension && hasDefaultExport(loadedExtension)) {
+ for (const [dictionaryName, dictionary] of Object.entries(loadedExtension.default)) {
+ this.#addOrUpdateDictionary(dictionaryName, dictionary);
}
}
})
From d51988bcfd78d99722ad9ea5527dd80390357ea3 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:02:02 +0200
Subject: [PATCH 014/122] add support for more callbacks on Observer
---
.../src/libs/element-api/element.mixin.ts | 6 +++---
.../libs/localization-api/localization.context.ts | 8 ++++++--
.../src/libs/observable-api/observer.controller.ts | 4 ++--
.../src/libs/observable-api/observer.ts | 12 ++++++++++--
4 files changed, 21 insertions(+), 9 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
index 0edad0f539..d178efbdb6 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
@@ -8,7 +8,7 @@ import {
UmbContextConsumerController,
UmbContextProviderController,
} from '@umbraco-cms/backoffice/context-api';
-import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api';
+import { ObserverCallback, UmbObserverController } from '@umbraco-cms/backoffice/observable-api';
export declare class UmbElement extends UmbControllerHostElement {
/**
@@ -20,7 +20,7 @@ export declare class UmbElement extends UmbControllerHostElement {
*/
observe(
source: Observable | { asObservable: () => Observable },
- callback: (_value: T) => void,
+ callback: ObserverCallback,
unique?: string
): UmbObserverController;
provideContext(alias: string | UmbContextToken, instance: R): UmbContextProviderController;
@@ -41,7 +41,7 @@ export const UmbElementMixin = (superClass: T)
*/
observe(
source: Observable | { asObservable: () => Observable },
- callback: (_value: T) => void,
+ callback: ObserverCallback,
unique?: string
) {
return new UmbObserverController(
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
index da9854e58a..90cc7ce54f 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
@@ -3,7 +3,7 @@ import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
import { UmbElement } from '@umbraco-cms/backoffice/element-api';
import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
-import { map, of, switchMap, type Observable } from '@umbraco-cms/backoffice/external/rxjs';
+import { of, switchMap, throwError, type Observable } from '@umbraco-cms/backoffice/external/rxjs';
export class UmbLocalizationContext {
#translationRegistry;
@@ -33,7 +33,11 @@ export class UmbLocalizationContext {
* @param fallback The fallback text to use if the key is not found (default: undefined).
*/
localize(key: string, fallback?: string): Observable {
- return this.translations.pipe(map((dictionary) => dictionary.get(key) ?? fallback ?? ''));
+ return this.translations.pipe(
+ switchMap((dictionary) => {
+ return dictionary.get(key) ?? fallback ?? throwError(() => new Error(`Key not found: ${key}`));
+ })
+ );
}
/**
diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.controller.ts
index 74fe0f347d..710ead9690 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.controller.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.controller.ts
@@ -1,4 +1,4 @@
-import { UmbObserver } from './observer.js';
+import { ObserverCallback, UmbObserver } from './observer.js';
import { Observable } from '@umbraco-cms/backoffice/external/rxjs';
import { UmbController, UmbControllerAlias, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
@@ -11,7 +11,7 @@ export class UmbObserverController extends UmbObserver implement
constructor(
host: UmbControllerHost,
source: Observable,
- callback: (_value: T) => void,
+ callback: ObserverCallback,
alias?: UmbControllerAlias
) {
super(source, callback);
diff --git a/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts b/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts
index 68ff9088b3..f2af7514ca 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/observable-api/observer.ts
@@ -1,11 +1,19 @@
import { Observable, Subscription, lastValueFrom } from '@umbraco-cms/backoffice/external/rxjs';
+export type ObserverCallbackStack = {
+ next: (_value: T) => void;
+ error?: (_value: unknown) => void;
+ complete?: () => void;
+};
+
+export type ObserverCallback = ((_value: T) => void) | ObserverCallbackStack;
+
export class UmbObserver {
#source!: Observable;
- #callback!: (_value: T) => void;
+ #callback!: ObserverCallback;
#subscription!: Subscription;
- constructor(source: Observable, callback: (_value: T) => void) {
+ constructor(source: Observable, callback: ObserverCallback) {
this.#source = source;
this.#subscription = source.subscribe(callback);
}
From 30ddd30f6dc592523198debb24821769603caf44 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:02:08 +0200
Subject: [PATCH 015/122] add throwError
---
src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts b/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts
index 14f961250f..8fcc8cc181 100644
--- a/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts
@@ -15,4 +15,5 @@ export {
lastValueFrom,
firstValueFrom,
switchMap,
+ throwError,
} from 'rxjs';
From 891a1f58a4e041d5f6a404babff8d1bca3f90cf8 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:03:13 +0200
Subject: [PATCH 016/122] add error callback & debug mode
---
.../core/localization/localize.element.ts | 44 ++++++++++++++-----
1 file changed, 33 insertions(+), 11 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 323e7ce1da..f09e4b870b 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -9,9 +9,21 @@ import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api';
*/
@customElement('umb-localize')
export class UmbLocalizeElement extends UmbLitElement {
+ /**
+ * The key to localize. The key is case sensitive.
+ * @attr
+ * @example key="general_ok"
+ */
@property({ type: String })
key!: string;
+ /**
+ * If true, the key will be rendered instead of the localized value if the key is not found.
+ * @attr
+ */
+ @property({ type: Boolean })
+ debug = false;
+
@state()
get value(): string {
return this.#value;
@@ -34,22 +46,32 @@ export class UmbLocalizeElement extends UmbLitElement {
}
async #load(localizationContext: typeof UMB_LOCALIZATION_CONTEXT.TYPE) {
- try {
- if (this.#subscription) {
- this.#subscription.destroy();
- }
-
- this.#subscription = this.observe(localizationContext!.localize(this.key), (value) => {
- this.value = value;
- });
- } catch (error: any) {
- console.error('Failed to localize key:', this.key, error);
+ if (this.#subscription) {
+ this.#subscription.destroy();
}
+
+ this.#subscription = this.observe(localizationContext!.localize(this.key), {
+ next: (value) => {
+ (this.getHostElement() as HTMLElement).removeAttribute('data-umb-localize-error');
+ this.value = value;
+ },
+ error: (error) => {
+ (this.getHostElement() as HTMLElement).setAttribute('data-umb-localize-error', (error as Error).message);
+ if (this.debug) {
+ console.error('Failed to localize key:', this.key, error);
+ this.value = this.key;
+ }
+ },
+ });
}
- render() {
+ protected render() {
return this.value ? html`${this.value}` : html` `;
}
+
+ protected createRenderRoot(): this {
+ return this;
+ }
}
declare global {
From 22a99a8b9f554ea245a5d71aa1f25a61502967b0 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:03:56 +0200
Subject: [PATCH 017/122] fix http link
---
.../src/packages/umbraco-news/umbraco-news-dashboard.element.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts
index 2e3a6f3627..5f60141300 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts
@@ -35,7 +35,7 @@ export class UmbUmbracoNewsDashboardElement extends UmbLitElement {
There is currently very limited functionality.
Please refer to the
- documentation to learn more about
+ documentation to learn more about
what is possible.
From f7901f61f0322bffcb749925f829259e125a51b5 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:14:41 +0200
Subject: [PATCH 018/122] add docs
---
.../src/packages/core/localization/localize.element.ts | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index f09e4b870b..944a926e63 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -69,6 +69,9 @@ export class UmbLocalizeElement extends UmbLitElement {
return this.value ? html`${this.value}` : html` `;
}
+ /**
+ * This element does not use a shadow root and will render directly into the DOM.
+ */
protected createRenderRoot(): this {
return this;
}
From c1a82a7457bf2c13593fd7c2d9b8015624629155 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:21:28 +0200
Subject: [PATCH 019/122] remove and merge debug
---
.../packages/core/localization/localize.element.ts | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 944a926e63..121bd73f1a 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -17,13 +17,6 @@ export class UmbLocalizeElement extends UmbLitElement {
@property({ type: String })
key!: string;
- /**
- * If true, the key will be rendered instead of the localized value if the key is not found.
- * @attr
- */
- @property({ type: Boolean })
- debug = false;
-
@state()
get value(): string {
return this.#value;
@@ -56,11 +49,9 @@ export class UmbLocalizeElement extends UmbLitElement {
this.value = value;
},
error: (error) => {
+ console.warn('Failed to localize key:', this.key, error);
(this.getHostElement() as HTMLElement).setAttribute('data-umb-localize-error', (error as Error).message);
- if (this.debug) {
- console.error('Failed to localize key:', this.key, error);
- this.value = this.key;
- }
+ this.value = this.key;
},
});
}
From d3c372f68b47eb28ceb9c2267948c303316e10f2 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:26:31 +0200
Subject: [PATCH 020/122] Revert "remove and merge debug"
This reverts commit c1a82a7457bf2c13593fd7c2d9b8015624629155.
---
.../packages/core/localization/localize.element.ts | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 121bd73f1a..944a926e63 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -17,6 +17,13 @@ export class UmbLocalizeElement extends UmbLitElement {
@property({ type: String })
key!: string;
+ /**
+ * If true, the key will be rendered instead of the localized value if the key is not found.
+ * @attr
+ */
+ @property({ type: Boolean })
+ debug = false;
+
@state()
get value(): string {
return this.#value;
@@ -49,9 +56,11 @@ export class UmbLocalizeElement extends UmbLitElement {
this.value = value;
},
error: (error) => {
- console.warn('Failed to localize key:', this.key, error);
(this.getHostElement() as HTMLElement).setAttribute('data-umb-localize-error', (error as Error).message);
- this.value = this.key;
+ if (this.debug) {
+ console.error('Failed to localize key:', this.key, error);
+ this.value = this.key;
+ }
},
});
}
From 010c3e9daa9148a4f68149de8a4416beefc70163 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:49:44 +0200
Subject: [PATCH 021/122] super optimize localization context to avoid rxjs
error handling
---
.../libs/localization-api/localization.context.ts | 6 +++---
.../packages/core/localization/localize.element.ts | 13 ++++++-------
2 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
index 90cc7ce54f..d64da33eff 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
@@ -3,7 +3,7 @@ import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
import { UmbElement } from '@umbraco-cms/backoffice/element-api';
import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
-import { of, switchMap, throwError, type Observable } from '@umbraco-cms/backoffice/external/rxjs';
+import { of, switchMap, type Observable, map } from '@umbraco-cms/backoffice/external/rxjs';
export class UmbLocalizationContext {
#translationRegistry;
@@ -34,8 +34,8 @@ export class UmbLocalizationContext {
*/
localize(key: string, fallback?: string): Observable {
return this.translations.pipe(
- switchMap((dictionary) => {
- return dictionary.get(key) ?? fallback ?? throwError(() => new Error(`Key not found: ${key}`));
+ map((dictionary) => {
+ return dictionary.get(key) ?? fallback ?? '';
})
);
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 944a926e63..22d85d4d33 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -50,18 +50,17 @@ export class UmbLocalizeElement extends UmbLitElement {
this.#subscription.destroy();
}
- this.#subscription = this.observe(localizationContext!.localize(this.key), {
- next: (value) => {
+ this.#subscription = this.observe(localizationContext!.localize(this.key), (value) => {
+ if (value) {
(this.getHostElement() as HTMLElement).removeAttribute('data-umb-localize-error');
this.value = value;
- },
- error: (error) => {
- (this.getHostElement() as HTMLElement).setAttribute('data-umb-localize-error', (error as Error).message);
+ } else {
+ (this.getHostElement() as HTMLElement).setAttribute('data-umb-localize-error', `Key not found: ${this.key}`);
+ console.warn('Key not found:', this.key);
if (this.debug) {
- console.error('Failed to localize key:', this.key, error);
this.value = this.key;
}
- },
+ }
});
}
From 304be0cd5a20db5edff4d30ea5b58e4f4c20d221 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:50:09 +0200
Subject: [PATCH 022/122] use shadowdom anyway to support slots
---
.../src/packages/core/localization/localize.element.ts | 7 -------
1 file changed, 7 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 22d85d4d33..bbb86778cc 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -67,13 +67,6 @@ export class UmbLocalizeElement extends UmbLitElement {
protected render() {
return this.value ? html`${this.value}` : html` `;
}
-
- /**
- * This element does not use a shadow root and will render directly into the DOM.
- */
- protected createRenderRoot(): this {
- return this;
- }
}
declare global {
From f5424809dc89ca1da791b641c89717d7b46a83ff Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:50:28 +0200
Subject: [PATCH 023/122] avoid need of internal value with requestUpdate
---
.../packages/core/localization/localize.element.ts | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index bbb86778cc..5a0392f576 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -25,17 +25,8 @@ export class UmbLocalizeElement extends UmbLitElement {
debug = false;
@state()
- get value(): string {
- return this.#value;
- }
+ protected value?: string;
- set value(value: string) {
- const oldValue = this.#value;
- this.#value = value;
- this.requestUpdate('value', oldValue);
- }
-
- #value: string = '';
#subscription?: UmbObserverController;
constructor() {
From 93dafad0c4ddc65e043c1f6c2123edd0da52e7f9 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:50:36 +0200
Subject: [PATCH 024/122] add close variable
---
src/Umbraco.Web.UI.Client/src/assets/lang/en.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.json b/src/Umbraco.Web.UI.Client/src/assets/lang/en.json
index a56dd6159c..6fa985e594 100644
--- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.json
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.json
@@ -1,5 +1,6 @@
{
"general": {
- "logout": "Log out"
+ "logout": "Log out",
+ "close": "Close"
}
}
From 823a6fb4e74fa6ae38d7b98baa53b8f25d8692b1 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 15:54:07 +0200
Subject: [PATCH 025/122] add 'this' to warnings so elements are easier to
locate
---
.../src/packages/core/localization/localize.element.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 5a0392f576..27806e4abc 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -47,7 +47,7 @@ export class UmbLocalizeElement extends UmbLitElement {
this.value = value;
} else {
(this.getHostElement() as HTMLElement).setAttribute('data-umb-localize-error', `Key not found: ${this.key}`);
- console.warn('Key not found:', this.key);
+ console.warn('Key not found:', this.key, this);
if (this.debug) {
this.value = this.key;
}
From ed8c585d7474361cd8b7c6cbbf5b0ca0f6293651 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 16:09:42 +0200
Subject: [PATCH 026/122] add 'key' to localizeMany
---
.../src/libs/localization-api/localization.context.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
index d64da33eff..166ee1830b 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
@@ -47,8 +47,8 @@ export class UmbLocalizationContext {
* @param keys
* @see localize
*/
- localizeMany(keys: string[]): Observable {
- return of(...keys).pipe(switchMap((key) => this.localize(key)));
+ localizeMany(keys: string[]): Observable> {
+ return of(...keys).pipe(switchMap((key) => this.localize(key).pipe(map((value) => ({ [key]: value })))));
}
}
From 32a2de69c101bfb39db409d741d47c761a703667 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 16:09:50 +0200
Subject: [PATCH 027/122] add label localization
---
.../current-user-modal.element.ts | 22 +++++++++++++------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
index 660641e7f2..9f2722005a 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
@@ -1,3 +1,4 @@
+import { UMB_LOCALIZATION_CONTEXT } from '@umbraco-cms/backoffice/localization-api';
import { UMB_AUTH, type UmbLoggedInUser } from '@umbraco-cms/backoffice/auth';
import { UMB_APP } from '@umbraco-cms/backoffice/context';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
@@ -10,6 +11,12 @@ export class UmbCurrentUserModalElement extends UmbLitElement {
@property({ attribute: false })
modalContext?: UmbModalContext;
+ @state()
+ protected labelClose = 'Close';
+
+ @state()
+ protected labelLogout = 'Log out';
+
@state()
private _currentUser?: UmbLoggedInUser;
@@ -25,15 +32,16 @@ export class UmbCurrentUserModalElement extends UmbLitElement {
this._observeCurrentUser();
});
- this.consumeContext(UMB_AUTH, (instance) => {
- this.#auth = instance;
- });
-
this.consumeContext(UMB_APP, (instance) => {
this.#appContext = instance;
});
- this._observeCurrentUser();
+ this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
+ instance.localizeMany(['general_close', 'general_logout']).subscribe((values) => {
+ if (values['general_close']) this.labelClose = values['general_close'];
+ if (values['general_logout']) this.labelLogout = values['general_logout'];
+ });
+ });
}
private async _observeCurrentUser() {
@@ -64,10 +72,10 @@ export class UmbCurrentUserModalElement extends UmbLitElement {
-
+
Close
-
+
Log out
From b3328014e937f3e9c63446e28fab9a0f9bda3fc5 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 16:31:28 +0200
Subject: [PATCH 028/122] support listening on changed translations with
localizeMany
---
.../localization-api/localization.context.ts | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
index 166ee1830b..241c4f4c69 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
@@ -3,7 +3,7 @@ import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
import { UmbElement } from '@umbraco-cms/backoffice/element-api';
import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
-import { of, switchMap, type Observable, map } from '@umbraco-cms/backoffice/external/rxjs';
+import { combineLatest, distinctUntilChanged, type Observable, map } from '@umbraco-cms/backoffice/external/rxjs';
export class UmbLocalizationContext {
#translationRegistry;
@@ -29,8 +29,12 @@ export class UmbLocalizationContext {
* Localize a key.
* If the key is not found, the fallback is returned.
* If the fallback is not provided, the key is returned.
+ *
* @param key The key to localize. The key is case sensitive.
* @param fallback The fallback text to use if the key is not found (default: undefined).
+ * @example localize('general_close').subscribe((value) => {
+ * console.log(value); // 'Close'
+ * });
*/
localize(key: string, fallback?: string): Observable {
return this.translations.pipe(
@@ -43,12 +47,17 @@ export class UmbLocalizationContext {
/**
* Localize many keys at once.
* If a key is not found, the key is returned.
+ *
* @description This method combines the results of multiple calls to localize.
- * @param keys
+ * @param keys The keys to localize. The keys are case sensitive.
+ * @example localizeMany(['general_close', 'general_logout']).subscribe((values) => {
+ * console.log(values[0]); // 'Close'
+ * console.log(values[1]); // 'Log out'
+ * });
* @see localize
*/
- localizeMany(keys: string[]): Observable> {
- return of(...keys).pipe(switchMap((key) => this.localize(key).pipe(map((value) => ({ [key]: value })))));
+ localizeMany(keys: string[]) {
+ return combineLatest(keys.map((key) => this.localize(key).pipe(distinctUntilChanged())));
}
}
From 99412a55f776406b72dccf7d3e6e8c5f3abb679a Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 25 Jul 2023 16:32:31 +0200
Subject: [PATCH 029/122] use localizeMany for buttons
---
.../modals/current-user/current-user-modal.element.ts | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
index 9f2722005a..872fe2d25e 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
@@ -38,8 +38,8 @@ export class UmbCurrentUserModalElement extends UmbLitElement {
this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
instance.localizeMany(['general_close', 'general_logout']).subscribe((values) => {
- if (values['general_close']) this.labelClose = values['general_close'];
- if (values['general_logout']) this.labelLogout = values['general_logout'];
+ this.labelClose = values[0];
+ this.labelLogout = values[1];
});
});
}
@@ -72,11 +72,9 @@ export class UmbCurrentUserModalElement extends UmbLitElement {
-
- Close
-
+ ${this.labelClose}
- Log out
+ ${this.labelLogout}
From 95a182487131783fbd04fc56ed643445677930e9 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 26 Jul 2023 10:29:01 +0200
Subject: [PATCH 030/122] translation to your profile
---
.../src/assets/lang/en.json | 3 ++
.../user-profile-app-profile.element.ts | 31 ++++++++++++++++---
2 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.json b/src/Umbraco.Web.UI.Client/src/assets/lang/en.json
index 6fa985e594..db19f6dd34 100644
--- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.json
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.json
@@ -2,5 +2,8 @@
"general": {
"logout": "Log out",
"close": "Close"
+ },
+ "user": {
+ "yourProfile": "Your profile"
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts
index 7bc4c986fc..1692f0c9b2 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts
@@ -1,3 +1,4 @@
+import { UMB_LOCALIZATION_CONTEXT } from '@umbraco-cms/backoffice/localization-api';
import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
@@ -13,6 +14,15 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement {
@state()
private _currentUser?: UmbLoggedInUser;
+ @state()
+ protected _labelYourProfile = 'Your profile';
+
+ @state()
+ protected _labelEditProfile = 'Edit your profile';
+
+ @state()
+ protected _labelChangePassword = 'Change your password';
+
private _modalContext?: UmbModalManagerContext;
private _auth?: typeof UMB_AUTH.TYPE;
@@ -28,7 +38,15 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement {
this._observeCurrentUser();
});
- this._observeCurrentUser();
+ this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
+ instance
+ .localizeMany(['user_yourProfile', 'user_editProfileLabel', 'user_changePasswordLabel'])
+ .subscribe((value) => {
+ this._labelYourProfile = value[0];
+ this._labelEditProfile = value[1];
+ this._labelChangePassword = value[2];
+ });
+ });
}
private async _observeCurrentUser() {
@@ -56,10 +74,13 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement {
render() {
return html`
-
- Your profile
- Edit
- Change password
+
+
+ Edit profile
+
+
+ Change password
+
`;
}
From b60a88a8fdd9c2d300f1349a922919b6dff4021e Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 26 Jul 2023 11:12:39 +0200
Subject: [PATCH 031/122] update imports
---
.../src/apps/backoffice/backoffice.element.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index e90f5a6ca4..1acec2afdc 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -1,6 +1,6 @@
import { UMB_LOCALIZATION_CONTEXT, UmbLocalizationContext } from '@umbraco-cms/backoffice/localization-api';
-import { UmbExtensionInitializer } from './extension.controller.js';
import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context.js';
+import { UmbExtensionInitializer } from './extension.controller.js';
import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
From a7c6957e3ce427c4beb7394ff13fef2083b49310 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 10:06:51 +0200
Subject: [PATCH 032/122] backoffice-element should react to user loggedin and
set up localization context
---
.../src/apps/backoffice/backoffice.element.ts | 21 ++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index 1acec2afdc..70511286cf 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -11,6 +11,7 @@ import {
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import './components/index.js';
+import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
// TODO: temp solution to load core packages
const CORE_PACKAGES = [
@@ -30,16 +31,26 @@ const CORE_PACKAGES = [
@customElement('umb-backoffice')
export class UmbBackofficeElement extends UmbLitElement {
- #extensionInitializer;
-
constructor() {
super();
this.provideContext(UMB_BACKOFFICE_CONTEXT_TOKEN, new UmbBackofficeContext());
new UmbBundleExtensionInitializer(this, umbExtensionsRegistry);
new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry);
- this.#extensionInitializer = new UmbExtensionInitializer(this, umbExtensionsRegistry);
- this.#extensionInitializer.setLocalPackages(CORE_PACKAGES);
- this.provideContext(UMB_LOCALIZATION_CONTEXT, new UmbLocalizationContext(this, umbExtensionsRegistry));
+
+ const extensionInitializer = new UmbExtensionInitializer(this, umbExtensionsRegistry);
+ extensionInitializer.setLocalPackages(CORE_PACKAGES);
+
+ const localizationContext = new UmbLocalizationContext(umbExtensionsRegistry);
+ this.provideContext(UMB_LOCALIZATION_CONTEXT, localizationContext);
+
+ this.consumeContext(UMB_AUTH, (auth) => {
+ this.observe(auth.currentUser, (user) => {
+ if (user) {
+ const languageIsoCode = user.languageIsoCode ?? 'en';
+ localizationContext.setLanguage(languageIsoCode);
+ }
+ });
+ });
}
render() {
From 2b65a78f67c23f67c0e55092fee1d1d313f7f574 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 10:07:10 +0200
Subject: [PATCH 033/122] rename src/tsconfig to tsconfig.build
---
src/Umbraco.Web.UI.Client/package.json | 4 ++--
.../src/{tsconfig.json => tsconfig.build.json} | 0
2 files changed, 2 insertions(+), 2 deletions(-)
rename src/Umbraco.Web.UI.Client/src/{tsconfig.json => tsconfig.build.json} (100%)
diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json
index 0c076c568e..ce251d806f 100644
--- a/src/Umbraco.Web.UI.Client/package.json
+++ b/src/Umbraco.Web.UI.Client/package.json
@@ -87,11 +87,11 @@
},
"scripts": {
"dev": "vite",
- "build": "tsc --project ./src/tsconfig.json && rollup -c ./src/rollup.config.js",
+ "build": "tsc --project ./src/tsconfig.build.json && rollup -c ./src/rollup.config.js",
"build:vite": "tsc && vite build --mode staging",
"build:for:static": "vite build",
"build:for:cms": "npm run build && node ./devops/build/copy-to-cms.js",
- "build:for:npm": "npm run build && tsc-alias -f -p src/tsconfig.json && npm run generate:jsonschema:dist && npm run wc-analyze && npm run wc-analyze:vscode",
+ "build:for:npm": "npm run build && tsc-alias -f -p src/tsconfig.build.json && npm run generate:jsonschema:dist && npm run wc-analyze && npm run wc-analyze:vscode",
"preview": "vite preview --open",
"test": "web-test-runner --coverage",
"test:watch": "web-test-runner --watch",
diff --git a/src/Umbraco.Web.UI.Client/src/tsconfig.json b/src/Umbraco.Web.UI.Client/src/tsconfig.build.json
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/tsconfig.json
rename to src/Umbraco.Web.UI.Client/src/tsconfig.build.json
From c12bf6707cfc18422755479448dee3aefc2a3d0a Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 10:07:39 +0200
Subject: [PATCH 034/122] localization context should not listen for auth
itself (makes it harder to test)
---
.../localization-api/localization.context.ts | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
index 241c4f4c69..6dd4c978fe 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
@@ -1,30 +1,23 @@
import { UmbTranslationRegistry } from './registry/translation.registry.js';
-import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
-import { UmbElement } from '@umbraco-cms/backoffice/element-api';
import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
import { combineLatest, distinctUntilChanged, type Observable, map } from '@umbraco-cms/backoffice/external/rxjs';
export class UmbLocalizationContext {
#translationRegistry;
- constructor(host: UmbElement, umbExtensionRegistry: UmbBackofficeExtensionRegistry) {
+ constructor(umbExtensionRegistry: UmbBackofficeExtensionRegistry) {
this.#translationRegistry = new UmbTranslationRegistry(umbExtensionRegistry);
-
- host.consumeContext(UMB_AUTH, (auth) => {
- host.observe(auth.currentUser, (user) => {
- if (user) {
- const languageIsoCode = user.languageIsoCode ?? 'en';
- this.#translationRegistry.register(languageIsoCode);
- }
- });
- });
}
get translations() {
return this.#translationRegistry.translations;
}
+ setLanguage(languageIsoCode: string) {
+ this.#translationRegistry.register(languageIsoCode);
+ }
+
/**
* Localize a key.
* If the key is not found, the fallback is returned.
From 273efeb4768cd71eca1ec83cd9dd760d1cb5e6a5 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 10:07:49 +0200
Subject: [PATCH 035/122] add tests to localization context
---
.../localization.context.test.ts | 97 +++++++++++++++++++
1 file changed, 97 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
new file mode 100644
index 0000000000..5f1616aa28
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
@@ -0,0 +1,97 @@
+import { expect } from '@open-wc/testing';
+import { firstValueFrom } from 'rxjs';
+import { UmbLocalizationContext } from './localization.context.js';
+import { UmbTranslationRegistry } from './registry/translation.registry.js';
+import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api';
+
+const english = {
+ type: 'translations',
+ alias: 'test.en',
+ name: 'Test English',
+ meta: {
+ culture: 'en',
+ translations: {
+ general: {
+ close: 'Close',
+ logout: 'Log out',
+ },
+ },
+ },
+};
+
+describe('Localization', () => {
+ let registry: UmbTranslationRegistry;
+ let extensionRegistry: UmbExtensionRegistry;
+
+ beforeEach(() => {
+ extensionRegistry = new UmbExtensionRegistry();
+ registry = new UmbTranslationRegistry(extensionRegistry);
+ extensionRegistry.register(english);
+ registry.register(english.meta.culture);
+ });
+
+ describe('UmbTranslationRegistry', () => {
+ it('should register and get translation', (done) => {
+ registry.translations.subscribe((translations) => {
+ expect(translations.get('general_close')).to.equal('Close');
+ done();
+ });
+ });
+ });
+
+ describe('UmbLocalizationContext', () => {
+ let context: UmbLocalizationContext;
+
+ beforeEach(async () => {
+ context = new UmbLocalizationContext(extensionRegistry);
+ context.setLanguage(english.meta.culture);
+ });
+
+ describe('localize', () => {
+ it('should return a value', async () => {
+ const value = await firstValueFrom(context.localize('general_close'));
+ expect(value).to.equal('Close');
+ });
+
+ it('should return fallback if key is not found', async () => {
+ const value = await firstValueFrom(context.localize('general_not_found', 'Not found'));
+ expect(value).to.equal('Not found');
+ });
+
+ it('should return an empty string if fallback is not provided', async () => {
+ const value = await firstValueFrom(context.localize('general_not_found'));
+ expect(value).to.equal('');
+ });
+
+ it('should return a new value if the translation changes', async () => {
+ const value = await firstValueFrom(context.localize('general_close'));
+ expect(value).to.equal('Close');
+
+ extensionRegistry.register({
+ type: 'translations',
+ alias: 'test.en.override',
+ name: 'Test English',
+ meta: {
+ culture: 'en',
+ translations: {
+ general: {
+ close: 'Close 2',
+ },
+ },
+ },
+ });
+
+ const value2 = await firstValueFrom(context.localize('general_close'));
+ expect(value2).to.equal('Close 2');
+ });
+ });
+
+ describe('localizeMany', () => {
+ it('should return values', async () => {
+ const values = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
+ expect(values[0]).to.equal('Close');
+ expect(values[1]).to.equal('Log out');
+ });
+ });
+ });
+});
From fde921155c9acddfb3e6d4f0040433887699cea0 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 11:39:31 +0200
Subject: [PATCH 036/122] add sleep test utility
---
src/Umbraco.Web.UI.Client/utils/test-utils.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/utils/test-utils.ts b/src/Umbraco.Web.UI.Client/utils/test-utils.ts
index fc83ba86e8..873784f2a3 100644
--- a/src/Umbraco.Web.UI.Client/utils/test-utils.ts
+++ b/src/Umbraco.Web.UI.Client/utils/test-utils.ts
@@ -1,3 +1,5 @@
export const defaultA11yConfig = {
ignoredRules: [],
};
+
+export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
From d594c8e7ea4f5421868f4e571446ee7d1948eb06 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 11:39:43 +0200
Subject: [PATCH 037/122] cancel any old subscription if the language changes
---
.../localization-api/registry/translation.registry.ts | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index c5d76e949e..0c093e1892 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -1,6 +1,6 @@
import { hasDefaultExport, loadExtension } from '@umbraco-cms/backoffice/extension-api';
import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
-import { ReplaySubject } from '@umbraco-cms/backoffice/external/rxjs';
+import { ReplaySubject, Subscription } from '@umbraco-cms/backoffice/external/rxjs';
export type UmbTranslationDictionary = Map;
@@ -8,6 +8,7 @@ export class UmbTranslationRegistry {
#extensionRegistry;
#innerDictionary = new ReplaySubject(1);
#innerDictionaryValue: UmbTranslationDictionary = new Map();
+ #subscription?: Subscription;
constructor(umbExtensionRegistry: UmbBackofficeExtensionRegistry) {
this.#extensionRegistry = umbExtensionRegistry;
@@ -21,8 +22,13 @@ export class UmbTranslationRegistry {
// Reset the inner dictionary.
this.#innerDictionaryValue = new Map();
+ // Cancel any previous subscription.
+ if (this.#subscription) {
+ this.#subscription.unsubscribe();
+ }
+
// Load new translations
- this.#extensionRegistry.extensionsOfType('translations').subscribe(async (extensions) => {
+ this.#subscription = this.#extensionRegistry.extensionsOfType('translations').subscribe(async (extensions) => {
await Promise.all(
extensions
.filter((x) => x.meta.culture === userCulture || x.meta.culture === fallbackCulture)
From ee310300991918196be077acbe23c77ca62f43e9 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 11:40:26 +0200
Subject: [PATCH 038/122] add support to reload the value if key changes
---
.../core/localization/localize.element.ts | 27 ++++++++++++++++---
1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 27806e4abc..9343502d82 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -15,7 +15,19 @@ export class UmbLocalizeElement extends UmbLitElement {
* @example key="general_ok"
*/
@property({ type: String })
- key!: string;
+ set key(value: string) {
+ const isNewKey = this.#key !== value;
+ this.#key = value;
+
+ // Only reload translations if the key has changed, otherwise the load happens when the context is there.
+ if (isNewKey) {
+ this.#load();
+ }
+ }
+
+ get key() {
+ return this.#key;
+ }
/**
* If true, the key will be rendered instead of the localized value if the key is not found.
@@ -27,21 +39,28 @@ export class UmbLocalizeElement extends UmbLitElement {
@state()
protected value?: string;
+ #key = '';
+ #localizationContext?: typeof UMB_LOCALIZATION_CONTEXT.TYPE;
#subscription?: UmbObserverController;
constructor() {
super();
this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
- this.#load(instance);
+ this.#localizationContext = instance;
+ this.#load();
});
}
- async #load(localizationContext: typeof UMB_LOCALIZATION_CONTEXT.TYPE) {
+ async #load() {
if (this.#subscription) {
this.#subscription.destroy();
}
- this.#subscription = this.observe(localizationContext!.localize(this.key), (value) => {
+ if (!this.#localizationContext) {
+ return;
+ }
+
+ this.#subscription = this.observe(this.#localizationContext!.localize(this.key), (value) => {
if (value) {
(this.getHostElement() as HTMLElement).removeAttribute('data-umb-localize-error');
this.value = value;
From f940412026f59b101714cc626f745bdfb5d731db Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 11:40:42 +0200
Subject: [PATCH 039/122] add test to change language entirely
---
.../localization.context.test.ts | 30 ++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
index 5f1616aa28..9ef7bc3a23 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
@@ -3,6 +3,7 @@ import { firstValueFrom } from 'rxjs';
import { UmbLocalizationContext } from './localization.context.js';
import { UmbTranslationRegistry } from './registry/translation.registry.js';
import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api';
+import { sleep } from '@umbraco-cms/internal/test-utils';
const english = {
type: 'translations',
@@ -19,6 +20,20 @@ const english = {
},
};
+const danish = {
+ type: 'translations',
+ alias: 'test.da',
+ name: 'Test Danish',
+ meta: {
+ culture: 'da',
+ translations: {
+ general: {
+ close: 'Luk',
+ },
+ },
+ },
+};
+
describe('Localization', () => {
let registry: UmbTranslationRegistry;
let extensionRegistry: UmbExtensionRegistry;
@@ -27,6 +42,7 @@ describe('Localization', () => {
extensionRegistry = new UmbExtensionRegistry();
registry = new UmbTranslationRegistry(extensionRegistry);
extensionRegistry.register(english);
+ extensionRegistry.register(danish);
registry.register(english.meta.culture);
});
@@ -63,7 +79,7 @@ describe('Localization', () => {
expect(value).to.equal('');
});
- it('should return a new value if the translation changes', async () => {
+ it('should return a new value if a key is overridden', async () => {
const value = await firstValueFrom(context.localize('general_close'));
expect(value).to.equal('Close');
@@ -86,6 +102,18 @@ describe('Localization', () => {
});
});
+ it('should return a new value if a language is changed', async () => {
+ const value = await firstValueFrom(context.localize('general_close'));
+ expect(value).to.equal('Close');
+
+ context.setLanguage(danish.meta.culture);
+
+ await sleep(0);
+
+ const value2 = await firstValueFrom(context.localize('general_close'));
+ expect(value2).to.equal('Luk');
+ });
+
describe('localizeMany', () => {
it('should return values', async () => {
const values = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
From c81e155154518b13aeb48f62d99d37ef1d651ecf Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 11:40:51 +0200
Subject: [PATCH 040/122] add test for
---
.../localization/localize.element.test.ts | 100 ++++++++++++++++++
1 file changed, 100 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
new file mode 100644
index 0000000000..91163baf5b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
@@ -0,0 +1,100 @@
+import { expect, fixture, html } from '@open-wc/testing';
+import {
+ UMB_LOCALIZATION_CONTEXT,
+ UmbLocalizationContext,
+ UmbTranslationRegistry,
+} from '@umbraco-cms/backoffice/localization-api';
+import { UmbLocalizeElement } from './localize.element.js';
+import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api';
+
+import '@umbraco-cms/backoffice/context-api';
+import { sleep } from '@umbraco-cms/internal/test-utils';
+
+const english = {
+ type: 'translations',
+ alias: 'test.en',
+ name: 'Test English',
+ meta: {
+ culture: 'en',
+ translations: {
+ general: {
+ close: 'Close',
+ logout: 'Log out',
+ },
+ },
+ },
+};
+
+const danish = {
+ type: 'translations',
+ alias: 'test.da',
+ name: 'Test Danish',
+ meta: {
+ culture: 'da',
+ translations: {
+ general: {
+ close: 'Luk',
+ },
+ },
+ },
+};
+
+describe('umb-localize', () => {
+ let element: UmbLocalizeElement;
+
+ beforeEach(async () => {
+ element = await fixture(html` `);
+ });
+
+ it('should be defined', () => {
+ expect(element).to.be.instanceOf(UmbLocalizeElement);
+ });
+
+ describe('localization', () => {
+ let hostElement: HTMLElement;
+ let extensionRegistry: UmbExtensionRegistry;
+ let context: UmbLocalizationContext;
+
+ beforeEach(async () => {
+ extensionRegistry = new UmbExtensionRegistry();
+ extensionRegistry.register(english);
+ extensionRegistry.register(danish);
+ const registry = new UmbTranslationRegistry(extensionRegistry);
+ registry.register(english.meta.culture);
+ context = new UmbLocalizationContext(extensionRegistry);
+ context.setLanguage(english.meta.culture);
+ hostElement = await fixture(
+ html`
+
+ `
+ );
+ element = hostElement.querySelector('umb-localize') as UmbLocalizeElement;
+ });
+
+ it('should localize a key', async () => {
+ await element.updateComplete;
+ expect(element.shadowRoot?.innerHTML).to.contain('Close');
+ });
+
+ it('should change the value if a new key is set', async () => {
+ await element.updateComplete;
+ expect(element.shadowRoot?.innerHTML).to.contain('Close');
+
+ element.key = 'general_logout';
+ await element.updateComplete;
+ expect(element.shadowRoot?.innerHTML).to.contain('Log out');
+ });
+
+ it('should change the value if the language is changed', async () => {
+ await element.updateComplete;
+ expect(element.shadowRoot?.innerHTML).to.contain('Close');
+
+ context.setLanguage(danish.meta.culture);
+ await element.updateComplete;
+
+ await sleep(0);
+
+ expect(element.shadowRoot?.innerHTML).to.contain('Luk');
+ });
+ });
+});
From b7ec665da8830ba7779b3a9b3e25cd6798d713f5 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 12:42:32 +0200
Subject: [PATCH 041/122] organize imports
---
.../src/apps/backoffice/backoffice.element.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index 70511286cf..a16dc2c9b1 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -1,6 +1,7 @@
import { UMB_LOCALIZATION_CONTEXT, UmbLocalizationContext } from '@umbraco-cms/backoffice/localization-api';
import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context.js';
import { UmbExtensionInitializer } from './extension.controller.js';
+import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
@@ -11,7 +12,6 @@ import {
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import './components/index.js';
-import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
// TODO: temp solution to load core packages
const CORE_PACKAGES = [
From 7bf9000814b26eecbb13829e21f53e1bd74c208c Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 12:44:50 +0200
Subject: [PATCH 042/122] linting
---
.../src/apps/backoffice/backoffice.element.ts | 2 +-
.../src/packages/core/localization/localize.element.test.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index a16dc2c9b1..b4428fd3c8 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -1,6 +1,6 @@
-import { UMB_LOCALIZATION_CONTEXT, UmbLocalizationContext } from '@umbraco-cms/backoffice/localization-api';
import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context.js';
import { UmbExtensionInitializer } from './extension.controller.js';
+import { UMB_LOCALIZATION_CONTEXT, UmbLocalizationContext } from '@umbraco-cms/backoffice/localization-api';
import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
index 91163baf5b..f5225b623a 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
@@ -1,10 +1,10 @@
import { expect, fixture, html } from '@open-wc/testing';
+import { UmbLocalizeElement } from './localize.element.js';
import {
UMB_LOCALIZATION_CONTEXT,
UmbLocalizationContext,
UmbTranslationRegistry,
} from '@umbraco-cms/backoffice/localization-api';
-import { UmbLocalizeElement } from './localize.element.js';
import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api';
import '@umbraco-cms/backoffice/context-api';
From a5f6a344c2487f4c27f48a93eff46faae9a99bbb Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 12:45:00 +0200
Subject: [PATCH 043/122] format check
---
src/Umbraco.Web.UI.Client/package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json
index ce251d806f..fd8bf81fc0 100644
--- a/src/Umbraco.Web.UI.Client/package.json
+++ b/src/Umbraco.Web.UI.Client/package.json
@@ -101,7 +101,7 @@
"lint": "eslint src apps e2e",
"lint:errors": "npm run lint -- --quiet",
"lint:fix": "npm run lint -- --fix",
- "format": "prettier 'src/**/*.ts'",
+ "format": "prettier 'src/**/*.ts' -- check",
"format:fix": "npm run format -- --write",
"generate:api": "openapi --input https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v14/dev/src/Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --postfixServices Resource --useOptions",
"generate:api-dev": "openapi --input http://localhost:11000/umbraco/swagger/management/swagger.json --output src/external/backend-api/src --postfixServices Resource --useOptions",
From 3019f5a51306637d007ccef8655e31c53f44b76d Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 13:01:59 +0200
Subject: [PATCH 044/122] Revert "add sleep test utility"
This reverts commit fde921155c9acddfb3e6d4f0040433887699cea0.
---
src/Umbraco.Web.UI.Client/utils/test-utils.ts | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/utils/test-utils.ts b/src/Umbraco.Web.UI.Client/utils/test-utils.ts
index 873784f2a3..fc83ba86e8 100644
--- a/src/Umbraco.Web.UI.Client/utils/test-utils.ts
+++ b/src/Umbraco.Web.UI.Client/utils/test-utils.ts
@@ -1,5 +1,3 @@
export const defaultA11yConfig = {
ignoredRules: [],
};
-
-export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
From 1d12ea996fbfc435a69addd0e2c7104a72554c97 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 13:02:49 +0200
Subject: [PATCH 045/122] use aTimeout to wait
---
.../src/packages/core/localization/localize.element.test.ts | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
index f5225b623a..d26496e7fa 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
@@ -1,4 +1,4 @@
-import { expect, fixture, html } from '@open-wc/testing';
+import { aTimeout, expect, fixture, html } from '@open-wc/testing';
import { UmbLocalizeElement } from './localize.element.js';
import {
UMB_LOCALIZATION_CONTEXT,
@@ -8,7 +8,6 @@ import {
import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api';
import '@umbraco-cms/backoffice/context-api';
-import { sleep } from '@umbraco-cms/internal/test-utils';
const english = {
type: 'translations',
@@ -92,7 +91,7 @@ describe('umb-localize', () => {
context.setLanguage(danish.meta.culture);
await element.updateComplete;
- await sleep(0);
+ await aTimeout(0);
expect(element.shadowRoot?.innerHTML).to.contain('Luk');
});
From afc5916efdcee716aab0424a0d587dbe8726d961 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 13:12:43 +0200
Subject: [PATCH 046/122] use test helper elementUpdated()
---
.../core/localization/localize.element.test.ts | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
index d26496e7fa..41522e66ca 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
@@ -1,4 +1,4 @@
-import { aTimeout, expect, fixture, html } from '@open-wc/testing';
+import { aTimeout, elementUpdated, expect, fixture, html } from '@open-wc/testing';
import { UmbLocalizeElement } from './localize.element.js';
import {
UMB_LOCALIZATION_CONTEXT,
@@ -71,25 +71,25 @@ describe('umb-localize', () => {
});
it('should localize a key', async () => {
- await element.updateComplete;
+ await elementUpdated(element);
expect(element.shadowRoot?.innerHTML).to.contain('Close');
});
it('should change the value if a new key is set', async () => {
- await element.updateComplete;
+ await elementUpdated(element);
expect(element.shadowRoot?.innerHTML).to.contain('Close');
element.key = 'general_logout';
- await element.updateComplete;
+ await elementUpdated(element);
expect(element.shadowRoot?.innerHTML).to.contain('Log out');
});
it('should change the value if the language is changed', async () => {
- await element.updateComplete;
+ await elementUpdated(element);
expect(element.shadowRoot?.innerHTML).to.contain('Close');
context.setLanguage(danish.meta.culture);
- await element.updateComplete;
+ await elementUpdated(element);
await aTimeout(0);
From 388ae4d54c2d10531ca491307ebf397908739196 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 13:16:38 +0200
Subject: [PATCH 047/122] test that values work inside a subscription
---
.../localization.context.test.ts | 57 ++++++++++++++++++-
1 file changed, 56 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
index 9ef7bc3a23..38162c3ff5 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
@@ -1,4 +1,4 @@
-import { expect } from '@open-wc/testing';
+import { expect, aTimeout } from '@open-wc/testing';
import { firstValueFrom } from 'rxjs';
import { UmbLocalizationContext } from './localization.context.js';
import { UmbTranslationRegistry } from './registry/translation.registry.js';
@@ -120,6 +120,61 @@ describe('Localization', () => {
expect(values[0]).to.equal('Close');
expect(values[1]).to.equal('Log out');
});
+
+ it('should return empty values if keys are not found', async () => {
+ const values = await firstValueFrom(context.localizeMany(['general_close', 'general_not_found']));
+ expect(values[0]).to.equal('Close');
+ expect(values[1]).to.equal('');
+ });
+
+ it('should update values if a key is overridden', async () => {
+ const values = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
+ expect(values[0]).to.equal('Close');
+ expect(values[1]).to.equal('Log out');
+
+ extensionRegistry.register(englishOverride);
+
+ const values2 = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
+ expect(values2[0]).to.equal('Close 2');
+ expect(values2[1]).to.equal('Log out');
+ });
+
+ it('should return new values if a language is changed', async () => {
+ const values = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
+ expect(values[0]).to.equal('Close');
+ expect(values[1]).to.equal('Log out');
+
+ context.setLanguage(danish.meta.culture);
+
+ await aTimeout(0);
+
+ const values2 = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
+ expect(values2[0]).to.equal('Luk');
+ expect(values2[1]).to.equal('Log out'); // This key does not exist in the danish translation so should use 'en' fallback.
+ });
+ });
+
+ it('should emit new values in same subscription', async () => {
+ const values: string[][] = [];
+
+ context.localizeMany(['general_close', 'general_logout']).subscribe((value) => {
+ values.push(value);
+ });
+
+ // Let the subscription run (values are available statically)
+ await aTimeout(0);
+
+ expect(values[0][0]).to.equal('Close');
+ expect(values[0][1]).to.equal('Log out');
+
+ // it should return new values if a key is overridden
+ extensionRegistry.register(englishOverride);
+
+ // Let the subscription run again
+ await aTimeout(0);
+
+ expect(values[1][0]).to.equal('Close 2');
+ expect(values[1][1]).to.equal('Log out');
});
});
});
From a8afe7cc27835563e56bee06e14635b63300ab45 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 13:16:44 +0200
Subject: [PATCH 048/122] test fallback language
---
.../localization.context.test.ts | 59 ++++++++++++-------
1 file changed, 37 insertions(+), 22 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
index 38162c3ff5..f3de0e463d 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
@@ -3,8 +3,8 @@ import { firstValueFrom } from 'rxjs';
import { UmbLocalizationContext } from './localization.context.js';
import { UmbTranslationRegistry } from './registry/translation.registry.js';
import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api';
-import { sleep } from '@umbraco-cms/internal/test-utils';
+//#region Translations
const english = {
type: 'translations',
alias: 'test.en',
@@ -20,6 +20,20 @@ const english = {
},
};
+const englishOverride = {
+ type: 'translations',
+ alias: 'test.en.override',
+ name: 'Test English',
+ meta: {
+ culture: 'en',
+ translations: {
+ general: {
+ close: 'Close 2',
+ },
+ },
+ },
+};
+
const danish = {
type: 'translations',
alias: 'test.da',
@@ -33,6 +47,7 @@ const danish = {
},
},
};
+//#endregion
describe('Localization', () => {
let registry: UmbTranslationRegistry;
@@ -83,35 +98,35 @@ describe('Localization', () => {
const value = await firstValueFrom(context.localize('general_close'));
expect(value).to.equal('Close');
- extensionRegistry.register({
- type: 'translations',
- alias: 'test.en.override',
- name: 'Test English',
- meta: {
- culture: 'en',
- translations: {
- general: {
- close: 'Close 2',
- },
- },
- },
- });
+ extensionRegistry.register(englishOverride);
const value2 = await firstValueFrom(context.localize('general_close'));
expect(value2).to.equal('Close 2');
});
- });
- it('should return a new value if a language is changed', async () => {
- const value = await firstValueFrom(context.localize('general_close'));
- expect(value).to.equal('Close');
+ it('should return a new value if the language is changed', async () => {
+ const value = await firstValueFrom(context.localize('general_close'));
+ expect(value).to.equal('Close');
- context.setLanguage(danish.meta.culture);
+ context.setLanguage(danish.meta.culture);
- await sleep(0);
+ await aTimeout(0);
- const value2 = await firstValueFrom(context.localize('general_close'));
- expect(value2).to.equal('Luk');
+ const value2 = await firstValueFrom(context.localize('general_close'));
+ expect(value2).to.equal('Luk');
+ });
+
+ it('should use fallback language if key is not found', async () => {
+ const value = await firstValueFrom(context.localize('general_logout'));
+ expect(value).to.equal('Log out');
+
+ context.setLanguage(danish.meta.culture);
+
+ await aTimeout(0);
+
+ const value2 = await firstValueFrom(context.localize('general_logout'));
+ expect(value2).to.equal('Log out');
+ });
});
describe('localizeMany', () => {
From 478d6da1642858c5a72793623908470cb76a03e0 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 13:46:06 +0200
Subject: [PATCH 049/122] lowercase iso codes
---
.../libs/localization-api/registry/translation.registry.ts | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 0c093e1892..3c7a866f6e 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -18,7 +18,10 @@ export class UmbTranslationRegistry {
return this.#innerDictionary.asObservable();
}
- register(userCulture: string, fallbackCulture = 'en') {
+ register(userCulture: string, fallbackCulture = 'en_us') {
+ userCulture = userCulture.toLowerCase();
+ fallbackCulture = fallbackCulture.toLowerCase();
+
// Reset the inner dictionary.
this.#innerDictionaryValue = new Map();
From f554d4ca84858d805c83f12e5695fcebfe04c117 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 13:46:19 +0200
Subject: [PATCH 050/122] set default language to 'en_us'
---
.../src/apps/backoffice/backoffice.element.ts | 2 +-
.../src/assets/lang/{en.json => en_us.json} | 0
.../src/packages/core/localization/manifests.ts | 6 +++---
3 files changed, 4 insertions(+), 4 deletions(-)
rename src/Umbraco.Web.UI.Client/src/assets/lang/{en.json => en_us.json} (100%)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index b4428fd3c8..34ef2a4608 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -46,7 +46,7 @@ export class UmbBackofficeElement extends UmbLitElement {
this.consumeContext(UMB_AUTH, (auth) => {
this.observe(auth.currentUser, (user) => {
if (user) {
- const languageIsoCode = user.languageIsoCode ?? 'en';
+ const languageIsoCode = user.languageIsoCode ?? 'en_us';
localizationContext.setLanguage(languageIsoCode);
}
});
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.json b/src/Umbraco.Web.UI.Client/src/assets/lang/en_us.json
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/assets/lang/en.json
rename to src/Umbraco.Web.UI.Client/src/assets/lang/en_us.json
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
index 4bb52d028c..98e41b0d7d 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
@@ -4,13 +4,13 @@ import { ManifestTranslations } from '../extension-registry/models/translations.
const translationManifests: Array = [
{
type: 'translations',
- alias: 'Umb.Translations.En',
+ alias: 'Umb.Translations.En_US',
weight: -100,
name: 'English (UK)',
meta: {
- culture: 'en',
+ culture: 'en_us',
},
- loader: () => import('../../../assets/lang/en.json'),
+ loader: () => import('../../../assets/lang/en_us.json'),
},
];
From c5fe841446fef89a7084d71569f43307906f3d70 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 13:53:16 +0200
Subject: [PATCH 051/122] convert en_us from current backoffice
---
.../src/assets/lang/en_us.json | 3003 ++++++++++++++++-
1 file changed, 3000 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en_us.json b/src/Umbraco.Web.UI.Client/src/assets/lang/en_us.json
index db19f6dd34..f07e205ca2 100644
--- a/src/Umbraco.Web.UI.Client/src/assets/lang/en_us.json
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en_us.json
@@ -1,9 +1,3006 @@
{
+ "actions": {
+ "assigndomain": "Culture and Hostnames",
+ "auditTrail": "Audit Trail",
+ "browse": "Browse Node",
+ "changeDocType": "Change Document Type",
+ "changeDataType": "Change Data Type",
+ "copy": "Copy",
+ "create": "Create",
+ "export": "Export",
+ "createPackage": "Create Package",
+ "createGroup": "Create group",
+ "delete": "Delete",
+ "disable": "Disable",
+ "editContent": "Edit content",
+ "editSettings": "Edit settings",
+ "emptyrecyclebin": "Empty recycle bin",
+ "enable": "Enable",
+ "exportDocumentType": "Export Document Type",
+ "importdocumenttype": "Import Document Type",
+ "importPackage": "Import Package",
+ "liveEdit": "Edit in Canvas",
+ "logout": "Exit",
+ "move": "Move",
+ "notify": "Notifications",
+ "protect": "Restrict Public Access",
+ "publish": "Publish",
+ "unpublish": "Unpublish",
+ "refreshNode": "Reload",
+ "republish": "Republish entire site",
+ "remove": "Remove",
+ "rename": "Rename",
+ "restore": "Restore",
+ "chooseWhereToCopy": "Choose where to copy",
+ "chooseWhereToMove": "Choose where to move",
+ "chooseWhereToImport": "Choose where to import",
+ "toInTheTreeStructureBelow": "to in the tree structure below",
+ "infiniteEditorChooseWhereToCopy": "Choose where to copy the selected item(s)",
+ "infiniteEditorChooseWhereToMove": "Choose where to move the selected item(s)",
+ "wasMovedTo": "was moved to",
+ "wasCopiedTo": "was copied to",
+ "wasDeleted": "was deleted",
+ "rights": "Permissions",
+ "rollback": "Rollback",
+ "sendtopublish": "Send To Publish",
+ "sendToTranslate": "Send To Translation",
+ "setGroup": "Set group",
+ "sort": "Sort",
+ "translate": "Translate",
+ "update": "Update",
+ "setPermissions": "Set permissions",
+ "unlock": "Unlock",
+ "createblueprint": "Create Content Template",
+ "resendInvite": "Resend Invitation",
+ "deployQueueForTransfer": "Queue for transfer",
+ "deployRestore": "Workspace restore",
+ "deployTreeRestore": "Tree restore",
+ "deployPartialRestore": "Partial restore",
+ "deployTransferNow": "Transfer now",
+ "deployCompare": "Compare"
+ },
+ "actionCategories": {
+ "content": "Content",
+ "administration": "Administration",
+ "structure": "Structure",
+ "other": "Other"
+ },
+ "actionDescriptions": {
+ "assignDomain": "Allow access to assign culture and hostnames",
+ "auditTrail": "Allow access to view a node's history log",
+ "browse": "Allow access to view a node",
+ "changeDocType": "Allow access to change Document Type for a node",
+ "copy": "Allow access to copy a node",
+ "create": "Allow access to create nodes",
+ "delete": "Allow access to delete nodes",
+ "move": "Allow access to move a node",
+ "protect": "Allow access to set and change access restrictions for a node",
+ "publish": "Allow access to publish a node",
+ "unpublish": "Allow access to unpublish a node",
+ "rights": "Allow access to change permissions for a node",
+ "rollback": "Allow access to roll back a node to a previous state",
+ "sendtopublish": "Allow access to send a node for approval before publishing",
+ "sendToTranslate": "Allow access to send a node for translation",
+ "sort": "Allow access to change the sort order for nodes",
+ "translate": "Allow access to translate a node",
+ "update": "Allow access to save a node",
+ "createblueprint": "Allow access to create a Content Template",
+ "notify": "Allow access to setup notifications for content nodes",
+ "deployQueueForTransfer": "Allow the user to queue item(s)",
+ "deployRestore": "Allow the user to restore items for the whole workspace",
+ "deployTreeRestore": "Allow the user to restore items for a tree",
+ "deployPartialRestore": "Allow the user to partial restore items",
+ "deployCompare": "Allow the user to compare items between workspaces"
+ },
+ "apps": {
+ "umbContent": "Content",
+ "umbInfo": "Info"
+ },
+ "assignDomain": {
+ "permissionDenied": "Permission denied.",
+ "addNew": "Add new domain",
+ "addCurrent": "Add current domain",
+ "remove": "remove",
+ "invalidNode": "Invalid node.",
+ "invalidDomain": "One or more domains have an invalid format.",
+ "duplicateDomain": "Domain has already been assigned.",
+ "language": "Language",
+ "domain": "Domain",
+ "domainCreated": "New domain '%0%' has been created",
+ "domainDeleted": "Domain '%0%' is deleted",
+ "domainExists": "Domain '%0%' has already been assigned",
+ "domainUpdated": "Domain '%0%' has been updated",
+ "orEdit": "Edit Current Domains",
+ "domainHelpWithVariants": "Valid domain names are: \"example.com\", \"www.example.com\", \"example.com:8080\", or \"https://www.example.com/\".\n Furthermore also one-level paths in domains are supported, eg. \"example.com/en\" or \"/en\".",
+ "inherit": "Inherit",
+ "setLanguage": "Culture",
+ "setLanguageHelp": "Set the culture for nodes below the current node, or inherit culture from parent nodes. Will also apply \n to the current node, unless a domain below applies too.",
+ "setDomains": "Domains"
+ },
+ "buttons": {
+ "clearSelection": "Clear selection",
+ "select": "Select",
+ "somethingElse": "Do something else",
+ "bold": "Bold",
+ "deindent": "Cancel Paragraph Indent",
+ "formFieldInsert": "Insert form field",
+ "graphicHeadline": "Insert graphic headline",
+ "htmlEdit": "Edit Html",
+ "indent": "Indent Paragraph",
+ "italic": "Italic",
+ "justifyCenter": "Center",
+ "justifyLeft": "Justify Left",
+ "justifyRight": "Justify Right",
+ "linkInsert": "Insert Link",
+ "linkLocal": "Insert local link (anchor)",
+ "listBullet": "Bullet List",
+ "listNumeric": "Numeric List",
+ "macroInsert": "Insert macro",
+ "pictureInsert": "Insert picture",
+ "publishAndClose": "Publish and close",
+ "publishDescendants": "Publish with descendants",
+ "relations": "Edit relations",
+ "returnToList": "Return to list",
+ "save": "Save",
+ "saveAndClose": "Save and close",
+ "saveAndPublish": "Save and publish",
+ "saveToPublish": "Send for approval",
+ "saveListView": "Save list view",
+ "schedulePublish": "Schedule",
+ "saveAndPreview": "Save and preview",
+ "showPageDisabled": "Preview is disabled because there's no template assigned",
+ "styleChoose": "Choose style",
+ "styleShow": "Show styles",
+ "tableInsert": "Insert table",
+ "generateModelsAndClose": "Generate models and close",
+ "saveAndGenerateModels": "Save and generate models",
+ "undo": "Undo",
+ "redo": "Redo",
+ "deleteTag": "Delete tag",
+ "confirmActionCancel": "Cancel",
+ "confirmActionConfirm": "Confirm",
+ "morePublishingOptions": "More publishing options",
+ "submitChanges": "Submit"
+ },
+ "auditTrails": {
+ "atViewingFor": "Viewing for",
+ "delete": "Content deleted",
+ "unpublish": "Content unpublished",
+ "unpublishvariant": "Content unpublished for languages: %0%",
+ "publish": "Content published",
+ "publishvariant": "Content published for languages: %0%",
+ "save": "Content saved",
+ "savevariant": "Content saved for languages: %0%",
+ "move": "Content moved",
+ "copy": "Content copied",
+ "rollback": "Content rolled back",
+ "sendtopublish": "Content sent for publishing",
+ "sendtopublishvariant": "Content sent for publishing for languages: %0%",
+ "sort": "Sort child items performed by user",
+ "custom": "%0%",
+ "contentversionpreventcleanup": "Cleanup disabled for version: %0%",
+ "contentversionenablecleanup": "Cleanup enabled for version: %0%",
+ "smallCopy": "Copy",
+ "smallPublish": "Publish",
+ "smallPublishVariant": "Publish",
+ "smallMove": "Move",
+ "smallSave": "Save",
+ "smallSaveVariant": "Save",
+ "smallDelete": "Delete",
+ "smallUnpublish": "Unpublish",
+ "smallUnpublishVariant": "Unpublish",
+ "smallRollBack": "Rollback",
+ "smallSendToPublish": "Send To Publish",
+ "smallSendToPublishVariant": "Send To Publish",
+ "smallSort": "Sort",
+ "smallCustom": "Custom",
+ "smallContentVersionPreventCleanup": "Save",
+ "smallContentVersionEnableCleanup": "Save",
+ "historyIncludingVariants": "History (all variants)"
+ },
+ "codefile": {
+ "createFolderIllegalChars": "The folder name cannot contain illegal characters.",
+ "deleteItemFailed": "Failed to delete item: %0%"
+ },
+ "content": {
+ "isPublished": "Is Published",
+ "about": "About this page",
+ "alias": "Alias",
+ "alternativeTextHelp": "(how would you describe the picture over the phone)",
+ "alternativeUrls": "Alternative Links",
+ "clickToEdit": "Click to edit this item",
+ "createBy": "Created by",
+ "createByDesc": "Original author",
+ "updatedBy": "Updated by",
+ "createDate": "Created",
+ "createDateDesc": "Date/time this document was created",
+ "documentType": "Document Type",
+ "editing": "Editing",
+ "expireDate": "Remove at",
+ "itemChanged": "This item has been changed after publication",
+ "itemNotPublished": "This item is not published",
+ "lastPublished": "Last published",
+ "noItemsToShow": "There are no items to show",
+ "listViewNoItems": "There are no items to show in the list.",
+ "listViewNoContent": "No child items have been added",
+ "listViewNoMembers": "No members have been added",
+ "mediatype": "Media Type",
+ "mediaLinks": "Link to media item(s)",
+ "membergroup": "Member Group",
+ "memberrole": "Role",
+ "membertype": "Member Type",
+ "noChanges": "No changes have been made",
+ "noDate": "No date chosen",
+ "nodeName": "Page title",
+ "noMediaLink": "This media item has no link",
+ "noProperties": "No content can be added for this item",
+ "otherElements": "Properties",
+ "parentNotPublished": "This document is published but is not visible because the parent '%0%' is\n unpublished\n ",
+ "parentCultureNotPublished": "This culture is published but is not visible because it is unpublished on\n parent '%0%'\n ",
+ "parentNotPublishedAnomaly": "This document is published but is not in the cache",
+ "getUrlException": "Could not get the URL",
+ "routeError": "This document is published but its URL would collide with content %0%",
+ "routeErrorCannotRoute": "This document is published but its URL cannot be routed",
+ "publish": "Publish",
+ "published": "Published",
+ "publishedPendingChanges": "Published (pending changes)",
+ "publishStatus": "Publication Status",
+ "publishDescendantsHelp": "Publish %0% and all content items underneath and thereby making their content publicly available.",
+ "publishDescendantsWithVariantsHelp": "Publish variants and variants of same type underneath and thereby making their content publicly available.",
+ "releaseDate": "Publish at",
+ "unpublishDate": "Unpublish at",
+ "removeDate": "Clear Date",
+ "setDate": "Set date",
+ "sortDone": "Sortorder is updated",
+ "sortHelp": "To sort the nodes, simply drag the nodes or click one of the column headers. You can select\n multiple nodes by holding the \"shift\" or \"control\" key while selecting\n ",
+ "statistics": "Statistics",
+ "titleOptional": "Title (optional)",
+ "altTextOptional": "Alternative text (optional)",
+ "captionTextOptional": "Caption (optional)",
+ "type": "Type",
+ "unpublish": "Unpublish",
+ "unpublished": "Unpublished",
+ "notCreated": "Not created",
+ "updateDate": "Last edited",
+ "updateDateDesc": "Date/time this document was edited",
+ "uploadClear": "Remove file(s)",
+ "uploadClearImageContext": "Click here to remove the image from the media item",
+ "uploadClearFileContext": "Click here to remove the file from the media item",
+ "urls": "Link to document",
+ "memberof": "Member of group(s)",
+ "notmemberof": "Not a member of group(s)",
+ "childItems": "Child items",
+ "target": "Target",
+ "scheduledPublishServerTime": "This translates to the following time on the server:",
+ "scheduledPublishDocumentation": "What does this mean? ",
+ "nestedContentDeleteItem": "Are you sure you want to delete this item?",
+ "nestedContentDeleteAllItems": "Are you sure you want to delete all items?",
+ "nestedContentEditorNotSupported": "Property %0% uses editor %1% which is not supported by Nested\n Content.\n ",
+ "nestedContentNoContentTypes": "No Content Types are configured for this property.",
+ "nestedContentAddElementType": "Add Element Type",
+ "nestedContentSelectElementTypeModalTitle": "Select Element Type",
+ "nestedContentGroupHelpText": "Select the group whose properties should be displayed. If left blank, the\n first group on the Element Type will be used.\n ",
+ "nestedContentTemplateHelpTextPart1": "Enter an angular expression to evaluate against each item for its\n name. Use\n ",
+ "nestedContentTemplateHelpTextPart2": "to display the item index",
+ "nestedContentNoGroups": "The selected element type does not contain any supported groups (tabs are not supported by this editor, either change them to groups or use the Block List editor).",
+ "addTextBox": "Add another text box",
+ "removeTextBox": "Remove this text box",
+ "contentRoot": "Content root",
+ "includeUnpublished": "Include unpublished content items.",
+ "isSensitiveValue": "This value is hidden. If you need access to view this value please contact your\n website administrator.\n ",
+ "isSensitiveValue_short": "This value is hidden.",
+ "languagesToPublish": "What languages would you like to publish?",
+ "languagesToSendForApproval": "What languages would you like to send for approval?",
+ "languagesToSchedule": "What languages would you like to schedule?",
+ "languagesToUnpublish": "Select the languages to unpublish. Unpublishing a mandatory language will\n unpublish all languages.\n ",
+ "variantsWillBeSaved": "All new variants will be saved.",
+ "variantsToPublish": "Which variants would you like to publish?",
+ "variantsToSave": "Choose which variants to be saved.",
+ "publishRequiresVariants": "The following variants is required for publishing to take place:",
+ "notReadyToPublish": "We are not ready to Publish",
+ "readyToPublish": "Ready to publish?",
+ "readyToSave": "Ready to Save?",
+ "resetFocalPoint": "Reset focal point",
+ "sendForApproval": "Send for approval",
+ "schedulePublishHelp": "Select the date and time to publish and/or unpublish the content item.",
+ "createEmpty": "Create new",
+ "createFromClipboard": "Paste from clipboard",
+ "nodeIsInTrash": "This item is in the Recycle Bin",
+ "variantSaveNotAllowed": "Save is not allowed",
+ "variantPublishNotAllowed": "Publish is not allowed",
+ "variantSendForApprovalNotAllowed": "Send for approval is not allowed",
+ "variantScheduleNotAllowed": "Schedule is not allowed",
+ "variantUnpublishNotAllowed": "Unpublish is not allowed"
+ },
+ "blueprints": {
+ "createBlueprintFrom": "Create a new Content Template from %0% ",
+ "blankBlueprint": "Blank",
+ "selectBlueprint": "Select a Content Template",
+ "createdBlueprintHeading": "Content Template created",
+ "createdBlueprintMessage": "A Content Template was created from '%0%'",
+ "duplicateBlueprintMessage": "Another Content Template with the same name already exists",
+ "blueprintDescription": "A Content Template is predefined content that an editor can select to use as the\n basis for creating new content\n "
+ },
+ "media": {
+ "clickToUpload": "Click to upload",
+ "orClickHereToUpload": "or click here to choose files",
+ "disallowedFileType": "Cannot upload this file, it does not have an approved file type",
+ "disallowedMediaType": "Cannot upload this file, the media type with alias '%0%' is not allowed here",
+ "invalidFileName": "Cannot upload this file, it does not have a valid file name",
+ "maxFileSize": "Max file size is",
+ "mediaRoot": "Media root",
+ "moveToSameFolderFailed": "Parent and destination folders cannot be the same",
+ "createFolderFailed": "Failed to create a folder under parent id %0%",
+ "renameFolderFailed": "Failed to rename the folder with id %0%",
+ "dragAndDropYourFilesIntoTheArea": "Drag and drop your file(s) into the area",
+ "uploadNotAllowed": "Upload is not allowed in this location."
+ },
+ "member": {
+ "createNewMember": "Create a new member",
+ "allMembers": "All Members",
+ "duplicateMemberLogin": "A member with this login already exists",
+ "memberGroupNoProperties": "Member groups have no additional properties for editing.",
+ "memberHasGroup": "The member is already in group '%0%'",
+ "memberHasPassword": "The member already has a password set",
+ "memberLockoutNotEnabled": "Lockout is not enabled for this member",
+ "memberNotInGroup": "The member is not in group '%0%'",
+ "2fa": "Two-Factor Authentication"
+ },
+ "contentType": {
+ "copyFailed": "Failed to copy content type",
+ "moveFailed": "Failed to move content type"
+ },
+ "mediaType": {
+ "copyFailed": "Failed to copy media type",
+ "moveFailed": "Failed to move media type",
+ "autoPickMediaType": "Auto pick"
+ },
+ "memberType": {
+ "copyFailed": "Failed to copy member type"
+ },
+ "create": {
+ "chooseNode": "Where do you want to create the new %0%",
+ "createUnder": "Create an item under",
+ "createContentBlueprint": "Select the Document Type you want to make a content template for",
+ "enterFolderName": "Enter a folder name",
+ "updateData": "Choose a type and a title",
+ "noDocumentTypes": "There are no allowed Document Types available for creating content here. You must enable these in Document Types within the Settings section, by editing the Allowed child node types under Permissions .",
+ "noDocumentTypesAtRoot": "There are no Document Types available for creating content here. You must create these in Document Types within the Settings section.",
+ "noDocumentTypesWithNoSettingsAccess": "The selected page in the content tree doesn't allow for any pages\n to be created below it.\n ",
+ "noDocumentTypesEditPermissions": "Edit permissions for this Document Type",
+ "noDocumentTypesCreateNew": "Create a new Document Type",
+ "noDocumentTypesAllowedAtRoot": "There are no allowed Document Types available for creating content here. You must enable these in Document Types within the Settings section, by changing the Allow as root option under Permissions .",
+ "noMediaTypes": "There are no allowed Media Types available for creating media here. You must enable these in Media Types Types within the Settings section, by editing the Allowed child node types under Permissions .",
+ "noMediaTypesWithNoSettingsAccess": "The selected media in the tree doesn't allow for any other media to be\n created below it.\n ",
+ "noMediaTypesEditPermissions": "Edit permissions for this Media Type",
+ "documentTypeWithoutTemplate": "Document Type without a template",
+ "documentTypeWithTemplate": "Document Type with Template",
+ "documentTypeWithTemplateDescription": "The data definition for a content page that can be created by\n editors in the content tree and is directly accessible via a URL.\n ",
+ "documentType": "Document Type",
+ "documentTypeDescription": "The data definition for a content component that can be created by editors in\n the content tree and be picked on other pages but has no direct URL.\n ",
+ "elementType": "Element Type",
+ "elementTypeDescription": "Defines the schema for a repeating set of properties, for example, in a 'Block\n List' or 'Block Grid' property editor.\n ",
+ "composition": "Composition",
+ "compositionDescription": "Defines a re-usable set of properties that can be included in the definition of\n multiple other Document Types. For example, a set of 'Common Page Settings'.\n ",
+ "folder": "Folder",
+ "folderDescription": "Used to organise the Document Types, Compositions and Element Types created in this\n Document Type tree.\n ",
+ "newFolder": "New folder",
+ "newDataType": "New Data Type",
+ "newJavascriptFile": "New JavaScript file",
+ "newEmptyPartialView": "New empty partial view",
+ "newPartialViewMacro": "New partial view macro",
+ "newPartialViewFromSnippet": "New partial view from snippet",
+ "newPartialViewMacroFromSnippet": "New partial view macro from snippet",
+ "newPartialViewMacroNoMacro": "New partial view macro (without macro)",
+ "newStyleSheetFile": "New style sheet file",
+ "newRteStyleSheetFile": "New Rich Text Editor style sheet file"
+ },
+ "dashboard": {
+ "browser": "Browse your website",
+ "dontShowAgain": "- Hide",
+ "nothinghappens": "If Umbraco isn't opening, you might need to allow popups from this site",
+ "openinnew": "has opened in a new window",
+ "restart": "Restart",
+ "visit": "Visit",
+ "welcome": "Welcome"
+ },
+ "prompt": {
+ "stay": "Stay",
+ "discardChanges": "Discard changes",
+ "unsavedChanges": "You have unsaved changes",
+ "unsavedChangesWarning": "Are you sure you want to navigate away from this page? - you have unsaved\n changes\n ",
+ "confirmListViewPublish": "Publishing will make the selected items visible on the site.",
+ "confirmListViewUnpublish": "Unpublishing will remove the selected items and all their descendants from the\n site.\n ",
+ "confirmUnpublish": "Unpublishing will remove this page and all its descendants from the site.",
+ "doctypeChangeWarning": "You have unsaved changes. Making changes to the Document Type will discard the\n changes.\n "
+ },
+ "bulk": {
+ "done": "Done",
+ "deletedItem": "Deleted %0% item",
+ "deletedItems": "Deleted %0% items",
+ "deletedItemOfItem": "Deleted %0% out of %1% item",
+ "deletedItemOfItems": "Deleted %0% out of %1% items",
+ "publishedItem": "Published %0% item",
+ "publishedItems": "Published %0% items",
+ "publishedItemOfItem": "Published %0% out of %1% item",
+ "publishedItemOfItems": "Published %0% out of %1% items",
+ "unpublishedItem": "Unpublished %0% item",
+ "unpublishedItems": "Unpublished %0% items",
+ "unpublishedItemOfItem": "Unpublished %0% out of %1% item",
+ "unpublishedItemOfItems": "Unpublished %0% out of %1% items",
+ "movedItem": "Moved %0% item",
+ "movedItems": "Moved %0% items",
+ "movedItemOfItem": "Moved %0% out of %1% item",
+ "movedItemOfItems": "Moved %0% out of %1% items",
+ "copiedItem": "Copied %0% item",
+ "copiedItems": "Copied %0% items",
+ "copiedItemOfItem": "Copied %0% out of %1% item",
+ "copiedItemOfItems": "Copied %0% out of %1% items"
+ },
+ "defaultdialogs": {
+ "nodeNameLinkPicker": "Link title",
+ "urlLinkPicker": "Link",
+ "anchorLinkPicker": "Anchor / querystring",
+ "anchorInsert": "Name",
+ "closeThisWindow": "Close this window",
+ "confirmdelete": "Are you sure you want to delete",
+ "confirmdeleteNumberOfItems": "Are you sure you want to delete %0% of %1% items",
+ "confirmdisable": "Are you sure you want to disable",
+ "confirmremove": "Are you sure you want to remove",
+ "confirmremoveusageof": "Are you sure you want to remove the usage of %0% ",
+ "confirmlogout": "Are you sure?",
+ "confirmSure": "Are you sure?",
+ "cut": "Cut",
+ "editdictionary": "Edit Dictionary Item",
+ "editlanguage": "Edit Language",
+ "editSelectedMedia": "Edit selected media",
+ "insertAnchor": "Insert local link",
+ "insertCharacter": "Insert character",
+ "insertgraphicheadline": "Insert graphic headline",
+ "insertimage": "Insert picture",
+ "insertlink": "Insert link",
+ "insertMacro": "Click to add a Macro",
+ "inserttable": "Insert table",
+ "languagedeletewarning": "This will delete the language",
+ "languageChangeWarning": "Changing the culture for a language may be an expensive operation and will result\n in the content cache and indexes being rebuilt\n ",
+ "lastEdited": "Last Edited",
+ "link": "Link",
+ "linkinternal": "Internal link:",
+ "linklocaltip": "When using local links, insert \"#\" in front of link",
+ "linknewwindow": "Open in new window?",
+ "macroDoesNotHaveProperties": "This macro does not contain any properties you can edit",
+ "paste": "Paste",
+ "permissionsEdit": "Edit permissions for",
+ "permissionsSet": "Set permissions for",
+ "permissionsSetForGroup": "Set permissions for %0% for user group %1%",
+ "permissionsHelp": "Select the users groups you want to set permissions for",
+ "recycleBinDeleting": "The items in the recycle bin are now being deleted. Please do not close this window\n while this operation takes place\n ",
+ "recycleBinIsEmpty": "The recycle bin is now empty",
+ "recycleBinWarning": "When items are deleted from the recycle bin, they will be gone forever",
+ "regexSearchError": "regexlib.com 's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.",
+ "regexSearchHelp": "Search for a regular expression to add validation to a form field. Example: 'email,\n 'zip-code', 'URL'.\n ",
+ "removeMacro": "Remove Macro",
+ "requiredField": "Required Field",
+ "sitereindexed": "Site is reindexed",
+ "siterepublished": "The website cache has been refreshed. All publish content is now up to date. While all\n unpublished content is still unpublished\n ",
+ "siterepublishHelp": "The website cache will be refreshed. All published content will be updated, while\n unpublished content will stay unpublished.\n ",
+ "tableColumns": "Number of columns",
+ "tableRows": "Number of rows",
+ "thumbnailimageclickfororiginal": "Click on the image to see full size",
+ "treepicker": "Pick item",
+ "viewCacheItem": "View Cache Item",
+ "relateToOriginalLabel": "Relate to original",
+ "includeDescendants": "Include descendants",
+ "theFriendliestCommunity": "The friendliest community",
+ "linkToPage": "Link to page",
+ "openInNewWindow": "Opens the linked document in a new window or tab",
+ "linkToMedia": "Link to media",
+ "selectContentStartNode": "Select content start node",
+ "selectMedia": "Select media",
+ "selectMediaType": "Select media type",
+ "selectIcon": "Select icon",
+ "selectItem": "Select item",
+ "selectLink": "Select link",
+ "selectMacro": "Select macro",
+ "selectContent": "Select content",
+ "selectContentType": "Select content type",
+ "selectMediaStartNode": "Select media start node",
+ "selectMember": "Select member",
+ "selectMemberGroup": "Select member group",
+ "selectMemberType": "Select member type",
+ "selectNode": "Select node",
+ "selectLanguages": "Select languages",
+ "selectSections": "Select sections",
+ "selectUser": "Select user",
+ "selectUsers": "Select users",
+ "noIconsFound": "No icons were found",
+ "noMacroParams": "There are no parameters for this macro",
+ "noMacros": "There are no macros available to insert",
+ "externalLoginProviders": "External login providers",
+ "exceptionDetail": "Exception Details",
+ "stacktrace": "Stacktrace",
+ "innerException": "Inner Exception",
+ "linkYour": "Link your",
+ "unLinkYour": "Un-link your",
+ "account": "account",
+ "selectEditor": "Select editor",
+ "selectEditorConfiguration": "Select configuration",
+ "selectSnippet": "Select snippet",
+ "variantdeletewarning": "This will delete the node and all its languages. If you only want to delete one\n language, you should unpublish the node in that language instead.\n ",
+ "propertyuserpickerremovewarning": "This will remove the user %0% .",
+ "userremovewarning": "This will remove the user %0% from the %1% group",
+ "yesRemove": "Yes, remove",
+ "deleteLayout": "You are deleting the layout",
+ "deletingALayout": "Modifying layout will result in loss of data for any existing content that is based on this configuration."
+ },
+ "dictionary": {
+ "importDictionaryItemHelp": "\n To import a dictionary item, find the \".udt\" file on your computer by clicking the\n \"Import\" button (you'll be asked for confirmation on the next screen)\n ",
+ "itemDoesNotExists": "Dictionary item does not exist.",
+ "parentDoesNotExists": "Parent item does not exist.",
+ "noItems": "There are no dictionary items.",
+ "noItemsInFile": "There are no dictionary items in this file.",
+ "noItemsFound": "There were no dictionary items found.",
+ "createNew": "Create dictionary item"
+ },
+ "dictionaryItem": {
+ "description": "\n Edit the different language versions for the dictionary item '%0% ' below\n ",
+ "displayName": "Culture Name",
+ "changeKeyError": "\n The key '%0%' already exists.\n ",
+ "overviewTitle": "Dictionary overview"
+ },
+ "examineManagement": {
+ "configuredSearchers": "Configured Searchers",
+ "configuredSearchersDescription": "Shows properties and tools for any configured Searcher (i.e. such as a\n multi-index searcher)\n ",
+ "fieldValues": "Field values",
+ "healthStatus": "Health status",
+ "healthStatusDescription": "The health status of the index and if it can be read",
+ "indexers": "Indexers",
+ "indexInfo": "Index info",
+ "contentInIndex": "Content in index",
+ "indexInfoDescription": "Lists the properties of the index",
+ "manageIndexes": "Manage Examine's indexes",
+ "manageIndexesDescription": "Allows you to view the details of each index and provides some tools for\n managing the indexes\n ",
+ "rebuildIndex": "Rebuild index",
+ "rebuildIndexWarning": "\n This will cause the index to be rebuilt. \n Depending on how much content there is in your site this could take a while. \n It is not recommended to rebuild an index during times of high website traffic or when editors are editing content.\n ",
+ "searchers": "Searchers",
+ "searchDescription": "Search the index and view the results",
+ "tools": "Tools",
+ "toolsDescription": "Tools to manage the index",
+ "fields": "fields",
+ "indexCannotRead": "The index cannot be read and will need to be rebuilt",
+ "processIsTakingLonger": "The process is taking longer than expected, check the Umbraco log to see if there\n have been any errors during this operation\n ",
+ "indexCannotRebuild": "This index cannot be rebuilt because it has no assigned",
+ "iIndexPopulator": "IIndexPopulator"
+ },
+ "placeholders": {
+ "username": "Enter your username",
+ "password": "Enter your password",
+ "confirmPassword": "Confirm your password",
+ "nameentity": "Name the %0%...",
+ "entername": "Enter a name...",
+ "enteremail": "Enter an email...",
+ "enterusername": "Enter a username...",
+ "label": "Label...",
+ "enterDescription": "Enter a description...",
+ "search": "Type to search...",
+ "filter": "Type to filter...",
+ "enterTags": "Type to add tags (press enter after each tag)...",
+ "email": "Enter your email",
+ "enterMessage": "Enter a message...",
+ "usernameHint": "Your username is usually your email",
+ "anchor": "#value or ?key=value",
+ "enterAlias": "Enter alias...",
+ "generatingAlias": "Generating alias...",
+ "a11yCreateItem": "Create item",
+ "a11yEdit": "Edit",
+ "a11yName": "Name"
+ },
+ "editcontenttype": {
+ "createListView": "Create custom list view",
+ "removeListView": "Remove custom list view",
+ "aliasAlreadyExists": "A Content Type, Media Type or Member Type with this alias already exists"
+ },
+ "renamecontainer": {
+ "renamed": "Renamed",
+ "enterNewFolderName": "Enter a new folder name here",
+ "folderWasRenamed": "%0% was renamed to %1%"
+ },
+ "editdatatype": {
+ "canChangePropertyEditorHelp": "Changing a property editor on a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json.",
+ "addPrevalue": "Add prevalue",
+ "dataBaseDatatype": "Database datatype",
+ "guid": "Property editor GUID",
+ "renderControl": "Property editor",
+ "rteButtons": "Buttons",
+ "rteEnableAdvancedSettings": "Enable advanced settings for",
+ "rteEnableContextMenu": "Enable context menu",
+ "rteMaximumDefaultImgSize": "Maximum default size of inserted images",
+ "rteRelatedStylesheets": "Related stylesheets",
+ "rteShowLabel": "Show label",
+ "rteWidthAndHeight": "Width and height",
+ "selectFolder": "Select the folder to move",
+ "inTheTree": "to in the tree structure below",
+ "wasMoved": "was moved underneath",
+ "hasReferencesDeleteConsequence": "Deleting %0% will delete the properties and their data from the following items",
+ "acceptDeleteConsequence": "I understand this action will delete the properties and data based on this Data\n Type\n "
+ },
+ "errorHandling": {
+ "errorButDataWasSaved": "Your data has been saved, but before you can publish this page there are some\n errors you need to fix first:\n ",
+ "errorChangingProviderPassword": "The current membership provider does not support changing password\n (EnablePasswordRetrieval need to be true)\n ",
+ "errorExistsWithoutTab": "%0% already exists",
+ "errorHeader": "There were errors:",
+ "errorHeaderWithoutTab": "There were errors:",
+ "errorInPasswordFormat": "The password should be a minimum of %0% characters long and contain at least %1%\n non-alpha numeric character(s)\n ",
+ "errorIntegerWithoutTab": "%0% must be an integer",
+ "errorMandatory": "The %0% field in the %1% tab is mandatory",
+ "errorMandatoryWithoutTab": "%0% is a mandatory field",
+ "errorRegExp": "%0% at %1% is not in a correct format",
+ "errorRegExpWithoutTab": "%0% is not in a correct format"
+ },
+ "errors": {
+ "defaultError": "An unknown failure has occurred",
+ "concurrencyError": "Optimistic concurrency failure, object has been modified",
+ "receivedErrorFromServer": "Received an error from the server",
+ "dissallowedMediaType": "The specified file type has been disallowed by the administrator",
+ "codemirroriewarning": "NOTE! Even though CodeMirror is enabled by configuration, it is disabled in\n Internet Explorer because it's not stable enough.\n ",
+ "contentTypeAliasAndNameNotNull": "Please fill both alias and name on the new property type!",
+ "filePermissionsError": "There is a problem with read/write access to a specific file or folder",
+ "macroErrorLoadingPartialView": "Error loading Partial View script (file: %0%)",
+ "missingTitle": "Please enter a title",
+ "missingType": "Please choose a type",
+ "pictureResizeBiggerThanOrg": "You're about to make the picture larger than the original size. Are you sure\n that you want to proceed?\n ",
+ "startNodeDoesNotExists": "Startnode deleted, please contact your administrator",
+ "stylesMustMarkBeforeSelect": "Please mark content before changing style",
+ "stylesNoStylesOnPage": "No active styles available",
+ "tableColMergeLeft": "Please place cursor at the left of the two cells you wish to merge",
+ "tableSplitNotSplittable": "You cannot split a cell that hasn't been merged.",
+ "propertyHasErrors": "This property is invalid"
+ },
"general": {
- "logout": "Log out",
- "close": "Close"
+ "options": "Options",
+ "about": "About",
+ "action": "Action",
+ "actions": "Actions",
+ "add": "Add",
+ "alias": "Alias",
+ "all": "All",
+ "areyousure": "Are you sure?",
+ "back": "Back",
+ "backToOverview": "Back to overview",
+ "border": "Border",
+ "by": "by",
+ "cancel": "Cancel",
+ "cellMargin": "Cell margin",
+ "choose": "Choose",
+ "clear": "Clear",
+ "close": "Close",
+ "closewindow": "Close Window",
+ "closepane": "Close Pane",
+ "comment": "Comment",
+ "confirm": "Confirm",
+ "constrain": "Constrain",
+ "constrainProportions": "Constrain proportions",
+ "content": "Content",
+ "continue": "Continue",
+ "copy": "Copy",
+ "create": "Create",
+ "cropSection": "Crop section",
+ "database": "Database",
+ "date": "Date",
+ "default": "Default",
+ "delete": "Delete",
+ "deleted": "Deleted",
+ "deleting": "Deleting...",
+ "design": "Design",
+ "dictionary": "Dictionary",
+ "dimensions": "Dimensions",
+ "discard": "Discard",
+ "down": "Down",
+ "download": "Download",
+ "edit": "Edit",
+ "edited": "Edited",
+ "elements": "Elements",
+ "email": "Email",
+ "error": "Error",
+ "field": "Field",
+ "findDocument": "Find",
+ "first": "First",
+ "focalPoint": "Focal point",
+ "general": "General",
+ "generic": "Generic",
+ "groups": "Groups",
+ "group": "Group",
+ "height": "Height",
+ "help": "Help",
+ "hide": "Hide",
+ "history": "History",
+ "icon": "Icon",
+ "id": "Id",
+ "import": "Import",
+ "excludeFromSubFolders": "Search only this folder",
+ "info": "Info",
+ "innerMargin": "Inner margin",
+ "insert": "Insert",
+ "install": "Install",
+ "invalid": "Invalid",
+ "justify": "Justify",
+ "label": "Label",
+ "language": "Language",
+ "last": "Last",
+ "layout": "Layout",
+ "links": "Links",
+ "loading": "Loading",
+ "locked": "Locked",
+ "login": "Login",
+ "logoff": "Log off",
+ "logout": "Logout",
+ "macro": "Macro",
+ "mandatory": "Mandatory",
+ "media": "Media",
+ "message": "Message",
+ "move": "Move",
+ "name": "Name",
+ "new": "New",
+ "next": "Next",
+ "no": "No",
+ "nodeName": "Node Name",
+ "of": "of",
+ "off": "Off",
+ "ok": "OK",
+ "open": "Open",
+ "on": "On",
+ "or": "or",
+ "orderBy": "Order by",
+ "password": "Password",
+ "path": "Path",
+ "pleasewait": "One moment please...",
+ "previous": "Previous",
+ "properties": "Properties",
+ "readMore": "Read more",
+ "rebuild": "Rebuild",
+ "reciept": "Email to receive form data",
+ "recycleBin": "Recycle Bin",
+ "recycleBinEmpty": "Your recycle bin is empty",
+ "reload": "Reload",
+ "revert": "Revert",
+ "remaining": "Remaining",
+ "remove": "Remove",
+ "rename": "Rename",
+ "renew": "Renew",
+ "required": "Required",
+ "retrieve": "Retrieve",
+ "retry": "Retry",
+ "rights": "Permissions",
+ "scheduledPublishing": "Scheduled Publishing",
+ "umbracoInfo": "Umbraco info",
+ "search": "Search",
+ "searchNoResult": "Sorry, we can not find what you are looking for.",
+ "noItemsInList": "No items have been added",
+ "server": "Server",
+ "settings": "Settings",
+ "shared": "Shared",
+ "show": "Show",
+ "showPageOnSend": "Show page on Send",
+ "size": "Size",
+ "sort": "Sort",
+ "status": "Status",
+ "submit": "Submit",
+ "success": "Success",
+ "type": "Type",
+ "typeName": "Type Name",
+ "typeToSearch": "Type to search...",
+ "under": "under",
+ "up": "Up",
+ "update": "Update",
+ "upgrade": "Upgrade",
+ "upload": "Upload",
+ "url": "URL",
+ "user": "User",
+ "username": "Username",
+ "validate": "Validate",
+ "value": "Value",
+ "view": "View",
+ "welcome": "Welcome...",
+ "width": "Width",
+ "yes": "Yes",
+ "folder": "Folder",
+ "searchResults": "Search results",
+ "reorder": "Reorder",
+ "reorderDone": "I am done reordering",
+ "preview": "Preview",
+ "changePassword": "Change password",
+ "to": "to",
+ "listView": "List view",
+ "saving": "Saving...",
+ "current": "current",
+ "embed": "Embed",
+ "selected": "selected",
+ "other": "Other",
+ "articles": "Articles",
+ "videos": "Videos",
+ "avatar": "Avatar for",
+ "header": "Header",
+ "systemField": "system field",
+ "lastUpdated": "Last Updated",
+ "skipToMenu": "Skip to menu",
+ "skipToContent": "Skip to content",
+ "Deploy": "Deploy",
+ "restore": "Restore"
+ },
+ "colors": {
+ "blue": "Blue"
+ },
+ "shortcuts": {
+ "addTab": "Add tab",
+ "addGroup": "Add group",
+ "addProperty": "Add property",
+ "addEditor": "Add editor",
+ "addTemplate": "Add template",
+ "addChildNode": "Add child node",
+ "addChild": "Add child",
+ "editDataType": "Edit data type",
+ "navigateSections": "Navigate sections",
+ "shortcut": "Shortcuts",
+ "showShortcuts": "show shortcuts",
+ "toggleListView": "Toggle list view",
+ "toggleAllowAsRoot": "Toggle allow as root",
+ "commentLine": "Comment/Uncomment lines",
+ "removeLine": "Remove line",
+ "copyLineUp": "Copy Lines Up",
+ "copyLineDown": "Copy Lines Down",
+ "moveLineUp": "Move Lines Up",
+ "moveLineDown": "Move Lines Down",
+ "generalHeader": "General",
+ "editorHeader": "Editor",
+ "toggleAllowCultureVariants": "Toggle allow culture variants"
+ },
+ "graphicheadline": {
+ "backgroundcolor": "Background color",
+ "bold": "Bold",
+ "color": "Text color",
+ "font": "Font",
+ "text": "Text"
+ },
+ "headers": {
+ "page": "Page"
+ },
+ "installer": {
+ "databaseErrorCannotConnect": "The installer cannot connect to the database.",
+ "databaseErrorWebConfig": "Could not save the web.config file. Please modify the connection string\n manually.\n ",
+ "databaseFound": "Your database has been found and is identified as",
+ "databaseHeader": "Database configuration",
+ "databaseInstall": "\n Press the install button to install the Umbraco %0% database\n ",
+ "databaseInstallDone": "Umbraco %0% has now been copied to your database. Press Next to proceed.",
+ "databaseNotFound": "Database not found! Please check that the information in the \"connection string\" of the \"web.config\" file is correct.
\n To proceed, please edit the \"web.config\" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named \"UmbracoDbDSN\" and save the file.
\n \n Click the retry button when\n done.\n\t\t\t More information on editing web.config here .
",
+ "databaseText": "To complete this step, you must know some information regarding your database server (\"connection string\"). \n Please contact your ISP if necessary.\n If you're installing on a local machine or server you might need information from your system administrator.",
+ "databaseUpgrade": "\n \n Press the upgrade button to upgrade your database to Umbraco %0%
\n \n Don't worry - no content will be deleted and everything will continue working afterwards!\n
\n ",
+ "databaseUpgradeDone": "Your database has been upgraded to the final version %0%. Press Next to\n proceed. ",
+ "databaseUpToDate": "Your current database is up-to-date!. Click next to continue the configuration wizard",
+ "defaultUserChangePass": "The Default users' password needs to be changed! ",
+ "defaultUserDisabled": "The Default user has been disabled or has no access to Umbraco!
No further actions needs to be taken. Click Next to proceed.",
+ "defaultUserPassChanged": "The Default user's password has been successfully changed since the installation!
No further actions needs to be taken. Click Next to proceed.",
+ "defaultUserPasswordChanged": "The password is changed!",
+ "greatStart": "Get a great start, watch our introduction videos",
+ "licenseText": "By clicking the next button (or modifying the umbracoConfigurationStatus in web.config),\n you accept the license for this software as specified in the box below. Notice that this Umbraco distribution\n consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license\n that covers the UI.\n ",
+ "None": "Not installed yet.",
+ "permissionsAffectedFolders": "Affected files and folders",
+ "permissionsAffectedFoldersMoreInfo": "More information on setting up permissions for Umbraco here",
+ "permissionsAffectedFoldersText": "You need to grant ASP.NET modify permissions to the following\n files/folders\n ",
+ "permissionsAlmostPerfect": "Your permission settings are almost perfect! \n You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.",
+ "permissionsHowtoResolve": "How to Resolve",
+ "permissionsHowtoResolveLink": "Click here to read the text version",
+ "permissionsHowtoResolveText": "Watch our video tutorial on setting up folder permissions for Umbraco or read the text version.",
+ "permissionsMaybeAnIssue": "Your permission settings might be an issue! \n \n You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.",
+ "permissionsNotReady": "Your permission settings are not ready for Umbraco! \n \n In order to run Umbraco, you'll need to update your permission settings.",
+ "permissionsPerfect": "Your permission settings are perfect! \n You are ready to run Umbraco and install packages!",
+ "permissionsResolveFolderIssues": "Resolving folder issue",
+ "permissionsResolveFolderIssuesLink": "Follow this link for more information on problems with ASP.NET and\n creating folders\n ",
+ "permissionsSettingUpPermissions": "Setting up folder permissions",
+ "permissionsText": "\n Umbraco needs write/modify access to certain directories in order to store files like pictures and PDF's.\n It also stores temporary data (aka: cache) for enhancing the performance of your website.\n ",
+ "runwayFromScratch": "I want to start from scratch",
+ "runwayFromScratchText": "\n Your website is completely empty at the moment, so that's perfect if you want to start from scratch and create your own Document Types and templates.\n (learn how )\n You can still choose to install Runway later on. Please go to the Developer section and choose Packages.\n ",
+ "runwayHeader": "You've just set up a clean Umbraco platform. What do you want to do next?",
+ "runwayInstalled": "Runway is installed",
+ "runwayInstalledText": "\n You have the foundation in place. Select what modules you wish to install on top of it. \n This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules \n ",
+ "runwayOnlyProUsers": "Only recommended for experienced users",
+ "runwaySimpleSite": "I want to start with a simple website",
+ "runwaySimpleSiteText": "\n
\n \"Runway\" is a simple website providing some basic Document Types and templates. The installer can set up Runway for you automatically,\n but you can easily edit, extend or remove it. It's not necessary and you can perfectly use Umbraco without it. However,\n Runway offers an easy foundation based on best practices to get you started faster than ever.\n If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.\n
\n \n Included with Runway: Home page, Getting Started page, Installing Modules page. \n Optional Modules: Top Navigation, Sitemap, Contact, Gallery.\n \n ",
+ "runwayWhatIsRunway": "What is Runway",
+ "step1": "Step 1/5 Accept license",
+ "step2": "Step 2/5: Database configuration",
+ "step3": "Step 3/5: Validating File Permissions",
+ "step4": "Step 4/5: Check Umbraco security",
+ "step5": "Step 5/5: Umbraco is ready to get you started",
+ "thankYou": "Thank you for choosing Umbraco",
+ "theEndBrowseSite": "Browse your new site \nYou installed Runway, so why not see how your new website looks.",
+ "theEndFurtherHelp": "Further help and information \nGet help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology",
+ "theEndHeader": "Umbraco %0% is installed and ready for use",
+ "theEndInstallFailed": "To finish the installation, you'll need to\n manually edit the /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%' .",
+ "theEndInstallSuccess": "You can get started instantly by clicking the \"Launch Umbraco\" button below. If you are new to Umbraco ,\nyou can find plenty of resources on our getting started pages.",
+ "theEndOpenUmbraco": "Launch Umbraco \nTo manage your website, simply open the Umbraco backoffice and start adding content, updating the templates and stylesheets or add new functionality",
+ "Unavailable": "Connection to database failed.",
+ "Version3": "Umbraco Version 3",
+ "Version4": "Umbraco Version 4",
+ "watch": "Watch",
+ "welcomeIntro": "This wizard will guide you through the process of configuring Umbraco %0% for a fresh install or upgrading from version 3.0.\n \n Press \"next\" to start the wizard."
+ },
+ "language": {
+ "cultureCode": "Culture Code",
+ "displayName": "Culture Name"
+ },
+ "lockout": {
+ "lockoutWillOccur": "You've been idle and logout will automatically occur in",
+ "renewSession": "Renew now to save your work"
+ },
+ "login": {
+ "greeting0": "Happy super Sunday",
+ "greeting1": "Happy marvelous Monday",
+ "greeting2": "Happy tubular Tuesday",
+ "greeting3": "Happy wonderful Wednesday",
+ "greeting4": "Happy thunderous Thursday",
+ "greeting5": "Happy funky Friday",
+ "greeting6": "Happy Caturday",
+ "instruction": "Log in below",
+ "signInWith": "Sign in with",
+ "timeout": "Session timed out",
+ "bottomText": "© 2001 - %0% Umbraco.com
",
+ "forgottenPassword": "Forgotten password?",
+ "forgottenPasswordInstruction": "An email will be sent to the address specified with a link to reset your\n password\n ",
+ "requestPasswordResetConfirmation": "An email with password reset instructions will be sent to the\n specified address if it matched our records\n ",
+ "showPassword": "Show password",
+ "hidePassword": "Hide password",
+ "returnToLogin": "Return to login form",
+ "setPasswordInstruction": "Please provide a new password",
+ "setPasswordConfirmation": "Your Password has been updated",
+ "resetCodeExpired": "The link you have clicked on is invalid or has expired",
+ "resetPasswordEmailCopySubject": "Umbraco: Reset Password",
+ "resetPasswordEmailCopyFormat": "\n \n\t\t\t\n\t\t\t\t \n\t\t\t\t \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n
\n\n \n \n \n
\n \n \n
\n\n\n \n\n\n
\n
\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tPassword reset requested\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t \n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tYour username to login to the Umbraco backoffice is: %0% \n
\n\n
\n\nIf you cannot click on the link, copy and paste this URL into your browser window:
\n\n\n \n \n
\n \n \n
\n
\n
\n \n \n \n
\n\n\n\t",
+ "2faTitle": "One last step",
+ "2faText": "You have enabled 2-factor authentication and must verify your identity.",
+ "2faMultipleText": "Please choose a 2-factor provider",
+ "2faCodeInput": "Verification code",
+ "2faCodeInputHelp": "Please enter the verification code",
+ "2faInvalidCode": "Invalid code entered"
+ },
+ "main": {
+ "dashboard": "Dashboard",
+ "sections": "Sections",
+ "tree": "Content"
+ },
+ "moveOrCopy": {
+ "choose": "Choose page above...",
+ "copyDone": "%0% has been copied to %1%",
+ "copyTo": "Select where the document %0% should be copied to below",
+ "moveDone": "%0% has been moved to %1%",
+ "moveTo": "Select where the document %0% should be moved to below",
+ "nodeSelected": "has been selected as the root of your new content, click 'ok' below.",
+ "noNodeSelected": "No node selected yet, please select a node in the list above before clicking 'ok'",
+ "notAllowedByContentType": "The current node is not allowed under the chosen node because of its type",
+ "notAllowedByPath": "The current node cannot be moved to one of its subpages neither can the parent and destination be the same",
+ "notAllowedAtRoot": "The current node cannot exist at the root",
+ "notValid": "The action isn't allowed since you have insufficient permissions on 1 or more child\n documents.\n ",
+ "relateToOriginal": "Relate copied items to original"
+ },
+ "notifications": {
+ "editNotifications": "Select your notification for %0% ",
+ "notificationsSavedFor": "Notification settings saved for",
+ "mailBody": "\n Hi %0%\n\n This is an automated mail to inform you that the task '%1%'\n has been performed on the page '%2%'\n by the user '%3%'\n\n Go to http://%4%/#/content/content/edit/%5% to edit.\n\n %6%\n\n Have a nice day!\n\n Cheers from the Umbraco robot\n ",
+ "mailBodyVariantSummary": "The following languages have been modified %0%",
+ "mailBodyHtml": "\n \n\t\t\t\n\t\t\t\t \n\t\t\t\t \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n
\n\n \n \n \n
\n \n \n
\n\n\n \n\n\n
\n
\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHi %0%,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t \n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tThis is an automated mail to inform you that the task '%1%' has been performed on the page '%2%' by the user '%3%' \n
\n\n\n
Update summary: \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t%6%\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHave a nice day! \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCheers from the Umbraco robot\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n \n \n
\n \n \n
\n
\n
\n \n \n \n
\n\n\n\t",
+ "mailBodyVariantHtmlSummary": "The following languages have been modified:
\n %0%\n ",
+ "mailSubject": "[%0%] Notification about %1% performed on %2%",
+ "notifications": "Notifications"
+ },
+ "packager": {
+ "actions": "Actions",
+ "created": "Created",
+ "createPackage": "Create package",
+ "chooseLocalPackageText": "\n Choose Package from your machine, by clicking the Browse \n button and locating the package. Umbraco packages usually have a \".umb\" or \".zip\" extension.\n ",
+ "deletewarning": "This will delete the package",
+ "includeAllChildNodes": "Include all child nodes",
+ "installed": "Installed",
+ "installedPackages": "Installed packages",
+ "installInstructions": "Install instructions",
+ "noConfigurationView": "This package has no configuration view",
+ "noPackagesCreated": "No packages have been created yet",
+ "noPackages": "No packages have been installed",
+ "noPackagesDescription": "Browse through the available packages using the 'Packages' icon in the top right of your screen",
+ "packageContent": "Package Content",
+ "packageLicense": "License",
+ "packageSearch": "Search for packages",
+ "packageSearchResults": "Results for",
+ "packageNoResults": "We couldn’t find anything for",
+ "packageNoResultsDescription": "Please try searching for another package or browse through the categories\n ",
+ "packagesPopular": "Popular",
+ "packagesPromoted": "Promoted",
+ "packagesNew": "New releases",
+ "packageHas": "has",
+ "packageKarmaPoints": "karma points",
+ "packageInfo": "Information",
+ "packageOwner": "Owner",
+ "packageContrib": "Contributors",
+ "packageCreated": "Created",
+ "packageCurrentVersion": "Current version",
+ "packageNetVersion": ".NET version",
+ "packageDownloads": "Downloads",
+ "packageLikes": "Likes",
+ "packageCompatibility": "Compatibility",
+ "packageCompatibilityDescription": "This package is compatible with the following versions of Umbraco, as\n reported by community members. Full compatability cannot be guaranteed for versions reported below 100%\n ",
+ "packageExternalSources": "External sources",
+ "packageAuthor": "Author",
+ "packageDocumentation": "Documentation",
+ "packageMetaData": "Package meta data",
+ "packageName": "Package name",
+ "packageNoItemsHeader": "Package doesn't contain any items",
+ "packageNoItemsText": "This package file doesn't contain any items to uninstall. \n You can safely remove this from the system by clicking \"uninstall package\" below.",
+ "packageOptions": "Package options",
+ "packageMigrationsRun": "Run pending package migrations",
+ "packageMigrationsComplete": "Package migrations have successfully completed.",
+ "packageMigrationsNonePending": "All package migrations have successfully completed.",
+ "packageReadme": "Package readme",
+ "packageRepository": "Package repository",
+ "packageUninstallConfirm": "Confirm package uninstall",
+ "packageUninstalledHeader": "Package was uninstalled",
+ "packageUninstalledText": "The package was successfully uninstalled",
+ "packageUninstallHeader": "Uninstall package",
+ "packageUninstallText": "You can unselect items you do not wish to remove, at this time, below. When you click \"confirm uninstall\" all checked-off items will be removed. \n Notice: any documents, media etc depending on the items you remove, will stop working, and could lead to system instability,\n so uninstall with caution. If in doubt, contact the package author.",
+ "packageVersion": "Package version",
+ "verifiedToWorkOnUmbracoCloud": "Verified to work on Umbraco Cloud"
+ },
+ "paste": {
+ "doNothing": "Paste with full formatting (Not recommended)",
+ "errorMessage": "The text you're trying to paste contains special characters or formatting. This could be\n caused by copying text from Microsoft Word. Umbraco can remove special characters or formatting automatically, so\n the pasted content will be more suitable for the web.\n ",
+ "removeAll": "Paste as raw text without any formatting at all",
+ "removeSpecialFormattering": "Paste, but remove formatting (Recommended)"
+ },
+ "publicAccess": {
+ "paGroups": "Group based protection",
+ "paGroupsHelp": "If you want to grant access to all members of specific member groups",
+ "paGroupsNoGroups": "You need to create a member group before you can use group based authentication",
+ "paErrorPage": "Error Page",
+ "paErrorPageHelp": "Used when people are logged on, but do not have access",
+ "paHowWould": "Choose how to restrict access to the page %0% ",
+ "paIsProtected": "%0% is now protected",
+ "paIsRemoved": "Protection removed from %0% ",
+ "paLoginPage": "Login Page",
+ "paLoginPageHelp": "Choose the page that contains the login form",
+ "paRemoveProtection": "Remove protection...",
+ "paRemoveProtectionConfirm": "Are you sure you want to remove the protection from the page %0% ?",
+ "paSelectPages": "Select the pages that contain login form and error messages",
+ "paSelectGroups": "Select the groups who have access to the page %0% ",
+ "paSelectMembers": "Select the members who have access to the page %0% ",
+ "paMembers": "Specific members protection",
+ "paMembersHelp": "If you wish to grant access to specific members"
+ },
+ "publish": {
+ "invalidPublishBranchPermissions": "Insufficient user permissions to publish all descendant documents",
+ "contentPublishedFailedIsTrashed": "\n %0% could not be published because the item is in the recycle bin.\n ",
+ "contentPublishedFailedAwaitingRelease": "\n %0% could not be published because the item is scheduled for release.\n ",
+ "contentPublishedFailedExpired": "\n %0% could not be published because the item has expired.\n ",
+ "contentPublishedFailedInvalid": "\n %0% could not be published because some properties did not pass validation rules.\n ",
+ "contentPublishedFailedByEvent": "\n %0% could not be published, a 3rd party add-in cancelled the action.\n ",
+ "contentPublishedFailedByParent": "\n %0% can not be published, because a parent page is not published.\n ",
+ "contentPublishedFailedByMissingName": "%0% can not be published, because its missing a name.",
+ "contentPublishedFailedReqCultureValidationError": "Validation failed for required language '%0%'. This\n language was saved but not published.\n ",
+ "inProgress": "Publishing in progress - please wait...",
+ "inProgressCounter": "%0% out of %1% pages have been published...",
+ "nodePublish": "%0% has been published",
+ "nodePublishAll": "%0% and subpages have been published",
+ "publishAll": "Publish %0% and all its subpages",
+ "publishHelp": "Click Publish to publish %0% and thereby making its content publicly available. \n You can publish this page and all its subpages by checking Include unpublished subpages below.\n "
+ },
+ "colorpicker": {
+ "noColors": "You have not configured any approved colors"
+ },
+ "contentPicker": {
+ "allowedItemTypes": "You can only select items of type(s): %0%",
+ "pickedTrashedItem": "You have picked a content item currently deleted or in the recycle bin",
+ "pickedTrashedItems": "You have picked content items currently deleted or in the recycle bin"
+ },
+ "mediaPicker": {
+ "deletedItem": "Deleted item",
+ "pickedTrashedItem": "You have picked a media item currently deleted or in the recycle bin",
+ "pickedTrashedItems": "You have picked media items currently deleted or in the recycle bin",
+ "trashed": "Trashed",
+ "openMedia": "Open in Media Library",
+ "changeMedia": "Change Media Item",
+ "editMediaEntryLabel": "Edit %0% on %1%",
+ "confirmCancelMediaEntryCreationHeadline": "Discard creation?",
+ "confirmCancelMediaEntryCreationMessage": "Are you sure you want to cancel the creation.",
+ "confirmCancelMediaEntryHasChanges": "You have made changes to this content. Are you sure you want to\n discard them?\n ",
+ "confirmRemoveAllMediaEntryMessage": "Remove all medias?",
+ "tabClipboard": "Clipboard",
+ "notAllowed": "Not allowed",
+ "openMediaPicker": "Open media picker"
+ },
+ "propertyEditorPicker": {
+ "title": "Select Property Editor",
+ "openPropertyEditorPicker": "Select Property Editor"
+ },
+ "relatedlinks": {
+ "enterExternal": "enter external link",
+ "chooseInternal": "choose internal page",
+ "caption": "Caption",
+ "link": "Link",
+ "newWindow": "Open in new window",
+ "captionPlaceholder": "enter the display caption",
+ "externalLinkPlaceholder": "Enter the link"
+ },
+ "imagecropper": {
+ "reset": "Reset crop",
+ "updateEditCrop": "Done",
+ "undoEditCrop": "Undo edits",
+ "customCrop": "User defined"
+ },
+ "rollback": {
+ "changes": "Changes",
+ "created": "Created",
+ "headline": "Select a version to compare with the current version",
+ "currentVersion": "Current version",
+ "diffHelp": "This shows the differences between the current (draft) version and the selected versionRed text will be removed in the selected version, green text will be added",
+ "noDiff": "There are no differences between the current (draft) version and the selected version",
+ "documentRolledBack": "Document has been rolled back",
+ "htmlHelp": "This displays the selected version as HTML, if you wish to see the difference between 2\n versions at the same time, use the diff view\n ",
+ "rollbackTo": "Rollback to",
+ "selectVersion": "Select version",
+ "view": "View",
+ "pagination": "Showing version %0% to %1% of %2% versions",
+ "versions": "Versions",
+ "currentDraftVersion": "Current draft version",
+ "currentPublishedVersion": "Current published version"
+ },
+ "scripts": {
+ "editscript": "Edit script file"
+ },
+ "sections": {
+ "content": "Content",
+ "forms": "Forms",
+ "media": "Media",
+ "member": "Members",
+ "packages": "Packages",
+ "marketplace": "Marketplace",
+ "settings": "Settings",
+ "translation": "Translation",
+ "users": "Users",
+ "deploy": "Deploy",
+ "deployOpenPortal": "Deploy",
+ "deployHelpAndDocumentation": "Help and documentation",
+ "deployOpenQueue": "Open transfer queue",
+ "deployGettingStarted": "Getting Started",
+ "deploySetupProject": "Set up a Project",
+ "deployDeployment": "Deployment",
+ "deployTroubleshooting": "Troubleshooting"
+ },
+ "help": {
+ "tours": "Tours",
+ "theBestUmbracoVideoTutorials": "The best Umbraco video tutorials",
+ "umbracoForum": "Visit our.umbraco.com",
+ "umbracoTv": "Visit umbraco.tv",
+ "umbracoLearningBase": "Watch our free tutorial videos",
+ "umbracoLearningBaseDescription": "on the Umbraco Learning Base"
+ },
+ "settings": {
+ "defaulttemplate": "Default template",
+ "importDocumentTypeHelp": "To import a Document Type, find the \".udt\" file on your computer by clicking the\n \"Import\" button (you'll be asked for confirmation on the next screen)\n ",
+ "newtabname": "New Tab Title",
+ "nodetype": "Node type",
+ "objecttype": "Type",
+ "stylesheet": "Stylesheet",
+ "script": "Script",
+ "tab": "Tab",
+ "tabname": "Tab Title",
+ "tabs": "Tabs",
+ "contentTypeEnabled": "Master Content Type enabled",
+ "contentTypeUses": "This Content Type uses",
+ "noPropertiesDefinedOnTab": "No properties defined on this tab. Click on the \"add a new property\" link at\n the top to create a new property.\n ",
+ "createMatchingTemplate": "Create matching template",
+ "addIcon": "Add icon"
+ },
+ "sort": {
+ "sortOrder": "Sort order",
+ "sortCreationDate": "Creation date",
+ "sortDone": "Sorting complete.",
+ "sortHelp": "Drag the different items up or down below to set how they should be arranged. Or click the\n column headers to sort the entire collection of items\n ",
+ "sortPleaseWait": "Please wait. Items are being sorted, this can take a while.",
+ "sortEmptyState": "This node has no child nodes to sort"
+ },
+ "speechBubbles": {
+ "validationFailedHeader": "Validation",
+ "validationFailedMessage": "Validation errors must be fixed before the item can be saved",
+ "operationFailedHeader": "Failed",
+ "operationSavedHeader": "Saved",
+ "operationSavedHeaderReloadUser": "Saved. To view the changes please reload your browser",
+ "invalidUserPermissionsText": "Insufficient user permissions, could not complete the operation",
+ "operationCancelledHeader": "Cancelled",
+ "operationCancelledText": "Operation was cancelled by a 3rd party add-in",
+ "folderUploadNotAllowed": "This file is being uploaded as part of a folder, but creating a new folder is not allowed here",
+ "folderCreationNotAllowed": "Creating a new folder is not allowed here",
+ "contentTypeDublicatePropertyType": "Property type already exists",
+ "contentTypePropertyTypeCreated": "Property type created",
+ "contentTypePropertyTypeCreatedText": "Name: %0% DataType: %1%",
+ "contentTypePropertyTypeDeleted": "Propertytype deleted",
+ "contentTypeSavedHeader": "Document Type saved",
+ "contentTypeTabCreated": "Tab created",
+ "contentTypeTabDeleted": "Tab deleted",
+ "contentTypeTabDeletedText": "Tab with id: %0% deleted",
+ "cssErrorHeader": "Stylesheet not saved",
+ "cssSavedHeader": "Stylesheet saved",
+ "cssSavedText": "Stylesheet saved without any errors",
+ "dataTypeSaved": "Datatype saved",
+ "dictionaryItemSaved": "Dictionary item saved",
+ "editContentPublishedHeader": "Content published",
+ "editContentPublishedText": "and is visible on the website",
+ "editMultiContentPublishedText": "%0% documents published and visible on the website",
+ "editVariantPublishedText": "%0% published and visible on the website",
+ "editMultiVariantPublishedText": "%0% documents published for languages %1% and visible on the website",
+ "editBlueprintSavedHeader": "Content Template saved",
+ "editBlueprintSavedText": "Changes have been successfully saved",
+ "editContentSavedHeader": "Content saved",
+ "editContentSavedText": "Remember to publish to make changes visible",
+ "editContentScheduledSavedText": "A schedule for publishing has been updated",
+ "editVariantSavedText": "%0% saved",
+ "editContentSendToPublish": "Sent For Approval",
+ "editContentSendToPublishText": "Changes have been sent for approval",
+ "editVariantSendToPublishText": "%0% changes have been sent for approval",
+ "editMediaSaved": "Media saved",
+ "editMediaSavedText": "Media saved without any errors",
+ "editMemberSaved": "Member saved",
+ "editStylesheetPropertySaved": "Stylesheet Property Saved",
+ "editStylesheetSaved": "Stylesheet saved",
+ "editTemplateSaved": "Template saved",
+ "editUserError": "Error saving user (check log)",
+ "editUserSaved": "User Saved",
+ "editUserTypeSaved": "User type saved",
+ "editUserGroupSaved": "User group saved",
+ "editCulturesAndHostnamesSaved": "Cultures and hostnames saved",
+ "editCulturesAndHostnamesError": "Error saving cultures and hostnames",
+ "fileErrorHeader": "File not saved",
+ "fileErrorText": "file could not be saved. Please check file permissions",
+ "fileSavedHeader": "File saved",
+ "fileSavedText": "File saved without any errors",
+ "languageSaved": "Language saved",
+ "mediaTypeSavedHeader": "Media Type saved",
+ "memberTypeSavedHeader": "Member Type saved",
+ "memberGroupSavedHeader": "Member Group saved",
+ "memberGroupNameDuplicate": "Another Member Group with the same name already exists",
+ "templateErrorHeader": "Template not saved",
+ "templateErrorText": "Please make sure that you do not have 2 templates with the same alias",
+ "templateSavedHeader": "Template saved",
+ "templateSavedText": "Template saved without any errors!",
+ "contentUnpublished": "Content unpublished",
+ "contentCultureUnpublished": "Content variation %0% unpublished",
+ "contentMandatoryCultureUnpublished": "The mandatory language '%0%' was unpublished. All languages for this\n content item are now unpublished.\n ",
+ "partialViewSavedHeader": "Partial view saved",
+ "partialViewSavedText": "Partial view saved without any errors!",
+ "partialViewErrorHeader": "Partial view not saved",
+ "partialViewErrorText": "An error occurred saving the file.",
+ "permissionsSavedFor": "Permissions saved for",
+ "deleteUserGroupsSuccess": "Deleted %0% user groups",
+ "deleteUserGroupSuccess": "%0% was deleted",
+ "enableUsersSuccess": "Enabled %0% users",
+ "disableUsersSuccess": "Disabled %0% users",
+ "enableUserSuccess": "%0% is now enabled",
+ "disableUserSuccess": "%0% is now disabled",
+ "setUserGroupOnUsersSuccess": "User groups have been set",
+ "unlockUsersSuccess": "Unlocked %0% users",
+ "unlockUserSuccess": "%0% is now unlocked",
+ "memberExportedSuccess": "Member was exported to file",
+ "memberExportedError": "An error occurred while exporting the member",
+ "deleteUserSuccess": "User %0% was deleted",
+ "resendInviteHeader": "Invite user",
+ "resendInviteSuccess": "Invitation has been re-sent to %0%",
+ "contentReqCulturePublishError": "Cannot publish the document since the required '%0%' is not published\n ",
+ "contentCultureValidationError": "Validation failed for language '%0%'",
+ "documentTypeExportedSuccess": "Document Type was exported to file",
+ "documentTypeExportedError": "An error occurred while exporting the Document Type",
+ "dictionaryItemExportedSuccess": "Dictionary item(s) was exported to file",
+ "dictionaryItemExportedError": "An error occurred while exporting the dictionary item(s)",
+ "dictionaryItemImported": "The following dictionary item(s) has been imported!",
+ "scheduleErrReleaseDate1": "The release date cannot be in the past",
+ "scheduleErrReleaseDate2": "Cannot schedule the document for publishing since the required '%0%' is not\n published\n ",
+ "scheduleErrReleaseDate3": "Cannot schedule the document for publishing since the required '%0%' has a\n publish date later than a non mandatory language\n ",
+ "scheduleErrExpireDate1": "The expire date cannot be in the past",
+ "scheduleErrExpireDate2": "The expire date cannot be before the release date",
+ "publishWithNoDomains": "Domains are not configured for multilingual site, please contact an administrator,\n see log for more information\n ",
+ "publishWithMissingDomain": "There is no domain configured for %0%, please contact an administrator, see\n log for more information\n ",
+ "preventCleanupEnableError": "An error occurred while enabling version cleanup for %0%",
+ "preventCleanupDisableError": "An error occurred while disabling version cleanup for %0%",
+ "copySuccessMessage": "Your system information has successfully been copied to the clipboard",
+ "cannotCopyInformation": "Could not copy your system information to the clipboard"
+ },
+ "stylesheet": {
+ "addRule": "Add style",
+ "editRule": "Edit style",
+ "editorRules": "Rich text editor styles",
+ "editorRulesHelp": "Define the styles that should be available in the rich text editor for this\n stylesheet\n ",
+ "editstylesheet": "Edit stylesheet",
+ "editstylesheetproperty": "Edit stylesheet property",
+ "nameHelp": "The name displayed in the editor style selector",
+ "preview": "Preview",
+ "previewHelp": "How the text will look like in the rich text editor.",
+ "selector": "Selector",
+ "selectorHelp": "Uses CSS syntax, e.g. \"h1\" or \".redHeader\"",
+ "styles": "Styles",
+ "stylesHelp": "The CSS that should be applied in the rich text editor, e.g. \"color:red;\"",
+ "tabCode": "Code",
+ "tabRules": "Rich Text Editor"
+ },
+ "template": {
+ "runtimeModeProduction": "Content is not editable when using runtime mode Production.",
+ "deleteByIdFailed": "Failed to delete template with ID %0%",
+ "edittemplate": "Edit template",
+ "insertSections": "Sections",
+ "insertContentArea": "Insert content area",
+ "insertContentAreaPlaceHolder": "Insert content area placeholder",
+ "insert": "Insert",
+ "insertDesc": "Choose what to insert into your template",
+ "insertDictionaryItem": "Dictionary item",
+ "insertDictionaryItemDesc": "A dictionary item is a placeholder for a translatable piece of text, which\n makes it easy to create designs for multilingual websites.\n ",
+ "insertMacro": "Macro",
+ "insertMacroDesc": "\n A Macro is a configurable component which is great for\n reusable parts of your design, where you need the option to provide parameters,\n such as galleries, forms and lists.\n ",
+ "insertPageField": "Value",
+ "insertPageFieldDesc": "Displays the value of a named field from the current page, with options to modify\n the value or fallback to alternative values.\n ",
+ "insertPartialView": "Partial view",
+ "insertPartialViewDesc": "\n A partial view is a separate template file which can be rendered inside another\n template, it's great for reusing markup or for separating complex templates into separate files.\n ",
+ "mastertemplate": "Master template",
+ "noMaster": "No master",
+ "renderBody": "Render child template",
+ "renderBodyDesc": "\n Renders the contents of a child template, by inserting a\n @RenderBody() placeholder.\n ",
+ "defineSection": "Define a named section",
+ "defineSectionDesc": "\n Defines a part of your template as a named section by wrapping it in\n @section { ... }. This can be rendered in a\n specific area of the parent of this template, by using @RenderSection.\n ",
+ "renderSection": "Render a named section",
+ "renderSectionDesc": "\n Renders a named area of a child template, by inserting a @RenderSection(name) placeholder.\n This renders an area of a child template which is wrapped in a corresponding @section [name]{ ... } definition.\n ",
+ "sectionName": "Section Name",
+ "sectionMandatory": "Section is mandatory",
+ "sectionMandatoryDesc": "\n If mandatory, the child template must contain a @section definition, otherwise an error is shown.\n ",
+ "queryBuilder": "Query builder",
+ "itemsReturned": "items returned, in",
+ "iWant": "I want",
+ "allContent": "all content",
+ "contentOfType": "content of type \"%0%\"",
+ "from": "from",
+ "websiteRoot": "my website",
+ "where": "where",
+ "and": "and",
+ "is": "is",
+ "isNot": "is not",
+ "before": "before",
+ "beforeIncDate": "before (including selected date)",
+ "after": "after",
+ "afterIncDate": "after (including selected date)",
+ "equals": "equals",
+ "doesNotEqual": "does not equal",
+ "contains": "contains",
+ "doesNotContain": "does not contain",
+ "greaterThan": "greater than",
+ "greaterThanEqual": "greater than or equal to",
+ "lessThan": "less than",
+ "lessThanEqual": "less than or equal to",
+ "id": "Id",
+ "name": "Name",
+ "createdDate": "Created Date",
+ "lastUpdatedDate": "Last Updated Date",
+ "orderBy": "order by",
+ "ascending": "ascending",
+ "descending": "descending",
+ "template": "Template"
+ },
+ "grid": {
+ "media": "Image",
+ "macro": "Macro",
+ "insertControl": "Choose type of content",
+ "chooseLayout": "Choose a layout",
+ "addRows": "Add a row",
+ "addElement": "Add content",
+ "dropElement": "Drop content",
+ "settingsApplied": "Settings applied",
+ "contentNotAllowed": "This content is not allowed here",
+ "contentAllowed": "This content is allowed here",
+ "clickToEmbed": "Click to embed",
+ "clickToInsertImage": "Click to insert image",
+ "clickToInsertMacro": "Click to insert macro",
+ "placeholderWriteHere": "Write here...",
+ "gridLayouts": "Grid Layouts",
+ "gridLayoutsDetail": "Layouts are the overall work area for the grid editor, usually you only need one or\n two different layouts\n ",
+ "addGridLayout": "Add Grid Layout",
+ "editGridLayout": "Edit Grid Layout",
+ "addGridLayoutDetail": "Adjust the layout by setting column widths and adding additional sections",
+ "rowConfigurations": "Row configurations",
+ "rowConfigurationsDetail": "Rows are predefined cells arranged horizontally",
+ "addRowConfiguration": "Add row configuration",
+ "editRowConfiguration": "Edit row configuration",
+ "addRowConfigurationDetail": "Adjust the row by setting cell widths and adding additional cells",
+ "noConfiguration": "No further configuration available",
+ "columns": "Columns",
+ "columnsDetails": "Total combined number of columns in the grid layout",
+ "settings": "Settings",
+ "settingsDetails": "Configure what settings editors can change",
+ "styles": "Styles",
+ "stylesDetails": "Configure what styling editors can change",
+ "allowAllEditors": "Allow all editors",
+ "allowAllRowConfigurations": "Allow all row configurations",
+ "maxItems": "Maximum items",
+ "maxItemsDescription": "Leave blank or set to 0 for unlimited",
+ "setAsDefault": "Set as default",
+ "chooseExtra": "Choose extra",
+ "chooseDefault": "Choose default",
+ "areAdded": "are added",
+ "warning": "Warning",
+ "warningText": "Modifying a row configuration name will result in loss of data for any existing content that is based on this configuration.
Modifying only the label will not result in data loss.
",
+ "youAreDeleting": "You are deleting the row configuration",
+ "deletingARow": "\n Deleting a row configuration name will result in loss of data for any existing content that is based on this\n configuration.\n ",
+ "deleteLayout": "You are deleting the layout",
+ "deletingALayout": "Modifying a layout will result in loss of data for any existing content that is based\n on this configuration.\n "
+ },
+ "contentTypeEditor": {
+ "compositions": "Compositions",
+ "group": "Group",
+ "groupReorderSameAliasError": "You can't move the group %0% to this tab because the group will get the same\n alias as a tab: \"%1%\". Rename the group to continue.\n ",
+ "noGroups": "You have not added any groups",
+ "addGroup": "Add group",
+ "inheritedFrom": "Inherited from",
+ "addProperty": "Add property",
+ "requiredLabel": "Required label",
+ "enableListViewHeading": "Enable list view",
+ "enableListViewDescription": "Configures the content item to show a sortable and searchable list of its\n children, the children will not be shown in the tree\n ",
+ "allowedTemplatesHeading": "Allowed Templates",
+ "allowedTemplatesDescription": "Choose which templates editors are allowed to use on content of this type\n ",
+ "allowAsRootHeading": "Allow as root",
+ "allowAsRootDescription": "Allow editors to create content of this type in the root of the content tree.\n ",
+ "childNodesHeading": "Allowed child node types",
+ "childNodesDescription": "Allow content of the specified types to be created underneath content of this\n type.\n ",
+ "chooseChildNode": "Choose child node",
+ "compositionsDescription": "Inherit tabs and properties from an existing Document Type. New tabs will be\n added to the current Document Type or merged if a tab with an identical name exists.\n ",
+ "compositionInUse": "This Content Type is used in a composition, and therefore cannot be composed itself.\n ",
+ "noAvailableCompositions": "There are no Content Types available to use as a composition.",
+ "compositionRemoveWarning": "Removing a composition will delete all the associated property data. Once you\n save the Document Type there's no way back.\n ",
+ "availableEditors": "Create new",
+ "reuse": "Use existing",
+ "editorSettings": "Editor settings",
+ "searchResultSettings": "Available configurations",
+ "searchResultEditors": "Create a new configuration",
+ "configuration": "Configuration",
+ "yesDelete": "Yes, delete",
+ "movedUnderneath": "was moved underneath",
+ "copiedUnderneath": "was copied underneath",
+ "folderToMove": "Select the folder to move",
+ "folderToCopy": "Select the folder to copy",
+ "structureBelow": "to in the tree structure below",
+ "allDocumentTypes": "All Document Types",
+ "allDocuments": "All Documents",
+ "allMediaItems": "All media items",
+ "usingThisDocument": "using this Document Type will be deleted permanently, please confirm you want to\n delete these as well.\n ",
+ "usingThisMedia": "using this Media Type will be deleted permanently, please confirm you want to delete\n these as well.\n ",
+ "usingThisMember": "using this Member Type will be deleted permanently, please confirm you want to delete\n these as well\n ",
+ "andAllDocuments": "and all documents using this type",
+ "andAllMediaItems": "and all media items using this type",
+ "andAllMembers": "and all members using this type",
+ "memberCanEdit": "Member can edit",
+ "memberCanEditDescription": "Allow this property value to be edited by the member on their profile page\n ",
+ "isSensitiveData": "Is sensitive data",
+ "isSensitiveDataDescription": "Hide this property value from content editors that don't have access to view\n sensitive information\n ",
+ "showOnMemberProfile": "Show on member profile",
+ "showOnMemberProfileDescription": "Allow this property value to be displayed on the member profile page\n ",
+ "tabHasNoSortOrder": "tab has no sort order",
+ "compositionUsageHeading": "Where is this composition used?",
+ "compositionUsageSpecification": "This composition is currently used in the composition of the following\n Content Types:\n ",
+ "variantsHeading": "Allow variations",
+ "cultureVariantHeading": "Allow vary by culture",
+ "segmentVariantHeading": "Allow segmentation",
+ "cultureVariantLabel": "Vary by culture",
+ "segmentVariantLabel": "Vary by segments",
+ "variantsDescription": "Allow editors to create content of this type in different languages.",
+ "cultureVariantDescription": "Allow editors to create content of different languages.",
+ "segmentVariantDescription": "Allow editors to create segments of this content.",
+ "allowVaryByCulture": "Allow varying by culture",
+ "allowVaryBySegment": "Allow segmentation",
+ "elementType": "Element Type",
+ "elementHeading": "Is an Element Type",
+ "elementDescription": "An Element Type is meant to be used within other Document Types, and not in the Content\n tree.\n ",
+ "elementCannotToggle": "A Document Type cannot be changed to an Element Type once it has been used to\n create one or more content items.\n ",
+ "elementDoesNotSupport": "This is not applicable for an Element Type",
+ "propertyHasChanges": "You have made changes to this property. Are you sure you want to discard them?",
+ "displaySettingsHeadline": "Appearance",
+ "displaySettingsLabelOnTop": "Label above (full-width)",
+ "confirmDeleteTabMessage": "Are you sure you want to delete the tab %0% ?",
+ "confirmDeleteGroupMessage": "Are you sure you want to delete the group %0% ?",
+ "confirmDeletePropertyMessage": "Are you sure you want to delete the property %0% ?",
+ "confirmDeleteTabNotice": "This will also delete all items below this tab.",
+ "confirmDeleteGroupNotice": "This will also delete all items below this group.",
+ "addTab": "Add tab",
+ "convertToTab": "Convert to tab",
+ "tabDirectPropertiesDropZone": "Drag properties here to place directly on the tab",
+ "removeChildNode": "You are removing the child node",
+ "removeChildNodeWarning": "Removing a child node will limit the editors options to create different content\n types beneath a node.\n ",
+ "usingEditor": "using this editor will get updated with the new settings.",
+ "historyCleanupHeading": "History cleanup",
+ "historyCleanupDescription": "Allow overriding the global history cleanup settings.",
+ "historyCleanupKeepAllVersionsNewerThanDays": "Keep all versions newer than days",
+ "historyCleanupKeepLatestVersionPerDayForDays": "Keep latest version per day for days",
+ "historyCleanupPreventCleanup": "Prevent cleanup",
+ "historyCleanupEnableCleanup": "Enable cleanup",
+ "historyCleanupGloballyDisabled": "NOTE! The cleanup of historically content versions are disabled globally. These settings will not take effect before it is enabled.",
+ "changeDataTypeHelpText": "Changing a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json."
+ },
+ "languages": {
+ "addLanguage": "Add language",
+ "culture": "ISO code",
+ "mandatoryLanguage": "Mandatory language",
+ "mandatoryLanguageHelp": "Properties on this language have to be filled out before the node can be\n published.\n ",
+ "defaultLanguage": "Default language",
+ "defaultLanguageHelp": "An Umbraco site can only have one default language set.",
+ "changingDefaultLanguageWarning": "Switching default language may result in default content missing.",
+ "fallsbackToLabel": "Falls back to",
+ "noFallbackLanguageOption": "No fall back language",
+ "fallbackLanguageDescription": "To allow multi-lingual content to fall back to another language if not\n present in the requested language, select it here.\n ",
+ "fallbackLanguage": "Fall back language",
+ "none": "none",
+ "invariantPropertyUnlockHelp": "%0% is shared across languages and segments.",
+ "invariantCulturePropertyUnlockHelp": "%0% is shared across all languages.",
+ "invariantSegmentPropertyUnlockHelp": "%0% is shared across all segments.",
+ "invariantLanguageProperty": "Shared: Languages",
+ "invariantSegmentProperty": "Shared: Segments"
+ },
+ "macro": {
+ "addParameter": "Add parameter",
+ "editParameter": "Edit parameter",
+ "enterMacroName": "Enter macro name",
+ "parameters": "Parameters",
+ "parametersDescription": "Define the parameters that should be available when using this macro.",
+ "selectViewFile": "Select partial view macro file"
+ },
+ "modelsBuilder": {
+ "buildingModels": "Building models",
+ "waitingMessage": "this can take a bit of time, don't worry",
+ "modelsGenerated": "Models generated",
+ "modelsGeneratedError": "Models could not be generated",
+ "modelsExceptionInUlog": "Models generation has failed, see exception in U log"
+ },
+ "templateEditor": {
+ "addDefaultValue": "Add default value",
+ "defaultValue": "Default value",
+ "alternativeField": "Fallback field",
+ "alternativeText": "Default value",
+ "casing": "Casing",
+ "encoding": "Encoding",
+ "chooseField": "Choose field",
+ "convertLineBreaks": "Convert line breaks",
+ "convertLineBreaksHelp": "Replaces line breaks with 'br' html tag",
+ "customFields": "Custom Fields",
+ "dateOnly": "Date only",
+ "formatAsDate": "Format as date",
+ "htmlEncode": "HTML encode",
+ "htmlEncodeHelp": "Will replace special characters by their HTML equivalent.",
+ "insertedAfter": "Will be inserted after the field value",
+ "insertedBefore": "Will be inserted before the field value",
+ "lowercase": "Lowercase",
+ "none": "None",
+ "outputSample": "Output sample",
+ "postContent": "Insert after field",
+ "preContent": "Insert before field",
+ "recursive": "Recursive",
+ "recursiveDescr": "Yes, make it recursive",
+ "standardFields": "Standard Fields",
+ "uppercase": "Uppercase",
+ "urlEncode": "URL encode",
+ "urlEncodeHelp": "Will format special characters in URLs",
+ "usedIfAllEmpty": "Will only be used when the field values above are empty",
+ "usedIfEmpty": "This field will only be used if the primary field is empty",
+ "withTime": "Date and time"
+ },
+ "translation": {
+ "details": "Translation details",
+ "DownloadXmlDTD": "Download XML DTD",
+ "fields": "Fields",
+ "includeSubpages": "Include subpages",
+ "mailBody": "\n Hi %0%\n\n This is an automated mail to inform you that the document '%1%'\n has been requested for translation into '%5%' by %2%.\n\n Go to http://%3%/translation/details.aspx?id=%4% to edit.\n\n Or log into Umbraco to get an overview of your translation tasks\n http://%3%\n\n Have a nice day!\n\n Cheers from the Umbraco robot\n ",
+ "noTranslators": "No translator users found. Please create a translator user before you start sending\n content to translation\n ",
+ "pageHasBeenSendToTranslation": "The page '%0%' has been send to translation",
+ "sendToTranslate": "Send the page '%0%' to translation",
+ "totalWords": "Total words",
+ "translateTo": "Translate to",
+ "translationDone": "Translation completed.",
+ "translationDoneHelp": "You can preview the pages, you've just translated, by clicking below. If the\n original page is found, you will get a comparison of the 2 pages.\n ",
+ "translationFailed": "Translation failed, the XML file might be corrupt",
+ "translationOptions": "Translation options",
+ "translator": "Translator",
+ "uploadTranslationXml": "Upload translation XML"
+ },
+ "treeHeaders": {
+ "content": "Content",
+ "contentBlueprints": "Content Templates",
+ "media": "Media",
+ "cacheBrowser": "Cache Browser",
+ "contentRecycleBin": "Recycle Bin",
+ "createdPackages": "Created packages",
+ "dataTypes": "Data Types",
+ "dictionary": "Dictionary",
+ "installedPackages": "Installed packages",
+ "installSkin": "Install skin",
+ "installStarterKit": "Install starter kit",
+ "languages": "Languages",
+ "localPackage": "Install local package",
+ "macros": "Macros",
+ "mediaTypes": "Media Types",
+ "member": "Members",
+ "memberGroups": "Member Groups",
+ "memberRoles": "Member Roles",
+ "memberTypes": "Member Types",
+ "documentTypes": "Document Types",
+ "relationTypes": "Relation Types",
+ "packager": "Packages",
+ "packages": "Packages",
+ "partialViews": "Partial Views",
+ "partialViewMacros": "Partial View Macro Files",
+ "repositories": "Install from repository",
+ "runway": "Install Runway",
+ "runwayModules": "Runway modules",
+ "scripting": "Scripting Files",
+ "scripts": "Scripts",
+ "stylesheets": "Stylesheets",
+ "templates": "Templates",
+ "logViewer": "Log Viewer",
+ "users": "Users",
+ "settingsGroup": "Settings",
+ "templatingGroup": "Templating",
+ "thirdPartyGroup": "Third Party"
+ },
+ "update": {
+ "updateAvailable": "New update ready",
+ "updateDownloadText": "%0% is ready, click here for download",
+ "updateNoServer": "No connection to server",
+ "updateNoServerError": "Error checking for update. Please review trace-stack for further information"
},
"user": {
- "yourProfile": "Your profile"
+ "access": "Access",
+ "accessHelp": "Based on the assigned groups and start nodes, the user has access to the following nodes\n ",
+ "assignAccess": "Assign access",
+ "administrators": "Administrator",
+ "categoryField": "Category field",
+ "createDate": "User created",
+ "changePassword": "Change your password",
+ "changePhoto": "Change photo",
+ "emailRequired": "Required - enter an email address for this user",
+ "newPassword": "New password",
+ "newPasswordFormatLengthTip": "Minimum %0% character(s) to go!",
+ "newPasswordFormatNonAlphaTip": "There should be at least %0% special character(s) in there.",
+ "noLockouts": "hasn't been locked out",
+ "noPasswordChange": "The password hasn't been changed",
+ "confirmNewPassword": "Confirm new password",
+ "changePasswordDescription": "You can change your password for accessing the Umbraco backoffice by filling\n out the form below and click the 'Change Password' button\n ",
+ "contentChannel": "Content Channel",
+ "createAnotherUser": "Create another user",
+ "createUserHelp": "Create new users to give them access to Umbraco. When a new user is created a password\n will be generated that you can share with the user.\n ",
+ "descriptionField": "Description field",
+ "disabled": "Disable User",
+ "documentType": "Document Type",
+ "duplicateLogin": "A user with this login already exists",
+ "editors": "Editor",
+ "excerptField": "Excerpt field",
+ "failedPasswordAttempts": "Failed login attempts",
+ "goToProfile": "Go to user profile",
+ "groupsHelp": "Add groups to assign access and permissions",
+ "inviteAnotherUser": "Invite another user",
+ "inviteUserHelp": "Invite new users to give them access to Umbraco. An invite email will be sent to the\n user with information on how to log in to Umbraco. Invites last for 72 hours.\n ",
+ "language": "Language",
+ "languageHelp": "Set the language you will see in menus and dialogs",
+ "lastLockoutDate": "Last lockout date",
+ "lastLogin": "Last login",
+ "lastPasswordChangeDate": "Password last changed",
+ "loginname": "Username",
+ "mediastartnode": "Media start node",
+ "mediastartnodehelp": "Limit the media library to a specific start node",
+ "mediastartnodes": "Media start nodes",
+ "mediastartnodeshelp": "Limit the media library to specific start nodes",
+ "modules": "Sections",
+ "nameRequired": "Required - enter a name for this user",
+ "noConsole": "Disable Umbraco Access",
+ "noLogin": "has not logged in yet",
+ "oldPassword": "Old password",
+ "password": "Password",
+ "resetPassword": "Reset password",
+ "passwordChanged": "Your password has been changed!",
+ "passwordChangedGeneric": "Password changed",
+ "passwordConfirm": "Please confirm the new password",
+ "passwordEnterNew": "Enter your new password",
+ "passwordIsBlank": "Your new password cannot be blank!",
+ "passwordCurrent": "Current password",
+ "passwordInvalid": "Invalid current password",
+ "passwordIsDifferent": "There was a difference between the new password and the confirmed password. Please\n try again!\n ",
+ "passwordMismatch": "The confirmed password doesn't match the new password!",
+ "passwordRequiresDigit": "The password must have at least one digit ('0'-'9')",
+ "passwordRequiresLower": "The password must have at least one lowercase ('a'-'z')",
+ "passwordRequiresNonAlphanumeric": "The password must have at least one non alphanumeric character",
+ "passwordRequiresUniqueChars": "The password must use at least %0% different characters",
+ "passwordRequiresUpper": "The password must have at least one uppercase ('A'-'Z')",
+ "passwordTooShort": "The password must be at least %0% characters long",
+ "permissionReplaceChildren": "Replace child node permissions",
+ "permissionSelectedPages": "You are currently modifying permissions for the pages:",
+ "permissionSelectPages": "Select pages to modify their permissions",
+ "removePhoto": "Remove photo",
+ "permissionsDefault": "Default permissions",
+ "permissionsGranular": "Granular permissions",
+ "permissionsGranularHelp": "Set permissions for specific nodes",
+ "profile": "Profile",
+ "searchAllChildren": "Search all children",
+ "languagesHelp": "Limit the languages users have access to edit",
+ "allowAccessToAllLanguages": "Allow access to all languages",
+ "sectionsHelp": "Add sections to give users access",
+ "selectUserGroups": "Select user groups",
+ "noStartNode": "No start node selected",
+ "noStartNodes": "No start nodes selected",
+ "startnode": "Content start node",
+ "startnodehelp": "Limit the content tree to a specific start node",
+ "startnodes": "Content start nodes",
+ "startnodeshelp": "Limit the content tree to specific start nodes",
+ "updateDate": "User last updated",
+ "userCreated": "has been created",
+ "userCreatedSuccessHelp": "The new user has successfully been created. To log in to Umbraco use the\n password below.\n ",
+ "userHasPassword": "The user already has a password set",
+ "userHasGroup": "The user is already in group '%0%'",
+ "userLockoutNotEnabled": "Lockout is not enabled for this user",
+ "userManagement": "User management",
+ "username": "Name",
+ "userNotInGroup": "The user is not in group '%0%'",
+ "userPermissions": "User permissions",
+ "usergroup": "User group",
+ "userInvited": "has been invited",
+ "userInvitedSuccessHelp": "An invitation has been sent to the new user with details about how to log in to\n Umbraco.\n ",
+ "userinviteWelcomeMessage": "Hello there and welcome to Umbraco! In just 1 minute you’ll be good to go, we\n just need you to setup a password and add a picture for your avatar.\n ",
+ "userinviteExpiredMessage": "Welcome to Umbraco! Unfortunately your invite has expired. Please contact your\n administrator and ask them to resend it.\n ",
+ "userinviteAvatarMessage": "Uploading a photo of yourself will make it easy for other users to recognize\n you. Click the circle above to upload your photo.\n ",
+ "writer": "Writer",
+ "configureTwoFactor": "Configure Two-Factor",
+ "change": "Change",
+ "yourProfile": "Your profile",
+ "yourHistory": "Your recent history",
+ "sessionExpires": "Session expires in",
+ "inviteUser": "Invite user",
+ "createUser": "Create user",
+ "sendInvite": "Send invite",
+ "backToUsers": "Back to users",
+ "inviteEmailCopySubject": "Umbraco: Invitation",
+ "inviteEmailCopyFormat": "\n \n\t\t\t\n\t\t\t\t \n\t\t\t\t \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n
\n\n \n \n \n
\n \n \n
\n\n\n \n\n\n
\n
\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHi %0%,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t \n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tYou have been invited by %1% to the Umbraco Back Office.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tMessage from %1% :\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \n%2% \n
\n\nIf you cannot click on the link, copy and paste this URL into your browser window:
\n\n\n \n \n
\n \n \n
\n
\n
\n \n \n \n
\n\n",
+ "defaultInvitationMessage": "Resending invitation...",
+ "deleteUser": "Delete User",
+ "deleteUserConfirmation": "Are you sure you wish to delete this user account?",
+ "stateAll": "All",
+ "stateActive": "Active",
+ "stateDisabled": "Disabled",
+ "stateLockedOut": "Locked out",
+ "stateApproved": "Approved",
+ "stateInvited": "Invited",
+ "stateInactive": "Inactive",
+ "sortNameAscending": "Name (A-Z)",
+ "sortNameDescending": "Name (Z-A)",
+ "sortCreateDateAscending": "Newest",
+ "sortCreateDateDescending": "Oldest",
+ "sortLastLoginDateDescending": "Last login",
+ "noUserGroupsAdded": "No user groups have been added",
+ "2faDisableText": "If you wish to disable this two-factor provider, then you must enter the code shown on your authentication device:",
+ "2faProviderIsEnabled": "This two-factor provider is enabled",
+ "2faProviderIsDisabledMsg": "This two-factor provider is now disabled",
+ "2faProviderIsNotDisabledMsg": "Something went wrong with trying to disable this two-factor provider",
+ "2faDisableForUser": "Do you want to disable this two-factor provider for this user?"
+ },
+ "validation": {
+ "validation": "Validation",
+ "validateAsEmail": "Validate as an email address",
+ "validateAsNumber": "Validate as a number",
+ "validateAsUrl": "Validate as a URL",
+ "enterCustomValidation": "...or enter a custom validation",
+ "fieldIsMandatory": "Field is mandatory",
+ "mandatoryMessage": "Enter a custom validation error message (optional)",
+ "validationRegExp": "Enter a regular expression",
+ "validationRegExpMessage": "Enter a custom validation error message (optional)",
+ "minCount": "You need to add at least",
+ "maxCount": "You can only have",
+ "addUpTo": "Add up to",
+ "items": "items",
+ "urls": "URL(s)",
+ "urlsSelected": "URL(s) selected",
+ "itemsSelected": "items selected",
+ "invalidDate": "Invalid date",
+ "invalidNumber": "Not a number",
+ "invalidNumberStepSize": "Not a valid numeric step size",
+ "invalidEmail": "Invalid email",
+ "invalidNull": "Value cannot be null",
+ "invalidEmpty": "Value cannot be empty",
+ "invalidPattern": "Value is invalid, it does not match the correct pattern",
+ "invalidMemberGroupName": "Invalid member group name",
+ "invalidUserGroupName": "Invalid user group name",
+ "invalidToken": "Invalid token",
+ "invalidUsername": "Invalid username",
+ "duplicateEmail": "Email '%0%' is already taken",
+ "duplicateUserGroupName": "User group name '%0%' is already taken",
+ "duplicateMemberGroupName": "Member group name '%0%' is already taken",
+ "duplicateUsername": "Username '%0%' is already taken",
+ "customValidation": "Custom validation",
+ "entriesShort": "Minimum %0% entries, requires %1% more.",
+ "entriesExceed": "Maximum %0% entries, %1% too many.",
+ "entriesAreasMismatch": "The content amount requirements are not met for one or more areas."
+ },
+ "healthcheck": {
+ "checkSuccessMessage": "Value is set to the recommended value: '%0%'.",
+ "checkErrorMessageDifferentExpectedValue": "Expected value '%1%' for '%2%' in configuration file '%3%', but\n found '%0%'.\n ",
+ "checkErrorMessageUnexpectedValue": "Found unexpected value '%0%' for '%2%' in configuration file '%3%'.\n ",
+ "macroErrorModeCheckSuccessMessage": "MacroErrors are set to '%0%'.",
+ "macroErrorModeCheckErrorMessage": "MacroErrors are set to '%0%' which will prevent some or all pages in\n your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'.\n ",
+ "httpsCheckValidCertificate": "Your website's certificate is valid.",
+ "httpsCheckInvalidCertificate": "Certificate validation error: '%0%'",
+ "httpsCheckExpiredCertificate": "Your website's SSL certificate has expired.",
+ "httpsCheckExpiringCertificate": "Your website's SSL certificate is expiring in %0% days.",
+ "healthCheckInvalidUrl": "Error pinging the URL %0% - '%1%'",
+ "httpsCheckIsCurrentSchemeHttps": "You are currently %0% viewing the site using the HTTPS scheme.",
+ "httpsCheckConfigurationRectifyNotPossible": "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to 'false' in\n your appSettings.json file. Once you access this site using the HTTPS scheme, that should be set to 'true'.\n ",
+ "httpsCheckConfigurationCheckResult": "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to '%0%' in your\n appSettings.json file, your cookies are %1% marked as secure.\n ",
+ "compilationDebugCheckSuccessMessage": "Debug compilation mode is disabled.",
+ "compilationDebugCheckErrorMessage": "Debug compilation mode is currently enabled. It is recommended to\n disable this setting before go live.\n ",
+ "umbracoApplicationUrlCheckResultTrue": "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is set to %0% .",
+ "umbracoApplicationUrlCheckResultFalse": "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is not set.",
+ "clickJackingCheckHeaderFound": "The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was found.",
+ "clickJackingCheckHeaderNotFound": "The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.",
+ "noSniffCheckHeaderFound": "The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was found.",
+ "noSniffCheckHeaderNotFound": "The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was not found.",
+ "hSTSCheckHeaderFound": "The header Strict-Transport-Security , also known as the HSTS-header, was found.",
+ "hSTSCheckHeaderNotFound": "The header Strict-Transport-Security was not found.",
+ "hSTSCheckHeaderFoundOnLocalhost": "The header Strict-Transport-Security , also known as the HSTS-header, was found. This header should not be present on localhost. ",
+ "hSTSCheckHeaderNotFoundOnLocalhost": "The header Strict-Transport-Security was not found. This header should not be present on localhost.",
+ "xssProtectionCheckHeaderFound": "The header X-XSS-Protection was found. It is recommended not to add this header to your website . \n You can read about this on the Mozilla website ",
+ "xssProtectionCheckHeaderNotFound": "The header X-XSS-Protection was not found.",
+ "excessiveHeadersFound": "The following headers revealing information about the website technology were found: %0% .",
+ "excessiveHeadersNotFound": "No headers revealing information about the website technology were found.\n ",
+ "smtpMailSettingsNotFound": "The 'Umbraco:CMS:Global:Smtp' configuration could not be found.",
+ "smtpMailSettingsHostNotConfigured": "The 'Umbraco:CMS:Global:Smtp:Host' configuration could not be\n found.\n ",
+ "smtpMailSettingsConnectionSuccess": "SMTP settings are configured correctly and the service is operating\n as expected.\n ",
+ "smtpMailSettingsConnectionFail": "The SMTP server configured with host '%0%' and port '%1%' could not be\n reached. Please check to ensure the SMTP settings in the configuration 'Umbraco:CMS:Global:Smtp' are correct.\n ",
+ "notificationEmailsCheckSuccessMessage": "Notification email has been set to %0% .",
+ "notificationEmailsCheckErrorMessage": "Notification email is still set to the default value of %0% .",
+ "scheduledHealthCheckEmailBody": "Results of the scheduled Umbraco Health Checks run on %0% at %1% are as follows:
%2%",
+ "scheduledHealthCheckEmailSubject": "Umbraco Health Check Status: %0%",
+ "checkGroup": "Check group",
+ "helpText": "\n The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button.\n You can add your own health checks, have a look at the documentation for more information about custom health checks.
\n "
+ },
+ "redirectUrls": {
+ "disableUrlTracker": "Disable URL tracker",
+ "enableUrlTracker": "Enable URL tracker",
+ "culture": "Culture",
+ "originalUrl": "Original URL",
+ "redirectedTo": "Redirected To",
+ "redirectUrlManagement": "Redirect URL Management",
+ "panelInformation": "The following URLs redirect to this content item:",
+ "noRedirects": "No redirects have been made",
+ "noRedirectsDescription": "When a published page gets renamed or moved a redirect will automatically be\n made to the new page.\n ",
+ "redirectRemoved": "Redirect URL removed.",
+ "redirectRemoveError": "Error removing redirect URL.",
+ "redirectRemoveWarning": "This will remove the redirect",
+ "confirmDisable": "Are you sure you want to disable the URL tracker?",
+ "disabledConfirm": "URL tracker has now been disabled.",
+ "disableError": "Error disabling the URL tracker, more information can be found in your log file.",
+ "enabledConfirm": "URL tracker has now been enabled.",
+ "enableError": "Error enabling the URL tracker, more information can be found in your log file."
+ },
+ "emptyStates": {
+ "emptyDictionaryTree": "No Dictionary items to choose from"
+ },
+ "textbox": {
+ "characters_left": "%0% characters left.",
+ "characters_exceed": "Maximum %0% characters, %1% too many."
+ },
+ "recycleBin": {
+ "contentTrashed": "Trashed content with Id: {0} related to original parent content with Id: {1}",
+ "mediaTrashed": "Trashed media with Id: {0} related to original parent media item with Id: {1}",
+ "itemCannotBeRestored": "Cannot automatically restore this item",
+ "itemCannotBeRestoredHelpText": "There is no location where this item can be automatically restored. You\n can move the item manually using the tree below.\n ",
+ "wasRestored": "was restored under"
+ },
+ "relationType": {
+ "direction": "Direction",
+ "parentToChild": "Parent to child",
+ "bidirectional": "Bidirectional",
+ "parent": "Parent",
+ "child": "Child",
+ "count": "Count",
+ "relation": "Relation",
+ "relations": "Relations",
+ "created": "Created",
+ "comment": "Comment",
+ "name": "Name",
+ "noRelations": "No relations for this Relation Type",
+ "tabRelationType": "Relation Type",
+ "tabRelations": "Relations",
+ "isDependency": "Is Dependency",
+ "dependency": "Yes",
+ "noDependency": "No"
+ },
+ "dashboardTabs": {
+ "contentIntro": "Getting Started",
+ "contentRedirectManager": "Redirect URL Management",
+ "mediaFolderBrowser": "Content",
+ "settingsWelcome": "Welcome",
+ "settingsExamine": "Examine Management",
+ "settingsPublishedStatus": "Published Status",
+ "settingsModelsBuilder": "Models Builder",
+ "settingsHealthCheck": "Health Check",
+ "settingsAnalytics": "Telemetry data",
+ "settingsProfiler": "Profiling",
+ "memberIntro": "Getting Started",
+ "formsInstall": "Install Umbraco Forms",
+ "deploy": "Workspaces",
+ "deployManagement": "Deploy"
+ },
+ "visuallyHiddenTexts": {
+ "goBack": "Go back",
+ "activeListLayout": "Active layout:",
+ "jumpTo": "Jump to",
+ "group": "group",
+ "passed": "passed",
+ "warning": "warning",
+ "failed": "failed",
+ "suggestion": "suggestion",
+ "checkPassed": "Check passed",
+ "checkFailed": "Check failed",
+ "openBackofficeSearch": "Open backoffice search",
+ "openCloseBackofficeHelp": "Open/Close backoffice help",
+ "openCloseBackofficeProfileOptions": "Open/Close your profile options",
+ "assignDomainDescription": "Setup Culture and Hostnames for %0%",
+ "createDescription": "Create new node under %0%",
+ "protectDescription": "Setup access restrictions on %0%",
+ "rightsDescription": "Setup Permissions on %0%",
+ "sortDescription": "Change sort order for %0%",
+ "createblueprintDescription": "Create Content Template based on %0%",
+ "openContextMenu": "Open context menu for",
+ "currentLanguage": "Current language",
+ "switchLanguage": "Switch language to",
+ "createNewFolder": "Create new folder",
+ "newPartialView": "Partial View",
+ "newPartialViewMacro": "Partial View Macro",
+ "newMember": "Member",
+ "newDataType": "Data Type",
+ "redirectDashboardSearchLabel": "Search the redirect dashboard",
+ "userGroupSearchLabel": "Search the user group section",
+ "userSearchLabel": "Search the users section",
+ "createItem": "Create item",
+ "create": "Create",
+ "edit": "Edit",
+ "name": "Name",
+ "addNewRow": "Add new row",
+ "tabExpand": "View more options",
+ "searchOverlayTitle": "Search the Umbraco backoffice",
+ "searchOverlayDescription": "Search for content nodes, media nodes etc. across the backoffice.",
+ "searchInputDescription": "When autocomplete results are available, press up and down arrows, or use the\n tab key and use the enter key to select.\n ",
+ "path": "Path:",
+ "foundIn": "Found in",
+ "hasTranslation": "Has translation",
+ "noTranslation": "Missing translation",
+ "dictionaryListCaption": "Dictionary items",
+ "contextMenuDescription": "Select one of the options to edit the node.",
+ "contextDialogDescription": "Perform action %0% on the %1% node",
+ "addImageCaption": "Add image caption",
+ "searchContentTree": "Search content tree",
+ "maxAmount": "Maximum amount"
+ },
+ "references": {
+ "tabName": "References",
+ "DataTypeNoReferences": "This Data Type has no references.",
+ "itemHasNoReferences": "This item has no references.",
+ "labelUsedByDocumentTypes": "Referenced by the following Document Types",
+ "labelUsedByMediaTypes": "Referenced by the following Media Types",
+ "labelUsedByMemberTypes": "Referenced by the following Member Types",
+ "usedByProperties": "Referenced by",
+ "labelUsedByItems": "Referenced by the following items",
+ "labelDependsOnThis": "The following items depend on this",
+ "labelUsedItems": "The following items are referenced",
+ "labelUsedDescendants": "The following descendant items have dependencies",
+ "labelDependentDescendants": "The following descending items have dependencies",
+ "deleteWarning": "This item or its descendants is being referenced. Deletion can lead to broken links on your website.",
+ "unpublishWarning": "This item or its descendants is being referenced. Unpublishing can lead to broken links on your website. Please take the appropriate actions.",
+ "deleteDisabledWarning": "This item or its descendants is being referenced. Therefore, deletion has been disabled.",
+ "listViewDialogWarning": "The following items you are trying to %0% are referenced by other content."
+ },
+ "logViewer": {
+ "deleteSavedSearch": "Delete Saved Search",
+ "logLevels": "Log Levels",
+ "selectAllLogLevelFilters": "Select all",
+ "deselectAllLogLevelFilters": "Deselect all",
+ "savedSearches": "Saved Searches",
+ "saveSearch": "Save Search",
+ "saveSearchDescription": "Enter a friendly name for your search query",
+ "filterSearch": "Filter Search",
+ "totalItems": "Total Items",
+ "timestamp": "Timestamp",
+ "level": "Level",
+ "machine": "Machine",
+ "message": "Message",
+ "exception": "Exception",
+ "properties": "Properties",
+ "searchWithGoogle": "Search With Google",
+ "searchThisMessageWithGoogle": "Search this message with Google",
+ "searchWithBing": "Search With Bing",
+ "searchThisMessageWithBing": "Search this message with Bing",
+ "searchOurUmbraco": "Search Our Umbraco",
+ "searchThisMessageOnOurUmbracoForumsAndDocs": "Search this message on Our Umbraco forums and docs",
+ "searchOurUmbracoWithGoogle": "Search Our Umbraco with Google",
+ "searchOurUmbracoForumsUsingGoogle": "Search Our Umbraco forums using Google",
+ "searchUmbracoSource": "Search Umbraco Source",
+ "searchWithinUmbracoSourceCodeOnGithub": "Search within Umbraco source code on Github",
+ "searchUmbracoIssues": "Search Umbraco Issues",
+ "searchUmbracoIssuesOnGithub": "Search Umbraco Issues on Github",
+ "deleteThisSearch": "Delete this search",
+ "findLogsWithRequestId": "Find Logs with Request ID",
+ "findLogsWithNamespace": "Find Logs with Namespace",
+ "findLogsWithMachineName": "Find Logs with Machine Name",
+ "open": "Open",
+ "polling": "Polling",
+ "every2": "Every 2 seconds",
+ "every5": "Every 5 seconds",
+ "every10": "Every 10 seconds",
+ "every20": "Every 20 seconds",
+ "every30": "Every 30 seconds",
+ "pollingEvery2": "Polling every 2s",
+ "pollingEvery5": "Polling every 5s",
+ "pollingEvery10": "Polling every 10s",
+ "pollingEvery20": "Polling every 20s",
+ "pollingEvery30": "Polling every 30s"
+ },
+ "clipboard": {
+ "labelForCopyAllEntries": "Copy %0%",
+ "labelForArrayOfItemsFrom": "%0% from %1%",
+ "labelForArrayOfItems": "Collection of %0%",
+ "labelForRemoveAllEntries": "Remove all items",
+ "labelForClearClipboard": "Clear clipboard"
+ },
+ "propertyActions": {
+ "tooltipForPropertyActionsMenu": "Open Property Actions",
+ "tooltipForPropertyActionsMenuClose": "Close Property Actions"
+ },
+ "nuCache": {
+ "refreshStatus": "Refresh status",
+ "memoryCache": "Memory Cache",
+ "memoryCacheDescription": "\n This button lets you reload the in-memory cache, by entirely reloading it from the database\n cache (but it does not rebuild that database cache). This is relatively fast.\n Use it when you think that the memory cache has not been properly refreshed, after some events\n triggered—which would indicate a minor Umbraco issue.\n (note: triggers the reload on all servers in an LB environment).\n ",
+ "reload": "Reload",
+ "databaseCache": "Database Cache",
+ "databaseCacheDescription": "\n This button lets you rebuild the database cache, ie the content of the cmsContentNu table.\n Rebuilding can be expensive. \n Use it when reloading is not enough, and you think that the database cache has not been\n properly generated—which would indicate some critical Umbraco issue.\n ",
+ "rebuild": "Rebuild",
+ "internals": "Internals",
+ "internalsDescription": "\n This button lets you trigger a NuCache snapshots collection (after running a fullCLR GC).\n Unless you know what that means, you probably do not need to use it.\n ",
+ "collect": "Collect",
+ "publishedCacheStatus": "Published Cache Status",
+ "caches": "Caches"
+ },
+ "profiling": {
+ "performanceProfiling": "Performance profiling",
+ "performanceProfilingDescription": "\n \n Umbraco currently runs in debug mode. This means you can use the built-in performance profiler to assess the performance when rendering pages.\n
\n \n If you want to activate the profiler for a specific page rendering, simply add umbDebug=true to the querystring when requesting the page.\n
\n \n If you want the profiler to be activated by default for all page renderings, you can use the toggle below.\n It will set a cookie in your browser, which then activates the profiler automatically.\n In other words, the profiler will only be active by default in your browser - not everyone else's.\n
\n ",
+ "activateByDefault": "Activate the profiler by default",
+ "reminder": "Friendly reminder",
+ "reminderDescription": "\n \n You should never let a production site run in debug mode. Debug mode is turned off by setting Umbraco:CMS:Hosting:Debug to false in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n ",
+ "profilerEnabledDescription": "\n \n Umbraco currently does not run in debug mode, so you can't use the built-in profiler. This is how it should be for a production site.\n
\n \n Debug mode is turned on by setting Umbraco:CMS:Hosting:Debug to true in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n "
+ },
+ "settingsDashboardVideos": {
+ "trainingHeadline": "Hours of Umbraco training videos are only a click away",
+ "trainingDescription": "\n Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos
\n ",
+ "getStarted": "To get you started"
+ },
+ "settingsDashboard": {
+ "start": "Start here",
+ "startDescription": "This section contains the building blocks for your Umbraco site. Follow the below\n links to find out more about working with the items in the Settings section\n ",
+ "more": "Find out more",
+ "bulletPointOne": "\n Read more about working with the items in Settings in the Documentation section of Our Umbraco\n ",
+ "bulletPointTwo": "\n Ask a question in the Community Forum \n ",
+ "bulletPointTutorials": "\n Watch our free tutorial videos on the Umbraco Learning Base \n ",
+ "bulletPointFour": "\n Find out about our productivity boosting tools and commercial support \n ",
+ "bulletPointFive": "\n Find out about real-life training and certification opportunities\n "
+ },
+ "startupDashboard": {
+ "fallbackHeadline": "Welcome to The Friendly CMS",
+ "fallbackDescription": "Thank you for choosing Umbraco - we think this could be the beginning of something\n beautiful. While it may feel overwhelming at first, we've done a lot to make the learning curve as smooth and fast\n as possible.\n "
+ },
+ "formsDashboard": {
+ "formsHeadline": "Umbraco Forms",
+ "formsDescription": "Create forms using an intuitive drag and drop interface. From simple contact forms\n that sends e-mails to advanced questionaires that integrate with CRM systems. Your clients will love it!\n ",
+ "yourForms": "Your forms",
+ "showMore": "Show more",
+ "entries": "Entries",
+ "newVersion": "There is a new version available",
+ "installOverlayTitle": "Congratulations",
+ "installOverlayDescription": "You've just installed Umbraco Forms - Let's create your first form",
+ "emptyOverlayTitle": "Create a form",
+ "emptyOverlayDescription": "You do not have any forms setup yet, how about creating one now?",
+ "createAForm": "Create a form",
+ "newVersionTitle": "There is a new version available",
+ "newVersionDescription": "You can now install Umbraco Forms",
+ "upgradeNow": "Upgrade now",
+ "downloading": "Downloading and upgrading forms...",
+ "invalidLicense": "Invalid license",
+ "invalidLicenseValidFor": "Your current Forms license is only valid for:",
+ "reconfigure": "Please re-configure your license below.",
+ "trialTitle": "Thank you for trying out Umbraco Forms",
+ "trialDescription": "To continue using Umbraco Forms, you must purchase a license, or use an existing license",
+ "configureLicense": "Configure existing license",
+ "buyLicense": "Buy license",
+ "buyLicenseTitle": "Buying a license",
+ "buyLicenseCopy": "\n \n It only takes a few minutes to buy a license for Umbraco Forms and your license is instantly delivered .\n
\n \n The steps are:\n
\n Click the buy button below \n Checkout with Credit Card (or invoice) \n Configure the license inside Umbraco Forms and you're up and running \n \n \n ",
+ "buyLink": "Buy Umbraco Forms",
+ "buyLicenseFAQs": "\n FAQ: \n What does it cost? \n Pricing starts at €209 and is a one time fee (no subscription).
\n What does a license cover? \n A license covers a single domain and will also work on all subdomains. It also includes two additional development domains.
\n Can I add additional domains to the license? \n Yes, additional domains can be added. You can purchase additional domains to your license from your account on Umbraco.com.
\n More questions? \n \n Don't worry, there's more details in the documentation and you're also more than welcome to get in touch with us . We usually respond within a couple of hours.\n
\n ",
+ "configureLicenseTitle": "Configure an Umbraco Forms license",
+ "configureLicenseCopy": "\n If you've already bought Umbraco Forms, you can automatically retrieve and configure your license here. Simply enter your umbraco.com credentials below and we'll\n find your license.\n ",
+ "configureLicenseFAQs": "\n FAQ: \n I don't know what my credentials are? \n \n It's a combination of your e-mail and password from when you placed your order. You can always reset your password here .\n
\n How do I buy a license? \n \n If you don't have a license, you can get one from here and only takes a few minutes .\n
\n ",
+ "findLicenses": "Find Licenses",
+ "invalidEmail": "Invalid email or password",
+ "noLicensesAvailable": "No Umbraco Forms licenses available on this account",
+ "availableLicensesTitle": "Available Licenses",
+ "foundLicenses": "Found",
+ "foundLicensesAccount": "on the account",
+ "noDomainsAssigned": "Has no domains assigned",
+ "setDomain": "Please set a domain on this license",
+ "configureAndInstall": "Configure and Install",
+ "installLicense": "Install this license",
+ "validDomains": "Valid domains",
+ "licenseValidOnDomain": "This license is valid on the current domain",
+ "licenseNotValidOnDomain": "This license is not valid on the current domain",
+ "plainTextPasswordWarning": "\n Warning: your configuration settings are set to save plain text passwords! \n When you use a password field on any of your forms, the data your visitors will enter in that field will be stored in plain text. This is a security issue and should be avoided.
\n To fix this issue, you can go in to your Umbraco:Forms:Security:SavePlainTextPasswords file and set the key SavePlainTextPasswords to False .
\n After updating this setting, make sure to recycle the application pool for the site for the new setting to become active.
\n Note: password values will still be passed on to workflows, regardless of the setting in configuration.
\n ",
+ "currentVersion": "Current installed version of Umbraco Forms:",
+ "licenseConfiguredNotificationTitle": "License configured",
+ "licenseConfiguredNotificationMessage": "Umbraco Forms has been configured for use on this website.",
+ "insufficientPermissionsError": "Insufficient Permissions",
+ "insufficientPermissionsMessage": "You do not have permissions to create and manage forms.",
+ "insufficientPermissionsUpgradeMessage": "Only Admin users have the ability to upgrade Umbraco Forms.",
+ "licensedDomains": "Licensed domains"
+ },
+ "blockEditor": {
+ "headlineCreateBlock": "Pick Element Type",
+ "headlineAddSettingsElementType": "Attach a settings Element Type",
+ "headlineAddCustomView": "Select view",
+ "headlineAddCustomStylesheet": "Select stylesheet",
+ "headlineAddThumbnail": "Choose thumbnail",
+ "labelcreateNewElementType": "Create new Element Type",
+ "labelCustomStylesheet": "Custom stylesheet",
+ "addCustomStylesheet": "Add stylesheet",
+ "headlineEditorAppearance": "Block appearance",
+ "headlineDataModels": "Data models",
+ "headlineCatalogueAppearance": "Catalogue appearance",
+ "labelBackgroundColor": "Background color",
+ "labelIconColor": "Icon color",
+ "labelContentElementType": "Content model",
+ "labelLabelTemplate": "Label",
+ "labelCustomView": "Custom view",
+ "labelCustomViewInfoTitle": "Show custom view description",
+ "labelCustomViewDescription": "Overwrite how this block appears in the backoffice UI. Pick a .html file\n containing your presentation.\n ",
+ "labelSettingsElementType": "Settings model",
+ "labelEditorSize": "Overlay editor size",
+ "addCustomView": "Add custom view",
+ "addSettingsElementType": "Add settings",
+ "confirmDeleteBlockMessage": "Are you sure you want to delete the content %0% ?",
+ "confirmDeleteBlockTypeMessage": "Are you sure you want to delete the block configuration %0% ?",
+ "confirmDeleteBlockTypeNotice": "The content of this block will still be present, editing of this content\n will no longer be available and will be shown as unsupported content.\n ",
+ "confirmDeleteBlockGroupMessage": "Are you sure you want to delete group %0% and all the Block configurations of this?",
+ "confirmDeleteBlockGroupNotice": "The content of these Blocks will still be present, editing of this content\n will no longer be available and will be shown as unsupported content.\n ",
+ "blockConfigurationOverlayTitle": "Configuration of '%0%'",
+ "elementTypeDoesNotExist": "Cannot be edited cause ElementType does not exist.",
+ "thumbnail": "Thumbnail",
+ "addThumbnail": "Add thumbnail",
+ "tabCreateEmpty": "Create empty",
+ "tabClipboard": "Clipboard",
+ "tabBlockSettings": "Settings",
+ "headlineAdvanced": "Advanced",
+ "forceHideContentEditor": "Hide content editor",
+ "forceHideContentEditorHelp": "Hide the content edit button and the content editor from the Block Editor overlay",
+ "girdInlineEditing": "Inline editing",
+ "girdInlineEditingHelp": "Enables inline editing for the first Property. Additional properties can be edited in the overlay.",
+ "blockHasChanges": "You have made changes to this content. Are you sure you want to discard them?",
+ "confirmCancelBlockCreationHeadline": "Discard creation?",
+ "confirmCancelBlockCreationMessage": "Are you sure you want to cancel the creation.",
+ "elementTypeDoesNotExistHeadline": "Error!",
+ "elementTypeDoesNotExistDescription": "The ElementType of this block does not exist anymore",
+ "addBlock": "Add content",
+ "addThis": "Add %0%",
+ "propertyEditorNotSupported": "Property '%0%' uses editor '%1%' which is not supported in blocks.",
+ "focusParentBlock": "Set focus on the container block",
+ "areaIdentification": "Identification",
+ "areaValidation": "Validation",
+ "areaValidationEntriesShort": "%0% must be present atleast %2% time(s).",
+ "areaValidationEntriesExceed": "%0% must maximum be present %3% time(s).",
+ "areaNumberOfBlocks": "Number of blocks",
+ "areaDisallowAllBlocks": "Only allow specific block types",
+ "areaAllowedBlocks": "Allowed block types",
+ "areaAllowedBlocksHelp": "Define the types of blocks that are allowed in this area, and optionally how many of each type that should be present.",
+ "confirmDeleteBlockAreaMessage": "Are you sure you want to delete this area?",
+ "confirmDeleteBlockAreaNotice": "Any blocks currently created within this area will be deleted.",
+ "layoutOptions": "Layout options",
+ "structuralOptions": "Structural",
+ "sizeOptions": "Size options",
+ "sizeOptionsHelp": "Define one or more size options, this enables resizing of the Block",
+ "allowedBlockColumns": "Available column spans",
+ "allowedBlockColumnsHelp": "Define the different number of columns this block is allowed to span across. This does not prevent Blocks from being placed in Areas with a smaller column span.",
+ "allowedBlockRows": "Available row spans",
+ "allowedBlockRowsHelp": "Define the range of layout rows this block is allowed to span across.",
+ "allowBlockInRoot": "Allow in root",
+ "allowBlockInRootHelp": "Make this block available in the root of the layout.",
+ "allowBlockInAreas": "Allow in areas",
+ "allowBlockInAreasHelp": "Make this block available by default within the areas of other Blocks (unless explicit permissions are set for these areas).",
+ "areaAllowedBlocksEmpty": "By default, all block types are allowed in an Area, Use this option to allow only selected types.",
+ "areas": "Areas",
+ "areasLayoutColumns": "Grid Columns for Areas",
+ "areasLayoutColumnsHelp": "Define how many columns that will be available for areas. If not defined, the number of columns defined for the entire layout will be used.",
+ "areasConfigurations": "Areas",
+ "areasConfigurationsHelp": "To enable the nesting of blocks within this block, define one or more areas. Areas follow the layout defined by their own grid column configuration. The 'column span' and 'row span' for each area can be adjusted by using the scale-handler box in the bottom right hand corner of the selected area.",
+ "invalidDropPosition": "%0% is not allowed at this spot.",
+ "defaultLayoutStylesheet": "Default layout stylesheet",
+ "confirmPasteDisallowedNestedBlockHeadline": "Disallowed content was rejected",
+ "confirmPasteDisallowedNestedBlockMessage": "The inserted content contained disallowed content, which has not been created. Would you like to keep the rest of this content anyway?",
+ "areaAliasHelp": "When using GetBlockGridHTML() to render the Block Grid, the alias will be rendered in the markup as a 'data-area-alias' attribute. Use the alias attribute to target the element for the area. Example. .umb-block-grid__area[data-area-alias=\"MyAreaAlias\"] { ... }",
+ "scaleHandlerButtonTitle": "Drag to scale",
+ "areaCreateLabelTitle": "Create Button Label",
+ "areaCreateLabelHelp": "Override the label text for adding a new Block to this Area, Example: 'Add Widget'",
+ "showSizeOptions": "Show resize options",
+ "addBlockType": "Add Block",
+ "addBlockGroup": "Add group",
+ "pickSpecificAllowance": "Pick group or Block",
+ "allowanceMinimum": "Set a minimum requirement",
+ "allowanceMaximum": "Set a maximum requirement",
+ "block": "Block",
+ "tabBlock": "Block",
+ "tabBlockTypeSettings": "Settings",
+ "tabAreas": "Areas",
+ "tabAdvanced": "Advanced",
+ "headlineAllowance": "Permissions",
+ "getSampleHeadline": "Install Sample Configuration",
+ "getSampleDescription": "This will add basic Blocks and help you get started with the Block Grid Editor. You'll get Blocks for Headline, Rich Text, Image, as well as a Two Column Layout.",
+ "getSampleButton": "Install",
+ "actionEnterSortMode": "Sort mode",
+ "actionExitSortMode": "End sort mode",
+ "areaAliasIsNotUnique": "This Areas Alias must be unique compared to the other Areas of this Block.",
+ "configureArea": "Configure area",
+ "deleteArea": "Delete area",
+ "addColumnSpanOption": "Add spanning %0% columns option"
+ },
+ "contentTemplatesDashboard": {
+ "whatHeadline": "What are Content Templates?",
+ "whatDescription": "Content Templates are pre-defined content that can be selected when creating a new\n content node.\n ",
+ "createHeadline": "How do I create a Content Template?",
+ "createDescription": "\n There are two ways to create a Content Template:
\n \n Right-click a content node and select \"Create Content Template\" to create a new Content Template. \n Right-click the Content Templates tree in the Settings section and select the Document Type you want to create a Content Template for. \n \n Once given a name, editors can start using the Content Template as a foundation for their new page.
\n ",
+ "manageHeadline": "How do I manage Content Templates?",
+ "manageDescription": "You can edit and delete Content Templates from the \"Content Templates\" tree in the\n Settings section. Expand the Document Type which the Content Template is based on and click it to edit or delete\n it.\n "
+ },
+ "preview": {
+ "endLabel": "End",
+ "endTitle": "End preview mode",
+ "openWebsiteLabel": "Preview website",
+ "openWebsiteTitle": "Open website in preview mode",
+ "returnToPreviewHeadline": "Preview website?",
+ "returnToPreviewDescription": "You have ended preview mode, do you want to enable it again to view the\n latest saved version of your website?\n ",
+ "returnToPreviewAcceptButton": "Preview latest version",
+ "returnToPreviewDeclineButton": "View published version",
+ "viewPublishedContentHeadline": "View published version?",
+ "viewPublishedContentDescription": "You are in Preview Mode, do you want exit in order to view the\n published version of your website?\n ",
+ "viewPublishedContentAcceptButton": "View published version",
+ "viewPublishedContentDeclineButton": "Stay in preview mode"
+ },
+ "permissions": {
+ "FolderCreation": "Folder creation",
+ "FileWritingForPackages": "File writing for packages",
+ "FileWriting": "File writing",
+ "MediaFolderCreation": "Media folder creation"
+ },
+ "treeSearch": {
+ "searchResult": "item returned",
+ "searchResults": "items returned"
+ },
+ "analytics": {
+ "consentForAnalytics": "Consent for telemetry data",
+ "analyticsLevelSavedSuccess": "Telemetry level saved!",
+ "analyticsDescription": "\n In order to improve Umbraco and add new functionality based on as relevant information as possible,\n we would like to collect system- and usage information from your installation.\n Aggregate data will be shared on a regular basis as well as learnings from these metrics.\n Hopefully, you will help us collect some valuable data.\n \n We WILL NOT collect any personal data such as content, code, user information, and all data will be fully anonymized.\n ",
+ "minimalLevelDescription": "We will only send an anonymized site ID to let us know that the site exists.",
+ "basicLevelDescription": "We will send an anonymized site ID, Umbraco version, and packages installed",
+ "detailedLevelDescription": "\n We will send:\n \n Anonymized site ID, Umbraco version, and packages installed. \n Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use. \n System information: Webserver, server OS, server framework, server OS language, and database provider. \n Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode. \n \n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n By choosing \"Detailed\" you agree to current and future anonymized information being collected. \n "
+ },
+ "umbId": {
+ "editProfile": "Edit your Umbraco ID profile",
+ "changePassword": "Change your Umbraco ID password"
+ },
+ "dialogs": {
+ "deployTransferNowTitle": "Transfer now",
+ "deployTransferNowHeadline": "Transfer %0% to %1% ",
+ "deployTransferNowDescription": "You are about to transfer %0% directly to %1%, without adding it to the queue.
",
+ "deployAddToQueueHeadline": "Queue %0% for transfer to %1% ",
+ "deployAddToQueueDescription": "This will put %0% in the queue for the next transfer, nothing will be transfered yet.
",
+ "deployAddToQueueCultureDescription": "Select language to include in transfer:
",
+ "deployAddToQueueChildPageDescription": "Should all items below %0% be included in the transfer?
",
+ "deployAddToQueueReleaseDateDescription": "The published or unpublished status will be transferred along with the content. To schedule the update for publishing in the future, please set a date:
",
+ "deployIncludeChildPages": "Include all items below",
+ "deployAddToQueueDone": "Changes have been queued When you are ready to transfer your full set of changes, go to the workspace dashboard to start the transfer.
",
+ "deployVariantQueueForTransferNotAllowed": "Transfer is not allowed",
+ "deployRestoreFrom": "From",
+ "deployRestoreWorkspace": "workspace",
+ "deployRestoreThis": "Restore",
+ "deployRestoreIncludingDescendants": "Including all items below",
+ "deployRestoreNotIncludingDescendants": "Not including items below",
+ "deployRestoreDescription": "\n This includes changes to referenced content, media and other items.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ",
+ "deployRestorePickFrom": "Or pick content from",
+ "deployFullRestoreFrom": "Restore this workspace from",
+ "deployFullRestoreDescription": "\n This will transfer changes from %0% for all items and apply them to this workspace.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ",
+ "deployFullRestoreAction": "Restore from",
+ "deployTreeRestoreFrom": "Restore this tree from",
+ "deployTreeRestoreDescription": "\n This will transfer changes from %0% and apply them to the selected tree in this workspace. This will include changes to any referenced content, media or other items.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ",
+ "deployCompareTitle": "Compare",
+ "deployGoToTransferQueue": "Open transfer queue"
+ },
+ "deployManagementDashboard": {
+ "refreshStatus": "Refresh Status",
+ "deployStatus": "Deploy Status",
+ "deployOperations": "Deploy Operations",
+ "triggerOperation": "Trigger Operation",
+ "version": "Version",
+ "status": "Status",
+ "operationTime": "Last operation time",
+ "schemaComparison": "Schema Comparison",
+ "configurationDetails": "Configuration Details",
+ "updateUmbracoSchemaFromDataFiles": "Update Umbraco Schema From Data Files",
+ "updateUmbracoSchemaFromDataFilesDescription": "Update the Umbraco schema based on the information contained in the .uda files on disk.",
+ "schemaDeployment": "Update Umbraco Schema",
+ "exportSchemaToDataFiles": "Export Schema To Data Files",
+ "exportSchemaToDataFilesDescription": "Extract the schema from Umbraco and output it to the .uda files on disk.",
+ "exportSchema": "Export Schema",
+ "clearCachedSignatures": "Clear Cached Signatures",
+ "clearCachedSignaturesDescription": "\n Clear the cached artifact signatures from the Umbraco environment.\n This should not be necessary in normal use. This may solve reports of schema mismatches when transferring content between environments that have been aligned.\n ",
+ "clearSignatures": "Clear Signatures",
+ "setCachedSignatures": "Set Cached Signatures",
+ "setCachedSignaturesDescription": "\n Sets the cached artifact signatures for all entities within the Umbraco environment.\n This can be used when signatures have been cleared and you want to ensure they are pre-generated before attempting a potentially long-running restore or transfer operation.\n ",
+ "setSignatures": "Set Signatures"
+ },
+ "formPicker": {
+ "selectFromFolder": "Select from folder",
+ "selectFromList": "Select from list of all forms"
+ },
+ "formCopy": {
+ "title": "Copying form '%0%'",
+ "enterName": "Enter a name for the copied form",
+ "alsoCopyWorkflows": "Also copy workflows?",
+ "copyToNewFolder": "Copy to a new folder?",
+ "selectLocation": "Select the location for copied form"
+ },
+ "formCreate": {
+ "title": "Create a new form or folder",
+ "emptyForm": "Empty form",
+ "emptyFormDescription": "Starting from scratch",
+ "folder": "Folder",
+ "folderDescription": "Used to organize forms",
+ "enterFolderName": "Enter a folder name"
+ },
+ "formExport": {
+ "formExportedSuccess": "The form was exported to a file."
+ },
+ "formImport": {
+ "importInstruction1": "\n To import a form, find the exported .json file on your computer by clicking the 'Import' button (you'll be asked for confirmation on the next screen).\n ",
+ "importInstruction2": "\n If a form already exists with the ID of the file selected, it will be updated and moved to the selected location.\n If no existing form is found, a new one will be created at the selected location.\n "
+ },
+ "formPermissions": {
+ "accessDeniedTitle": "Access denied"
+ },
+ "formMessages": {
+ "saveErrorMessage": "Please check if your settings are valid."
+ },
+ "formEdit": {
+ "addQuestion": "Add question",
+ "groupIsEmpty": "Group is empty",
+ "dropQuestionHere": "Drop a question here...",
+ "letGo": "Yaay.. let go",
+ "pageIsEmpty": "Page is empty",
+ "dropGroupHere": "Drop a group here...",
+ "addGroup": "Add new group",
+ "addPage": "Add new page",
+ "pageTitlePlaceholder": "Untitled page (optional)",
+ "groupTitlePlaceholder": "Untitled group (optional)",
+ "saveFieldFailedTitle": "Field failed to save",
+ "accessDeniedMessage": "You do not have access to edit this form.",
+ "formSaved": "Form saved",
+ "unableToLoadForm": "Unable to load form",
+ "helpText": "Help text",
+ "editPage": "Edit Page",
+ "editGroup": "Edit Group",
+ "editQuestion": "Edit Question",
+ "workflows": "Workflows",
+ "magicStringsForFieldsNote": "\n Many field settings support the use of magic strings .\n When the form is displayed, these strings can be replaced with values from various sources, including dictionary values, session or cookie data and Umbraco page fields.\n Read more .",
+ "magicStringsForWorkflowsNote": "\n Many workflow settings support the use of magic strings .\n When the workflow is processed, these strings can be replaced with values from various sources, including record data and dictionary values.\n Read more .",
+ "fieldTypeNotAvailable": "The field type configured for this field is no longer available.",
+ "fieldTypeRichTextNotAvailable": "The rich text cannot be formatted as no valid data type has been configured.",
+ "fieldTypeRichTextNotAvailableLinkText": "Read how to configure a data type."
+ },
+ "formFileUpload": {
+ "allowAllFiles": "Allow all files",
+ "allowOnlySpecifiedFiles": "Allow only specified files",
+ "predefinedAllowedFileTypes": "Predefined allowed file types",
+ "userDefinedAllowedFileTypes": "User defined allowed file types",
+ "deleteAllowedFileTypeConfirmationTitle": "Confirmation",
+ "deleteAllowedFileTypeConfirmationDescription": "Are you sure you want to delete this?",
+ "duplicateFileTypeErrorTitle": "File type error",
+ "duplicateFileTypeErrorMessage": "Unable to add file type as this is a duplicate.",
+ "pickFile": "Pick File",
+ "uploading": "Uploading",
+ "currentFile": "Current file"
+ },
+ "formPrevalues": {
+ "newValue": "New value",
+ "newCaption": "New caption",
+ "caption": "Caption",
+ "duplicateErrorTitle": "Prevalue error",
+ "duplicateAddErrorMessage": "Unable to add value as it would create a duplicate.",
+ "duplicateEditErrorMessage": "Unable to edit value as it would create a duplicate."
+ },
+ "formDelete": {
+ "title": "Are you sure you want to delete the %0% '%1%'?",
+ "timingNote": "Please note this can take lots of time depending on the number of records.",
+ "recordDeleteNote": "Deleting the form will also delete the associated records.",
+ "recordDetail": "There are %0% records, with the most recent one submitted on %1%.",
+ "noRecordDetail": "There are 0 records.",
+ "cannotDeleteFolder": "The selected folder cannot be deleted as it is not empty.",
+ "successMessageForForm": "Successfully deleted the form.",
+ "failedMessageForForm": "Form failed to delete.",
+ "successMessageForFolder": "Successfully deleted the folder.",
+ "failedMessageForFolder": "Folder failed to delete."
+ },
+ "formEntries": {
+ "title": "%0% Entries",
+ "filterEntries": "Filter entries...",
+ "selectedRowsDescription": "%0% of %1% selected",
+ "export": "Export",
+ "chooseExportFormat": "Choose a format to export form records to",
+ "entriesNotStored": "Currently submissions are not stored in the database.",
+ "enableStoreEntries": "To enable this, go to form settings and activate the \"Store Records\" feature.",
+ "noEntriesInRange": "No submissions added yet in this date range.",
+ "noEntriesInRangeDetail": "We couldn't find any submissions, are you sure you published the form? Or try expanding the date range.",
+ "noEntriesMatchingSearch": "We couldn't find any submissions matching your search.",
+ "noEntriesMatchingSearchDetail": "Try searching for something else, maybe you're lucky next time.",
+ "selectedEntryPaging": "Entry %0% of %1%",
+ "previousEntry": "Previous entry",
+ "nextEntry": "Next entry",
+ "accessDeniedMessage": "You do not have access to view this form's entries.",
+ "executeCompleteTitle": "Executed action",
+ "executeSuccessMessage": "Successfully executed action %0%",
+ "executeErrorMessage": "Failed to execute action %0% due to error: %1%.",
+ "entryDetails": "Entry details",
+ "closeDetails": "Close details",
+ "submittedOn": "Submitted on",
+ "updatedOn": "Updated on",
+ "fromPage": "From page",
+ "member": "Member",
+ "state": "State",
+ "uniqueId": "Unique ID",
+ "auditTrail": "Audit trail",
+ "showAuditTrail": "Show audit trail",
+ "hideAuditTrail": "Hide audit trail",
+ "updatedBy": "Updated by",
+ "updateRecordSuccess": "Record updated",
+ "updateRecordError": "Record could not be updated",
+ "workflowAudit": "Workflow Audit",
+ "workflowAuditName": "Name",
+ "workflowAuditType": "Type",
+ "workflowAuditExecutedOn": "Executed On",
+ "workflowAuditExecutionStage": "Stage",
+ "workflowAuditResult": "Result",
+ "workflowAuditTitleFormatSingular": "%0% of %1% workflow succeeded",
+ "workflowAuditTitleFormatPlural": "%0% of %1% workflows succeeded",
+ "workflowAuditRetry": "Retry",
+ "workflowAuditRunAgain": "Run Again",
+ "workflowAuditRunAnyway": "Run Anyway",
+ "workflowAuditRetryConfirmTitle": "Confirmation",
+ "workflowAuditRetryConfirmMessage": "Are you sure you wish to run the selected workflow?",
+ "workflowAuditRetrySuccessMessage": "The workflow execution completed (see audit trail for status and consult logs for a non-successful result)",
+ "workflowAuditRetryFailedMessage": "The workflow execution failed",
+ "workflowAuditRetryFailedMessageDetailWorkflowNotFound": "The workflow is no longer associated with the form.",
+ "workflowExecutionStageSubmitted": "Submitted",
+ "workflowExecutionStageApproved": "Approved",
+ "workflowExecutionStatusCompleted": "Completed",
+ "workflowExecutionStatusFailed": "Failed",
+ "workflowExecutionStatusNotConfigured": "Not Configured",
+ "workflowExecutionStatusCancelled": "Cancelled",
+ "workflowExecutionStatusSkippedDueToConditions": "Ignored By Conditions"
+ },
+ "formMove": {
+ "title": "Select the folder to move %0% to in the tree structure below.",
+ "successMessage": "%0% was moved underneath %1% .",
+ "successNotificationHeader": "Moved",
+ "successNotificationDescriptionForForm": "The form was moved to the selected location.",
+ "successNotificationDescriptionForFolder": "The folder was moved to the selected location."
+ },
+ "formRename": {
+ "enterNewName": "Enter the new name",
+ "successNotificationHeader": "Renamed",
+ "successNotificationDescriptionForFolder": "The folder was renamed."
+ },
+ "formConditions": {
+ "title": "Conditions",
+ "enableConditions": "Enable conditions",
+ "actionTypeShow": "Show",
+ "actionTypeHide": "Hide",
+ "workflowactionTypeShow": "Run",
+ "workflowactionTypeHide": "Ignore",
+ "logicTypeAll": "all",
+ "logicTypeAny": "any",
+ "operatorIs": "is",
+ "operatorIsNot": "is not",
+ "operatorGreaterThen": "is greater than",
+ "operatorLessThen": "is less than",
+ "operatorContains": "contains",
+ "operatorStartsWith": "starts with",
+ "operatorEndsWith": "ends with",
+ "thisFieldSetIf": "this group if",
+ "thisFieldIf": "this field if",
+ "buttonsForThisPageIf": "the \"next\" or \"submit\" button for this page if",
+ "thisWorkflowIf": "this workflow if",
+ "ofTheFollowingMatch": "of the following match",
+ "selectField": "Select field",
+ "addCondition": "Add condition",
+ "pageConditionsDescription": "Optionally define conditions for the display of the \"Submit\" or \"Next\" button for the page.",
+ "pageButtonConditionStatus": "%0% buttons for this page if %1% of the following match:",
+ "fieldsetConditionStatus": "%0% this group if %1% of the following match:",
+ "fieldConditionStatus": "%0% this question if %1% of the following match:",
+ "empty": "empty"
+ },
+ "formThemes": {
+ "noThemesAvailable": "No themes available. Add themes to /Views/Partials/Forms/Themes"
+ },
+ "formWorkflows": {
+ "workflowNameLabel": "Workflow Name",
+ "workflowNameDescription": "Give a descriptive name for your workflow",
+ "activeLabel": "Active",
+ "activeDescription": "Enable or disable the workflow",
+ "includeSensitiveDataLabel": "Include Sensitive Data",
+ "includeSensitiveDataDescription": "Include sensitive data when executing this workflow?",
+ "submitMessage": "Submit message / Go to page",
+ "approve": "Approve",
+ "automatic": "automatic",
+ "noWorkflowsAdded": "No workflows are added",
+ "configureWorkflow": "configure workflow",
+ "saveFailedTitle": "Workflow failed to save",
+ "closeConfirmationTitle": "Confirmation",
+ "closeConfirmationMessage": "Changes have been made which have not been saved. Are you sure you wish to close?",
+ "chooseWorkflow": "Choose workflow",
+ "on": "On",
+ "onSubmit": "On Submit",
+ "onSubmitDescription": "We will run these workflows for you when the form is submitted",
+ "onApprove": "On Approve",
+ "onApproveDescription": "These workflows will run when the entry is approved",
+ "onApproveAutomaticDescription": "this happens automatically after the submit event with the current form settings",
+ "defaultWorkflowName": "Submit message / Go to page",
+ "defaultWorkflowDescription": "Show a message when the form is submitted or go to an Umbraco page",
+ "addWorkflow": "Add workflow",
+ "messageOnSubmit": "Message on submit",
+ "messageOnSubmitDescription": "Show a message when the form is submitted",
+ "messageOnSubmitIsHtmlToggleTextOn": "Format message in rich text",
+ "messageOnSubmitIsHtmlToggleTextOff": "Format message in plain text",
+ "goToPage": "Go to page",
+ "goToPageDescription": "Go to an Umbraco page when the form is submitted"
+ },
+ "fieldSetColumns": {
+ "title": "Columns",
+ "setNumber": "Set how many columns you wish to have in your group.",
+ "columnNumberDescription": "This group currently has %0%.",
+ "addColumn": "Add column"
+ },
+ "fieldSettings": {
+ "namePlaceholder": "Enter question...",
+ "descriptionPlaceholder": "Enter help text...",
+ "requiredLabel": "Required label",
+ "chooseAnswerType": "Choose answer type",
+ "sensitiveData": "Sensitive data",
+ "sensitiveDataDescription": "Prevent the data from being viewed and exported if a user doesn't have sufficient permissions.",
+ "sensitiveDataLabel": "Yes, this field stores sensitive data",
+ "allowedFileUploadTypes": "Allowed file upload types",
+ "prevalues": "Prevalues",
+ "prevaluesProvideWithSources": "Either provide here a list of options (prevalues) specific for this field, or select a predefined prevalue source.",
+ "prevaluesProvide": "Provides a list of options (prevalues) for the field.",
+ "prevaluesItems": "Items",
+ "prevaluesSource": "Prevalue source",
+ "pressEnterToAdd": "Press enter to add a value",
+ "settings": "Settings",
+ "mandatory": "Mandatory",
+ "enterRegex": "Enter a regular expression",
+ "invalidPlaceholder": "Enter a field invalid message...",
+ "allowMultipleFileUploads": "Allow multiple file uploads",
+ "multipleFilesToggleTextOn": "Multiple files allowed",
+ "multipleFilesToggleTextOff": "Single file only"
+ },
+ "formSettings": {
+ "storeRecords": "Store Records",
+ "storeRecordsDescription": "\n Check this box to save submitted records in a database.\n This will allow you to view and export them from the queries overview.\n If you don't want to store data (due to policies in your organization), leave the box un-checked.\n ",
+ "storeRecordsConfirm": "Yes, keep submitted records in a database so they can be viewed and exported later.",
+ "captions": "Captions",
+ "captionsDescription": "Change the captions for the Submit, Next and Previous buttons.",
+ "captionSubmitButton": "'Submit' button label",
+ "captionNextButton": "'Next' button label",
+ "captionPreviousButton": "'Previous' button label",
+ "styling": "Styling",
+ "stylingDescription": "Add one or more classes to wrap your form to enable custom styling, or disable default styling.",
+ "formCssClass": "Form CSS class",
+ "disableDefaultStylesheet": "Disable default stylesheet",
+ "validation": "Validation",
+ "validationDescription": "Provide better validation messages, hide validation labels and change or disable the required/mandatory marker.",
+ "mandatoryErrorMessage": "Mandatory Error Message",
+ "mandatoryErrorMessageDescription": "Message to display when a mandatory field was left empty",
+ "invalidErrorMessage": "Invalid Error Message",
+ "invalidErrorMessageDescription": "Message to display when a field is invalid",
+ "showValidationSummary": "Show validation summary",
+ "hideFieldValidationLabels": "Hide field validation labels",
+ "markFields": "Mark fields",
+ "markFieldsNoIndicator": "No Indicator",
+ "markMandatoryFields": "Mark Mandatory Fields",
+ "markOptionalFields": "Mark Optional Fields",
+ "indicator": "Indicator",
+ "changeIndicatorSymbol": "Change the mandatory indicator symbol",
+ "autocomplete": "Autocomplete",
+ "autocompleteDescription": "Add an attribute to control the overall form's autocompletion behaviour.",
+ "autocompleteNone": "None",
+ "autocompleteOn": "On",
+ "autocompleteOff": "Off",
+ "moderation": "Moderation",
+ "moderationDescription": "Allow form submissions to be post moderated. Most use cases are for publicly shown entries such as blog post comments or submissions for a social campaign.",
+ "enablePostModeration": "Enable post moderation",
+ "fieldsDisplayed": "Fields displayed",
+ "fieldsDisplayedDescription": "Select which fields are displayed in the list of form entries.",
+ "displayDefaultFields": "Display default fields",
+ "displayDefaultFieldsDescription": "By default, the values provided for the first three fields of the form are displayed, along with some system fields.",
+ "formFields": "Form fields",
+ "systemFields": "System fields",
+ "noSelectedDisplayFields": "No fields have been selected for display.",
+ "resetDisplayDefaultFieldsMessage": "Are you sure you wish to return to the default field selection for display? The custom fields you have selected will be removed when the form is saved.",
+ "dataRetention": "Data retention",
+ "dataRetentionDescription": "Define how long form submissions are kept for before they are automatically deleted.",
+ "dataRetentionForSubmittedRecords": "Number of days to retain submitted records",
+ "dataRetentionForApprovedRecords": "Number of days to retain approved records",
+ "dataRetentionRetainSubmittedRecords": "Retain submitted records forever",
+ "dataRetentionRetainApprovedRecords": "Retain approved records forever",
+ "scheduledRecordDeletionNotEnabled": "The scheduled record deletion service is not currently enabled. These settings will not take effect until it is enabled and running."
+ },
+ "formSecurity": {
+ "saveSuccessTitle": "User form security saved",
+ "saveErrorTitle": "User form security failed to save",
+ "manageFormsLabel": "Manage Forms",
+ "manageFormsDescription": "Grant or deny access to managing forms",
+ "manageWorkflowsLabel": "Manage Workflows",
+ "manageWorkflowsDescription": "Grant or deny access to managing all forms workflow items",
+ "manageDatasourcesLabel": "Manage Data Sources",
+ "manageDatasourcesDescription": "Grant or deny access to managing any data sources for all forms",
+ "managePrevalueSourcesLabel": "Manage Prevalue Sources",
+ "managePrevalueSourcesDescription": "Grant or deny access to managing any prevalue sources for all forms",
+ "manageIndividualFormsLabel": "Form Security",
+ "manageIndividualFormsDescription": "Grant or deny access to individual forms",
+ "startFolders": "Start folders",
+ "startFoldersDescription": "Define the root folder or folders for the user",
+ "selectNewStartFolders": "Select start folders",
+ "formName": "Form name",
+ "hasAccess": "Has Access",
+ "viewEntriesLabel": "View Entries",
+ "viewEntriesDescription": "Grant or deny access to viewing of submitted entries",
+ "editEntriesLabel": "Edit Entries",
+ "editEntriesDescription": "Grant or deny access to editing of submitted entries",
+ "deleteTitle": "Delete user security: %0%",
+ "deleteUserRecordNote": "By deleting the user security record the user's permissions will be derived from the user groups that they are members of.",
+ "deleteSuccessMessage": "User security record deleted.",
+ "deleteFailedMessage": "User security record could not be deleted.",
+ "createTitle": "Create user security",
+ "createUserRecordNote": "When a user record is created it will take precedence over any permissions assigned at the user group level.",
+ "selectUser": "Select user",
+ "allUsersHaveRecords": "All users already have security records created.",
+ "groupPermissions": "Group permissions",
+ "userPermissions": "User permissions"
+ },
+ "formDataSources": {
+ "typeDescription": "Select the type of data source",
+ "createForm": "Create form",
+ "formName": "Form Name",
+ "selectFields": "Select fields",
+ "selectFieldsDescription": "Fields from the datasource you wish to include in the form.",
+ "setupForeignKeys": "Setup foreign keys",
+ "setupForeignKeysDescription": "Select the value column for foreign key fields.",
+ "selectType": "Select type",
+ "selectTypeDescription": "Field type you wish to use for the included fields (or default value).",
+ "defaultValue": "Default value",
+ "deleteConfirm": "Are you sure you want to delete the data source %0%?",
+ "saveSuccessTitle": "Datasource saved",
+ "saveErrorTitle": "Datasource failed to save",
+ "accessDeniedMessage": "You do not have access to edit datasources"
+ },
+ "formPrevalueSources": {
+ "typeDescription": "Select the type of prevalue source",
+ "deleteConfirm": "Are you sure you want to delete the prevalue source %0%?",
+ "saveSuccessTitle": "Prevalue source saved",
+ "saveErrorTitle": "Prevalue source failed to save",
+ "accessDeniedMessage": "You do not have access to edit prevalue sources"
+ },
+ "formProviderFieldTypes": {
+ "checkboxName": "Checkbox",
+ "checkboxDescription": "Renders a checkbox.",
+ "checkboxDefaultValueLabel": "Default Value",
+ "checkboxDefaultValueDescription": "Enter a default value.",
+ "multipleChoiceName": "Multiple choice",
+ "multipleChoiceDescription": "Renders a collection of checkboxes to select multiple answers.",
+ "multipleChoiceDefaultValueLabel": "Default Value",
+ "multipleChoiceDefaultValueDescription": "Enter a default value.",
+ "multipleChoiceShowLabelLabel": "Show Label",
+ "multipleChoiceShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
+ "dataConsentName": "Data Consent",
+ "dataConsentDescription": "Renders a field to ask for data consent.",
+ "dataConsentAcceptCopyLabel": "Accept Copy",
+ "dataConsentAcceptCopyDescription": "The text used to confirm consent.",
+ "dataConsentShowLabelLabel": "Show Label",
+ "dataConsentShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
+ "dateName": "Date",
+ "dateDescription": "Renders a date picker.",
+ "datePlaceholderLabel": "Placeholder",
+ "datePlaceholderDescription": "Enter a placeholder value.",
+ "dropdownName": "Dropdown",
+ "dropdownDescription": "Renders a list of values in a dropdown",
+ "dropdownDefaultValueLabel": "Default Value",
+ "dropdownDefaultValueDescription": "Enter a default value.",
+ "dropdownAllowMultipleSelectionsLabel": "Allow multiple selections",
+ "dropdownAllowMultipleSelectionsDescription": "Indicate whether multiple selections from the list are allowed.",
+ "dropdownShowLabelLabel": "Show Label",
+ "dropdownShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
+ "dropdownAutocompleteAttributeLabel": "Autocomplete attribute",
+ "dropdownAutocompleteAttributeDescription": "Optionally enter a value for the autocomplete attribute.",
+ "dropdownSelectPromptLabel": "Prompt for selection",
+ "dropdownSelectPromptDescription": "Optionally provide a prompt for the user's selection.",
+ "fileUploadName": "File upload",
+ "fileUploadDescription": "Renders an upload field, allowing files to be uploaded.",
+ "hiddenName": "Hidden",
+ "hiddenDescription": "Renders a hidden field.",
+ "hiddenDefaultValueLabel": "Default Value",
+ "hiddenDefaultValueDescription": "Enter a default value.",
+ "passwordName": "Password",
+ "passwordDescription": "Renders a password field.",
+ "passwordPlaceholderLabel": "Placeholder",
+ "passwordPlaceholderDescription": "Enter a placeholder value.",
+ "singleChoiceName": "Single choice",
+ "singleChoiceDescription": "Renders a radio button list to enable a single choice answer.",
+ "singleChoiceDefaultValueLabel": "Default Value",
+ "singleChoiceDefaultValueDescription": "Enter a default value.",
+ "singleChoiceShowLabelLabel": "Show Label",
+ "singleChoiceShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
+ "recaptcha2Name": "reCAPTCHA v2",
+ "recaptcha2Description": "Google reCAPTCHA v2.",
+ "recaptcha2ThemeLabel": "Theme",
+ "recaptcha2ThemeDescription": "reCAPTCHA v2 theme.",
+ "recaptcha2SizeLabel": "Size",
+ "recaptcha2SizeDescription": "reCAPTCHA v2 size.",
+ "recaptcha2ErrorMessageLabel": "Error message",
+ "recaptcha2ErrorMessageDescription": "The error message to display when the user does not pass the reCAPTCHA check.",
+ "reCAPTCHAV3WithScoreName": "reCAPTCHA v3 with score",
+ "reCAPTCHAV3WithScoreDescription": "Google reCAPTCHA v3 with score threshold",
+ "reCAPTCHAV3WithScoreScoreThresholdLabel": "Score threshold",
+ "reCAPTCHAV3WithScoreScoreThresholdDescription": "A reCAPTCHA v3 determined score between 0 and 1, above which form submissions are accepted. A higher value will catch more spam submissions, but also increase the risk of rejections of valid entries. For most sites, 0.5 is a sensible choice..",
+ "reCAPTCHAV3WithScoreScoreErrorMessageLabel": "Error message",
+ "reCAPTCHAV3WithScoreScoreErrorMessageDescription": "The error message to display when the user does not pass the reCAPTCHA check.",
+ "reCAPTCHAV3WithScoreScoreSaveScoreLabel": "Save score",
+ "reCAPTCHAV3WithScoreScoreSaveScoreDescription": "Save the calculated score with the form submission.",
+ "richTextName": "Rich text",
+ "richTextDescription": "Provide some some descriptive text with formatting.",
+ "richTextHtmlLabel": "Rich text",
+ "richTextHtmlDescription": "Enter your formatted text",
+ "titleAndDescriptionName": "Title and description",
+ "titleAndDescriptionDescription": "This is used to enter some descriptive text.",
+ "titleAndDescriptionCaptionLabel": "Headline",
+ "titleAndDescriptionCaptionDescription": "Enter a headline.",
+ "titleAndDescriptionBodyTextLabel": "Body Text",
+ "titleAndDescriptionBodyTextDescription": "Enter your copy text.",
+ "titleAndDescriptionCaptionTagLabel": "Headline tag",
+ "titleAndDescriptionCaptionTagDescription": "Select the HTML element to use when rendering the headline.",
+ "titleAndDescriptionShowLabelLabel": "Show Label",
+ "titleAndDescriptionShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
+ "longAnswerName": "Long answer",
+ "longAnswerDescription": "Renders a textarea, designed for longer answers.",
+ "longAnswerDefaultValueLabel": "Default Value",
+ "longAnswerDefaultValueDescription": "Enter a default value.",
+ "longAnswerPlaceholderLabel": "Placeholder",
+ "longAnswerPlaceholderDescription": "Enter a placeholder value.",
+ "longAnswerShowLabelLabel": "Show Label",
+ "longAnswerShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
+ "longAnswerAutocompleteAttributeLabel": "Autocomplete attribute",
+ "longAnswerAutocompleteAttributeDescription": "Optionally enter a value for the autocomplete attribute.",
+ "longAnswerNumberOfRowsLabel": "Number Of Rows",
+ "longAnswerNumberOfRowsDescription": "Enter the number of rows displayed for entry.",
+ "longAnswerMaximumLengthLabel": "Maximum Length",
+ "longAnswerMaximumLengthDescription": "Enter the maximum number of characters accepted.",
+ "shortAnswerName": "Short answer",
+ "shortAnswerDescription": "Renders an text input field, for short answers.",
+ "shortAnswerDefaultValueLabel": "Default Value",
+ "shortAnswerDefaultValueDescription": "Enter a default value.",
+ "shortAnswerPlaceholderLabel": "Placeholder",
+ "shortAnswerPlaceholderDescription": "Enter a placeholder value.",
+ "shortAnswerShowLabelLabel": "Show Label",
+ "shortAnswerShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
+ "shortAnswerMaximumLengthLabel": "Maximum Length",
+ "shortAnswerMaximumLengthDescription": "Enter the maximum number of characters accepted.",
+ "shortAnswerFieldTypeLabel": "Field Type",
+ "shortAnswerFieldTypeDescription": "Select the type of information expected.",
+ "shortAnswerAutocompleteAttributeLabel": "Autocomplete attribute",
+ "shortAnswerAutocompleteAttributeDescription": "Optionally enter a value for the autocomplete attribute."
+ },
+ "formProviderWorkflows": {
+ "changeRecordStateName": "Change Record State",
+ "changeRecordStateDescription": "Changes the state of the record being processed when it matches a word.",
+ "changeRecordStateWordsLabel": "Words",
+ "changeRecordStateWordsDescription": "Comma seperated list of words to match.",
+ "changeRecordStateActionLabel": "Action",
+ "changeRecordStateActionDescription": "What to do if it matches.",
+ "postAsXMLName": "Post as XML",
+ "postAsXMLDescription": "Posts the form as XML to a URL.",
+ "postAsXMLUrlLabel": "URL",
+ "postAsXMLUrlDescription": "Enter the URL to post to.",
+ "postAsXMLMethodLabel": "Method",
+ "postAsXMLMethodDescription": "POST or GET.",
+ "postAsXMLXsltFileLabel": "XSLT File",
+ "postAsXMLXsltFileDescription": "Transform the XML before posting it.",
+ "postAsXMLFieldsLabel": "Fields",
+ "postAsXMLFieldsDescription": "Map the needed fields.",
+ "postAsXMLUsernameLabel": "User",
+ "postAsXMLUsernameDescription": "(optional)",
+ "postAsXMLPasswordLabel": "Password",
+ "postAsXMLPasswordDescription": "(optional)",
+ "sendFormToURLName": "Send form to URL",
+ "sendFormToURLDescription": "Sends the form to a URL, either as a HTTP POST or GET.",
+ "sendFormToURLUrlLabel": "URL",
+ "sendFormToURLUrlDescription": "Enter the URL to post to.",
+ "sendFormToURLMethodLabel": "Method",
+ "sendFormToURLMethodDescription": "POST or GET.",
+ "sendFormToURLStandardFieldsLabel": "Standard Fields",
+ "sendFormToURLStandardFieldsDescription": "Map any standard form information to send.",
+ "sendFormToURLFieldsLabel": "Fields",
+ "sendFormToURLFieldsDescription": "Map the needed fields.",
+ "sendFormToURLUsernameLabel": "User",
+ "sendFormToURLUsernameDescription": "(optional)",
+ "sendFormToURLPasswordLabel": "Password",
+ "sendFormToURLPasswordDescription": "(optional)",
+ "saveAsAnXMLFileName": "Save as an XML file",
+ "saveAsAnXMLFileDescription": "Saves the result of the form as an XML file via XSLT.",
+ "saveAsAnXMLFilePathLabel": "Path",
+ "saveAsAnXMLFilePathDescription": "Path to place the file.",
+ "saveAsAnXMLFileExtensionLabel": "Extension",
+ "saveAsAnXMLFileExtensionDescription": "File extension.",
+ "saveAsAnXMLFileXsltFileLabel": "XSLT File",
+ "saveAsAnXMLFileXsltFileDescription": "Transform the XML before saving it.",
+ "saveAsUmbracoContentNodeName": "Save as Umbraco content node",
+ "saveAsUmbracoContentNodeDescription": "Saves the form values as an content node using a specified document type.",
+ "saveAsUmbracoContentNodeFieldsLabel": "Document Type",
+ "saveAsUmbracoContentNodeFieldsDescription": "Map document type.",
+ "saveAsUmbracoContentNodePublishLabel": "Publish",
+ "saveAsUmbracoContentNodePublishDescription": "Publish node instantly.",
+ "saveAsUmbracoContentNodeRootNodeLabel": "Save location",
+ "saveAsUmbracoContentNodeRootNodeDescription": "Choose the location for where to save the created content node.",
+ "sendEmailName": "Send email",
+ "sendEmailDescription": "Send the result of the form to an email address.",
+ "sendEmailEmailLabel": "Recipient Email",
+ "sendEmailEmailDescription": "Enter the recipient email address(es).",
+ "sendEmailCcEmailLabel": "CC Email",
+ "sendEmailCcEmailDescription": "Enter the CC email addresses (if required).",
+ "sendEmailBccEmailLabel": "BCC Email",
+ "sendEmailBccEmailDescription": "Enter the BCC email addresses (if required).",
+ "sendEmailSenderEmailLabel": "Sender Email",
+ "sendEmailSenderEmailDescription": "Enter the sender email (if blank it will use the settings from configuration).",
+ "sendEmailReplyToEmailLabel": "Reply To Email",
+ "sendEmailReplyToEmailDescription": "Enter the email address to be used as the reply-to address (if required).",
+ "sendEmailSubjectLabel": "Subject",
+ "sendEmailSubjectDescription": "Enter the subject.",
+ "sendEmailMessageLabel": "Message",
+ "sendEmailMessageDescription": "Enter the introductory message.",
+ "sendEmailAttachmentLabel": "Attachments",
+ "sendEmailAttachmentDescription": "Attach file uploads to email.",
+ "sendEmailWithTemplateRazorName": "Send email with template (Razor)",
+ "sendEmailWithTemplateRazorDescription": "Send the result of the form to an email address/addresses using a Razor .cshtml template.",
+ "sendEmailWithTemplateRazorEmailLabel": "Recipient Email",
+ "sendEmailWithTemplateRazorEmailDescription": "Enter the recipient email address(es).",
+ "sendEmailWithTemplateRazorCcEmailLabel": "CC Email",
+ "sendEmailWithTemplateRazorCcEmailDescription": "Enter the CC email addresses (if required).",
+ "sendEmailWithTemplateRazorBccEmailLabel": "BCC Email",
+ "sendEmailWithTemplateRazorBccEmailDescription": "Enter the BCC email addresses (if required).",
+ "sendEmailWithTemplateRazorSenderEmailLabel": "Sender Email",
+ "sendEmailWithTemplateRazorSenderEmailDescription": "Enter the sender email (if blank it will use the settings from configuration).",
+ "sendEmailWithTemplateRazorReplyToEmailLabel": "Reply To Email",
+ "sendEmailWithTemplateRazorReplyToEmailDescription": "Enter the email address to be used as the reply-to address (if required).",
+ "sendEmailWithTemplateRazorSubjectLabel": "Subject",
+ "sendEmailWithTemplateRazorSubjectDescription": "Enter the subject.",
+ "sendEmailWithTemplateRazorRazorViewFilePathLabel": "Email Template",
+ "sendEmailWithTemplateRazorRazorViewFilePathDescription": "The path to the Razor view that you want to use for generating the email. Email templates are stored at /Views/Partials/Forms/Emails.",
+ "sendEmailWithTemplateRazorHeaderHtmlLabel": "Header text",
+ "sendEmailWithTemplateRazorHeaderHtmlDescription": "Enter formatted text to be rendered in the email header.",
+ "sendEmailWithTemplateRazorFooterHtmlLabel": "Footer text",
+ "sendEmailWithTemplateRazorFooterHtmlDescription": "Enter formatted text to be rendered in the email footer.",
+ "sendEmailWithTemplateRazorAttachmentLabel": "Attachments",
+ "sendEmailWithTemplateRazorAttachmentDescription": "Attach file uploads to email.",
+ "sendXSLTTransformedEmailName": "Send XSLT transformed email",
+ "sendXSLTTransformedEmailDescription": "Send the result of the form to an email address.",
+ "sendXSLTTransformedEmailEmailLabel": "Recipient Email",
+ "sendXSLTTransformedEmailEmailDescription": "Enter the recipient email address(es).",
+ "sendXSLTTransformedEmailCcEmailLabel": "CC Email",
+ "sendXSLTTransformedEmailCcEmailDescription": "Enter the CC email addresses (if required).",
+ "sendXSLTTransformedEmailBccEmailLabel": "BCC Email",
+ "sendXSLTTransformedEmailBccEmailDescription": "Enter the BCC email addresses (if required).",
+ "sendXSLTTransformedEmailSenderEmailLabel": "Sender Email",
+ "sendXSLTTransformedEmailSenderEmailDescription": "Enter the sender email (if blank it will use the settings from configuration).",
+ "sendXSLTTransformedEmailReplyToEmailLabel": "Reply To Email",
+ "sendXSLTTransformedEmailReplyToEmailDescription": "Enter the email address to be used as the reply-to address (if required).",
+ "sendXSLTTransformedEmailSubjectLabel": "Subject",
+ "sendXSLTTransformedEmailSubjectDescription": "Enter the subject.",
+ "sendXSLTTransformedEmailXsltFileLabel": "XSLT File",
+ "sendXSLTTransformedEmailXsltFileDescription": "Transform the XML before sending the email.",
+ "slackLegacyName": "Slack (Legacy)",
+ "slackLegacyDescription": "Posts the form data to a specific channel on Slack using legacy tokens.",
+ "slackLegacyTokenLabel": "API Token",
+ "slackLegacyTokenDescription": "Slack API token.",
+ "slackLegacyChannelLabel": "Channel",
+ "slackLegacyChannelDescription": "Slack channel to post to.",
+ "slackLegacyUsernameLabel": "Username",
+ "slackLegacyUsernameDescription": "The username or bot to post as.",
+ "slackLegacyAvatarUrlLabel": "Avatar URL",
+ "slackLegacyAvatarUrlDescription": "The full URL (including http/https) to the avatar image.",
+ "slackName": "Slack",
+ "slackDescription": "Posts the form data to a specific channel on Slack using a webhook.",
+ "slackWebhookUrlLabel": "Webhook URL",
+ "slackWebhookUrlDescription": "Slack Webhook URL."
+ },
+ "formProviderDataSources": {
+ "sQLDatabaseName": "SQL Database",
+ "sQLDatabaseDescription": "Connects to any OLEDB supported database table and constructs a datasource from it.",
+ "sQLDatabaseConnectionLabel": "Connection String",
+ "sQLDatabaseConnectionDescription": "OleDB Compatible Connection string.",
+ "sQLDatabaseTableLabel": "Table Name",
+ "sQLDatabaseTableDescription": "Database table name."
+ },
+ "formProviderPrevalueSources": {
+ "dataSourceName": "DataSource",
+ "dataSourceDescription": "Stores prevalues in the prevalues table.",
+ "getValuesFromTextfileName": "Get values from textfile",
+ "getValuesFromTextfileDescription": "Upload textfile that contains the prevalues.",
+ "getValuesFromTextfileTextFileLabel": "Text File",
+ "getValuesFromTextfileTextFileDescription": "File containing the prevalues (separated by linebreaks).",
+ "umbracoDocumentsName": "Umbraco Documents",
+ "umbracoDocumentsDescription": "Uses nodes from a specific source as preValues.",
+ "umbracoDocumentsRootNodeLabel": "Root node",
+ "umbracoDocumentsRootNodeDescription": "Source to fetch nodes from.",
+ "umbracoDocumentsUseCurrentPageLabel": "Use current page as root",
+ "umbracoDocumentsUseCurrentPageDescription": "Does not work in preview mode.",
+ "umbracoDocumentsDocTypeLabel": "Document type",
+ "umbracoDocumentsDocTypeDescription": "The type of nodes you would like to use.",
+ "umbracoDocumentsValueFieldLabel": "Value field",
+ "umbracoDocumentsValueFieldDescription": "Select which field should be used for the value of the prevalue.",
+ "umbracoDocumentsListGrandChildrenLabel": "List all descendants",
+ "umbracoDocumentsListGrandChildrenDescription": "Don't limit to children but also include other levels.",
+ "umbracoDocumentsOrderByLabel": "Order by",
+ "umbracoDocumentsOrderByDescription": "Select how the prevalue list should be ordered.",
+ "sQLDatabaseName": "SQL Database",
+ "sQLDatabaseDescription": "Connects to a OLEDB compatible Database Table and constructs a prevalue source from it.",
+ "sQLDatabaseConnectionLabel": "Connection String",
+ "sQLDatabaseConnectionDescription": "OleDB compatible connection string.",
+ "sQLDatabaseConnectionStringLabel": "Connection String from configuration",
+ "sQLDatabaseConnectionStringDescription": "Choose connection string (needs to be OleDB compatible).",
+ "sQLDatabaseTableNameLabel": "Table Name",
+ "sQLDatabaseTableNameDescription": "",
+ "sQLDatabaseKeyColumnLabel": "Key Column",
+ "sQLDatabaseKeyColumnDescription": "Column containing the keys.",
+ "sQLDatabaseValueColumnLabel": "Value Column",
+ "sQLDatabaseValueColumnDescription": "Column containing the values.",
+ "sQLDatabaseCaptionColumnLabel": "Caption Column",
+ "sQLDatabaseCaptionColumnDescription": "Column containing the captions.",
+ "umbracoDataTypePreValueName": "Umbraco data type PreValues",
+ "umbracoDataTypePreValueDescription": "Connects to an Umbraco data type and uses its pre-value collection.",
+ "umbracoDataTypePreValuesDataTypeIdLabel": "Data Type",
+ "umbracoDataTypePreValuesDataTypeIdDescription": "Data type to use."
+ },
+ "formProviderExportTypes": {
+ "excelFileName": "Excel File (submitted values)",
+ "excelFileDescription": "Exports all submitted values for the form to Excel, in a format useful for integration with other systems.",
+ "excelFileDisplayValuesName": "Excel File (display values)",
+ "excelFileDisplayValuesDescription": "Exports all values for the form to Excel, in a format useful for reviewing the data or creating a report. Captions are used for prevalue data where available.",
+ "excelFileNameOsx": "Excel/Numbers File (submitted values)",
+ "excelFileDescriptionOsx": "Exports all submitted values for the form to Excel/Numbers, in a format useful for integration with other systems.",
+ "excelFileDisplayValuesNameOsx": "Excel/Numbers File (display values)",
+ "excelFileDisplayValuesDescriptionOsx": "Exports all values for the form to Excel/Numbers, in a format useful for reviewing the data or creating a report. Captions are used for prevalue data where available.",
+ "saveAllUploadedFilesInDiskStructureName": "Save All Uploaded Files (in disk structure)",
+ "saveAllUploadedFilesInDiskStructureDescription": "Exports all files uploading in form submissions to a zip archive, organized as the files are stored on disk.",
+ "saveAllUploadedFilesByEntryName": "Save All Uploaded Files (by entry)",
+ "saveAllUploadedFilesByEntryDescription": "Exports all files uploading in form submissions to a zip archive, organized in a sub-folder per entry."
+ },
+ "formRecordSetActions": {
+ "deleteConfirm": "Are you sure you want to delete these entries?"
}
}
From 671f726811aa0b93cca5f6079d034bb284d37287 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 13:53:22 +0200
Subject: [PATCH 052/122] use correct keys
---
.../user-profile-app-profile.element.ts | 20 +++++++++----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts
index 1692f0c9b2..bdfe434667 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts
@@ -18,10 +18,10 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement {
protected _labelYourProfile = 'Your profile';
@state()
- protected _labelEditProfile = 'Edit your profile';
+ protected _labelEditProfile = 'Edit';
@state()
- protected _labelChangePassword = 'Change your password';
+ protected _labelChangePassword = 'Change password';
private _modalContext?: UmbModalManagerContext;
private _auth?: typeof UMB_AUTH.TYPE;
@@ -39,13 +39,11 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement {
});
this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
- instance
- .localizeMany(['user_yourProfile', 'user_editProfileLabel', 'user_changePasswordLabel'])
- .subscribe((value) => {
- this._labelYourProfile = value[0];
- this._labelEditProfile = value[1];
- this._labelChangePassword = value[2];
- });
+ instance.localizeMany(['user_yourProfile', 'general_edit', 'general_changePassword']).subscribe((value) => {
+ this._labelYourProfile = value[0];
+ this._labelEditProfile = value[1];
+ this._labelChangePassword = value[2];
+ });
});
}
@@ -76,10 +74,10 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement {
return html`
- Edit profile
+ ${this._labelEditProfile}
- Change password
+ ${this._labelChangePassword}
`;
From ab5cde196c76dce32d5283b3e0f5573e0b8383c8 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 14:09:18 +0200
Subject: [PATCH 053/122] add story to localize
---
.../.storybook/preview.js | 7 ++++
.../localization/localize.element.stories.ts | 32 +++++++++++++++++++
2 files changed, 39 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
diff --git a/src/Umbraco.Web.UI.Client/.storybook/preview.js b/src/Umbraco.Web.UI.Client/.storybook/preview.js
index 0dbfac5f28..2df0d61be3 100644
--- a/src/Umbraco.Web.UI.Client/.storybook/preview.js
+++ b/src/Umbraco.Web.UI.Client/.storybook/preview.js
@@ -17,6 +17,7 @@ import { UmbDocumentTypeStore } from '../src/packages/documents/document-types/r
import { umbExtensionsRegistry } from '../src/packages/core/extension-registry';
import { UmbIconRegistry } from '../src/shared/icon-registry/icon.registry';
import { UmbLitElement } from '../src/shared/lit-element';
+import { UmbLocalizationContext, UMB_LOCALIZATION_CONTEXT } from '../src/libs/localization-api';
import customElementManifests from '../dist-cms/custom-elements.json';
import '../src/libs/context-api/provide/context-provider.element';
@@ -24,6 +25,7 @@ import '../src/libs/controller-api/controller-host-initializer.element.ts';
import '../src/packages/core/components';
import { manifests as documentManifests } from '../src/packages/documents';
+import { manifests as translationManifests } from '../src/packages/core/localization/manifests';
// MSW
startMockServiceWorker({ serviceWorker: { url: (import.meta.env.VITE_BASE_PATH ?? '/') + 'mockServiceWorker.js' } });
@@ -36,6 +38,11 @@ class UmbStoryBookElement extends UmbLitElement {
this._umbIconRegistry.attach(this);
this._registerExtensions(documentManifests);
this.provideContext(UMB_MODAL_CONTEXT_TOKEN, new UmbModalManagerContext(this));
+
+ this._registerExtensions(translationManifests);
+ const localizationContext = new UmbLocalizationContext(umbExtensionsRegistry);
+ localizationContext.setLanguage('en-US');
+ this.provideContext(UMB_LOCALIZATION_CONTEXT, localizationContext);
}
_registerExtensions(manifests) {
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
new file mode 100644
index 0000000000..5f245f9a70
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
@@ -0,0 +1,32 @@
+import { Meta, StoryObj } from '@storybook/web-components';
+import { html } from 'lit';
+import type { UmbLocalizeElement } from './localize.element.js';
+import './localize.element.js';
+
+const meta: Meta = {
+ title: 'Localization/Localize',
+ component: 'umb-localize',
+ args: {
+ key: 'general_ok',
+ },
+ decorators: [
+ (story) => {
+ return html`
+ Component output: ${story()}
+
`;
+ },
+ ],
+ parameters: {
+ docs: {
+ source: {
+ code: ` `,
+ },
+ },
+ },
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Overview: Story = {};
From cbf3528d2fa64c596e7126e5691334b3086028ea Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 14:12:20 +0200
Subject: [PATCH 054/122] keynotfound story
---
.../packages/core/localization/localize.element.stories.ts | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
index 5f245f9a70..867d0f5bfe 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
@@ -30,3 +30,10 @@ export default meta;
type Story = StoryObj;
export const Overview: Story = {};
+
+export const KeyNotFound: Story = {
+ args: {
+ key: 'general_ok_not_found',
+ debug: true,
+ },
+};
From 7a1fc3d612faa548d3def4c27379ecef6a908d18 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 14:36:00 +0200
Subject: [PATCH 055/122] add localization documentation
---
.../stories/extending/localization.mdx | 126 ++++++++++++++++++
1 file changed, 126 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
new file mode 100644
index 0000000000..e81cf0a42b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
@@ -0,0 +1,126 @@
+import { Canvas, Meta } from '@storybook/addon-docs';
+
+import * as LocalizeStories from '../../../src/packages/core/localization/localize.element.stories';
+
+
+
+# Localization
+
+Localization is the process of adapting an application to a specific language, culture, or region. Localization
+requires that you provide translated text for the user interface and localized data for the application to consume.
+
+## Registering a language
+
+To register a language, you need to add a new manifest to the Extension API.
+
+The manifest can be added through the `umbraco-package.json` file like this:
+
+```json
+{
+ "name": "MyPackage",
+ "extensions": [
+ {
+ "type": "translations",
+ "alias": "MyPackage.Lang.EnUS",
+ "name": "English (United States)",
+ "meta": {
+ "culture": "en_us"
+ },
+ "js": "/App_Plugins/MyPackage/lang/en_us.json"
+ }
+ ]
+}
+```
+
+If you do not have many translations, you can also choose to include them directly in the meta object like so:
+
+```json
+"meta": {
+ "culture": "en_us",
+ "translations": {
+ "section": {
+ "key1": "value1",
+ "key2": "value2"
+ }
+ }
+}
+```
+
+### Layout of the language file
+
+The language file is a simple JSON file with a key-value structure organised in sections.
+
+```json
+{
+ "section": {
+ "key1": "value1",
+ "key2": "value2"
+ }
+}
+```
+
+The sections and keys will be formatted into a map in Umbraco
+with the format `section_key1` and `section_key2` which forms the unique key
+of which they are requested by.
+
+## Using the translations
+
+### umb-localize
+
+The `umb-localize` component is used to translate text in the UI. It is used like this:
+
+
+
+### UmbLocalizationContext
+
+The `UmbLocalizationContext` is used to translate text in the UI. It is used like this:
+
+```ts
+this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
+ // Localize one key
+ instance.localize('general_close').subscribe((value) => {
+ console.log(value); // should display "Close" in the console
+ });
+
+ // Localize many keys
+ instance.localizeMany(['general_close', 'general_cancel']).subscribe((values) => {
+ console.log(values); // should display ["Close", "Cancel"] in the console
+ });
+});
+```
+
+The values can then be assigned to a stateful property in the component and rendered to the user.
+
+### Fallback
+
+If a key is not found in the current language, the fallback language will be used. The fallback language is **English (United States)**.
+
+## Localization in Umbraco
+
+Out of the box, Umbraco ships with the following languages denoted by their ISO codes:
+
+- `bs-BS` - Bosnian (Bosnia and Herzegovina)
+- `cs-CZ` - Czech (Czech Republic)
+- `cy-GB` - Welsh (United Kingdom)
+- `da-DK` - Danish (Denmark)
+- `de-DE` - German (Germany)
+- `en-GB` - English (United Kingdom)
+- `en-US` - **English (United States)** (fallback language)
+- `es-ES` - Spanish (Spain)
+- `fr-FR` - French (France)
+- `he-IL` - Hebrew (Israel)
+- `hr-HR` - Croatian (Croatia)
+- `it-IT` - Italian (Italy)
+- `ja-JP` - Japanese (Japan)
+- `ko-KR` - Korean (Korea)
+- `nb-NO` - Norwegian Bokmål (Norway)
+- `nl-NL` - Dutch (Netherlands)
+- `pl-PL` - Polish (Poland)
+- `pt-BR` - Portuguese (Brazil)
+- `ro-RO` - Romanian (Romania)
+- `ru-RU` - Russian (Russia)
+- `sv-SE` - Swedish (Sweden)
+- `tr-TR` - Turkish (Turkey)
+- `ua-UA` - Ukrainian (Ukraine)
+- `zh-CN` - Chinese (China)
+- `zh-TW` - Chinese (Taiwan)
From a91d45431784365a41b103f5ec7aa4db3097208c Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 14:42:26 +0200
Subject: [PATCH 056/122] add docs and fallback language
---
.../src/libs/localization-api/localization.context.ts | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
index 6dd4c978fe..b77889ffcc 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
@@ -14,8 +14,15 @@ export class UmbLocalizationContext {
return this.#translationRegistry.translations;
}
- setLanguage(languageIsoCode: string) {
- this.#translationRegistry.register(languageIsoCode);
+ /**
+ * Set a new language which will query the manifests for translations and register them.
+ * Eventually it will update all codes visible on the screen.
+ *
+ * @param languageIsoCode The language to use (example: 'en_us')
+ * @param fallbackLanguageIsoCode The fallback language to use (example: 'en_us', default: 'en_us')
+ */
+ setLanguage(languageIsoCode: string, fallbackLanguageIsoCode?: string) {
+ this.#translationRegistry.register(languageIsoCode, fallbackLanguageIsoCode);
}
/**
From 17fc66a4fa4d1fbbe431bcca992feafd5e36dd42 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 14:42:33 +0200
Subject: [PATCH 057/122] register fallback language
---
.../libs/localization-api/localization.context.test.ts | 10 +++++-----
.../core/localization/localize.element.test.ts | 10 ++--------
2 files changed, 7 insertions(+), 13 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
index f3de0e463d..efc13fbca7 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
@@ -58,7 +58,7 @@ describe('Localization', () => {
registry = new UmbTranslationRegistry(extensionRegistry);
extensionRegistry.register(english);
extensionRegistry.register(danish);
- registry.register(english.meta.culture);
+ registry.register(english.meta.culture, english.meta.culture);
});
describe('UmbTranslationRegistry', () => {
@@ -75,7 +75,7 @@ describe('Localization', () => {
beforeEach(async () => {
context = new UmbLocalizationContext(extensionRegistry);
- context.setLanguage(english.meta.culture);
+ context.setLanguage(english.meta.culture, english.meta.culture);
});
describe('localize', () => {
@@ -108,7 +108,7 @@ describe('Localization', () => {
const value = await firstValueFrom(context.localize('general_close'));
expect(value).to.equal('Close');
- context.setLanguage(danish.meta.culture);
+ context.setLanguage(danish.meta.culture, english.meta.culture);
await aTimeout(0);
@@ -120,7 +120,7 @@ describe('Localization', () => {
const value = await firstValueFrom(context.localize('general_logout'));
expect(value).to.equal('Log out');
- context.setLanguage(danish.meta.culture);
+ context.setLanguage(danish.meta.culture, english.meta.culture);
await aTimeout(0);
@@ -159,7 +159,7 @@ describe('Localization', () => {
expect(values[0]).to.equal('Close');
expect(values[1]).to.equal('Log out');
- context.setLanguage(danish.meta.culture);
+ context.setLanguage(danish.meta.culture, english.meta.culture);
await aTimeout(0);
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
index 41522e66ca..81591ae206 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
@@ -1,10 +1,6 @@
import { aTimeout, elementUpdated, expect, fixture, html } from '@open-wc/testing';
import { UmbLocalizeElement } from './localize.element.js';
-import {
- UMB_LOCALIZATION_CONTEXT,
- UmbLocalizationContext,
- UmbTranslationRegistry,
-} from '@umbraco-cms/backoffice/localization-api';
+import { UMB_LOCALIZATION_CONTEXT, UmbLocalizationContext } from '@umbraco-cms/backoffice/localization-api';
import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api';
import '@umbraco-cms/backoffice/context-api';
@@ -58,10 +54,8 @@ describe('umb-localize', () => {
extensionRegistry = new UmbExtensionRegistry();
extensionRegistry.register(english);
extensionRegistry.register(danish);
- const registry = new UmbTranslationRegistry(extensionRegistry);
- registry.register(english.meta.culture);
context = new UmbLocalizationContext(extensionRegistry);
- context.setLanguage(english.meta.culture);
+ context.setLanguage(english.meta.culture, english.meta.culture);
hostElement = await fixture(
html`
From 1878078cd5a31720e399a81faa1b3f6eacfb17d6 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 15:12:42 +0200
Subject: [PATCH 058/122] convert language to es module
---
.../src/assets/lang/{en_us.json => en_us.js} | 2 +-
.../src/packages/core/localization/manifests.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
rename src/Umbraco.Web.UI.Client/src/assets/lang/{en_us.json => en_us.js} (99%)
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en_us.json b/src/Umbraco.Web.UI.Client/src/assets/lang/en_us.js
similarity index 99%
rename from src/Umbraco.Web.UI.Client/src/assets/lang/en_us.json
rename to src/Umbraco.Web.UI.Client/src/assets/lang/en_us.js
index f07e205ca2..a68c44992e 100644
--- a/src/Umbraco.Web.UI.Client/src/assets/lang/en_us.json
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en_us.js
@@ -1,4 +1,4 @@
-{
+export default {
"actions": {
"assigndomain": "Culture and Hostnames",
"auditTrail": "Audit Trail",
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
index 98e41b0d7d..3d08fdad0f 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
@@ -10,7 +10,7 @@ const translationManifests: Array = [
meta: {
culture: 'en_us',
},
- loader: () => import('../../../assets/lang/en_us.json'),
+ loader: () => import('../../../assets/lang/en_us.js')
},
];
From 5345cfbe486821115dc3b3c6859da73d426e597f Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 15:13:46 +0200
Subject: [PATCH 059/122] update docs
---
.../storybook/stories/extending/localization.mdx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
index e81cf0a42b..08efcdbc14 100644
--- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
+++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
@@ -26,7 +26,7 @@ The manifest can be added through the `umbraco-package.json` file like this:
"meta": {
"culture": "en_us"
},
- "js": "/App_Plugins/MyPackage/lang/en_us.json"
+ "js": "/App_Plugins/MyPackage/lang/en_us.js"
}
]
}
@@ -48,10 +48,10 @@ If you do not have many translations, you can also choose to include them direct
### Layout of the language file
-The language file is a simple JSON file with a key-value structure organised in sections.
+The language file is a simple JS module with a default export containing a key-value structure organised in sections.
```json
-{
+export default {
"section": {
"key1": "value1",
"key2": "value2"
From c680a30c45422b788dfc21406ec82eee4a585a1b Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 15:44:06 +0200
Subject: [PATCH 060/122] use dash (-) instead of underscore (_) for backward
compatibility
---
.../src/apps/backoffice/backoffice.element.ts | 2 +-
.../src/assets/lang/{en_us.js => en-us.js} | 0
.../src/libs/localization-api/localization.context.ts | 4 ++--
.../libs/localization-api/registry/translation.registry.ts | 2 +-
.../src/packages/core/localization/manifests.ts | 6 +++---
.../storybook/stories/extending/localization.mdx | 6 +++---
6 files changed, 10 insertions(+), 10 deletions(-)
rename src/Umbraco.Web.UI.Client/src/assets/lang/{en_us.js => en-us.js} (100%)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index 34ef2a4608..1c0a66f1b0 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -46,7 +46,7 @@ export class UmbBackofficeElement extends UmbLitElement {
this.consumeContext(UMB_AUTH, (auth) => {
this.observe(auth.currentUser, (user) => {
if (user) {
- const languageIsoCode = user.languageIsoCode ?? 'en_us';
+ const languageIsoCode = user.languageIsoCode ?? 'en-us';
localizationContext.setLanguage(languageIsoCode);
}
});
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en_us.js b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.js
similarity index 100%
rename from src/Umbraco.Web.UI.Client/src/assets/lang/en_us.js
rename to src/Umbraco.Web.UI.Client/src/assets/lang/en-us.js
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
index b77889ffcc..cc6c54fb9f 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
@@ -18,8 +18,8 @@ export class UmbLocalizationContext {
* Set a new language which will query the manifests for translations and register them.
* Eventually it will update all codes visible on the screen.
*
- * @param languageIsoCode The language to use (example: 'en_us')
- * @param fallbackLanguageIsoCode The fallback language to use (example: 'en_us', default: 'en_us')
+ * @param languageIsoCode The language to use (example: 'en-us')
+ * @param fallbackLanguageIsoCode The fallback language to use (example: 'en-us', default: 'en-us')
*/
setLanguage(languageIsoCode: string, fallbackLanguageIsoCode?: string) {
this.#translationRegistry.register(languageIsoCode, fallbackLanguageIsoCode);
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 3c7a866f6e..0b82ca0a0a 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -18,7 +18,7 @@ export class UmbTranslationRegistry {
return this.#innerDictionary.asObservable();
}
- register(userCulture: string, fallbackCulture = 'en_us') {
+ register(userCulture: string, fallbackCulture = 'en-us') {
userCulture = userCulture.toLowerCase();
fallbackCulture = fallbackCulture.toLowerCase();
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
index 3d08fdad0f..a41650b2cc 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
@@ -6,11 +6,11 @@ const translationManifests: Array = [
type: 'translations',
alias: 'Umb.Translations.En_US',
weight: -100,
- name: 'English (UK)',
+ name: 'English (US)',
meta: {
- culture: 'en_us',
+ culture: 'en-us',
},
- loader: () => import('../../../assets/lang/en_us.js')
+ loader: () => import('../../../assets/lang/en-us.js'),
},
];
diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
index 08efcdbc14..250bedb902 100644
--- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
+++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
@@ -24,9 +24,9 @@ The manifest can be added through the `umbraco-package.json` file like this:
"alias": "MyPackage.Lang.EnUS",
"name": "English (United States)",
"meta": {
- "culture": "en_us"
+ "culture": "en-us"
},
- "js": "/App_Plugins/MyPackage/lang/en_us.js"
+ "js": "/App_Plugins/MyPackage/lang/en-us.js"
}
]
}
@@ -36,7 +36,7 @@ If you do not have many translations, you can also choose to include them direct
```json
"meta": {
- "culture": "en_us",
+ "culture": "en-us",
"translations": {
"section": {
"key1": "value1",
From f5a5707bb3f90b3194c9c117d5f227cb73ae6961 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 15:44:59 +0200
Subject: [PATCH 061/122] add crude language selector to user workspace
---
.../user-workspace-editor.element.ts | 45 ++++++++++++++++---
1 file changed, 40 insertions(+), 5 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
index 2a378b5d35..138f56decc 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
@@ -14,6 +14,7 @@ import {
ifDefined,
repeat,
} from '@umbraco-cms/backoffice/external/lit';
+import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs';
import { UMB_CHANGE_PASSWORD_MODAL } from '@umbraco-cms/backoffice/modal';
import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal';
@@ -34,9 +35,11 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement {
@state()
private _user?: UmbUserDetail;
+ @state()
+ private languages: Array<{ name: string; value: string; selected: boolean }> = [];
+
#auth?: typeof UMB_AUTH.TYPE;
#modalContext?: UmbModalManagerContext;
- #languages = []; //TODO Add languages
#workspaceContext?: UmbUserWorkspaceContext;
#userRepository?: UmbUserRepository;
@@ -78,7 +81,39 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement {
#observeCurrentUser() {
if (!this.#auth) return;
- this.observe(this.#auth.currentUser, (currentUser) => (this._currentUser = currentUser));
+ this.observe(this.#auth.currentUser, async (currentUser) => {
+ this._currentUser = currentUser;
+
+ if (!currentUser) {
+ return;
+ }
+
+ // Find all translations and make a unique list of iso codes
+ const translations = await firstValueFrom(umbExtensionsRegistry.extensionsOfType('translations'));
+
+ this.languages = translations
+ .filter((isoCode) => isoCode !== undefined)
+ .map((translation) => ({
+ value: translation.meta.culture.toLowerCase(),
+ name: translation.name,
+ selected: false,
+ }));
+
+ const currentUserLanguageCode = currentUser.languageIsoCode?.toLowerCase();
+
+ // Set the current user's language as selected
+ const currentUserLanguage = this.languages.find((language) => language.value === currentUserLanguageCode);
+
+ if (currentUserLanguage) {
+ currentUserLanguage.selected = true;
+ } else {
+ this.languages.push({
+ value: currentUserLanguageCode ?? 'en-us',
+ name: currentUserLanguageCode ? `${currentUserLanguageCode} (unknown)` : 'Unknown',
+ selected: true,
+ });
+ }
+ });
}
#onUserStatusChange() {
@@ -152,10 +187,10 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement {
return html`
Profile
-
+
-
+
@@ -172,7 +207,7 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement {
label="Content start node"
description="Limit the content tree to specific start nodes">
this.#workspaceContext?.updateProperty('contentStartNodeIds', e.target.value)}
slot="editor">
From 0505bb58f88962d5d2225adc02a408231efd641f Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 16:29:41 +0200
Subject: [PATCH 062/122] make current language observable as a part
---
src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.ts | 3 +--
src/Umbraco.Web.UI.Client/src/shared/auth/auth.interface.ts | 5 +++++
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.ts
index f6ffa51e6d..b9c00be403 100644
--- a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.context.ts
@@ -11,6 +11,7 @@ export class UmbAuthContext implements IUmbAuth {
#currentUser = new UmbObjectState(undefined);
readonly currentUser = this.#currentUser.asObservable();
readonly isLoggedIn = new ReplaySubject(1);
+ readonly languageIsoCode = this.#currentUser.asObservablePart((user) => user?.languageIsoCode ?? 'en-us');
#host;
#authFlow;
@@ -33,8 +34,6 @@ export class UmbAuthContext implements IUmbAuth {
async fetchCurrentUser(): Promise {
const { data } = await tryExecuteAndNotify(this.#host, UserResource.getUserCurrent());
- if (!data) return;
-
this.#currentUser.next(data);
return data;
diff --git a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.interface.ts b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.interface.ts
index 284388fe41..b70031f8d7 100644
--- a/src/Umbraco.Web.UI.Client/src/shared/auth/auth.interface.ts
+++ b/src/Umbraco.Web.UI.Client/src/shared/auth/auth.interface.ts
@@ -23,6 +23,11 @@ export interface IUmbAuth {
*/
get currentUser(): Observable;
+ /**
+ * Get the current user's language ISO code.
+ */
+ languageIsoCode: Observable;
+
/**
* Make a server request for the current user and save the state
*/
From caa1cb073a74e481f82c759308373ab44b1503e2 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 16:29:56 +0200
Subject: [PATCH 063/122] observe only on the changed language iso
---
.../src/apps/backoffice/backoffice.element.ts | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index 1c0a66f1b0..8b908773fd 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -44,12 +44,13 @@ export class UmbBackofficeElement extends UmbLitElement {
this.provideContext(UMB_LOCALIZATION_CONTEXT, localizationContext);
this.consumeContext(UMB_AUTH, (auth) => {
- this.observe(auth.currentUser, (user) => {
- if (user) {
- const languageIsoCode = user.languageIsoCode ?? 'en-us';
- localizationContext.setLanguage(languageIsoCode);
- }
- });
+ this.observe(
+ auth.languageIsoCode,
+ (currentLanguageIsoCode) => {
+ localizationContext.setLanguage(currentLanguageIsoCode);
+ },
+ 'languageIsoCode'
+ );
});
}
From 6b4edb902ed9e46633a62a7ad9fcfe27fd154789 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 16:30:04 +0200
Subject: [PATCH 064/122] add danish as a language
---
.../src/assets/lang/da-dk.js | 3031 +++++++++++++++++
.../packages/core/localization/manifests.ts | 10 +
2 files changed, 3041 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js
new file mode 100644
index 0000000000..b109ce453a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js
@@ -0,0 +1,3031 @@
+export default {
+ "actions": {
+ "assigndomain": "Tilføj domæne",
+ "auditTrail": "Revisionsspor",
+ "browse": "Gennemse elementer",
+ "changeDocType": "Skift Dokument Type",
+ "changeDataType": "Skift Input Type",
+ "copy": "Kopier",
+ "create": "Opret",
+ "export": "Eksportér",
+ "createPackage": "Opret pakke",
+ "createGroup": "Opret gruppe",
+ "delete": "Slet",
+ "disable": "Deaktivér",
+ "editSettings": "Edit settings",
+ "emptyrecyclebin": "Tøm papirkurv",
+ "enable": "Aktivér",
+ "exportDocumentType": "Eksportér dokumenttype",
+ "importdocumenttype": "Importér dokumenttype",
+ "importPackage": "Importér pakke",
+ "liveEdit": "Redigér i Canvas",
+ "logout": "Log af",
+ "move": "Flyt",
+ "notify": "Notificeringer",
+ "protect": "Offentlig adgang",
+ "publish": "Udgiv",
+ "unpublish": "Afpublicér",
+ "refreshNode": "Genindlæs elementer",
+ "remove": "Fjern",
+ "republish": "Genudgiv hele sitet",
+ "rename": "Omdøb",
+ "restore": "Gendan",
+ "chooseWhereToCopy": "Vælg hvor du vil kopiere",
+ "chooseWhereToMove": "Vælg hvortil du vil flytte",
+ "infiniteEditorChooseWhereToMove": "Vælg hvor du vil flytte de valgte elementer hen",
+ "toInTheTreeStructureBelow": "til i træstrukturen nedenfor",
+ "infiniteEditorChooseWhereToCopy": "Vælg hvor du vil kopiere de valgte elementer til",
+ "wasMovedTo": "blev flyttet til",
+ "wasCopiedTo": "blev kopieret til",
+ "wasDeleted": "blev slettet",
+ "rights": "Rettigheder",
+ "rollback": "Fortryd ændringer",
+ "sendtopublish": "Send til udgivelse",
+ "sendToTranslate": "Send til oversættelse",
+ "setGroup": "Sæt gruppe",
+ "sort": "Sortér",
+ "translate": "Oversæt",
+ "update": "Opdatér",
+ "setPermissions": "Sæt rettigheder",
+ "unlock": "LÃ¥s op",
+ "createblueprint": "Opret indholdsskabelon",
+ "resendInvite": "Gensend Invitation",
+ "defaultValue": "Standard værdi",
+ "deployQueueForTransfer": "Sæt i kø for overførsel",
+ "deployRestore": "Genskab alt",
+ "deployPartialRestore": "Udvalgt gendanelse",
+ "deployTransferNow": "Overfør nu",
+ "editContent": "Edit content",
+ "chooseWhereToImport": "Choose where to import",
+ "deployTreeRestore": "Tree restore",
+ "deployCompare": "Compare"
+ },
+ "actionCategories": {
+ "content": "Indhold",
+ "administration": "Administration",
+ "structure": "Struktur",
+ "other": "Andet"
+ },
+ "actionDescriptions": {
+ "assignDomain": "Tillad adgang til at tildele sprog og domæner",
+ "auditTrail": "Tillad adgang for at få vist en nodes historik",
+ "browse": "Tillad adgang for at få vist en node",
+ "changeDocType": "Tillad adgang til at ændre dokumenttype for en node",
+ "copy": "Tillad adgang til at kopiere en node",
+ "create": "Tillad adgang til at oprette noder",
+ "delete": "Tillad adgang til at slette noder",
+ "move": "Tillad adgang til at flytte en node",
+ "protect": "Tillad adgang til at indstille og ændre offentlig adgang til en node",
+ "publish": "Tillad adgang til at udgive en node",
+ "unpublish": "Tillad adgang til at afpublicere en node",
+ "rights": "Tillad adgang til at ændre rettigheder for en node",
+ "rollback": "Tillad adgang til at returnere en node til en tidligere tilstand",
+ "sendtopublish": "Tillad adgang til at sende en node til godkendelse før den udgives",
+ "sendToTranslate": "Tillad adgang til at sende en node til oversættelse",
+ "sort": "Tillad adgang til at ændre sorteringsrækkefølge for noder",
+ "translate": "Tillad adgang til at oversætte en node",
+ "update": "Tillad adgang til at gemme en node",
+ "createblueprint": "Tillad adgang til at oprette en indholdsskabelon",
+ "notify": "Tillad adgang til at oprette notificeringer for noder",
+ "deployQueueForTransfer": "Tillad brugeren at sætte i overførselskøen",
+ "deployRestore": "Tillad brugeren at genskabe sider",
+ "deployPartialRestore": "Tillad brugeren at genskabe udvalgte sider",
+ "deployTreeRestore": "Allow the user to restore items for a tree",
+ "deployCompare": "Allow the user to compare items between workspaces"
+ },
+ "apps": {
+ "umbContent": "Indhold",
+ "umbInfo": "Info"
+ },
+ "assignDomain": {
+ "permissionDenied": "Tilladelse nægtet.",
+ "addNew": "Tilføj nyt domæne",
+ "remove": "fjern",
+ "invalidNode": "Ugyldig node.",
+ "invalidDomain": "Et eller flere domæner har et ugyldigt format.",
+ "duplicateDomain": "Domæne er allerede blevet tildelt.",
+ "language": "Sprog",
+ "domain": "Domæne",
+ "domainCreated": "Domænet '%0%' er nu oprettet og tilknyttet siden",
+ "domainDeleted": "Domænet '%0%' er nu slettet",
+ "domainExists": "Domænet '%0%' er oprettet",
+ "domainUpdated": "Domænet '%0%' er nu opdateret",
+ "orEdit": "eller rediger nuværende domæner",
+ "domainHelpWithVariants": "Gyldige domænenavne er: \"example.com\", \"www.example.com\", \"example.com:8080\" eller \"https://www.example.com/\".\n Yderlgiere understøttes også første niveau af stien efter domænet, f.eks. \"Example.com/en\" eller \"/en\". ",
+ "inherit": "Nedarv",
+ "setLanguage": "Sprog",
+ "setLanguageHelp": "Indstil sproget for noder under den aktuelle node, eller nedarv sprog fra forældre noder. Gælder også \n for den aktuelle node, medmindre et domæne nedenfor også indstiller et sprog.",
+ "setDomains": "Domæner",
+ "addCurrent": "Add current domain"
+ },
+ "buttons": {
+ "clearSelection": "Ryd valg",
+ "select": "Vælg",
+ "somethingElse": "Gør noget andet",
+ "bold": "Fed",
+ "deindent": "Fortryd indryk afsnit",
+ "formFieldInsert": "Indsæt formularfelt",
+ "graphicHeadline": "Indsæt grafisk overskrift",
+ "htmlEdit": "Redigér Html",
+ "indent": "Indryk afsnit",
+ "italic": "Kursiv",
+ "justifyCenter": "Centrér",
+ "justifyLeft": "Venstrestil afsnit",
+ "justifyRight": "Højrestil afsnit",
+ "linkInsert": "Indsæt link",
+ "linkLocal": "Indsæt lokalt link (anker)",
+ "listBullet": "Punktopstilling",
+ "listNumeric": "Nummerorden",
+ "macroInsert": "Indsæt makro",
+ "pictureInsert": "Indsæt billede",
+ "publishAndClose": "Udgiv og luk",
+ "publishDescendants": "Udgiv med undersider",
+ "relations": "Redigér relationer",
+ "returnToList": "Tilbage til listen",
+ "save": "Gem",
+ "saveAndClose": "Gem og luk",
+ "saveAndPublish": "Gem og udgiv",
+ "saveToPublish": "Gem og send til udgivelse",
+ "saveListView": "Gem listevisning",
+ "schedulePublish": "Planlæg",
+ "saveAndPreview": "Forhåndsvisning",
+ "showPageDisabled": "Forhåndsvisning er deaktiveret fordi der ikke er nogen skabelon tildelt",
+ "styleChoose": "Vælg formattering",
+ "styleShow": "Vis koder",
+ "tableInsert": "Indsæt tabel",
+ "generateModelsAndClose": "Generer modeller og luk",
+ "saveAndGenerateModels": "Gem og generer modeller",
+ "undo": "Fortryd",
+ "redo": "Genskab",
+ "deleteTag": "Slet tag",
+ "confirmActionCancel": "Fortryd",
+ "confirmActionConfirm": "Bekræft",
+ "morePublishingOptions": "Flere publiseringsmuligheder",
+ "submitChanges": "Indsæt"
+ },
+ "auditTrails": {
+ "atViewingFor": "For",
+ "delete": "Brugeren har slettet indholdet",
+ "unpublish": "Brugeren har afpubliceret indholdet",
+ "unpublishvariant": "Brugeren har afpubliceret indholdet for sprogene: %0%",
+ "publish": "Brugeren har gemt og udgivet indholdet",
+ "publishvariant": "Brugeren har gemt og udgivet indholdet for sprogene: %0%",
+ "save": "Brugeren har gemt indholdet",
+ "savevariant": "Brugeren har gemt indholdet for sprogene: %0%",
+ "move": "Brugeren har flyttet indholdet",
+ "copy": "Brugeren har kopieret indholdet",
+ "rollback": "Brugeren har tilbagerullet indholdet til en tidligere tilstand",
+ "sendtopublish": "Brugeren har sendt indholdet til udgivelse",
+ "sendtopublishvariant": "Brugeren har sendt indholdet til udgivelse for sprogene: %0%",
+ "sendtotranslate": "Brugeren har sendt indholdet til oversættelse",
+ "sort": "Brugeren har sorteret de underliggende sider",
+ "custom": "%0%",
+ "smallCopy": "Kopieret",
+ "smallPublish": "Udgivet",
+ "smallPublishVariant": "Udgivet",
+ "smallMove": "Flyttet",
+ "smallSave": "Gemt",
+ "smallSaveVariant": "Gemt",
+ "smallDelete": "Slettet",
+ "smallUnpublish": "Afpubliceret",
+ "smallUnpublishVariant": "Afpubliceret",
+ "smallRollBack": "Indhold tilbagerullet",
+ "smallSendToPublish": "Sendt til udgivelse",
+ "smallSendToPublishVariant": "Sendt til udgivelse",
+ "smallSendToTranslate": "Sendt til oversættelse",
+ "smallSort": "Sorteret",
+ "smallCustom": "Brugerdefineret",
+ "historyIncludingVariants": "Historik (alle sprog)",
+ "contentversionpreventcleanup": "Cleanup disabled for version: %0%",
+ "contentversionenablecleanup": "Cleanup enabled for version: %0%",
+ "smallContentVersionPreventCleanup": "Save",
+ "smallContentVersionEnableCleanup": "Save"
+ },
+ "codefile": {
+ "createFolderIllegalChars": "Mappens navn må ikke indeholde ugyldige tegn.",
+ "deleteItemFailed": "Sletning af filen/mappen fejlede: %0%"
+ },
+ "content": {
+ "isPublished": "Udgivet",
+ "about": "Om siden",
+ "alias": "Alias",
+ "alternativeTextHelp": "(hvordan ville du f.eks. beskrive billedet via telefonen?)",
+ "alternativeUrls": "Alternative links",
+ "clickToEdit": "Klik for at redigere dette punkt",
+ "createBy": "Oprettet af",
+ "createByDesc": "Oprindelig forfatter",
+ "updatedBy": "Opdateret af",
+ "createDate": "Oprettet den",
+ "createDateDesc": "Tidspunkt for oprettelse",
+ "documentType": "Dokumenttype",
+ "editing": "Redigerer",
+ "expireDate": "Nedtagningsdato",
+ "itemChanged": "Dette punkt er ændret siden udgivelsen",
+ "itemNotPublished": "Dette punkt er endnu ikke udgivet",
+ "lastPublished": "Sidst udgivet",
+ "noItemsToShow": "Der er ingen elementer at vise",
+ "listViewNoItems": "Der er ingen elementer at vise på listen.",
+ "listViewNoContent": "Intet indhold er blevet tilføjet",
+ "listViewNoMembers": "Ingen medlemmer er blevet tilføjet",
+ "mediatype": "Medietype",
+ "mediaLinks": "Link til medie(r)",
+ "membergroup": "Medlemsgruppe",
+ "memberrole": "Rolle",
+ "membertype": "Medlemstype",
+ "noChanges": "Der er endnu ikke lavet nogle ændringer.",
+ "noDate": "Ingen dato valgt",
+ "nodeName": "Sidetitel",
+ "noMediaLink": "Dette medie har ikke noget link",
+ "noProperties": "Intet indhold kan tilføjes for dette element",
+ "otherElements": "Egenskaber",
+ "parentNotPublished": "Dette dokument er udgivet, men ikke synligt da den overliggende side '%0%' ikke er\n udgivet!\n ",
+ "parentCultureNotPublished": "Dette sprog er udgivet, men ikke synligt, da den overliggende side '%0%' ikke\n er udgivet!\n ",
+ "parentNotPublishedAnomaly": "Ups: dette dokument er udgivet, men er ikke i cachen (intern fejl)",
+ "getUrlException": "Kunne ikke hente URL'en",
+ "routeError": "Dette dokument er udgivet, men dets URL ville kollidere med indholdet %0%",
+ "routeErrorCannotRoute": "Dette dokument er udgivet, men dets URL kan ikke dirigeres",
+ "publish": "Udgiv",
+ "published": "Udgivet",
+ "publishedPendingChanges": "Udgivet (Ventede ændringer)",
+ "publishStatus": "Udgivelsesstatus",
+ "publishDescendantsHelp": "Klik Udgiv med undersider for at udgive %0% og alle sider under og dermed gøre deres indhold offentligt tilgængelige.",
+ "publishDescendantsWithVariantsHelp": "Klik Udgiv med undersider for at udgive de valgte sprog og de samme sprog for sider under og dermed gøre deres indhold offentligt tilgængelige.",
+ "releaseDate": "Udgivelsesdato",
+ "unpublishDate": "Afpubliceringsdato",
+ "removeDate": "Fjern dato",
+ "setDate": "Vælg dato",
+ "sortDone": "Sorteringsrækkefølgen er opdateret",
+ "sortHelp": "For at sortere, træk siderne eller klik på en af kolonnehovederne. Du kan vælge flere sider\n ved at holde \"shift\" eller \"control\" nede mens du vælger.\n ",
+ "statistics": "Statistik",
+ "titleOptional": "Titel (valgfri)",
+ "altTextOptional": "Alternativ tekst (valgfri)",
+ "captionTextOptional": "Overskrift (valgfri)",
+ "type": "Type",
+ "variantsToPublish": "Hvilke varianter vil du udgive?",
+ "variantsToSave": "Vælg hvilke varianter, der skal gemmes.",
+ "unpublish": "Afpublicér",
+ "unpublished": "Afpubliceret",
+ "notCreated": "Ikke oprettet",
+ "updateDate": "Sidst redigeret",
+ "updateDateDesc": "Tidspunkt for seneste redigering",
+ "uploadClear": "Fjern fil",
+ "uploadClearImageContext": "Klik her for at fjerne billedet fra medie filen",
+ "uploadClearFileContext": "Klik her for at fjerne filen fra medie filen",
+ "urls": "Link til dokument",
+ "memberof": "Medlem af grupper(ne)",
+ "notmemberof": "Ikke medlem af grupper(ne)",
+ "childItems": "Undersider",
+ "target": "Ã…ben i vindue",
+ "scheduledPublishServerTime": "Dette oversætter til den følgende tid på serveren:",
+ "scheduledPublishDocumentation": "Hvad betyder det? ",
+ "nestedContentDeleteItem": "Er du sikker på, at du vil slette dette element?",
+ "nestedContentDeleteAllItems": "Er du sikker på, at du vil slette alle elementer?",
+ "nestedContentEditorNotSupported": "Egenskaben %0% anvender editoren %1% som ikke er understøttet af Nested\n Content.\n ",
+ "nestedContentNoContentTypes": "Der er ikke konfigureret nogen indholdstyper for denne egenskab.",
+ "nestedContentAddElementType": "Tilføj element type",
+ "nestedContentSelectElementTypeModalTitle": "Vælg element type",
+ "nestedContentGroupHelpText": "Vælg gruppen, hvis værdier skal vises. Hvis dette er efterladt blankt vil\n den første gruppe på element typen bruges.\n ",
+ "addTextBox": "Tilføj en ny tekstboks",
+ "removeTextBox": "Fjern denne tekstboks",
+ "contentRoot": "Indholdsrod",
+ "includeUnpublished": "Inkluder ikke-udgivet indhold.",
+ "isSensitiveValue": "Denne værdi er skjult.Hvis du har brug for adgang til at se denne værdi, bedes du\n kontakte din web-administrator.\n ",
+ "isSensitiveValue_short": "Denne værdi er skjult.",
+ "languagesToPublish": "Hvilke sprog vil du gerne udgive?",
+ "languagesToSendForApproval": "Hvilke sprog vil du gerne sende til godkendelse?",
+ "languagesToSchedule": "Hvilke sprog vil du gerne planlægge?",
+ "languagesToUnpublish": "Vælg sproget du vil afpublicere. Afpublicering af et obligatorisk sprog vil\n afpublicere alle sprog.\n ",
+ "resetFocalPoint": "Nulstil fokuspunkt",
+ "variantsWillBeSaved": "Alle nye varianter vil blive gemt.",
+ "publishRequiresVariants": "De følgende varianter er krævet for at en udgivelse kan finde sted:",
+ "notReadyToPublish": "Vi er ikke klar til at udgive",
+ "readyToPublish": "Klar til at udgive?",
+ "readyToSave": "Klar til at gemme?",
+ "sendForApproval": "Send til godkendelse",
+ "schedulePublishHelp": "Vælg dato og klokkeslæt for at udgive og/eller afpublicere indholdet.",
+ "createEmpty": "Opret ny",
+ "createFromClipboard": "Indsæt fra udklipsmappen",
+ "nodeIsInTrash": "Dette element er i papirkurven",
+ "nestedContentTemplateHelpTextPart1": "Enter an angular expression to evaluate against each item for its\n name. Use\n ",
+ "nestedContentTemplateHelpTextPart2": "to display the item index",
+ "nestedContentNoGroups": "The selected element type does not contain any supported groups (tabs are not supported by this editor, either change them to groups or use the Block List editor).",
+ "variantSaveNotAllowed": "Save is not allowed",
+ "variantPublishNotAllowed": "Publish is not allowed",
+ "variantSendForApprovalNotAllowed": "Send for approval is not allowed",
+ "variantScheduleNotAllowed": "Schedule is not allowed",
+ "variantUnpublishNotAllowed": "Unpublish is not allowed"
+ },
+ "blueprints": {
+ "createBlueprintFrom": "Opret en ny indholdsskabelon fra %0% ",
+ "blankBlueprint": "Blank",
+ "selectBlueprint": "Vælg en indholdsskabelon",
+ "createdBlueprintHeading": "Indholdsskabelon oprettet",
+ "createdBlueprintMessage": "En indholdsskabelon blev oprettet fra '%0%'",
+ "duplicateBlueprintMessage": "En anden indholdsskabelon med samme navn eksisterer allerede",
+ "blueprintDescription": "En indholdskabelon er foruddefineret indhold, som en redaktør kan vælge at bruge\n som grundlag for at oprette nyt indhold\n "
+ },
+ "media": {
+ "clickToUpload": "Klik for at uploade",
+ "orClickHereToUpload": "eller klik her for at vælge filer",
+ "disallowedFileType": "Kan ikke uploade denne fil, den har ikke en godkendt filtype",
+ "maxFileSize": "Maks filstørrelse er",
+ "mediaRoot": "Medie rod",
+ "moveToSameFolderFailed": "Overordnet og destinations mappe kan ikke være den samme",
+ "createFolderFailed": "Oprettelse af mappen under parent med id %0% fejlede",
+ "renameFolderFailed": "Omdøbning af mappen med id %0% fejlede",
+ "dragAndDropYourFilesIntoTheArea": "Træk dine filer ind i dropzonen for, at uploade dem til\n mediebiblioteket.\n ",
+ "uploadNotAllowed": "Upload er ikke tiladt på denne lokation",
+ "disallowedMediaType": "Cannot upload this file, the media type with alias '%0%' is not allowed here",
+ "invalidFileName": "Cannot upload this file, it does not have a valid file name"
+ },
+ "member": {
+ "createNewMember": "Opret et nyt medlem",
+ "allMembers": "Alle medlemmer",
+ "memberGroupNoProperties": "Medlemgrupper har ingen yderligere egenskaber til redigering.",
+ "2fa": "Totrinsbekræftelse",
+ "duplicateMemberLogin": "A member with this login already exists",
+ "memberHasGroup": "The member is already in group '%0%'",
+ "memberHasPassword": "The member already has a password set",
+ "memberLockoutNotEnabled": "Lockout is not enabled for this member",
+ "memberNotInGroup": "The member is not in group '%0%'"
+ },
+ "contentType": {
+ "copyFailed": "Kopiering af indholdstypen fejlede",
+ "moveFailed": "Flytning af indholdstypen fejlede"
+ },
+ "mediaType": {
+ "copyFailed": "Kopiering af medietypen fejlede",
+ "moveFailed": "Flytning af medietypen fejlede",
+ "autoPickMediaType": "Auto vælg"
+ },
+ "memberType": {
+ "copyFailed": "Kopiering af medlemstypen fejlede"
+ },
+ "create": {
+ "chooseNode": "Hvor ønsker du at oprette den nye %0%",
+ "createUnder": "Opret under",
+ "createContentBlueprint": "Vælg den dokumenttype, du vil oprette en indholdsskabelon til",
+ "enterFolderName": "Angiv et navn for mappen",
+ "updateData": "Vælg en type og skriv en titel",
+ "noDocumentTypes": "Der kunne ikke findes nogen tilladte dokumenttyper. Du skal tillade disse i indstillinger under \"dokumenttyper\" .",
+ "noDocumentTypesAtRoot": "There are no document types available for creating content here. You must create these in Document Types within the Settings section.",
+ "noDocumentTypesWithNoSettingsAccess": "Den valgte side i træet tillader ikke at sider oprettes under\n den.\n ",
+ "noDocumentTypesEditPermissions": "Rediger tilladelser for denne dokumenttype.",
+ "noDocumentTypesCreateNew": "Opret en ny dokumenttype",
+ "noDocumentTypesAllowedAtRoot": "Der er ingen tilladte Dokumenttyper tilgængelige for at lave indhold her. Du skal tillade dette i Dokumenttyper inde i Indstillinger sektionen, ved at ændre Tillad på rodniveau indestillingen under Permissions .",
+ "noMediaTypes": "Der kunne ikke findes nogen tilladte media typer. Du skal tillade disse i indstillinger under \"media typer\" .",
+ "noMediaTypesWithNoSettingsAccess": "Det valgte medie i træet tillader ikke at medier oprettes under det.\n ",
+ "noMediaTypesEditPermissions": "Rediger tilladelser for denne medietype.",
+ "documentTypeWithoutTemplate": "Dokumenttype uden skabelon",
+ "documentTypeWithTemplate": "Dokumenttype med skabelon",
+ "documentTypeWithTemplateDescription": "Definerer en indholdsside, der kan oprettes af redaktørerne i\n indholdstræet, og som er kan tilgås direkte på en URL.\n ",
+ "documentType": "Dokumenttype",
+ "documentTypeDescription": "Definerer en indholdskomponent, der kan oprettes af redaktørerne i\n indholdstræet og benyttes i sammenhæng med andet indhold, men som ikke kan tilgås direkte på en URL.\n ",
+ "elementType": "Element-type",
+ "elementTypeDescription": "Definerer skabelonen for et sæt at egenskaber, der kan anvendes som skema i\n avancerede felter som f.eks. 'Block List' eller 'Block Grid'.\n ",
+ "composition": "Komposition",
+ "compositionDescription": "Definerer et sæt genbrugbare egenskaber, der kan inkluderes i definitionen af\n andre dokumenttyper - f.eks. et sæt 'Almindelige side-data'.\n ",
+ "folder": "Mappe",
+ "folderDescription": "Benyttes til at organisere dokumenttyper, element-typer og kompositioner i\n dokumenttype-træet.\n ",
+ "newFolder": "Ny mappe",
+ "newDataType": "Ny datatype",
+ "newJavascriptFile": "Ny JavaScript-fil",
+ "newEmptyPartialView": "Ny tom partial view",
+ "newPartialViewMacro": "Ny partial view makro",
+ "newPartialViewFromSnippet": "Ny partial view fra snippet",
+ "newPartialViewMacroFromSnippet": "Ny partial view makro fra snippet",
+ "newPartialViewMacroNoMacro": "Ny partial view makro (uden makro)",
+ "newStyleSheetFile": "Ny stylesheet-fil",
+ "newRteStyleSheetFile": "Ny Rich Text Editor stylesheet-fil"
+ },
+ "dashboard": {
+ "browser": "Til dit website",
+ "dontShowAgain": "- Skjul",
+ "nothinghappens": "Hvis Umbraco ikke starter, kan det skyldes at din browser ikke tillader pop-up vinduer\n ",
+ "openinnew": "er åbnet i nyt vindue",
+ "restart": "Genstart",
+ "visit": "Besøg",
+ "welcome": "Velkommen"
+ },
+ "prompt": {
+ "stay": "Bliv",
+ "discardChanges": "Kassér ændringer",
+ "unsavedChanges": "Du har ikke-gemte ændringer",
+ "unsavedChangesWarning": "Er du sikker på du vil navigere væk fra denne side? - du har ikke-gemte\n ændringer\n ",
+ "confirmListViewPublish": "Udgivelse vil gøre de valgte sider synlige på sitet.",
+ "confirmListViewUnpublish": "Afpublicering vil fjerne de valgte sider og deres undersider fra sitet.",
+ "confirmUnpublish": "Afpublicering vil fjerne denne side og alle dets undersider fra websitet.",
+ "doctypeChangeWarning": "Du har ikke-gemte ændringer. Hvis du ændrer dokumenttype, kasseres ændringerne.\n "
+ },
+ "bulk": {
+ "done": "Færdig",
+ "deletedItem": "Slettede %0% element",
+ "deletedItems": "Slettede %0% elementer",
+ "deletedItemOfItem": "Slettede %0% ud af %1% element",
+ "deletedItemOfItems": "Slettede %0% ud af %1% elementer",
+ "publishedItem": "Udgav %0% element",
+ "publishedItems": "Udgav %0% elementer",
+ "publishedItemOfItem": "Udgav %0% ud af %1% element",
+ "publishedItemOfItems": "Udgav %0% ud af %1% elementer",
+ "unpublishedItem": "Fjernede %0% element fra udgivelse",
+ "unpublishedItems": "Fjernede %0% elementer fra udgivelse",
+ "unpublishedItemOfItem": "Fjernede %0% ud af %1% element fra udgivelse",
+ "unpublishedItemOfItems": "Fjernede %0% ud af %1% elementer fra udgivelse",
+ "movedItem": "Flyttede %0% element",
+ "movedItems": "Flyttede %0% elementer",
+ "movedItemOfItem": "Flyttede %0% ud af %1% element",
+ "movedItemOfItems": "Flyttede %0% ud af %1% elementer",
+ "copiedItem": "Kopierede %0% element",
+ "copiedItems": "Kopierede %0% elementer",
+ "copiedItemOfItem": "Kopierede %0% ud af %1% element",
+ "copiedItemOfItems": "Kopierede %0% ud af %1% elementer"
+ },
+ "defaultdialogs": {
+ "nodeNameLinkPicker": "Link titel",
+ "urlLinkPicker": "Link",
+ "anchorLinkPicker": "Lokalt link / querystreng",
+ "anchorInsert": "Navn på lokalt link",
+ "assignDomain": "Rediger domæner",
+ "closeThisWindow": "Luk denne dialog",
+ "confirmdelete": "Er du sikker på at du vil slette",
+ "confirmdisable": "Er du sikker på du vil deaktivere",
+ "confirmremove": "Er du sikker på at du vil fjerne",
+ "confirmremoveusageof": "Er du sikker på du vil fjerne brugen af %0% ",
+ "confirmlogout": "Er du sikker på at du vil forlade Umbraco?",
+ "confirmSure": "Er du sikker?",
+ "cut": "Klip",
+ "editdictionary": "Rediger ordbogsnøgle",
+ "editlanguage": "Rediger sprog",
+ "editSelectedMedia": "Rediger det valgte medie",
+ "insertAnchor": "Indsæt lokalt link",
+ "insertCharacter": "Indsæt tegn",
+ "insertgraphicheadline": "Indsæt grafisk overskrift",
+ "insertimage": "Indsæt billede",
+ "insertlink": "Indsæt link",
+ "insertMacro": "Indsæt makro",
+ "inserttable": "Indsæt tabel",
+ "languagedeletewarning": "Dette vil slette sproget",
+ "languageChangeWarning": "Ændring af kulturen for et sprog kan forsage en krævende opration og vil\n resultere i indholds cache og indeksering vil blive genlavet\n ",
+ "lastEdited": "Sidst redigeret",
+ "link": "Link",
+ "linkinternal": "Internt link:",
+ "linklocaltip": "Ved lokalt link, indsæt da en \"#\" foran linket",
+ "linknewwindow": "Ã…ben i nyt vindue?",
+ "macroDoesNotHaveProperties": "Denne makro har ingen egenskaber du kan redigere",
+ "paste": "Indsæt tekst",
+ "permissionsEdit": "Rediger rettigheder for",
+ "permissionsSet": "Sæt rettigheder for",
+ "permissionsSetForGroup": "Sæt rettigheder for %0% for brugergruppe %1%",
+ "permissionsHelp": "Vælg de brugergrupper, du vil angive tilladelser til",
+ "recycleBinDeleting": "Elementerne i papirkurven slettes. Luk venligst ikke dette vindue mens sletningen\n foregår\n ",
+ "recycleBinIsEmpty": "Papirkurven er nu tom",
+ "recycleBinWarning": "NÃ¥r elementer slettes fra papirkurven, slettes de for altid",
+ "regexSearchError": "regexlib.com 's webservice oplever i øjeblikket problemer, vi ikke har kontrol over. Beklager ulejligheden. ",
+ "regexSearchHelp": "Søg efter et regulært udtryk for at tilføje validering til et formularfelt. Eksempel:\n 'e-mail', 'postnr.', 'URL'\n ",
+ "removeMacro": "Fjern makro",
+ "requiredField": "Obligatorisk",
+ "sitereindexed": "Sitet er genindekseret",
+ "siterepublished": "Sitet er nu genudgivet",
+ "siterepublishHelp": "Websitets cache vil blive genopfrisket. Alt udgivet indhold vil blive opdateret, mens\n upubliceret indhold vil forblive upubliceret.\n ",
+ "tableColumns": "Antal kolonner",
+ "tableRows": "Antal rækker",
+ "thumbnailimageclickfororiginal": "Klik på billedet for at se den fulde størrelse",
+ "treepicker": "Vælg",
+ "viewCacheItem": "Se cache element",
+ "relateToOriginalLabel": "Relatér til original",
+ "includeDescendants": "Inkludér undersider",
+ "theFriendliestCommunity": "Det venligste community",
+ "linkToPage": "Link til side",
+ "openInNewWindow": "Ã…ben linket i et nyt vindue eller fane",
+ "linkToMedia": "Link til medie",
+ "selectContentStartNode": "Vælg startnode for indhold",
+ "selectMedia": "Vælg medie",
+ "selectMediaType": "Vælg medietype",
+ "selectIcon": "Vælg ikon",
+ "selectItem": "Vælg item",
+ "selectLink": "Vælg link",
+ "selectMacro": "Vælg makro",
+ "selectContent": "Vælg indhold",
+ "selectContentType": "Vælg indholdstype",
+ "selectMediaStartNode": "Vælg startnode for mediearkivet",
+ "selectMember": "Vælg medlem",
+ "selectMemberGroup": "Vælg medlemsgruppe",
+ "selectMemberType": "Vælg medlemstype",
+ "selectNode": "Vælg node",
+ "selectLanguages": "Vælg sprog",
+ "selectSections": "Vælg sektioner",
+ "selectUser": "Vælg bruger",
+ "selectUsers": "Vælg brugere",
+ "noIconsFound": "Ingen ikoner blev fundet",
+ "noMacroParams": "Der er ingen parametre for denne makro",
+ "noMacros": "Der er ikke tilføjet nogen makroer",
+ "externalLoginProviders": "Eksterne login-udbydere",
+ "exceptionDetail": "Undtagelsesdetaljer",
+ "stacktrace": "Stacktrace",
+ "innerException": "Indre undtagelse",
+ "linkYour": "Link dit",
+ "unLinkYour": "Fjern link fra dit",
+ "account": "konto",
+ "selectEditor": "Vælg editor",
+ "selectEditorConfiguration": "Vælg konfiguration",
+ "selectSnippet": "Vælg snippet",
+ "variantdeletewarning": "Dette vil slette noden og alle dets sprog. Hvis du kun vil slette et sprog, så\n afpublicér det i stedet.\n ",
+ "propertyuserpickerremovewarning": "Dette vil fjerne brugeren %0% ",
+ "userremovewarning": "Dette vil fjerne brugeren %0% fra %1% gruppen",
+ "yesRemove": "Ja, fjern",
+ "confirmdeleteNumberOfItems": "Are you sure you want to delete %0% of %1% items",
+ "deleteLayout": "You are deleting the layout",
+ "deletingALayout": "Modifying layout will result in loss of data for any existing content that is based on this configuration."
+ },
+ "dictionary": {
+ "noItems": "Der er ingen ordbogselementer.",
+ "importDictionaryItemHelp": "\n To import a dictionary item, find the \".udt\" file on your computer by clicking the\n \"Import\" button (you'll be asked for confirmation on the next screen)\n ",
+ "itemDoesNotExists": "Dictionary item does not exist.",
+ "parentDoesNotExists": "Parent item does not exist.",
+ "noItemsInFile": "There are no dictionary items in this file.",
+ "noItemsFound": "There were no dictionary items found.",
+ "createNew": "Create dictionary item"
+ },
+ "dictionaryItem": {
+ "description": "\n Rediger de forskellige sprogversioner for ordbogselementet '%0%' herunder. Du tilføjer flere sprog under 'sprog' i menuen til venstre \n ",
+ "displayName": "Kulturnavn",
+ "changeKeyError": "\n Navnet '%0%' eksisterer allerede.\n ",
+ "overviewTitle": "Ordbogsoversigt"
+ },
+ "examineManagement": {
+ "configuredSearchers": "Konfigurerede søgere",
+ "configuredSearchersDescription": "Viser egenskaber og værktøjer til enhver konfigureret søger (dvs. som en\n multi-indekssøger)\n ",
+ "fieldValues": "Feltværdier",
+ "healthStatus": "Sundhedstilstand",
+ "healthStatusDescription": "Indeksets sundhedstilstand, og hvis det kan læses",
+ "indexers": "Indeksører",
+ "indexInfo": "Indeksinfo",
+ "indexInfoDescription": "Viser indeksets egenskaber",
+ "manageIndexes": "Administrer Examine indekserne",
+ "manageIndexesDescription": "Giver dig mulighed for at se detaljerne for hvert indeks og giver nogle\n værktøjer til styring af indeksørerne\n ",
+ "rebuildIndex": "Genopbyg indeks",
+ "rebuildIndexWarning": "\n Dette vil medføre, at indekset genopbygges. \n Afhængigt af hvor meget indhold der er på dit website, kan det tage et stykke tid. \n Det anbefales ikke at genopbygge et indeks i perioder med høj websitetrafik eller når redaktører redigerer indhold.\n ",
+ "searchers": "Søgere",
+ "searchDescription": "Søg i indekset og se resultaterne",
+ "tools": "Værktøjer",
+ "toolsDescription": "Værktøjer til at administrere indekset",
+ "fields": "felter",
+ "indexCannotRead": "Indexet skal bygges igen, for at kunne læses",
+ "processIsTakingLonger": "Processen tager længere tid end forventet. Kontrollér Umbraco loggen for at se om\n der er sket fejl under operationen\n ",
+ "indexCannotRebuild": "Dette index kan ikke genbygges for det ikke har nogen",
+ "iIndexPopulator": "IIndexPopulator",
+ "contentInIndex": "Content in index"
+ },
+ "placeholders": {
+ "username": "Indtast dit brugernavn",
+ "password": "Indtast dit kodeord",
+ "confirmPassword": "Bekræft dit kodeord",
+ "nameentity": "Navngiv %0%...",
+ "entername": "Indtast navn...",
+ "enteremail": "Indtast en e-mail...",
+ "enterusername": "Indtast et brugernavn...",
+ "label": "Label...",
+ "enterDescription": "Indtast beskrivelse",
+ "search": "Søg...",
+ "filter": "Filtrér...",
+ "enterTags": "Indtast nøgleord (tryk på Enter efter hvert nøgleord)...",
+ "email": "Indtast din e-mail",
+ "enterMessage": "Indtast en besked...",
+ "usernameHint": "Dit brugernavn er typisk din e-mailadresse",
+ "anchor": "#value eller ?key=value",
+ "enterAlias": "Indtast alias...",
+ "generatingAlias": "Genererer alias...",
+ "a11yCreateItem": "Opret element",
+ "a11yEdit": "Rediger",
+ "a11yName": "Navn"
+ },
+ "editcontenttype": {
+ "createListView": "Opret brugerdefineret listevisning",
+ "removeListView": "Fjern brugerdefineret listevisning",
+ "aliasAlreadyExists": "En dokumenttype, medietype eller medlemstype med dette alias findes allerede"
+ },
+ "renamecontainer": {
+ "renamed": "Omdøbt",
+ "enterNewFolderName": "Indtast et ny mappenavn her",
+ "folderWasRenamed": "%0% was renamed to %1%"
+ },
+ "editdatatype": {
+ "addPrevalue": "Tilføj førværdi",
+ "dataBaseDatatype": "Database-datatype",
+ "guid": "Data Editor GUID",
+ "renderControl": "Visningskontrol",
+ "rteButtons": "Knapper",
+ "rteEnableAdvancedSettings": "Aktiver avancerede indstillinger for",
+ "rteEnableContextMenu": "Aktiver kontekstmenu",
+ "rteMaximumDefaultImgSize": "Maks. std. størrelse på indsatte billeder",
+ "rteRelatedStylesheets": "Relaterede stylesheets",
+ "rteShowLabel": "Vis label",
+ "rteWidthAndHeight": "Bredde og højde",
+ "selectFolder": "Vælg den mappe, der skal flyttes",
+ "inTheTree": "til i træstrukturen nedenfor",
+ "wasMoved": "blev flyttet under",
+ "hasReferencesDeleteConsequence": "Ved sletning af %0% fjernes egnskaber og egnskabernes data fra følgende elementer",
+ "acceptDeleteConsequence": "I understand this action will delete the properties and data based on this Data\n Type\n ",
+ "canChangePropertyEditorHelp": "Changing a property editor on a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json."
+ },
+ "errorHandling": {
+ "errorButDataWasSaved": "Dine data er blevet gemt, men før du kan udgive denne side er der nogle fejl der\n skal rettes:\n ",
+ "errorChangingProviderPassword": "Den nuværende membership-provider understøtter ikke skift af kodeord\n (EnablePasswordRetrieval skal være true)\n ",
+ "errorExistsWithoutTab": "%0% der findes allerede",
+ "errorHeader": "Der var fejl i dokumentet:",
+ "errorHeaderWithoutTab": "Der var fejl i formularen:",
+ "errorInPasswordFormat": "Kodeordet skal være på minimum %0% tegn og indeholde mindst %1% alfanumeriske\n karakterer\n ",
+ "errorIntegerWithoutTab": "%0% skal være et heltal",
+ "errorMandatory": "%0% under %1% er et obligatorisk felt og skal udfyldes",
+ "errorMandatoryWithoutTab": "%0% er et obligatorisk felt og skal udfyldes",
+ "errorRegExp": "%0% under %1% er ikke i et korrekt format",
+ "errorRegExpWithoutTab": "%0% er ikke i et korrekt format"
+ },
+ "errors": {
+ "receivedErrorFromServer": "Der skete en fejl på severen",
+ "dissallowedMediaType": "Denne filttype er blevet deaktiveret af administratoren",
+ "codemirroriewarning": "OBS! Selvom CodeMirror er slået til i konfigurationen, så er den deaktiveret i\n Internet Explorer fordi den ikke er stabil nok.\n ",
+ "contentTypeAliasAndNameNotNull": "Du skal udfylde både Alias & Navn på den nye egenskabstype!",
+ "filePermissionsError": "Der mangler læse/skrive rettigheder til bestemte filer og mapper",
+ "macroErrorLoadingPartialView": "Fejl ved indlæsning af Partial View script (fil: %0%)",
+ "missingTitle": "Skriv venligst en titel",
+ "missingType": "Du skal vælge en type",
+ "pictureResizeBiggerThanOrg": "Du er ved at gøre billedet større end originalen. Det vil forringe\n kvaliteten af billedet. Ønsker du at fortsætte?\n ",
+ "startNodeDoesNotExists": "Startnode er slettet, kontakt systemadministrator",
+ "stylesMustMarkBeforeSelect": "Du skal markere noget indhold, før du kan ændre stylen",
+ "stylesNoStylesOnPage": "Der er ingen aktive styles eller formatteringer på denne side",
+ "tableColMergeLeft": "Du skal stå til venstre for de 2 celler du ønsker at samle!",
+ "tableSplitNotSplittable": "Du kan ikke opdele en celle, som ikke allerede er delt.",
+ "propertyHasErrors": "Denne egenskab er ugyldig",
+ "defaultError": "An unknown failure has occurred",
+ "concurrencyError": "Optimistic concurrency failure, object has been modified"
+ },
+ "general": {
+ "options": "Valgmuligheder",
+ "about": "Om",
+ "action": "Handling",
+ "actions": "Muligheder",
+ "add": "Tilføj",
+ "alias": "Alias",
+ "all": "Alle",
+ "areyousure": "Er du sikker?",
+ "back": "Tilbage",
+ "backToOverview": "Tilbage til oversigt",
+ "border": "Kant",
+ "by": "af",
+ "cancel": "Fortryd",
+ "cellMargin": "Celle margen",
+ "choose": "Vælg",
+ "clear": "Ryd",
+ "close": "Luk",
+ "closewindow": "Luk vindue",
+ "closepane": "Luk vindue",
+ "comment": "Kommentar",
+ "confirm": "Bekræft",
+ "constrain": "Proportioner",
+ "constrainProportions": "Behold proportioner",
+ "content": "Indhold",
+ "continue": "Fortsæt",
+ "copy": "Kopiér",
+ "create": "Opret",
+ "cropSection": "Beskær sektion",
+ "database": "Database",
+ "date": "Dato",
+ "default": "Standard",
+ "delete": "Slet",
+ "deleted": "Slettet",
+ "deleting": "Sletter...",
+ "design": "Design",
+ "dictionary": "Ordbog",
+ "dimensions": "Dimensioner",
+ "discard": "Kassér",
+ "down": "Ned",
+ "download": "Hent",
+ "edit": "Rediger",
+ "edited": "Redigeret",
+ "elements": "Elementer",
+ "email": "E-mail",
+ "error": "Fejl",
+ "field": "Felt",
+ "findDocument": "Find",
+ "first": "Første",
+ "focalPoint": "Fokuspunkt",
+ "general": "Generelt",
+ "groups": "Grupper",
+ "group": "Gruppe",
+ "height": "Højde",
+ "help": "Hjælp",
+ "hide": "Skjul",
+ "history": "Historik",
+ "icon": "Ikon",
+ "id": "Id",
+ "import": "Importer",
+ "excludeFromSubFolders": "Søg kun i denne mappe",
+ "info": "Info",
+ "innerMargin": "Indre margen",
+ "insert": "Indsæt",
+ "install": "Installér",
+ "invalid": "Ugyldig",
+ "justify": "Justering",
+ "label": "Mærke",
+ "language": "Sprog",
+ "last": "Sidste",
+ "layout": "Layout",
+ "links": "Links",
+ "loading": "Henter",
+ "locked": "LÃ¥st",
+ "login": "Log ind",
+ "logoff": "Log af",
+ "logout": "Log ud",
+ "macro": "Makro",
+ "mandatory": "Påkrævet",
+ "message": "Besked",
+ "move": "Flyt",
+ "name": "Navn",
+ "new": "Ny",
+ "next": "Næste",
+ "no": "Nej",
+ "of": "af",
+ "off": "Fra",
+ "ok": "OK",
+ "open": "Ã…ben",
+ "on": "Til",
+ "or": "eller",
+ "orderBy": "Sortér efter",
+ "password": "Kodeord",
+ "path": "Sti",
+ "pleasewait": "Et øjeblik...",
+ "previous": "Forrige",
+ "properties": "Egenskaber",
+ "rebuild": "Genopbyg",
+ "reciept": "E-mail der skal modtage indhold af formular",
+ "recycleBin": "Papirkurv",
+ "recycleBinEmpty": "Din papirkurv er tom",
+ "reload": "Genindlæs",
+ "remaining": "Mangler",
+ "remove": "Fjern",
+ "rename": "Omdøb",
+ "renew": "Forny",
+ "required": "Påkrævet",
+ "retrieve": "Hent",
+ "retry": "Prøv igen",
+ "rights": "Rettigheder",
+ "scheduledPublishing": "Planlagt publicering",
+ "search": "Søg",
+ "searchNoResult": "Beklager, vi kan ikke finde det, du leder efter.",
+ "noItemsInList": "Ingen elementer er blevet tilføjet",
+ "server": "Server",
+ "settings": "Indstillinger",
+ "show": "Vis",
+ "showPageOnSend": "Hvilken side skal vises efter at formularen er sendt",
+ "size": "Størrelse",
+ "sort": "Sortér",
+ "status": "Status",
+ "submit": "Indsend",
+ "type": "Type",
+ "typeToSearch": "Skriv for at søge...",
+ "under": "under",
+ "up": "Op",
+ "update": "Opdatér",
+ "upgrade": "Opdatér",
+ "upload": "Upload",
+ "url": "URL",
+ "user": "Bruger",
+ "username": "Brugernavn",
+ "value": "Værdi",
+ "view": "Vis",
+ "welcome": "Velkommen...",
+ "width": "Bredde",
+ "yes": "Ja",
+ "folder": "Mappe",
+ "searchResults": "Søgeresultater",
+ "readMore": "Læs mere",
+ "reorder": "Sortér",
+ "reorderDone": "Afslut sortering",
+ "preview": "Eksempel",
+ "changePassword": "Skift kodeord",
+ "to": "til",
+ "listView": "Listevisning",
+ "saving": "Gemmer...",
+ "current": "nuværende",
+ "embed": "Indlejring",
+ "selected": "valgt",
+ "other": "Andet",
+ "articles": "Artikler",
+ "videos": "Videoer",
+ "avatar": "Avatar til",
+ "header": "Overskrift",
+ "systemField": "system felt",
+ "Deploy": "Deploy",
+ "restore": "Genskab",
+ "generic": "Generic",
+ "media": "Media",
+ "nodeName": "Node Name",
+ "revert": "Revert",
+ "umbracoInfo": "Umbraco info",
+ "shared": "Shared",
+ "success": "Success",
+ "typeName": "Type Name",
+ "validate": "Validate",
+ "lastUpdated": "Last Updated",
+ "skipToMenu": "Skip to menu",
+ "skipToContent": "Skip to content"
+ },
+ "colors": {
+ "blue": "Blå"
+ },
+ "shortcuts": {
+ "addGroup": "Tilføj fane",
+ "addProperty": "Tilføj egenskab",
+ "addEditor": "Tilføj editor",
+ "addTemplate": "Tilføj skabelon",
+ "addChildNode": "Tilføj child node",
+ "addChild": "Tilføj child",
+ "editDataType": "Rediger datatype",
+ "navigateSections": "Naviger sektioner",
+ "shortcut": "Genveje",
+ "showShortcuts": "Vis genveje",
+ "toggleListView": "Brug listevisning",
+ "toggleAllowAsRoot": "Tillad på rodniveau",
+ "commentLine": "Kommentér/Udkommentér linjer",
+ "removeLine": "Slet linje",
+ "copyLineUp": "Kopiér linjer op",
+ "copyLineDown": "Kopiér linjer ned",
+ "moveLineUp": "Flyt linjer op",
+ "moveLineDown": "Flyt linjer ned",
+ "generalHeader": "Generelt",
+ "editorHeader": "Editor",
+ "toggleAllowCultureVariants": "Skift tillad sprogvarianter",
+ "addTab": "Add tab"
+ },
+ "graphicheadline": {
+ "backgroundcolor": "Baggrundsfarve",
+ "bold": "Fed",
+ "color": "Tekstfarve",
+ "font": "Skrifttype",
+ "text": "Tekst"
+ },
+ "headers": {
+ "page": "Side"
+ },
+ "installer": {
+ "databaseErrorCannotConnect": "Installeringsprogrammet kan ikke forbinde til databasen.",
+ "databaseErrorWebConfig": "Kunne ikke gemme web.config filen. Du bedes venligst manuelt ændre database\n forbindelses strengen.\n ",
+ "databaseFound": "Din database er blevet fundet og identificeret som",
+ "databaseHeader": "Database konfiguration",
+ "databaseInstall": "\n Klik på installér knappen for at installere Umbraco %0% databasen\n ",
+ "databaseInstallDone": "Umbraco %0% er nu blevet kopieret til din database. Tryk på Næste for at fortsætte.",
+ "databaseNotFound": "Databasen er ikke fundet. Kontrollér venligst at informationen i database forbindelsesstrengen i \"web.config\" filen er korrekt.
\nFor at fortsætte bedes du venligst rette \"web.config\" filen (ved at bruge Visual Studio eller dit favoritprogram), scroll til bunden, tilføj forbindelsesstrengen til din database i feltet som hedder \"umbracoDbDSN\" og gem filen.
Klik på Forsøg igen knappen når du er færdig.Mere information om at redigere web.config her.
",
+ "databaseText": "For at afslutte dette skridt er du nødt til at have nogle informationer om din database parat (\"database forbindelsesstrengen\"). Kontakt venligst din ISP hvis det er nødvendigt. Hvis du installerer på en lokal maskine eller server kan du muligvis få informationerne fra din systemadministrator.",
+ "databaseUpgrade": "Tryk på Opgradér knappen for at opgradere din database til Umbraco %0%
Bare rolig - intet indhold vil blive slettet og alt vil stadig fungere bagefter!
",
+ "databaseUpgradeDone": "Din database er blevet opgraderet til den endelige version %0%. Tryk på Næste for at fortsætte.",
+ "databaseUpToDate": "Din database er up-to-date!. Klik på Næste for at fortsætte med konfigurationsguiden.",
+ "defaultUserChangePass": "Normalbrugerens adgangskode er nødt til at blive ændret! ",
+ "defaultUserDisabled": "Normalbrugeren er blevet gjort utjenstdygtig eller har ikke adgang til Umbraco!
Du behøver ikke foretage yderligere handlinger. Tryk på Næste for at fortsætte.
",
+ "defaultUserPassChanged": "Normalbrugerens adgangskode er på succesfuld vis blevet ændret siden installationen!
Du behøver ikke foretage yderligere handlinger. Tryk på Næste for at fortsætte.
",
+ "defaultUserPasswordChanged": "Adgangskoden er blevet ændret!",
+ "greatStart": "FÃ¥ en fremragende start, se vores videoer",
+ "licenseText": "Ved at klikke på næste knappen (eller ved at ændre UmbracoConfigurationStatus i web.config\n filen), accepterer du licensaftalen for denne software, som specificeret i boksen nedenfor. Bemærk venligst at\n denne Umbraco distribution består af to forskellige licenser, MIT's Open Source Licens for frameworket og Umbraco\n Freeware Licensen som dækker UI'en.\n ",
+ "None": "Endnu ikke installeret",
+ "permissionsAffectedFolders": "Berørte filer og foldere",
+ "permissionsAffectedFoldersMoreInfo": "Flere informationer om at opsætte rettigheder for Umbraco her",
+ "permissionsAffectedFoldersText": "Du er nødt til at give ASP.NET 'modify' rettigheder på følgende\n filer/foldere\n ",
+ "permissionsAlmostPerfect": "Dine rettighedsindstillinger er næsten perfekte! Du kan køre Umbraco uden problemer, men du vil ikke være i stand til at installere pakker, som er anbefalet for at få fuldt udbytte af Umbraco.",
+ "permissionsHowtoResolve": "Hvorledes besluttes",
+ "permissionsHowtoResolveLink": "Klik her for at læse tekstversionen",
+ "permissionsHowtoResolveText": "Se vores video tutorials om at opsætte folderrettigheder for Umbraco eller læs tekstversionen.",
+ "permissionsMaybeAnIssue": "Dine rettighedsindstillinger kan være et problem! Du kan afvikle Umbraco uden problemer, men du vil ikke være i stand til at oprette foldere eller installere pakker, hvilket er anbefalet for at få fuldt udbytte af Umbraco.",
+ "permissionsNotReady": "Dine rettighedsindstillinger er ikke klar til Umbraco! For at afvikle Umbraco er du nødt til at opdatere dine rettighedsindstillinger.",
+ "permissionsPerfect": "Dine rettighedsindstillinger er perfekte! Du er nu parat til at afvikle Umbraco og installere pakker!",
+ "permissionsResolveFolderIssues": "Løser folder problem",
+ "permissionsResolveFolderIssuesLink": "Følg dette link for mere information om udfordringer med ASP.NET og\n oprettelse af foldere\n ",
+ "permissionsSettingUpPermissions": "Sætter folderrettigheder op",
+ "permissionsText": "Umbraco har behov for 'write/modify' adgang til bestemte foldere, for at kunne gemme\n filer som billeder og PDF'er. Umbraco gemmer også midlertidige data (eksempelvis cachen) for at forbedre ydelsen\n på dit website.\n ",
+ "runwayFromScratch": "Jeg har lyst til at begynde på bar bund",
+ "runwayFromScratchText": "Dit website er helt tomt for øjeblikket, så det er perfekt hvis du ønsker at begynde på bar bund og oprette dine egne dokumenttyper og skabeloner. (lær hvordan ) Du kan stadig vælge at installere Runway senere. Gå venligst til Udvikler-sektionen og vælg Pakker.",
+ "runwayHeader": "Du har lige opsat en ren Umbraco-platform. Hvad ønsker du nu at gøre?",
+ "runwayInstalled": "Runway er installeret",
+ "runwayInstalledText": "Du har fundamentet på plads. Vælg hvilke moduler du ønsker at installere ovenpå det. Dette er vores liste over anbefalede moduler. Kryds dem af du ønsker at installere eller se den fulde liste af moduler ",
+ "runwayOnlyProUsers": "Kun anbefalet for erfarne brugere",
+ "runwaySimpleSite": "Jeg ønsker at begynder med et simpelt website",
+ "runwaySimpleSiteText": "\"Runway\" er et simpelt website som stiller nogle basale dokumenttyper og skabeloner til rådighed. Installeringsprogrammet kan automatisk opsætte Runway for dig, men du kan nemt redigere, udvide eller fjerne det. Det er ikke nødvendigt og du kan sagtens bruge Umbraco uden. Men Runway tilbyder et fundament, som er baseret på 'Best Practices', som får dig igang hurtigere end nogensinde før. Hvis du vælger at installere Runway, kan du efter eget valg vælge de grundlæggende byggesten kaldet 'Runway Modules' til at forbedre dine Runway-sider.
Inkluderet med Runway: Home Page, Getting Started page, Installing Modules page. Valgfri Moduler: Top Navigation, Sitemap, Contact, Gallery.
",
+ "runwayWhatIsRunway": "Hvad er Runway",
+ "step1": "Skridt 1/5: Acceptér licens",
+ "step2": "Skridt 2/5: Database-konfiguration",
+ "step3": "Skridt 3/5: Validerer filrettigheder",
+ "step4": "Skridt 4/5: Kontrollér Umbraco sikkerhed",
+ "step5": "Skridt 5/5: Umbraco er parat til at få dig igang",
+ "thankYou": "Tak fordi du valgte Umbraco",
+ "theEndBrowseSite": "Gennemse dit nye site Du installerede Runway, så hvorfor ikke se hvordan dit nye website ser ud.",
+ "theEndFurtherHelp": "Yderligere hjælpe og informationer Få hjælp fra vores prisvindende fællesskab, gennemse dokumentationen eller se nogle gratis videoer om hvordan du opsætter et simpelt site, hvordan du bruger pakker og en 'quick guide' til Umbraco terminologier",
+ "theEndHeader": "Umbraco %0% er installeret og klar til brug",
+ "theEndInstallFailed": "For at afslutte installationen er du nødt til manuelt at rette /web.config filen og opdatére 'AppSetting' feltet UmbracoConfigurationStatus i bunden til '%0%' .",
+ "theEndInstallSuccess": "Du kan komme igang med det samme ved at klikke på \"Start Umbraco\" knappen nedenfor. Hvis du er ny med Umbraco , kan du finde masser af ressourcer på vores 'getting started' sider.\n",
+ "theEndOpenUmbraco": "Start Umbraco For at administrere dit website skal du blot åbne Umbraco administrationen og begynde at tilføje indhold, opdatere skabelonerne og stylesheets'ene eller tilføje ny funktionalitet.",
+ "Unavailable": "Forbindelse til databasen fejlede.",
+ "Version3": "Umbraco Version 3",
+ "Version4": "Umbraco Version 4",
+ "watch": "Se",
+ "welcomeIntro": "Denne guide vil bringe dig gennem konfigurationsprocessen af Umbraco %0% for en frisk installation eller for en opgradering fra version 3.0. Tryk på Næste for at begynde på guiden."
+ },
+ "language": {
+ "cultureCode": "Culture Code",
+ "displayName": "Culture Name"
+ },
+ "lockout": {
+ "lockoutWillOccur": "Du har været inaktiv, og du vil blive logget ud om",
+ "renewSession": "Forny for at gemme dine ændringer"
+ },
+ "login": {
+ "greeting0": "Så er det søndag!",
+ "greeting1": "Smil, det er mandag!",
+ "greeting2": "Hurra, det er tirsdag!",
+ "greeting3": "Hvilken herlig onsdag!",
+ "greeting4": "Glædelig torsdag!",
+ "greeting5": "Endelig fredag!",
+ "greeting6": "Glædelig lørdag",
+ "instruction": "Log ind nedenfor",
+ "signInWith": "Log ind med",
+ "timeout": "Din session er udløbet",
+ "bottomText": "© 2001 - %0% umbraco.com
",
+ "forgottenPassword": "Glemt adgangskode?",
+ "forgottenPasswordInstruction": "En e-mail vil blive sendt til den angivne adresse med et link til at\n nulstille din adgangskode\n ",
+ "requestPasswordResetConfirmation": "En e-mail med instruktioner for nulstilling af adgangskoden vil blive\n sendt til den angivne adresse, hvis det matcher vores optegnelser\n ",
+ "showPassword": "Vis adgangskode",
+ "hidePassword": "Skjul adgangskode",
+ "returnToLogin": "Tilbage til login formular",
+ "setPasswordInstruction": "Angiv en ny adgangskode",
+ "setPasswordConfirmation": "Din adgangskode er blevet opdateret",
+ "resetCodeExpired": "Det link, du har klikket på, er ugyldigt eller udløbet",
+ "resetPasswordEmailCopySubject": "Umbraco: Nulstil adgangskode",
+ "resetPasswordEmailCopyFormat": "Dit brugernavn til at logge på Umbraco backoffice er: %0%
Klik her for at nulstille din adgangskode eller kopier/indsæt denne URL i din browser:
%1%
",
+ "mfaSecurityCodeSubject": "Umbraco: Sikkerhedskode",
+ "mfaSecurityCodeMessage": "Din sikkerhedskode er: %0%",
+ "2faTitle": "Sidste skridt",
+ "2faText": "Det er påkrævet at du bekræfter din identitet.",
+ "2faMultipleText": "Vælg venligst en godkendelsesmetode",
+ "2faCodeInput": "Kode",
+ "2faCodeInputHelp": "Indtast venligst bekræftelseskoden",
+ "2faInvalidCode": "Ugyldig kode indtastet"
+ },
+ "main": {
+ "dashboard": "Skrivebord",
+ "sections": "Sektioner",
+ "tree": "Indhold"
+ },
+ "moveOrCopy": {
+ "choose": "Vælg siden ovenover...",
+ "copyDone": "%0% er nu kopieret til %1%",
+ "copyTo": "Kopier til",
+ "moveDone": "%0% er nu flyttet til %1%",
+ "moveTo": "Flyt til",
+ "nodeSelected": "er blevet valgt som roden for dit nye indhold, klik 'ok' nedenunder.",
+ "noNodeSelected": "Intet element valgt, vælg et element i listen ovenfor før der klikkes 'fortsæt'",
+ "notAllowedByContentType": "Det nuværende element kan ikke lægges under denne pga. sin type",
+ "notAllowedByPath": "Det nuværende element kan ikke ligge under en af dens undersider",
+ "notAllowedAtRoot": "Dette element må ikke findes på rodniveau",
+ "notValid": "Denne handling er ikke tilladt fordi du ikke har de fornødne rettigheder på et eller flere af\n under-dokumenterne\n ",
+ "relateToOriginal": "Relater det kopierede element til originalen"
+ },
+ "notifications": {
+ "editNotifications": "Vælg dine notificeringer for %0% ",
+ "notificationsSavedFor": "Notificeringer er gemt for",
+ "mailBody": "\nHej %0%\n\nDette er en automatisk mail for at fortælle at handlingen '%1%'\ner blevet udført på siden '%2%'\naf brugeren '%3%'\n\nGå til http://%4%/#/content/content/edit/%5% for at redigere.\n\nHa' en dejlig dag!\n\nMange hilsner fra Umbraco robotten\n\t\t",
+ "mailBodyHtml": "Hej %0%
\n Dette er en automatisk mail for at informere dig om at opgaven '%1%' \n er blevet udførtpå siden '%2%' af brugeren '%3%'
\n
Opdateringssammendrag: Hav en fortsat god dag! De bedste hilsner fra Umbraco robotten
",
+ "mailSubject": "[%0%] Notificering om %1% udført på %2%",
+ "notifications": "Notificeringer",
+ "mailBodyVariantSummary": "The following languages have been modified %0%",
+ "mailBodyVariantHtmlSummary": "The following languages have been modified:
\n %0%\n "
+ },
+ "packager": {
+ "actions": "Handlinger",
+ "created": "Oprettet",
+ "createPackage": "Opret pakke",
+ "chooseLocalPackageText": "Vælg pakken fra din computer. Umbraco pakker er oftest en \".zip\" fil",
+ "deletewarning": "Dette vil slette pakken",
+ "includeAllChildNodes": "Inkludér alle underliggende sider",
+ "installed": "Installeret",
+ "installedPackages": "Installerede pakker",
+ "noConfigurationView": "Denne pakke har ingen konfigurationsvisning",
+ "noPackagesCreated": "Der er ikke blevet oprettet nogle pakker endnu",
+ "noPackages": "Du har ingen pakker installeret",
+ "noPackagesDescription": "Du har ikke nogen pakker installeret. Du kan enten installere en lokal pakke ved at vælge den fra din computer eller gennemse de tilgængelige pakker ved hjælp af ikonet 'Pakker' øverst til højre på din skærm",
+ "packageContent": "Pakkeindhold",
+ "packageLicense": "Licens",
+ "packageSearch": "Søg efter pakker",
+ "packageSearchResults": "Resultater for",
+ "packageNoResults": "Vi kunne ikke finde resultater for",
+ "packageNoResultsDescription": "Prøv venligst at søge efter en anden pakke eller gennemse kategorierne\n ",
+ "packagesPopular": "Populære",
+ "packagesNew": "Nye udgivelser",
+ "packageHas": "har",
+ "packageKarmaPoints": "karma points",
+ "packageInfo": "Information",
+ "packageOwner": "Ejer",
+ "packageContrib": "Bidragsydere",
+ "packageCreated": "Oprettet",
+ "packageCurrentVersion": "Nuværende version",
+ "packageNetVersion": ".NET version",
+ "packageDownloads": "Downloads",
+ "packageLikes": "Likes",
+ "packageCompatibility": "Kompatibilitet",
+ "packageCompatibilityDescription": "Denne pakke er kompatibel med de følgende versioner af Umbraco, som\n rapporteret af community-medlemmer. Fuld kompatibilitet kan ikke garanteres for versioner rapporteret nedenfor\n 100%\n ",
+ "packageExternalSources": "Eksterne kilder",
+ "packageAuthor": "Forfatter",
+ "packageDocumentation": "Dokumentation",
+ "packageMetaData": "Pakke meta data",
+ "packageName": "Pakkenavn",
+ "packageNoItemsHeader": "Pakken indeholder ingen elementer",
+ "packageNoItemsText": "Denne pakkefil indeholder ingen elementer som kan af-installeres. Du kan roligt fjerne denne fra systemet ved at klikke på \"Fjern pakke\" nedenfor.",
+ "packageOptions": "Pakkevalg",
+ "packageReadme": "Pakke læs mig",
+ "packageRepository": "Pakke opbevaringsbase",
+ "packageUninstallConfirm": "Bekræft af-installering",
+ "packageUninstalledHeader": "Pakken blev fjernet",
+ "packageUninstalledText": "Pakken er på succesfuld vis blevet fjernet",
+ "packageUninstallHeader": "Afinstallér pakke",
+ "packageUninstallText": "Du kan fjerne markeringen på elementer du ikke ønsker at fjerne, på dette tidspunkt, nedenfor. Når du klikker 'bekræft' vil alle afkrydsede elemenet blive fjernet \nBemærk: at dokumenter og medier som afhænger af denne pakke vil muligvis holde op med at virke, så vær forsigtig. Hvis i tvivl, kontakt personen som har udviklet pakken.",
+ "packageVersion": "Pakke version",
+ "installInstructions": "Install instructions",
+ "packagesPromoted": "Promoted",
+ "packageMigrationsRun": "Run pending package migrations",
+ "packageMigrationsComplete": "Package migrations have successfully completed.",
+ "packageMigrationsNonePending": "All package migrations have successfully completed.",
+ "verifiedToWorkOnUmbracoCloud": "Verified to work on Umbraco Cloud"
+ },
+ "paste": {
+ "doNothing": "Indsæt med fuld formattering (Anbefales ikke)",
+ "errorMessage": "Den tekst du er ved at indsætte indeholder specialtegn eller formattering. Dette kan\n skyldes at du kopierer fra f.eks. Microsoft Word. Umbraco kan fjerne denne specialformattering automatisk så\n indholdet er mere velegnet til visning på en webside.\n ",
+ "removeAll": "Indsæt som ren tekst, dvs. fjern al formattering",
+ "removeSpecialFormattering": "Indsæt, men fjern formattering som ikke bør være på en webside (Anbefales)\n "
+ },
+ "publicAccess": {
+ "paGroups": "Gruppebaseret beskyttelse",
+ "paGroupsHelp": "Hvis du ønsker at give adgang til alle medlemmer af specifikke medlemsgrupper",
+ "paGroupsNoGroups": "Du skal oprette en medlemsgruppe før du kan bruge gruppebaseret beskyttelse",
+ "paErrorPage": "Fejlside",
+ "paErrorPageHelp": "Brugt når folk er logget ind, men ingen adgang",
+ "paHowWould": "Vælg hvordan siden %0% skal beskyttes",
+ "paIsProtected": "%0% er nu beskyttet",
+ "paIsRemoved": "Beskyttelse fjernet fra %0% ",
+ "paLoginPage": "Log ind-side",
+ "paLoginPageHelp": "Vælg siden der indeholder log ind-formularen",
+ "paRemoveProtection": "Fjern beskyttelse...",
+ "paRemoveProtectionConfirm": "Er du sikker på at du vil fjerne beskyttelsen fra siden %0% ?",
+ "paSelectPages": "Vælg siderne der indeholder log ind-formularer og fejlmeddelelser",
+ "paSelectGroups": "Vælg de grupper der har adgang til siden %0% ",
+ "paSelectMembers": "Vælg de medlemmer der har adgang til siden %0% ",
+ "paMembers": "Adgang til enkelte medlemmer",
+ "paMembersHelp": "Hvis du ønsker at give adgang til enkelte medlemmer"
+ },
+ "publish": {
+ "invalidPublishBranchPermissions": "Utilstrækkelige bruger adgang til a udgive alle under dokumenter",
+ "contentPublishedFailedAwaitingRelease": "Udgivelsen kunne ikke udgives da publiceringsdato er sat",
+ "contentPublishedFailedIsTrashed": "\n %0% kunne ikke publiceres da elementet er i skraldespanden.\n ",
+ "contentPublishedFailedExpired": "\n %0% Udgivelsen kunne ikke blive publiceret da publiceringsdatoen er overskredet\n ",
+ "contentPublishedFailedInvalid": "\n %0% kunne ikke publiceres da følgende egenskaber : %1% ikke overholdte valderingsreglerne.\n ",
+ "contentPublishedFailedByEvent": "%0% kunne ikke udgives, fordi et 3. parts modul annullerede handlingen\n ",
+ "contentPublishedFailedByMissingName": "%0% kan ikke udgives, fordi det mangler et navn.",
+ "includeUnpublished": "Medtag ikke-udgivede undersider",
+ "inProgress": "Publicerer - vent venligst...",
+ "inProgressCounter": "%0% ud af %1% sider er blevet udgivet...",
+ "nodePublish": "%0% er nu publiceret",
+ "nodePublishAll": "%0% og alle undersider er nu publiceret",
+ "publishAll": "Publicér alle undersider",
+ "publishHelp": "Klik ok for at udgive %0% og derved gøre indholdet offentligt tilgængeligt.. Du kan udgive denne side og dens undersider ved at klikke Udgiv alle undersider forneden",
+ "contentPublishedFailedByParent": "\n %0% can not be published, because a parent page is not published.\n ",
+ "contentPublishedFailedReqCultureValidationError": "Validation failed for required language '%0%'. This\n language was saved but not published.\n "
+ },
+ "colorpicker": {
+ "noColors": "Du har ikke konfigureret nogen godkendte farver"
+ },
+ "contentPicker": {
+ "allowedItemTypes": "Du kan kun vælge følgende type(r) dokumenter: %0%",
+ "pickedTrashedItem": "Du har valgt et dokument som er slettet eller lagt i papirkurven",
+ "pickedTrashedItems": "Du har valgt dokumenter som er slettede eller lagt i papirkurven"
+ },
+ "mediaPicker": {
+ "deletedItem": "Slettet medie",
+ "pickedTrashedItem": "Du har valgt et medie som er slettet eller lagt i papirkurven",
+ "pickedTrashedItems": "Du har valgt medier som er slettede eller lagt i papirkurven",
+ "trashed": "Slettet",
+ "openMedia": "Ã…ben i mediebiblioteket",
+ "changeMedia": "Skift medie",
+ "editMediaEntryLabel": "Rediger %0% på %1%",
+ "confirmCancelMediaEntryCreationHeadline": "Annuller indsættelse?",
+ "confirmCancelMediaEntryCreationMessage": "Er du sikker på at du vil annullere indsættelsen?",
+ "confirmCancelMediaEntryHasChanges": "Du har foretaget ændringer til bruge af dette media. Er du sikker på\n at du vil annullere?\n ",
+ "confirmRemoveAllMediaEntryMessage": "Fjern brugen af alle medier?",
+ "tabClipboard": "Udklipsholder",
+ "notAllowed": "Ikke tilladt",
+ "openMediaPicker": "Open media picker"
+ },
+ "relatedlinks": {
+ "enterExternal": "indtast eksternt link",
+ "chooseInternal": "vælg en intern side",
+ "caption": "Tekst",
+ "link": "Link",
+ "newWindow": "Nyt vindue",
+ "captionPlaceholder": "Indtast en tekst",
+ "externalLinkPlaceholder": "Indtast et link"
+ },
+ "imagecropper": {
+ "reset": "Nulstil",
+ "updateEditCrop": "Acceptér",
+ "undoEditCrop": "Fortryd",
+ "customCrop": "Brugerdefineret"
+ },
+ "rollback": {
+ "changes": "Ændringer",
+ "headline": "Vælg en version at sammenligne med den nuværende version",
+ "diffHelp": "Her vises forskellene mellem den nuværende version og den valgte versionRød tekst vil ikke blive vist i den valgte version. Grøn betyder tilføjet ",
+ "noDiff": "Der er ingen forskelle mellem den nuværende version og den valgte version",
+ "documentRolledBack": "Dokument tilbagerullet",
+ "htmlHelp": "Her vises den valgte version som html. Hvis du ønsker at se forskellen mellem de 2 versioner\n på samme tid, brug 'diff'-oversigten\n ",
+ "rollbackTo": "Tilbagerulning til",
+ "selectVersion": "Vælg version",
+ "view": "Vis",
+ "created": "Created",
+ "currentVersion": "Current version",
+ "pagination": "Showing version %0% to %1% of %2% versions",
+ "versions": "Versions",
+ "currentDraftVersion": "Current draft version",
+ "currentPublishedVersion": "Current published version"
+ },
+ "scripts": {
+ "editscript": "Rediger script"
+ },
+ "sections": {
+ "concierge": "Concierge",
+ "content": "Indhold",
+ "courier": "Courier",
+ "developer": "Udvikler",
+ "installer": "Umbraco konfigurationsguide",
+ "media": "Mediearkiv",
+ "member": "Medlemmer",
+ "packages": "Pakker",
+ "marketplace": "Marketplace",
+ "newsletters": "Nyhedsbreve",
+ "settings": "Indstillinger",
+ "statistics": "Statistik",
+ "translation": "Oversættelse",
+ "users": "Brugere",
+ "help": "Hjælp",
+ "forms": "Formularer",
+ "deploy": "Deploy",
+ "deployOpenPortal": "Ã…ben portalen",
+ "deployHelpAndDocumentation": "Hjælp og dokumentation",
+ "deployOpenQueue": "Åben overførselskøen",
+ "deployGettingStarted": "Kom godt igang",
+ "deploySetupProject": "Opsæt dit projekt",
+ "deployDeployment": "Lær om 'Deployment'",
+ "deployTroubleshooting": "Fejlsøgning"
+ },
+ "help": {
+ "tours": "Tours",
+ "theBestUmbracoVideoTutorials": "De bedste Umbraco video tutorials",
+ "umbracoForum": "Besøg our.umbraco.com",
+ "umbracoTv": "Besøg umbraco.tv",
+ "umbracoLearningBase": "Watch our free tutorial videos",
+ "umbracoLearningBaseDescription": "on the Umbraco Learning Base"
+ },
+ "settings": {
+ "defaulttemplate": "Standardskabelon",
+ "importDocumentTypeHelp": "For at importere en dokumenttype, find \".udt\"-filen på din computer ved at\n klikke på \"Gennemse\"-knappen og klik \"Import\" (Du vil blive bedt om bekræftelse på næste skærmbillede)\n ",
+ "newtabname": "Ny titel på faneblad",
+ "nodetype": "Nodetype",
+ "objecttype": "Type",
+ "stylesheet": "Stylesheet",
+ "script": "Script",
+ "tab": "Faneblad",
+ "tabname": "Titel på faneblad",
+ "tabs": "Faneblade",
+ "createMatchingTemplate": "Opret tilsvarende skabelon",
+ "addIcon": "Tilføj ikon",
+ "contentTypeEnabled": "Master Content Type enabled",
+ "contentTypeUses": "This Content Type uses",
+ "noPropertiesDefinedOnTab": "No properties defined on this tab. Click on the \"add a new property\" link at\n the top to create a new property.\n "
+ },
+ "sort": {
+ "sortOrder": "Sorteringsrækkefølge",
+ "sortCreationDate": "Oprettelsesdato",
+ "sortDone": "Sortering udført",
+ "sortHelp": "Træk de forskellige sider op eller ned for at indstille hvordan de skal arrangeres, eller klik\n på kolonnehovederne for at sortere hele rækken af sider\n ",
+ "sortPleaseWait": "Vent venligst mens siderne sorteres. Det kan tage et stykke tid.",
+ "sortEmptyState": "Denne node har ingen under noder at sortere"
+ },
+ "speechBubbles": {
+ "validationFailedHeader": "Validering",
+ "validationFailedMessage": "Valideringsfejl skal rettes før elementet kan gemmes",
+ "operationFailedHeader": "Fejlet",
+ "operationSavedHeader": "Gemt",
+ "operationSavedHeaderReloadUser": "Gemt. For at se ændringerne skal du genindlæse din browser",
+ "invalidUserPermissionsText": "Utilstrækkelige brugerrettigheder, kunne ikke fuldføre handlingen",
+ "operationCancelledHeader": "Annulleret",
+ "operationCancelledText": "Handlingen blev annulleret af et 3. part tilføjelsesprogram",
+ "contentPublishedFailedByEvent": "Udgivelsen blev annulleret af et 3. part tilføjelsesprogram",
+ "contentTypeDublicatePropertyType": "Property type eksisterer allerede",
+ "contentTypePropertyTypeCreated": "Egenskabstype oprettet",
+ "contentTypePropertyTypeCreatedText": "Navn: %0% DataType: %1%",
+ "contentTypePropertyTypeDeleted": "Egenskabs type slettet",
+ "contentTypeSavedHeader": "Indholdstype gemt",
+ "contentTypeTabCreated": "Du har oprettet et faneblad",
+ "contentTypeTabDeleted": "Faneblad slettet",
+ "contentTypeTabDeletedText": "Faneblad med id: %0% slettet",
+ "cssErrorHeader": "Stylesheetet blev ikke gemt",
+ "cssSavedHeader": "Stylesheet gemt",
+ "cssSavedText": "Stylesheet gemt uden fejl",
+ "dataTypeSaved": "Datatype gemt",
+ "dictionaryItemSaved": "Ordbogsnøgle gemt",
+ "editContentPublishedFailedByParent": "Udgivelse fejlede da overliggende side ikke er udgivet",
+ "editContentPublishedHeader": "Indhold publiceret",
+ "editContentPublishedText": "og nu synligt for besøgende",
+ "editMultiContentPublishedText": "%0% dokumenter udgivet og synlige på hjemmesiden",
+ "editVariantPublishedText": "%0% udgivet og synligt på hjemmesiden",
+ "editMultiVariantPublishedText": "%0% dokumenter udgivet for sprogene %1% og synlige på hjemmesiden",
+ "editBlueprintSavedHeader": "Indholdsskabelon gemt",
+ "editBlueprintSavedText": "Rettelser er blevet gemt",
+ "editContentSavedHeader": "Indhold gemt",
+ "editContentSavedText": "Husk at publicere for at gøre det synligt for besøgende",
+ "editContentScheduledSavedText": "En planlægning for udgivelse er blevet opdateret",
+ "editVariantSavedText": "%0% gemt",
+ "editContentSendToPublish": "Send til Godkendelse",
+ "editContentSendToPublishText": "Rettelser er blevet sendt til godkendelse",
+ "editVariantSendToPublishText": "%0% rettelser er blevet sendt til godkendelse",
+ "editMediaSaved": "Medie gemt",
+ "editMediaSavedText": "Medie gemt uden problemer",
+ "editMemberSaved": "Medlem gemt",
+ "editStylesheetPropertySaved": "Stylesheetegenskab gemt",
+ "editStylesheetSaved": "Stylesheet gemt",
+ "editTemplateSaved": "Skabelon gemt",
+ "editUserError": "Der er opstået en fejl under redigering",
+ "editUserSaved": "Bruger gemt",
+ "editUserTypeSaved": "Brugertype gemt",
+ "editUserGroupSaved": "Brugergruppe gemt",
+ "editCulturesAndHostnamesSaved": "Sprog og domæner gemt",
+ "editCulturesAndHostnamesError": "Der opstod en fejl ved at gemme sprog og domæner",
+ "fileErrorHeader": "Fil ikke gemt",
+ "fileErrorText": "Filen kunne ikke gemmes. Tjek filrettighederne",
+ "fileSavedHeader": "Fil gemt",
+ "fileSavedText": "Fil gemt uden fejl",
+ "languageSaved": "Sprog gemt",
+ "mediaTypeSavedHeader": "Medietype gemt",
+ "memberTypeSavedHeader": "Medlemstype gemt",
+ "memberGroupSavedHeader": "Medlemsgruppe gemt",
+ "templateErrorHeader": "Skabelon ikke gemt",
+ "templateErrorText": "Undgå venligst at du har 2 templates med samme alias",
+ "templateSavedHeader": "Skabelon gemt",
+ "templateSavedText": "Skabelon gemt uden fejl!",
+ "contentUnpublished": "Indhold fjernet fra udgivelse",
+ "contentCultureUnpublished": "Indhold variation %0% afpubliceret",
+ "contentMandatoryCultureUnpublished": "Det krævet sprog '%0%' var afpubliceret. Alle sprog for dette\n indholds element er nu afpubliceret.\n ",
+ "partialViewSavedHeader": "Partial view gemt",
+ "partialViewSavedText": "Partial view gemt uden fejl!",
+ "partialViewErrorHeader": "Partial view ikke gemt",
+ "partialViewErrorText": "Der opstod en fejl ved at gemme filen.",
+ "permissionsSavedFor": "Rettigheder gemt for",
+ "deleteUserGroupsSuccess": "Slettede %0% brugergrupper",
+ "deleteUserGroupSuccess": "%0% blev slettet",
+ "enableUsersSuccess": "Aktiverede %0% brugere",
+ "disableUsersSuccess": "Deaktiverede %0% brugere",
+ "enableUserSuccess": "%0% er nu aktiveret",
+ "disableUserSuccess": "%0% er nu deaktiveret",
+ "setUserGroupOnUsersSuccess": "Brugergrupper er blevet indstillet",
+ "unlockUsersSuccess": "LÃ¥ste %0% brugere op",
+ "unlockUserSuccess": "%0% er nu låst op",
+ "memberExportedSuccess": "Medlem blev exportet til fil",
+ "memberExportedError": "Der skete en fejl under exporteringen af medlemmet",
+ "deleteUserSuccess": "Brugeren %0% blev slettet",
+ "resendInviteHeader": "Invitér bruger",
+ "resendInviteSuccess": "Invitationen blev gensendt til %0%",
+ "contentReqCulturePublishError": "Kan ikke udgive dokumentet da det krævet '%0%' ikke er udgivet",
+ "contentCultureValidationError": "Validering fejlede for sproget '%0%'",
+ "documentTypeExportedSuccess": "Dokumenttypen blev eksporteret til en fil",
+ "documentTypeExportedError": "Der skete en fejl under eksport af en dokumenttype",
+ "scheduleErrReleaseDate1": "Udgivelses datoen kan ikke ligge i fortiden",
+ "scheduleErrReleaseDate2": "Kan ikke planlægge dokumentes udgivelse da det krævet '%0%' ikke er udgivet\n ",
+ "scheduleErrReleaseDate3": "Kan ikke planlægge dokumentes udgivelse da det krævet '%0%' har en senere\n udgivelses dato end et ikke krævet sprog\n ",
+ "scheduleErrExpireDate1": "Afpubliceringsdatoen kan ikke ligge i fortiden",
+ "scheduleErrExpireDate2": "Afpubliceringsdatoen kan ikke være før udgivelsesdatoen",
+ "publishWithNoDomains": "Domæner er ikke konfigureret for en flersproget side, kontakt vensligst en\n administrator, se loggen for mere information\n ",
+ "publishWithMissingDomain": "Der er ikke noget domæne konfigureret for %0%, kontakt vensligst en\n administrator, se loggen for mere information\n ",
+ "copySuccessMessage": "Dit systems information er blevet kopieret til udklipsholderen",
+ "cannotCopyInformation": "Kunne desværre ikke kopiere dit systems information til udklipsholderen",
+ "folderUploadNotAllowed": "This file is being uploaded as part of a folder, but creating a new folder is not allowed here",
+ "folderCreationNotAllowed": "Creating a new folder is not allowed here",
+ "memberGroupNameDuplicate": "Another Member Group with the same name already exists",
+ "dictionaryItemExportedSuccess": "Dictionary item(s) was exported to file",
+ "dictionaryItemExportedError": "An error occurred while exporting the dictionary item(s)",
+ "dictionaryItemImported": "The following dictionary item(s) has been imported!",
+ "preventCleanupEnableError": "An error occurred while enabling version cleanup for %0%",
+ "preventCleanupDisableError": "An error occurred while disabling version cleanup for %0%"
+ },
+ "stylesheet": {
+ "addRule": "Tilføj style",
+ "editRule": "Redigér style",
+ "editorRules": "Teksteditor-styles",
+ "editorRulesHelp": "Definér de styles, der skal være tilgængelige i teksteditoren for dette stylesheet\n ",
+ "selector": "Selector",
+ "selectorHelp": "Bruger CSS-syntaks, f.eks. \"h1\" eller \".redheader\"",
+ "editstylesheet": "Rediger stylesheet",
+ "editstylesheetproperty": "Rediger CSS-egenskab",
+ "nameHelp": "Det navn der vises i teksteditoren",
+ "preview": "Forhåndsvisning",
+ "previewHelp": "Hvordan teksten vil se ud i teksteditoren.",
+ "styles": "Styles",
+ "stylesHelp": "Den CSS der skal anvendes i teksteditoren, f.eks. \"color:red;\"",
+ "tabCode": "Kode",
+ "tabRules": "Editor"
+ },
+ "template": {
+ "deleteByIdFailed": "Sletning af skabelonen med ID %0% fejlede",
+ "edittemplate": "Rediger skabelon",
+ "insertSections": "Sektioner",
+ "insertContentArea": "Indsæt indholdsområde",
+ "insertContentAreaPlaceHolder": "Indsæt pladsholder for indholdsområde",
+ "insert": "Indsæt",
+ "insertDesc": "Hvad vil du indsætte?",
+ "insertDictionaryItem": "Oversættelse",
+ "insertDictionaryItemDesc": "Indsætter en oversætbar tekst, som skifter efter det sprog, som websitet vises\n i.\n ",
+ "insertMacro": "Makro",
+ "insertMacroDesc": "\n En makro er et element, som kan have forskellige indstillinger, når det indsættes.\n Brug det som en genbrugelig del af dit design såsom gallerier, formularer og lister.\n ",
+ "insertPageField": "Sideværdi",
+ "insertPageFieldDesc": "\n Viser værdien af et felt fra den nuværende side. Kan indstilles til at bruge rekursive værdier eller\n vise en standardværdi i tilfælde af, at feltet er tomt.\n ",
+ "insertPartialView": "Partial view",
+ "insertPartialViewDesc": "\n Et Partial View er et skabelonelement, som kan indsættes i andre skabeloner og derved\n genbruges og deles på tværs af sideskabelonerne.\n ",
+ "mastertemplate": "Master skabelon",
+ "quickGuide": "Lynguide til Umbracos skabelontags",
+ "noMaster": "Ingen master",
+ "renderBody": "Indsæt en underliggende skabelon",
+ "renderBodyDesc": "\n Henter indholdet af en underliggende skabelon ind, ved at\n indsætte et @RenderBody() element.\n ",
+ "defineSection": "Definer en sektion",
+ "defineSectionDesc": "\n Definerer en del af din skabelon som en navngivet sektion, ved at\n omkranse den i @section { ... }. Herefter kan denne sektion flettes ind i\n overliggende skabelon ved at indsætte et @RenderSection element.\n ",
+ "renderSection": "Indsæt en sektion",
+ "renderSectionDesc": "\n Henter indholdet af en sektion fra den underliggende skabelon ind, ved at indsætte et\n @RenderSection(name) element. Den underliggende skabelon skal have\n defineret en sektion via et @section [name]{ ... } element.\n ",
+ "sectionName": "Sektionsnavn",
+ "sectionMandatory": "Sektionen er obligatorisk",
+ "sectionMandatoryDesc": "\n Hvis obligatorisk, skal underskabelonen indeholde en @section -definition.\n ",
+ "queryBuilder": "Query builder",
+ "itemsReturned": "sider returneret, på",
+ "iWant": "Returner",
+ "allContent": "alt indhold",
+ "contentOfType": "indhold af typen \"%0%\"",
+ "from": "fra",
+ "websiteRoot": "mit website",
+ "where": "hvor",
+ "and": "og",
+ "is": "er",
+ "isNot": "ikke er",
+ "before": "er før",
+ "beforeIncDate": "er før (inkl. valgte dato)",
+ "after": "er efter",
+ "afterIncDate": "er efter (inkl. valgte dato)",
+ "equals": "er",
+ "doesNotEqual": "ikke er",
+ "contains": "indeholder",
+ "doesNotContain": "ikke indeholder",
+ "greaterThan": "er større end",
+ "greaterThanEqual": "er større end eller det samme som",
+ "lessThan": "er mindre end",
+ "lessThanEqual": "er mindre end eller det samme som",
+ "id": "Id",
+ "name": "Navn",
+ "createdDate": "Oprettelsesdato",
+ "lastUpdatedDate": "Sidste opdatering",
+ "orderBy": "Sortér efter",
+ "ascending": "stigende rækkefølge",
+ "descending": "faldende rækkefølge",
+ "template": "Skabelon",
+ "runtimeModeProduction": "Content is not editable when using runtime mode Production."
+ },
+ "grid": {
+ "media": "Billede",
+ "macro": "Macro",
+ "insertControl": "Vælg indholdstype",
+ "chooseLayout": "Vælg layout",
+ "addRows": "Tilføj række",
+ "addElement": "Tilføj indhold",
+ "dropElement": "Slip indhold",
+ "settingsApplied": "Indstillinger tilføjet",
+ "contentNotAllowed": "Indholdet er ikke tilladt her",
+ "contentAllowed": "Indholdet er tilladt her",
+ "clickToEmbed": "Klik for at indlejre",
+ "clickToInsertImage": "Klik for at indsætte et billede",
+ "placeholderWriteHere": "Skriv her...",
+ "gridLayouts": "Grid layout",
+ "gridLayoutsDetail": "Et layout er det overordnede arbejdsområde til dit grid - du vil typisk kun behøve ét\n eller to\n ",
+ "addGridLayout": "Tilføj grid layout",
+ "editGridLayout": "Rediger grid layout",
+ "addGridLayoutDetail": "Juster dit layout ved at justere kolonnebredder og tilføj yderligere sektioner\n ",
+ "rowConfigurations": "Rækkekonfigurationer",
+ "rowConfigurationsDetail": "Rækker er foruddefinerede celler, der arrangeres vandret",
+ "addRowConfiguration": "Tilføj rækkekonfiguration",
+ "editRowConfiguration": "Rediger rækkekonfiguration",
+ "addRowConfigurationDetail": "Juster rækken ved at indstille cellebredder og tilføje yderligere celler\n ",
+ "noConfiguration": "Ingen yderligere konfiguration tilgængelig",
+ "columns": "Kolonner",
+ "columnsDetails": "Det totale antal kolonner i dit grid",
+ "settings": "Indstillinger",
+ "settingsDetails": "Konfigurer, hvilket indstillinger, brugeren kan ændre",
+ "styles": "Typografi",
+ "stylesDetails": "Vælg hvilke typografiværdier en redaktør kan ændre",
+ "allowAllEditors": "Tillad alle editorer",
+ "allowAllRowConfigurations": "Tillad alle rækkekonfigurationer",
+ "setAsDefault": "Sæt som standard",
+ "chooseExtra": "Vælg ekstra",
+ "chooseDefault": "Vælg standard",
+ "areAdded": "er tilføjet",
+ "youAreDeleting": "Du sletter en rækkekonfiguration",
+ "deletingARow": "Sletning af et rækkekonfigurations navn vil resultere i et tab af data for alle\n eksiterende indhold som bruger dens konfiguration.\n ",
+ "deleteLayout": "Du sletter et layoutet",
+ "deletingALayout": "Når du redigerer et layout vil data gå tabt de steder, hvor denne konfiguration\n bruges.\n ",
+ "maxItems": "Maksimalt emner",
+ "maxItemsDescription": "Efterlad blank eller sæt til 0 for ubegrænset",
+ "clickToInsertMacro": "Click to insert macro",
+ "warning": "Warning",
+ "warningText": "Modifying a row configuration name will result in loss of data for any existing content that is based on this configuration.
Modifying only the label will not result in data loss.
"
+ },
+ "contentTypeEditor": {
+ "compositions": "Kompositioner",
+ "group": "Gruppe",
+ "noGroups": "Du har ikke tilføjet nogen grupper",
+ "addGroup": "Tilføj gruppe",
+ "inheritedFrom": "Nedarvet fra",
+ "addProperty": "Tilføj egenskab",
+ "requiredLabel": "Påkrævet label",
+ "enableListViewHeading": "Aktivér listevisning",
+ "enableListViewDescription": "Konfigurér indholdet til at blive vist i en sortérbar og søgbar liste;\n undersider vil ikke blive vist i træet\n ",
+ "allowedTemplatesHeading": "Tilladte skabeloner",
+ "allowedTemplatesDescription": "Vælg hvilke skabeloner, der er tilladt at bruge på dette indhold.",
+ "allowAsRootHeading": "Tillad på rodniveau",
+ "allowAsRootDescription": "Kun dokumenttyper med denne indstilling aktiveret kan oprettes i rodniveau under\n indhold og mediearkiv.\n ",
+ "childNodesHeading": "Tilladte typer",
+ "childNodesDescription": "Tillad at oprette indhold af en specifik type under denne.",
+ "chooseChildNode": "Vælg child node",
+ "compositionsDescription": "Nedarv faner og egenskaber fra en anden dokumenttype. Nye faner vil blive\n tilføjet den nuværende dokumenttype eller sammenflettet hvis fanenavnene er ens.\n ",
+ "compositionInUse": "Indholdstypen bliver brugt i en komposition og kan derfor ikke blive anvendt som\n komposition\n ",
+ "noAvailableCompositions": "Der er ingen indholdstyper tilgængelige at bruge som komposition",
+ "compositionRemoveWarning": "Når du fjerner en komposition vil alle associerede indholdsdata blive slettet.\n Når først dokumenttypen er gemt, er der ingen vej tilbage.\n ",
+ "availableEditors": "Opret ny indstilling",
+ "reuse": "Genbrug",
+ "editorSettings": "Input indstillinger",
+ "searchResultSettings": "Tilgængelige indstillinger",
+ "searchResultEditors": "Opret ny indstilling",
+ "configuration": "Konfiguration",
+ "yesDelete": "Ja, slet",
+ "movedUnderneath": "blev flyttet til",
+ "copiedUnderneath": "blev kopieret til",
+ "folderToMove": "Vælg hvor",
+ "folderToCopy": "Vælg hvor",
+ "structureBelow": "skal flyttes til",
+ "allDocumentTypes": "Alle dokumenttyper",
+ "allDocuments": "Alle dokumenter",
+ "allMediaItems": "Alle medier",
+ "usingThisDocument": "som benytter denne dokumenttype vil blive slettet permanent. Bekræft at du også vil\n slette dem.\n ",
+ "usingThisMedia": "som benytter denne medietype vil blive slettet permanent. Bekræft at du også vil slette\n dem.\n ",
+ "usingThisMember": "som benytter denne medlemstype vil blive slettet permanent. Bekræft at du også vil\n slette dem.\n ",
+ "andAllDocuments": "og alle dokumenter, som benytter denne type",
+ "andAllMediaItems": "og alle medier, som benytter denne type",
+ "andAllMembers": "og alle medlemmer, som benytter denne type",
+ "memberCanEdit": "Medlem kan redigere",
+ "memberCanEditDescription": "Tillad at denne egenskab kan redigeres af medlemmet på dets profil.",
+ "isSensitiveData": "Er følsom data",
+ "isSensitiveDataDescription": "Skjul værdien af denne egenskab for indholdsredaktører der ikke har adgang\n til at se følsomme data\n ",
+ "showOnMemberProfile": "Vis på medlemsprofil",
+ "showOnMemberProfileDescription": "Tillad at denne egenskab kan vises på medlemmets profil.",
+ "tabHasNoSortOrder": "fane har ingen sorteringsrækkefølge",
+ "compositionUsageHeading": "Hvor er denne komposition brugt?",
+ "compositionUsageSpecification": "Denne komposition brugt i kompositionen af de følgende indholdstyper:\n ",
+ "variantsHeading": "Tillad variationer",
+ "cultureVariantHeading": "Tillad sprogvariation",
+ "segmentVariantHeading": "Tillad segmentering",
+ "cultureVariantLabel": "Tillader sprogvariationer",
+ "segmentVariantLabel": "Tillader segmentering",
+ "variantsDescription": "Tillad at redaktører kan oprette indhold af denne type på flere sprog.",
+ "cultureVariantDescription": "Tillad at redaktører kan oprette dette indhold på flere sprog.",
+ "segmentVariantDescription": "Tillad at redaktører kan oprette flere udgaver af denne type indhold.",
+ "allowVaryByCulture": "Tillad sprogvariation",
+ "allowVaryBySegment": "Tillad segmentering",
+ "elementType": "Element-type",
+ "elementHeading": "Er en Element-type",
+ "elementDescription": "En Element-type er tiltænkt brug i andre Dokumenttyper, ikke i indholdstræet.\n ",
+ "elementCannotToggle": "En Dokumenttype kan ikke ændres til en Element-type efter den er blevet brugt til\n at oprette en eller flere indholds elementer.\n ",
+ "elementDoesNotSupport": "Dette benyttes ikke for en Element-type",
+ "propertyHasChanges": "Du har lavet ændringer til denne egenskab. Er du sikker på at du vil kassere dem?\n ",
+ "displaySettingsHeadline": "Visning",
+ "displaySettingsLabelOnTop": "Label hen over (fuld bredde)",
+ "removeChildNode": "Du fjerner noden",
+ "removeChildNodeWarning": "Fjernelse af noden, begrænser redaktørens muligheder for at oprette forskellige\n typer af underindhold.\n ",
+ "groupReorderSameAliasError": "You can't move the group %0% to this tab because the group will get the same\n alias as a tab: \"%1%\". Rename the group to continue.\n ",
+ "confirmDeleteTabMessage": "Are you sure you want to delete the tab %0% ?",
+ "confirmDeleteGroupMessage": "Are you sure you want to delete the group %0% ?",
+ "confirmDeletePropertyMessage": "Are you sure you want to delete the property %0% ?",
+ "confirmDeleteTabNotice": "This will also delete all items below this tab.",
+ "confirmDeleteGroupNotice": "This will also delete all items below this group.",
+ "addTab": "Add tab",
+ "convertToTab": "Convert to tab",
+ "tabDirectPropertiesDropZone": "Drag properties here to place directly on the tab",
+ "usingEditor": "using this editor will get updated with the new settings.",
+ "historyCleanupHeading": "History cleanup",
+ "historyCleanupDescription": "Allow overriding the global history cleanup settings.",
+ "historyCleanupKeepAllVersionsNewerThanDays": "Keep all versions newer than days",
+ "historyCleanupKeepLatestVersionPerDayForDays": "Keep latest version per day for days",
+ "historyCleanupPreventCleanup": "Prevent cleanup",
+ "historyCleanupEnableCleanup": "Enable cleanup",
+ "historyCleanupGloballyDisabled": "NOTE! The cleanup of historically content versions are disabled globally. These settings will not take effect before it is enabled.",
+ "changeDataTypeHelpText": "Changing a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json."
+ },
+ "languages": {
+ "addLanguage": "Tilføj sprog",
+ "mandatoryLanguage": "Påkrævet sprog",
+ "mandatoryLanguageHelp": "Egenskaber på dette sprog skal være udfyldt før noden kan blive udgivet.",
+ "defaultLanguage": "Standardsprog",
+ "defaultLanguageHelp": "Et Umbraco-site kan kun have ét standardsprog.",
+ "changingDefaultLanguageWarning": "At skifte standardsprog kan resultere i at standardindhold mangler.\n ",
+ "fallsbackToLabel": "Fallback til",
+ "noFallbackLanguageOption": "Intet fallback-sprog",
+ "fallbackLanguageDescription": "For at tillade flersproget indhold, som ikke er tilgængeligt i det anmodede\n sprog, skal du her vælge et sprog at falde tilbage på.\n ",
+ "fallbackLanguage": "Fallback-sprog",
+ "none": "ingen",
+ "culture": "ISO code",
+ "invariantPropertyUnlockHelp": "%0% is shared across languages and segments.",
+ "invariantCulturePropertyUnlockHelp": "%0% is shared across all languages.",
+ "invariantSegmentPropertyUnlockHelp": "%0% is shared across all segments.",
+ "invariantLanguageProperty": "Shared: Languages",
+ "invariantSegmentProperty": "Shared: Segments"
+ },
+ "macro": {
+ "addParameter": "Tilføj parameter",
+ "editParameter": "Redigér parameter",
+ "enterMacroName": "Indtast makronavn",
+ "parameters": "Parametre",
+ "parametersDescription": "Definér de parametre der skal være tilgængelige, når du bruger denne makro.",
+ "selectViewFile": "Vælg partial view makrofil"
+ },
+ "modelsBuilder": {
+ "buildingModels": "Bygger modeller",
+ "waitingMessage": "dette kan tage lidt tid",
+ "modelsGenerated": "Modeller genereret",
+ "modelsGeneratedError": "Modeller kunne ikke genereres",
+ "modelsExceptionInUlog": "Modelgeneration fejlet, se fejlmeddelelse i log"
+ },
+ "templateEditor": {
+ "addDefaultValue": "Tilføj standard værdi",
+ "defaultValue": "Standard værdi",
+ "alternativeField": "Alternativt felt",
+ "alternativeText": "Alternativ tekst",
+ "casing": "Casing",
+ "encoding": "Kodning",
+ "chooseField": "Felt som skal indsættes",
+ "convertLineBreaks": "Konvertér linjeskift",
+ "convertLineBreaksHelp": "Erstatter et linjeskift med html-tag'et <br>",
+ "customFields": "Custom felter",
+ "dateOnly": "Ja, kun dato",
+ "formatAsDate": "Formatér som dato",
+ "htmlEncode": "HTML indkod",
+ "htmlEncodeHelp": "Vil erstatte specielle karakterer med deres HTML jævnbyrdige.",
+ "insertedAfter": "Denne tekst vil blive sat ind lige efter værdien af feltet",
+ "insertedBefore": "Denne tekst vil blive sat ind lige før værdien af feltet",
+ "lowercase": "Lowercase",
+ "none": "Ingen",
+ "outputSample": "Udskrift eksempel",
+ "postContent": "Indsæt efter felt",
+ "preContent": "Indsæt før felt",
+ "recursive": "Rekursivt",
+ "recursiveDescr": "Ja, lav det rekursivt",
+ "removeParagraph": "Fjern paragraf-tags",
+ "removeParagraphHelp": "Fjerner eventuelle <P> omkring teksten",
+ "standardFields": "Standard felter",
+ "uppercase": "Store bogstaver",
+ "urlEncode": "URL encode",
+ "urlEncodeHelp": "Hvis indholdet af felterne skal sendes til en URL, skal denne slåes til så specialtegn\n formateres\n ",
+ "usedIfAllEmpty": "Denne tekst bruges hvis ovenstående felter er tomme",
+ "usedIfEmpty": "Dette felt vil blive brugt hvis ovenstående felt er tomt",
+ "withTime": "Ja, med klokkeslæt. Dato/tid separator:"
+ },
+ "translation": {
+ "details": "Oversættelsesdetaljer",
+ "DownloadXmlDTD": "Download XML DTD",
+ "fields": "Felter",
+ "includeSubpages": "Inkluder undersider",
+ "mailBody": "Hej %0%. Dette er en automatisk mail sendt for at informere dig om at dokumentet '%1' har en\n forespørgsel omkring oversættelse til '%5%' af %2%. Gå til http://%3%/translation/details.aspx?id=%4% for at\n redigere. Eller log ind i Umbraco for at få en oversigt over dine oversættelsesopgaver: http://%3%/Umbraco Hav en\n god dag! Mange hilsner Umbraco-robotten\n ",
+ "noTranslators": "Ingen oversættelsesbrugere er fundet. Opret venligst en oversættelsesbruger før du\n begynder at sende indhold til oversættelse\n ",
+ "pageHasBeenSendToTranslation": "Siden '%0%' er blevet sent til oversættelse",
+ "sendToTranslate": "Send siden '%0%' til oversættelse",
+ "totalWords": "Totalt antal ord",
+ "translateTo": "Oversæt til",
+ "translationDone": "Oversættelse gennemført.",
+ "translationDoneHelp": "Du kan gennemse de sider, som du lige har oversat, ved at klikke nedenfor. Hvis den\n originale side bliver fundet, vil du blive præsenteret for en sammenligning af de to sider.\n ",
+ "translationFailed": "Oversættelse fejlede, XML-filen kan være korrupt (indeholde fejl)",
+ "translationOptions": "Oversættelsesmuligheder",
+ "translator": "Oversætter",
+ "uploadTranslationXml": "Upload oversættelse (xml)"
+ },
+ "treeHeaders": {
+ "content": "Indhold",
+ "contentBlueprints": "Indholdsskabeloner",
+ "media": "Mediearkiv",
+ "cacheBrowser": "Cacheviser",
+ "contentRecycleBin": "Papirkurv",
+ "createdPackages": "Oprettede pakker",
+ "dataTypes": "Datatyper",
+ "dictionary": "Ordbog",
+ "installedPackages": "Installerede pakker",
+ "installSkin": "Installér et skin",
+ "installStarterKit": "Installér et starterkit",
+ "languages": "Sprog",
+ "localPackage": "Installér lokal pakke",
+ "macros": "Makroer",
+ "mediaTypes": "Medietyper",
+ "member": "Medlemmer",
+ "memberGroups": "Medlemsgrupper",
+ "memberRoles": "Roller",
+ "memberTypes": "Medlemstyper",
+ "documentTypes": "Dokumenttyper",
+ "relationTypes": "Relationstyper",
+ "packager": "Pakker",
+ "packages": "Pakker",
+ "partialViews": "Partial Views",
+ "partialViewMacros": "Partial View makrofiler",
+ "repositories": "Installer fra \"repository\"",
+ "runway": "Installer Runway",
+ "runwayModules": "Runway-moduler",
+ "scripting": "Scripting filer",
+ "scripts": "Scripts",
+ "stylesheets": "Stylesheets",
+ "templates": "Skabeloner",
+ "logViewer": "Logfremviser",
+ "userPermissions": "Brugertilladelser",
+ "userTypes": "Brugertyper",
+ "users": "Brugere",
+ "settingsGroup": "Indstillinger",
+ "templatingGroup": "Design og layout",
+ "thirdPartyGroup": "Tredjepart"
+ },
+ "update": {
+ "updateAvailable": "Ny opdatering er klar",
+ "updateDownloadText": "%0% er klar, klik her for at downloade",
+ "updateNoServer": "Ingen forbindelse til server",
+ "updateNoServerError": "Der kunne ikke tjekkes for ny opdatering. Se trace for mere info."
+ },
+ "user": {
+ "access": "Adgang",
+ "accessHelp": "Baseret på de tildelte grupper og startnoder har brugeren adgang til følgende noder",
+ "assignAccess": "Tildel adgang",
+ "administrators": "Administrator",
+ "categoryField": "Kategorifelt",
+ "createDate": "Bruger oprettet",
+ "changePassword": "Skift dit kodeord",
+ "changePhoto": "Skift billede",
+ "newPassword": "Nyt kodeord",
+ "newPasswordFormatLengthTip": "Minium %0% karakterer tilbage!",
+ "newPasswordFormatNonAlphaTip": "Der skal som minium være %0% specielle karakterer.",
+ "noLockouts": "er ikke blevet låst ude",
+ "noPasswordChange": "Kodeordet er ikke blevet ændret",
+ "confirmNewPassword": "Gentag dit nye kodeord",
+ "changePasswordDescription": "Du kan ændre dit kodeord, som giver dig adgang til Umbraco backoffice ved at\n udfylde formularen og klikke på knappen 'Skift dit kodeord'\n ",
+ "contentChannel": "Indholdskanal",
+ "createAnotherUser": "Opret endnu en bruger",
+ "createUserHelp": "Opret nye brugere for at give dem adgang til Umbraco. NÃ¥r en ny bruger oprettes,\n genereres der en adgangskode, som du kan dele med brugeren.\n ",
+ "descriptionField": "Beskrivelsesfelt",
+ "disabled": "Deaktivér bruger",
+ "documentType": "Dokumenttype",
+ "editors": "Redaktør",
+ "excerptField": "Uddragsfelt",
+ "failedPasswordAttempts": "Fejlede loginforsøg",
+ "goToProfile": "GÃ¥ til brugerprofil",
+ "groupsHelp": "Tilføj grupper for at tildele adgang og tilladelser",
+ "inviteAnotherUser": "Invitér anden bruger",
+ "inviteUserHelp": "Invitér nye brugere til at give dem adgang til Umbraco. En invitation vil blive sendt\n via e-mail til brugeren med oplysninger om, hvordan man logger ind i Umbraco.\n ",
+ "language": "Sprog",
+ "languageHelp": "Indstil det sprog, du vil se i menuer og dialoger",
+ "lastLockoutDate": "Senest låst ude",
+ "lastLogin": "Seneste login",
+ "lastPasswordChangeDate": "Kodeord sidst ændret",
+ "loginname": "Brugernavn",
+ "mediastartnode": "Startnode i mediearkivet",
+ "mediastartnodehelp": "Begræns mediebiblioteket til en bestemt startnode",
+ "mediastartnodes": "Medie startnoder",
+ "mediastartnodeshelp": "Begræns mediebiblioteket til bestemte startnoder",
+ "modules": "Moduler",
+ "noConsole": "Deaktivér adgang til Umbraco",
+ "noLogin": "har endnu ikke logget ind",
+ "oldPassword": "Gammelt kodeord",
+ "password": "Adgangskode",
+ "resetPassword": "Nulstil kodeord",
+ "passwordChanged": "Dit kodeord er blevet ændret!",
+ "passwordChangedGeneric": "Kodeord ændret",
+ "passwordConfirm": "Bekræft venligst dit nye kodeord",
+ "passwordEnterNew": "Indtast dit nye kodeord",
+ "passwordIsBlank": "Dit nye kodeord kan ikke være blankt!",
+ "passwordCurrent": "Nuværende kodeord",
+ "passwordInvalid": "ugyldig nuværende kodeord",
+ "passwordIsDifferent": "Dit nye kodeord og dit bekræftede kodeord var ikke ens, forsøg venligst igen!",
+ "passwordMismatch": "Det bekræftede kodeord matcher ikke det nye kodeord",
+ "permissionReplaceChildren": "Erstat underelement-rettigheder",
+ "permissionSelectedPages": "Du ændrer i øjeblikket rettigheder for siderne:",
+ "permissionSelectPages": "Vælg sider for at ændre deres rettigheder",
+ "removePhoto": "Fjern billede",
+ "permissionsDefault": "Standardrettigheder",
+ "permissionsGranular": "Granulære rettigheder",
+ "permissionsGranularHelp": "Sæt rettigheder for specifikke noder",
+ "profile": "Profil",
+ "searchAllChildren": "Søg alle 'børn'",
+ "languagesHelp": "Tilføj sprog for at give brugerne adgang til at redigere",
+ "sectionsHelp": "Tilføj sektioner for at give brugerne adgang",
+ "selectUserGroups": "Vælg brugergrupper",
+ "noStartNode": "Ingen startnode valgt",
+ "noStartNodes": "Ingen startnoder valgt",
+ "startnode": "Indhold startnode",
+ "startnodehelp": "Begræns indholdstræet til en bestemt startnode",
+ "startnodes": "Indhold startnoder",
+ "startnodeshelp": "Begræns indholdstræet til bestemte startnoder",
+ "updateDate": "Bruger sidst opdateret",
+ "userCreated": "er blevet oprettet",
+ "userCreatedSuccessHelp": "Den nye bruger er blevet oprettet. For at logge ind i Umbraco skal du bruge\n adgangskoden nedenfor.\n ",
+ "userManagement": "Brugeradministration",
+ "username": "Navn",
+ "userPermissions": "Brugertilladelser",
+ "usergroup": "Brugergruppe",
+ "userInvited": "er blevet inviteret",
+ "userInvitedSuccessHelp": "En invitation er blevet sendt til den nye bruger med oplysninger om, hvordan man\n logger ind i Umbraco.\n ",
+ "userinviteWelcomeMessage": "Hej og velkommen til Umbraco! På bare 1 minut vil du være klar til at komme i\n gang, vi skal bare have dig til at oprette en adgangskode og tilføje et billede til din avatar.\n ",
+ "userinviteExpiredMessage": "Velkommen til Umbraco! Desværre er din invitation udløbet. Kontakt din\n administrator og bed om at gensende invitationen.\n ",
+ "userinviteAvatarMessage": "Hvis du uploader et billede af dig selv, gør du det nemt for andre brugere at\n genkende dig. Klik på cirklen ovenfor for at uploade et billede.\n ",
+ "writer": "Forfatter",
+ "configureTwoFactor": "Konfigurer totrinsbekræftelse",
+ "change": "Skift",
+ "yourProfile": "Din profil",
+ "yourHistory": "Din historik",
+ "sessionExpires": "Session udløber",
+ "inviteUser": "Invitér bruger",
+ "createUser": "Opret bruger",
+ "sendInvite": "Send invitation",
+ "backToUsers": "Tilbage til brugere",
+ "inviteEmailCopySubject": "Umbraco: Invitation",
+ "inviteEmailCopyFormat": "Hej %0%, du er blevet inviteret af %1% til Umbraco backoffice.
Besked fra %1%: %2%
Klik på dette link for acceptere invitationen
Hvis du ikke kan klikke på linket, så kopier og indsæt denne URL i dit browservindue %3%
",
+ "defaultInvitationMessage": "Gensender invitation...",
+ "deleteUser": "Slet bruger",
+ "deleteUserConfirmation": "Er du sikker på du ønsker at slette denne brugers konto?",
+ "stateAll": "Alle",
+ "stateActive": "Aktiv",
+ "stateDisabled": "Deaktiveret",
+ "stateLockedOut": "LÃ¥st ude",
+ "stateApproved": "Godkendt",
+ "stateInvited": "Inviteret",
+ "stateInactive": "Inaktiv",
+ "sortNameAscending": "Navn (A-Ã…)",
+ "sortNameDescending": "Navn (Ã…-A)",
+ "sortCreateDateAscending": "Nyeste",
+ "sortCreateDateDescending": "Ældste",
+ "sortLastLoginDateDescending": "Sidst logget ind",
+ "noUserGroupsAdded": "Ingen brugere er blevet tilføjet",
+ "2faDisableText": "Hvis du ønsker at slå denne totrinsbekræftelse fra, så skal du nu indtaste koden fra din enhed:",
+ "2faProviderIsEnabled": "Denne totrinsbekræftelse er slået til",
+ "2faProviderIsDisabledMsg": "Den valgte totrinsbekræftelse er nu slået fra",
+ "2faProviderIsNotDisabledMsg": "Der skete en ukendt fejl da denne totrinsbekræftelse skulles slåes fra",
+ "2faDisableForUser": "Er du sikker på, at du vil fjerne denne totrinsbekræftelse for denne bruger?",
+ "emailRequired": "Required - enter an email address for this user",
+ "duplicateLogin": "A user with this login already exists",
+ "nameRequired": "Required - enter a name for this user",
+ "passwordRequiresDigit": "The password must have at least one digit ('0'-'9')",
+ "passwordRequiresLower": "The password must have at least one lowercase ('a'-'z')",
+ "passwordRequiresNonAlphanumeric": "The password must have at least one non alphanumeric character",
+ "passwordRequiresUniqueChars": "The password must use at least %0% different characters",
+ "passwordRequiresUpper": "The password must have at least one uppercase ('A'-'Z')",
+ "passwordTooShort": "The password must be at least %0% characters long",
+ "allowAccessToAllLanguages": "Allow access to all languages",
+ "userHasPassword": "The user already has a password set",
+ "userHasGroup": "The user is already in group '%0%'",
+ "userLockoutNotEnabled": "Lockout is not enabled for this user",
+ "userNotInGroup": "The user is not in group '%0%'"
+ },
+ "validation": {
+ "validation": "Validering",
+ "validateAsEmail": "Valider som e-mail",
+ "validateAsNumber": "Valider som tal",
+ "validateAsUrl": "Valider som URL",
+ "enterCustomValidation": "...eller indtast din egen validering",
+ "fieldIsMandatory": "Feltet er påkrævet",
+ "mandatoryMessage": "Indtast en selvvalgt validerings fejlbesked (valgfrit)",
+ "validationRegExp": "Indtast et regulært udtryk",
+ "validationRegExpMessage": "Indtast en selvvalgt validerings fejlbesked (valgfrit)",
+ "minCount": "Du skal tilføje mindst",
+ "maxCount": "Du kan kun have",
+ "addUpTo": "Tilføj op til",
+ "items": "elementer",
+ "urls": "URL(er)",
+ "urlsSelected": "URL(er) valgt",
+ "itemsSelected": "elementer valgt",
+ "invalidDate": "Ugyldig dato",
+ "invalidNumber": "Ikke et tal",
+ "invalidNumberStepSize": "Ikke en gyldig numerisk trinstørrelse",
+ "invalidEmail": "Ugyldig e-mail",
+ "invalidNull": "Værdien kan ikke være tom",
+ "invalidEmpty": "Værdien kan ikke være tom",
+ "invalidPattern": "Værdien er ugyldig, som ikke matcher det korrekte format",
+ "customValidation": "Selvvalgt validering",
+ "entriesShort": "Minimum %0% element(er), tilføj %1% mere.",
+ "entriesExceed": "Maksimum %0% element(er), %1% for mange.",
+ "entriesAreasMismatch": "Ét eller flere områder lever ikke op til kravene for antal indholdselementer.",
+ "invalidMemberGroupName": "Invalid member group name",
+ "invalidUserGroupName": "Invalid user group name",
+ "invalidToken": "Invalid token",
+ "invalidUsername": "Invalid username",
+ "duplicateEmail": "Email '%0%' is already taken",
+ "duplicateUserGroupName": "User group name '%0%' is already taken",
+ "duplicateMemberGroupName": "Member group name '%0%' is already taken",
+ "duplicateUsername": "Username '%0%' is already taken"
+ },
+ "redirectUrls": {
+ "disableUrlTracker": "Slå URL tracker fra",
+ "enableUrlTracker": "Slå URL tracker til",
+ "culture": "Kultur",
+ "originalUrl": "Original URL",
+ "redirectedTo": "Viderestillet til",
+ "redirectUrlManagement": "Viderestil URL håndtering",
+ "panelInformation": "De følgende URLs viderestiller til dette indholds element",
+ "noRedirects": "Der er ikke lavet nogen viderestillinger",
+ "noRedirectsDescription": "Når en udgivet side bliver omdøbt eller flyttet, vil en viderestilling\n automatisk blive lavet til den nye side.\n ",
+ "redirectRemoved": "Viderestillings URL fjernet.",
+ "redirectRemoveError": "Fejl under fjernelse af viderestillings URL.",
+ "redirectRemoveWarning": "Dette vil fjerne viderestillingen",
+ "confirmDisable": "Er du sikker på at du vil slå URL trackeren fra?",
+ "disabledConfirm": "URL tracker er nu slået fra.",
+ "disableError": "Der opstod en fejl under forsøget på at slå URL trackeren fra, der findes mere information\n i logfilen.\n ",
+ "enabledConfirm": "URL tracker er nu slået fra.",
+ "enableError": "Der opstod en fejl under forsøget på at slå URL trackeren til, der findes mere information\n i logfilen.\n "
+ },
+ "emptyStates": {
+ "emptyDictionaryTree": "Ingen ordbog elementer at vælge imellem"
+ },
+ "textbox": {
+ "characters_left": "%0% tegn tilbage.",
+ "characters_exceed": "Maksimum %0% tegn, %1% for mange."
+ },
+ "recycleBin": {
+ "contentTrashed": "Slettet indhold med Id: {0} Relateret til original \"parent\" med id: {1}",
+ "mediaTrashed": "Slettet medie med Id: {0} relateret til original \"parent\" / mappe med id: {1}",
+ "itemCannotBeRestored": "Kan ikke automatisk genoprette dette element",
+ "itemCannotBeRestoredHelpText": "Der er ikke nogen placering hvor dette element automatisk kan genoprettes.\n Du kan flytte elementet manuelt i træet nedenfor.\n ",
+ "wasRestored": "blev genoprettet under"
+ },
+ "relationType": {
+ "direction": "Retning",
+ "parentToChild": "Forælder til barn",
+ "bidirectional": "Tovejs",
+ "parent": "Forælder",
+ "child": "Barn",
+ "count": "Antal",
+ "relations": "Relationer",
+ "created": "Oprettet",
+ "comment": "Kommentar",
+ "name": "Navn",
+ "noRelations": "Der er ingen relationer for denne relationstype.",
+ "tabRelationType": "Relationstype",
+ "tabRelations": "Relationer",
+ "relation": "Relation",
+ "isDependency": "Is Dependency",
+ "dependency": "Yes",
+ "noDependency": "No"
+ },
+ "dashboardTabs": {
+ "contentIntro": "Kom godt i gang",
+ "contentRedirectManager": "Redirects håndtering",
+ "mediaFolderBrowser": "Indhold",
+ "settingsWelcome": "Velkommen",
+ "settingsExamine": "Examine Management",
+ "settingsPublishedStatus": "Published Cache",
+ "settingsModelsBuilder": "Models Builder",
+ "settingsHealthCheck": "Health Check",
+ "settingsProfiler": "Profiling",
+ "memberIntro": "Kom godt i gang",
+ "formsInstall": "Installer Umbraco Forms",
+ "deploy": "Arbejdsområder",
+ "settingsAnalytics": "Telemetry data",
+ "deployManagement": "Deploy"
+ },
+ "visuallyHiddenTexts": {
+ "goBack": "GÃ¥ tilbage",
+ "activeListLayout": "Aktivt layout:",
+ "jumpTo": "GÃ¥ til",
+ "group": "gruppe",
+ "passed": "bestået",
+ "warning": "advarsel",
+ "failed": "fejlet",
+ "suggestion": "forslag",
+ "checkPassed": "Test bestået",
+ "checkFailed": "Test fejlet",
+ "openBackofficeSearch": "Åben backoffice søgning",
+ "openCloseBackofficeHelp": "Åben/Luk backoffice hjælp",
+ "openCloseBackofficeProfileOptions": "Ã…ben/Luk dine profil indstillinger",
+ "assignDomainDescription": "Tilføj domæne på %0%",
+ "createDescription": "Opret ny node under %0%",
+ "protectDescription": "Opsæt offentlig adgang på %0%",
+ "rightsDescription": "Opsæt rettigheder på %0%",
+ "sortDescription": "Juster soterings rækkefølgen for %0%",
+ "createblueprintDescription": "Opret indholds skabelon baseret på %0%",
+ "openContextMenu": "Ã…ben kontext menu for",
+ "currentLanguage": "Aktivt sprog",
+ "switchLanguage": "Skift sprog til",
+ "createNewFolder": "Opret ny mappe",
+ "newPartialView": "Delvist View",
+ "newPartialViewMacro": "Delvist View Macro",
+ "newMember": "Medlem",
+ "newDataType": "Data type",
+ "redirectDashboardSearchLabel": "Søg i viderestillings dashboardet",
+ "userGroupSearchLabel": "Søg i brugergruppe sektionen",
+ "userSearchLabel": "Søg i bruger sektionen",
+ "createItem": "Opret element",
+ "create": "Opret",
+ "edit": "Rediger",
+ "name": "Navn",
+ "addNewRow": "Tilføj ny række",
+ "tabExpand": "Vis flere muligheder",
+ "searchOverlayTitle": "Søg i Umbraco backoffice",
+ "searchOverlayDescription": "Søg efter indholdsnoder, medienoder osv. i backoffice",
+ "searchInputDescription": "Når autoudfyldnings resultaterne er klar, tryk op og ned pilene, eller benyt tab\n knappen og brug enter knappen til at vælge.\n ",
+ "path": "Vej",
+ "foundIn": "Fundet i",
+ "hasTranslation": "Har oversættelse",
+ "noTranslation": "Mangler oversættelse",
+ "dictionaryListCaption": "Ordbogs elementer",
+ "contextMenuDescription": "Udfør handling %0% på %1% noden",
+ "addImageCaption": "Tilføj billede overskrift",
+ "searchContentTree": "Søg i indholdstræet",
+ "maxAmount": "Maximum antal",
+ "contextDialogDescription": "Perform action %0% on the %1% node"
+ },
+ "references": {
+ "tabName": "Referencer",
+ "DataTypeNoReferences": "Denne Data Type har ingen referencer.",
+ "labelUsedByMediaTypes": "Brugt i Medie Typer",
+ "labelUsedByMemberTypes": "Brugt i Medlems Typer",
+ "usedByProperties": "Brugt af",
+ "labelUsedByDocuments": "Brugt i Dokumenter",
+ "labelUsedByMembers": "Brugt i Medlemmer",
+ "labelUsedByMedia": "Brugt i Medier",
+ "itemHasNoReferences": "This item has no references.",
+ "labelUsedByDocumentTypes": "Referenced by the following Document Types",
+ "labelUsedByItems": "Referenced by the following items",
+ "labelDependsOnThis": "The following items depend on this",
+ "labelUsedItems": "The following items are referenced",
+ "labelUsedDescendants": "The following descendant items have dependencies",
+ "labelDependentDescendants": "The following descending items have dependencies",
+ "deleteWarning": "This item or its descendants is being referenced. Deletion can lead to broken links on your website.",
+ "unpublishWarning": "This item or its descendants is being referenced. Unpublishing can lead to broken links on your website. Please take the appropriate actions.",
+ "deleteDisabledWarning": "This item or its descendants is being referenced. Therefore, deletion has been disabled.",
+ "listViewDialogWarning": "The following items you are trying to %0% are referenced by other content."
+ },
+ "logViewer": {
+ "deleteSavedSearch": "Slet gemte søgning",
+ "logLevels": "Log type",
+ "selectAllLogLevelFilters": "Vælg alle",
+ "deselectAllLogLevelFilters": "Fravælg alle",
+ "savedSearches": "Gemte søgninger",
+ "saveSearch": "Gem søgning",
+ "saveSearchDescription": "Indtast et navn for din søgebetingelse",
+ "filterSearch": "Filter søgning",
+ "totalItems": "Samlet resultat",
+ "timestamp": "Dato",
+ "level": "Type",
+ "machine": "Maskine",
+ "message": "Besked",
+ "exception": "Exception",
+ "properties": "Egenskaber",
+ "searchWithGoogle": "Søg med Google",
+ "searchThisMessageWithGoogle": "Søg efter denne besked på Google",
+ "searchWithBing": "Søg med Bing",
+ "searchThisMessageWithBing": "Søg efter denne besked på Bing",
+ "searchOurUmbraco": "Søg på Our Umbraco",
+ "searchThisMessageOnOurUmbracoForumsAndDocs": "Søg efter denne besked på Our Umbraco forum og\n dokumentation\n ",
+ "searchOurUmbracoWithGoogle": "Søg på Our Umbraco med Google",
+ "searchOurUmbracoForumsUsingGoogle": "Søg på Our Umbraco forum med Google",
+ "searchUmbracoSource": "Søg i Umbraco kildekoden",
+ "searchWithinUmbracoSourceCodeOnGithub": "Søg i Umbraco kildekoden på Github",
+ "searchUmbracoIssues": "Søg i Umbraco issues",
+ "searchUmbracoIssuesOnGithub": "Søg i Umbraco issues på Github",
+ "deleteThisSearch": "Slet denne søgning",
+ "findLogsWithRequestId": "Find logs med request Id",
+ "findLogsWithNamespace": "Find logs med Namespace",
+ "findLogsWithMachineName": "Find logs med maskin navn",
+ "open": "Ã…ben",
+ "polling": "Henter",
+ "every2": "Hver 2 sekunder",
+ "every5": "Hver 5 sekunder",
+ "every10": "Hver 10 sekunder",
+ "every20": "Hver 20 sekunder",
+ "every30": "Hver 30 sekunder",
+ "pollingEvery2": "Henter hver 2s",
+ "pollingEvery5": "Henter hver 5s",
+ "pollingEvery10": "Henter hver 10s",
+ "pollingEvery20": "Henter hver 20s",
+ "pollingEvery30": "Henter hver 30s"
+ },
+ "clipboard": {
+ "labelForCopyAllEntries": "Kopier %0%",
+ "labelForArrayOfItemsFrom": "%0% fra %1%",
+ "labelForArrayOfItems": "Samling af %0%",
+ "labelForRemoveAllEntries": "Fjern alle elementer",
+ "labelForClearClipboard": "Ryd udklipsholder"
+ },
+ "propertyActions": {
+ "tooltipForPropertyActionsMenu": "Ã…ben egenskabshandlinger",
+ "tooltipForPropertyActionsMenuClose": "Luk egenskabshandlinger"
+ },
+ "blockEditor": {
+ "headlineCreateBlock": "Vælg elementtype",
+ "headlineAddSettingsElementType": "Tilføj en indstillings elementtype",
+ "headlineAddCustomView": "Tilføj visning",
+ "headlineAddCustomStylesheet": "Tilføj stylesheet",
+ "headlineAddThumbnail": "Vælg billede",
+ "labelcreateNewElementType": "Opret ny elementtype",
+ "labelCustomStylesheet": "Overskriv stylesheet",
+ "addCustomStylesheet": "Tilføj stylesheet",
+ "headlineEditorAppearance": "Redigerings udseende",
+ "headlineDataModels": "Data modeller",
+ "headlineCatalogueAppearance": "katalog udseende",
+ "labelBackgroundColor": "Baggrunds farve",
+ "labelIconColor": "Ikon farve",
+ "labelContentElementType": "Indholds model",
+ "labelLabelTemplate": "Label",
+ "labelCustomView": "Speciel visning",
+ "labelCustomViewInfoTitle": "Vis speciel visning beskrivelsen",
+ "labelCustomViewDescription": "Overskrift hvordan denne block præsenteres i backoffice interfacet. Vælg en\n .html fil der indeholder din præsensation.\n ",
+ "labelSettingsElementType": "Indstillings model",
+ "labelEditorSize": "Rederings lagets størrelse",
+ "addCustomView": "Tilføj speciel visning",
+ "addSettingsElementType": "Tilføj instillinger",
+ "confirmDeleteBlockMessage": "Er du sikker på at du vil slette indholdet %0% ?",
+ "confirmDeleteBlockTypeMessage": "Er du sikker på at du vil slette konfigurationen %0% ?",
+ "confirmDeleteBlockTypeNotice": "Indholdet vil stadigt eksistere, men redigering af dette indhold vil ikke\n være muligt. Indholdet vil blive vist som ikke understøttet indhold.\n ",
+ "confirmDeleteBlockGroupMessage": "Er du sikker på at du vil slette gruppen %0% og blok konfigurationer?",
+ "confirmDeleteBlockGroupNotice": "Indholdet af gruppens blokke vil stadigt eksistere, men redigering af dette indhold vil ikke\n være muligt. Indholdet vil blive vist som ikke understøttet indhold.\n ",
+ "blockConfigurationOverlayTitle": "Konfiguration af '%0%'",
+ "elementTypeDoesNotExist": "Kan ikke redigeres fordi elementtypen ikke eksisterer.",
+ "thumbnail": "Billede",
+ "addThumbnail": "Tilføj billede",
+ "tabCreateEmpty": "Opret ny",
+ "tabClipboard": "Udklipsholder",
+ "tabBlockSettings": "Indstillinger",
+ "headlineAdvanced": "Avanceret",
+ "forceHideContentEditor": "Skjul indholdseditoren",
+ "forceHideContentEditorHelp": "Skjul indholds redigerings knappen samt indholdseditoren i Blok Redigerings vinduet",
+ "girdInlineEditing": "Direkte redigering",
+ "girdInlineEditingHelp": "Tilføjer direkte redigering a det første felt. Yderligere felter optræder kun i redigerings vinduet.",
+ "blockHasChanges": "Du har lavet ændringer til dette indhold. Er du sikker på at du vil kassere dem?",
+ "confirmCancelBlockCreationHeadline": "Annuller oprettelse?",
+ "confirmCancelBlockCreationMessage": "Er du sikker på at du vil annullere oprettelsen.",
+ "elementTypeDoesNotExistHeadline": "Fejl!",
+ "elementTypeDoesNotExistDescription": "Elementtypen for denne blok eksisterer ikke længere",
+ "addBlock": "Tilføj indhold",
+ "addThis": "Tilføj %0%",
+ "propertyEditorNotSupported": "Feltet %0% bruger editor %1% som ikke er supporteret for blokke.",
+ "focusParentBlock": "Fokusér på den ydre blok",
+ "areaIdentification": "Identifikation",
+ "areaValidation": "Validering",
+ "areaValidationEntriesShort": "%0% skal tilføjes minimum %2% gang(e).",
+ "areaValidationEntriesExceed": "%0% må maksimalt tilføjes %3% gang(e).",
+ "areaNumberOfBlocks": "Antal blokke",
+ "areaDisallowAllBlocks": "Tillad kun specifikke blok-typer",
+ "areaAllowedBlocks": "Tilladte blok-typer",
+ "areaAllowedBlocksHelp": "Vælg de blok-typer, der er tilladt i dette område, og evt. også hvor mange af hver type, redaktørerne skal tilføje til området.",
+ "areaAllowedBlocksEmpty": "Når denne er tom er alle block-typer tilladt for områder tilladt.",
+ "confirmDeleteBlockAreaMessage": "Er du sikker på, at du vil slette dette område?",
+ "confirmDeleteBlockAreaNotice": "Alle blokke, der er oprettet i dette område, vil blive slettet.",
+ "layoutOptions": "Layout-opsætning",
+ "structuralOptions": "Struktur",
+ "sizeOptions": "Størrelses opsætning",
+ "allowedBlockColumns": "Tilgængelige kolonne-størrelser",
+ "allowedBlockColumnsHelp": "Vælg de forskellige antal kolonner denne blok må optage i layoutet. Dette forhindre ikke blokken i at optræde i et mindre område.",
+ "allowedBlockRows": "TIlgængelige række-størrelser",
+ "allowedBlockRowsHelp": "Vælg hvor mange rækker denne blok på optage i layoutet.",
+ "allowBlockInRoot": "Tillad på rodniveau",
+ "allowBlockInRootHelp": "Gør denne blok tilgængelig i layoutets rodniveau. Hvis dette ikke er valgt, kan denne blok kun bruges inden for andre blokkes definerede områder.",
+ "areas": "Blok-områder",
+ "areasLayoutColumns": "Layout-kolonner",
+ "areasLayoutColumnsHelp": "Vælg hvor mange layout-kolonnner der skal være tilgængelig for blokkens områder. Hvis der ikke er valgt noget her, benyttes det antal layout-kolonner der er valgt for hele layoutet.",
+ "areasConfigurations": "Opsætning af områder",
+ "areasConfigurationsHelp": "Hvis det skal være muligt at indsætte nye blokke indeni denne blok, skal der oprettes ét eller flere områder til at indsætte de nye blokke i.",
+ "invalidDropPosition": "Ikke tilladt placering.",
+ "defaultLayoutStylesheet": "Standardlayout stylesheet",
+ "confirmPasteDisallowedNestedBlockHeadline": "Ikke tilladt indhold blev afvist",
+ "confirmPasteDisallowedNestedBlockMessage": "Det indsatte indhold bestod af ikke tilladt del-indhold, disse dele er blevet afvist. Vil du beholde det resterene alligevel?",
+ "areaAliasHelp": "Dette alias skrives ud via GetBlockGridHTML(), brug aliaset til at fange det element der repræsentere dette område. F.eks.. .umb-block-grid__area[data-area-alias=\"MitOmraadeAlias\"] { ... }",
+ "scaleHandlerButtonTitle": "Træk for at skalere",
+ "areaCreateLabelTitle": "Tilføj indhold label",
+ "areaCreateLabelHelp": "Overskriv labellen for tilføj indholds knappen i dette område.",
+ "showSizeOptions": "Tilføj skalerings muligheder",
+ "addBlockType": "Tilføj Blok",
+ "addBlockGroup": "Tilføj gruppe",
+ "pickSpecificAllowance": "Tilføj gruppe eller Blok",
+ "allowanceMinimum": "Sæt minimum krav",
+ "allowanceMaximum": "Sæt maksimum krav",
+ "block": "Blok",
+ "tabBlock": "Blok",
+ "tabBlockTypeSettings": "Indstillinger",
+ "tabAreas": "Områder",
+ "tabAdvanced": "Avanceret",
+ "headlineAllowance": "Tilladelser",
+ "getSampleHeadline": "Installer demo konfiguration",
+ "getSampleDescription": "Dette tilføjer basale og hjælper dig til at komme igang med Block Grid Editor. Dette indeholder Blokke for Overskrift, Beriget-Tekst, Billede og To-Koloners-Layout.",
+ "getSampleButton": "Installer",
+ "actionEnterSortMode": "Sortings tilstand",
+ "actionExitSortMode": "Afslut sortings tilstand",
+ "areaAliasIsNotUnique": "Dette område alias skal være unikt sammenlignet med andre områder af denne Blok.",
+ "configureArea": "Konfigurer område",
+ "deleteArea": "Slet område",
+ "addColumnSpanOption": "Tilføj mulighed for %0% koloner",
+ "sizeOptionsHelp": "Define one or more size options, this enables resizing of the Block",
+ "allowBlockInAreas": "Allow in areas",
+ "allowBlockInAreasHelp": "Make this block available by default within the areas of other Blocks (unless explicit permissions are set for these areas)."
+ },
+ "contentTemplatesDashboard": {
+ "whatHeadline": "Hvad er Indholdsskabeloner?",
+ "whatDescription": "Indholdsskabeloner er foruddefineret indhold der kan vælges når der oprettes nye\n indholdselementer.\n ",
+ "createHeadline": "Hvordan opretter jeg en Indholdsskabelon?",
+ "createDescription": "\n Der er to måder at oprette Indholdsskabeloner på:
\n \n Højreklik på en indholdsnode og vælg \"Opret indholdsskabelon\" for at oprette en ny Indholdsskabelon. \n Højreklik på Indholdsskabeloner i sektionen Indstillinger og vælg den dokumenttype du vil oprette en Indholdsskabelon for. \n \n Når indholdsskabelonen har fået et navn, kan redaktører begynde at bruge indholdsskabelonen som udgangspunkt for deres nye side.
\n ",
+ "manageHeadline": "Hvordan vedligeholder jeg Indholdsskabeloner?",
+ "manageDescription": "Du kan redigere og slette Indholdsskabeloner fra \"Indholdsskabeloner\" i sektionen\n Indstillinger. Fold dokumenttypen som Indholdsskabelonen er baseret på ud og klik på den for at redigere eller\n slette den.\n "
+ },
+ "preview": {
+ "endLabel": "Afslut",
+ "endTitle": "Afslut forhåndsvisning",
+ "openWebsiteLabel": "Vis i nyt vindue",
+ "openWebsiteTitle": "Åben forhåndsvisning i nyt vindue",
+ "returnToPreviewHeadline": "Forhåndsvisning af indholdet?",
+ "returnToPreviewDescription": "Du har afslutet forhåndsvisning, vil du starte forhåndsvisning igen for at\n se seneste gemte version af indholdet?\n ",
+ "returnToPreviewDeclineButton": "Se udgivet indhold",
+ "viewPublishedContentHeadline": "Se udgivet indhold?",
+ "viewPublishedContentDescription": "Du er i forhåndsvisning, vil du afslutte for at se den udgivet\n version?\n ",
+ "viewPublishedContentAcceptButton": "Se udgivet version",
+ "viewPublishedContentDeclineButton": "Forbliv i forhåndsvisning",
+ "returnToPreviewAcceptButton": "Preview latest version"
+ },
+ "permissions": {
+ "FolderCreation": "Mappeoprettelse",
+ "FileWritingForPackages": "Filskrivning for pakker",
+ "FileWriting": "Filskrivning",
+ "MediaFolderCreation": "Medie mappeoprettelse"
+ },
+ "treeSearch": {
+ "searchResult": "resultat",
+ "searchResults": "resultater"
+ },
+ "dialogs": {
+ "deployTransferNowTitle": "Overfør nu",
+ "deployTransferNowHeadline": "Overfør %0% til %1% ",
+ "deployTransferNowDescription": "Du er ved at igangsætte overførsel af %0% direkte til %1%, uden at tilføje til køen.
",
+ "deployAddToQueueHeadline": "Sæt %0% i køen for overførsel til %1% ",
+ "deployAddToQueueDescription": "Denne handling sætter %0% i køen til næste overførsel, intet vil blive overført endnu.
",
+ "deployAddToQueueChildPageDescription": "Skal alle underliggende sider af %0% inkluderes i denne overførsel?
",
+ "deployIncludeChildPages": "Inkluder underliggende sider",
+ "deployAddToQueueDone": "Ændringer er lagt i køen Når du er klar til at overfører gå til arbejdsområde siden for at starte overførselen.
",
+ "deployRestoreFrom": "Fra",
+ "deployRestoreWorkspace": "arbejdsområde",
+ "deployRestoreThis": "Genskab",
+ "deployRestoreIncludingDescendants": "Inklusiv alle underliggende sider",
+ "deployRestoreNotIncludingDescendants": "Uden underliggende sider",
+ "deployRestoreDescription": "\n Dette inkludere rettelser til alt referred indhold og medier.
\n Bemærk: Genskabning af store mængder indhold kan tage langtid af udføre, undervejs bør du ikke ændre eller overfører indhold.
\n ",
+ "deployRestorePickFrom": "Eller vælg indhold fra",
+ "deployFullRestoreFrom": "Genskab dette arbejdsområde fra",
+ "deployFullRestoreDescription": "\n Denne handling vil overfører rettelser fra %0% til dette arbejdsmiljø. Dette inkludere rettelser til referred indhold og medier.
\n \n Bemærk: Genskabning af store mængder indhold kan tage langtid af udføre, undervejs bør du ikke ændre eller overfører indhold.\n
\n ",
+ "deployFullRestoreAction": "Genskab fra",
+ "deployGoToTransferQueue": "Åben overførselskøen",
+ "deployAddToQueueCultureDescription": "Select language to include in transfer:
",
+ "deployAddToQueueReleaseDateDescription": "The published or unpublished status will be transferred along with the content. To schedule the update for publishing in the future, please set a date:
",
+ "deployVariantQueueForTransferNotAllowed": "Transfer is not allowed",
+ "deployTreeRestoreFrom": "Restore this tree from",
+ "deployTreeRestoreDescription": "\n This will transfer changes from %0% and apply them to the selected tree in this workspace. This will include changes to any referenced content, media or other items.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ",
+ "deployCompareTitle": "Compare"
+ },
+ "formPicker": {
+ "selectFromFolder": "Vælg fra mappe",
+ "selectFromList": "Vælg fra listen over alle formularer"
+ },
+ "formsDashboard": {
+ "yourForms": "Dine formularer",
+ "showMore": "Vis mere",
+ "entries": "Besvarelser",
+ "newVersion": "Der er en ny version tilgængelig",
+ "installOverlayTitle": "Tillykke",
+ "installOverlayDescription": "Du har installeret Umbraco Forms - Lad os oprette din første formular",
+ "emptyOverlayTitle": "Opret formular",
+ "emptyOverlayDescription": "Du har ikke klargjort nogle formularer endnu, vil du starte på en nu?",
+ "createAForm": "Opret formular",
+ "newVersionTitle": "Der er en ny version tilgængelig",
+ "newVersionDescription": "Nu kan du installere Umbraco Forms",
+ "upgradeNow": "Opgrader nu",
+ "downloading": "Henter og opgraderer Forms...",
+ "invalidLicense": "Ugyldig licens",
+ "invalidLicenseValidFor": "Din nuværende Forms licens udløber snart:",
+ "reconfigure": "Omkonfigurer din licens nedenfor.",
+ "trialTitle": "Tak fordi du afprøver Umbraco Forms",
+ "trialDescription": "For at fortsætte med at bruge Umbraco Forms, skal du enten købe en licens eller bruge en eksisterende",
+ "configureLicense": "Konfigurer eksisterende licens",
+ "buyLicense": "Køb licens",
+ "buyLicenseTitle": "Køb en licens",
+ "buyLicenseCopy": "\n \n Det tager kun et par minutter at købe en licens til Umbraco Forms og din licens bliver leveret øjeblikkeligt .\n
\n \n Du skal bare:\n
\n Klikke på køb-knappen nedenfor \n Checkout med Kreditkort (eller faktura) \n Konfigurere licensen inde fra Umbraco Forms og så er du klar \n \n \n ",
+ "buyLink": "Køb Umbraco Forms",
+ "buyLicenseFAQs": "\n FAQ: \n Hvad koster det? \n Priserne starter ved €209 og det er en engangsudgift (intet abonnement nødvendigt).
\n Hvad dækker en license over? \n En licens dækker over et enkelt domæne og vil også virke på alle subdomæner. Det inkluderer desuden to yderligere development domæner.
\n Kan jeg tilføje yderligere domæner til licensen? \n Ja, der kan godt tilføjes yderligere domæner. Du kan tilkøbe flere domæner til din licens fra din konto på Umbraco.com.
\n Har du flere spørgsmål? \n \n Bare rolig, der er flere detaljer i dokumentationen og du er velkommen til at kontakte os . Vi svarer typisk i løbet af et par timer.\n
\n ",
+ "configureLicenseTitle": "Konfigurer en Umbraco Forms licens",
+ "configureLicenseCopy": "\n Hvis du allerede har købt Umbraco Forms, kan du automatisk hente og konfigurere din licens her. Du skal bare angive dine brugeroplysninger herunder og vi\n finder din licens.\n ",
+ "configureLicenseFAQs": "\n FAQ: \n Jeg ved ikke hvad mine brugeroplysninger er? \n \n Det er en kombination af din e-mail og kodeord fra da du lavede din bestilling. Du kan altid nulstille dit kodeord her .\n
\n Hvordan køber jeg en licens? \n \n Hvis du ikke har en licens, kan du få fat i en herfra og det tager kun et øjeblik .\n
\n ",
+ "findLicenses": "Find Licenser",
+ "invalidEmail": "Forkert email eller kodeord",
+ "noLicensesAvailable": "Der er ingen Umbraco Forms licenser tilgængelige på denne konto",
+ "availableLicensesTitle": "Tilgængelige Licenser",
+ "foundLicenses": "Fundede",
+ "foundLicensesAccount": "på kontoen",
+ "noDomainsAssigned": "Har ikke tilknyttet et domæne",
+ "setDomain": "Tilknyt venligst et domæne til denne licens",
+ "configureAndInstall": "Konfigurer og installer",
+ "installLicense": "Installer denne licens",
+ "validDomains": "Gyldige domæner",
+ "licenseValidOnDomain": "Denne licens er gyldig til det nuværende domæne",
+ "licenseNotValidOnDomain": "Denne licens er ikke gyldig til det nuværende domæne",
+ "plainTextPasswordWarning": "\n Advarsel: indstillingerne for kodeord er sat til klar tekst i din konfiguration! \n Når du benytter et felt til kodeord på en formular, bliver det data som dine besøgende udfylder feltet med, gemt som klar tekst. Dette er et sikkerhedsmæssigt problem og bør undgås.
\n For at udbedre problemet kan du i din ~/App_Plugins/UmbracoForms/UmbracoForms.config fil sætte nøglen SavePlainTextPasswords til False .
\n Efter opdateringen af denne indstilling skal du sikre dig at sitets application pool bliver recycled så den nye indstilling træder i kraft.
\n Bemærk: kodeordsværdier vil stadig blive sendt videre til arbejdsgange, uanset indstillingen i UmbracoForms.config
\n ",
+ "currentVersion": "Nuværende installerede version af Umbraco Forms:",
+ "licenseConfiguredNotificationTitle": "Licens er konfigureret",
+ "licenseConfiguredNotificationMessage": "Umbraco Forms er blevet konfigureret til brug med dette website.",
+ "insufficientPermissionsError": "Manglende tilladelser",
+ "insufficientPermissionsMessage": "Du har ikke tilladelse til at oprette og varetage formularer.",
+ "insufficientPermissionsUpgradeMessage": "Kun admin-brugere kan opgradere Umbraco Forms.",
+ "licensedDomains": "Licenserede domæner",
+ "formsHeadline": "Umbraco Forms",
+ "formsDescription": "Create forms using an intuitive drag and drop interface. From simple contact forms\n that sends e-mails to advanced questionaires that integrate with CRM systems. Your clients will love it!\n "
+ },
+ "formCopy": {
+ "title": "Kopierer formular '%0%'",
+ "enterName": "Angiv et navn til den kopierede formular",
+ "alsoCopyWorkflows": "Skal arbejdsgange også kopieres?",
+ "copyToNewFolder": "Kopier til en anden mappe?",
+ "selectLocation": "Vælg placering til den kopierede formular"
+ },
+ "formCreate": {
+ "title": "Opret en ny formular eller mappe",
+ "emptyForm": "Tom formular",
+ "emptyFormDescription": "Start fra bunden",
+ "folder": "Mappe",
+ "folderDescription": "Bruges til at organisere formularer",
+ "enterFolderName": "Angiv et navn til mappen"
+ },
+ "formExport": {
+ "formExportedSuccess": "Formularen blev eksporteret til en fil."
+ },
+ "formImport": {
+ "importInstruction1": "\n For at importere en formular skal du finde den eksporterede .json-fil på din computer ved at klikke på knappen 'Importer' (du bliver bedt om bekræftelse på næste skærmbillede).\n ",
+ "importInstruction2": "\n Hvis der allerede findes en formular med id'et for den valgte fil, vil den blive opdateret og flyttet til den valgte placering.\n Hvis der ikke findes en eksisterende formular, oprettes en ny på det valgte sted.\n "
+ },
+ "formPermissions": {
+ "accessDeniedTitle": "Ingen adgang"
+ },
+ "formMessages": {
+ "saveErrorMessage": "Undersøg venligst om dine indstillinger er gyldige."
+ },
+ "formEdit": {
+ "addQuestion": "Tilføj spørgsmål",
+ "groupIsEmpty": "Gruppen er tom",
+ "dropQuestionHere": "Smid et spørgsmål her...",
+ "letGo": "Yaay.. så går det løs",
+ "pageIsEmpty": "Siden er tom",
+ "dropGroupHere": "Smid en gruppe her...",
+ "addGroup": "Tilføj en ny gruppe",
+ "addPage": "Tilføj en ny side",
+ "pageTitlePlaceholder": "Side uden titel (valgfri)",
+ "groupTitlePlaceholder": "Gruppe uden titel (valgfri)",
+ "saveFieldFailedTitle": "Felt kunne ikke gemmes",
+ "accessDeniedMessage": "Du har ikke rettigheder til at rette på denne formular.",
+ "formSaved": "Formular gemt",
+ "unableToLoadForm": "Kan ikke indlæse formular",
+ "helpText": "Hjælpetekst",
+ "editPage": "Ret Side",
+ "editGroup": "Ret Gruppe",
+ "editQuestion": "Ret spørgsmål",
+ "workflows": "Arbejdsgange",
+ "magicStringsForFieldsNote": "\n Mange feltindstillinger understøtter brugen af ​​magiske strenge .\n Når formularen vises, kan disse strenge erstattes med værdier fra forskellige kilder, herunder ordbogsværdier, sessions- eller cookiedata og Umbraco-sidefelter.\n Læs mere .",
+ "magicStringsForWorkflowsNote": "\n Mange workflow-indstillinger understøtter brugen af ​​magiske strenge .\n Når arbejdsgangen behandles, kan disse strenge erstattes med værdier fra forskellige kilder, herunder registreringsdata og ordbogsværdier.\n Læs mere .",
+ "fieldTypeNotAvailable": "Felttypen, der er konfigureret til dette felt, er ikke længere tilgængelig.",
+ "fieldTypeRichTextNotAvailable": "Den rige tekst kan ikke formateres, da der ikke er konfigureret en gyldig datatype.",
+ "fieldTypeRichTextNotAvailableLinkText": "Læs, hvordan du konfigurerer en datatype."
+ },
+ "formFileUpload": {
+ "allowAllFiles": "Tillad alle filer",
+ "allowOnlySpecifiedFiles": "Tillad kun specifikke filer",
+ "predefinedAllowedFileTypes": "Foruddefinerede tilladte filtyper",
+ "userDefinedAllowedFileTypes": "Brugerdefinerede tilladte filtyper",
+ "deleteAllowedFileTypeConfirmationTitle": "Bekræftelse",
+ "deleteAllowedFileTypeConfirmationDescription": "Er du sikker på at du vil slette denne?",
+ "duplicateFileTypeErrorTitle": "Filtypefejl",
+ "duplicateFileTypeErrorMessage": "Kan ikke tilføje filtype fordi typen allerede eksisterer.",
+ "pickFile": "Vælg fil",
+ "uploading": "Uploader",
+ "currentFile": "Nuværende fil"
+ },
+ "formPrevalues": {
+ "newValue": "Ny værdi",
+ "newCaption": "Ny billedtekst",
+ "caption": "Billedtekst",
+ "duplicateErrorTitle": "Fejl på foruddefineret værdi",
+ "duplicateAddErrorMessage": "Kan ikke tilføje værdi da værdien allerede eksisterer.",
+ "duplicateEditErrorMessage": "Kan ikke ændre værdi da værdien allerede eksisterer."
+ },
+ "formDelete": {
+ "title": "Er du sikker på at du vil slette %0% '%1%'?",
+ "timingNote": "Bemærk at dette kan tage lang tid alt afhængig af antallet af besvarelser.",
+ "recordDeleteNote": "Sletning af formularen vil også slette de tilknyttede poster.",
+ "recordDetail": "Der er %0% poster, med den seneste indsendt på %1%.",
+ "cannotDeleteFolder": "Den valgte mappe kan ikke slettes da den ikke er tom.",
+ "successMessageForForm": "Sletning af formular er gennemført.",
+ "failedMessageForForm": "Sletning af formular mislykkedes.",
+ "successMessageForFolder": "Sletning af mappe er gennemført.",
+ "failedMessageForFolder": "Sletning af mappe mislykkedes.",
+ "noRecordDetail": "There are 0 records."
+ },
+ "formEntries": {
+ "title": "%0% besvarelser",
+ "filterEntries": "Filtrer besvarelser...",
+ "selectedRowsDescription": "%0% af %1% er valgt",
+ "export": "Eksporter",
+ "chooseExportFormat": "Vælg et format som du til eksportere besvarelserne til",
+ "entriesNotStored": "For nuværende bliver besvarelser ikke gemt i databasen.",
+ "enableStoreEntries": "For at aktivere dette, skal du gå til indstillinger og aktivere indstillingen \"Gem fortegnelser\".",
+ "noEntriesInRange": "Der findes endnu ingen besvarelser inden for valgte datoer.",
+ "noEntriesInRangeDetail": "Vi kan ikke finde nogen besvarelser, er du sikker på at du har udgivet formularen? eller prøv at udvidde datointervalet.",
+ "noEntriesMatchingSearch": "Vi kan ikke finde nogle besvarelser der matcher din søgning.",
+ "noEntriesMatchingSearchDetail": "Prøv at søge efter noget andet, måske er du heldig næste gang.",
+ "selectedEntryPaging": "Besvarelse %0% af %1%",
+ "previousEntry": "Forrige besvarelse",
+ "nextEntry": "Næste besvarelse",
+ "accessDeniedMessage": "Du har ikke adgang til at se denne formulars besvarelser.",
+ "executeCompleteTitle": "Udfør handling",
+ "executeSuccessMessage": "Handling %0% er gennemført",
+ "executeErrorMessage": "Handling %0% mislykkedes på grund af fejlen: %1%.",
+ "entryDetails": "Besvarelse",
+ "closeDetails": "Luk detaljer",
+ "submittedOn": "Indsendt",
+ "updatedOn": "Opdateret",
+ "fromPage": "Forside",
+ "member": "Medlem",
+ "state": "Tilstand",
+ "uniqueId": "Unikt ID",
+ "auditTrail": "Revisionsspor",
+ "showAuditTrail": "Vis revisionsspor",
+ "hideAuditTrail": "Skjul revisionsspor",
+ "updatedBy": "Opdateret af",
+ "updateRecordSuccess": "Rekord opdateret",
+ "updateRecordError": "Record kunne ikke opdateres",
+ "workflowAudit": "Workflow revision",
+ "workflowAuditName": "Navn",
+ "workflowAuditType": "Type",
+ "workflowAuditExecutedOn": "Udført den",
+ "workflowAuditExecutionStage": "Fase",
+ "workflowAuditResult": "Resultat",
+ "workflowAuditTitleFormatSingular": "%0% af %1% arbejdsgang lykkedes",
+ "workflowAuditTitleFormatPlural": "%0% af %1% arbejdsgange lykkedes",
+ "workflowAuditRetry": "Prøve igen",
+ "workflowAuditRunAgain": "Udfør igen",
+ "workflowAuditRunAnyway": "Udfør alligevel",
+ "workflowAuditRetryConfirmTitle": "Bekræftelse",
+ "workflowAuditRetryConfirmMessage": "Er du sikker på, at du vil køre den valgte arbejdsgang igen?",
+ "workflowAuditRetrySuccessMessage": "Workflow-udførelsen afsluttet (se revisionsspor for status og konsulter logfiler for et mislykket resultat)",
+ "workflowAuditRetryFailedMessage": "Udførelsen af ​​arbejdsgangen mislykkedes",
+ "workflowAuditRetryFailedMessageDetailWorkflowNotFound": "Arbejdsgangen er ikke længere knyttet til formularen.",
+ "workflowExecutionStageSubmitted": "Indsendt",
+ "workflowExecutionStageApproved": "Godkendt",
+ "workflowExecutionStatusCompleted": "Færdiggjort",
+ "workflowExecutionStatusFailed": "Mislykkedes",
+ "workflowExecutionStatusNotConfigured": "Ikke konfigureret",
+ "workflowExecutionStatusCancelled": "Annulleret",
+ "workflowExecutionStatusSkippedDueToConditions": "Ignoreret af betingelser"
+ },
+ "formMove": {
+ "title": "Vælg den mappe du vil flytte %0% til i træstrukturen nedenfor.",
+ "successMessage": "%0% blev flyttet indunder %1% .",
+ "successNotificationHeader": "Flyttet",
+ "successNotificationDescriptionForForm": "Formularen blev flyttet til den valgte placering.",
+ "successNotificationDescriptionForFolder": "Mappen blev flyttet til den valgte placering."
+ },
+ "formRename": {
+ "enterNewName": "Angiv et nyt navn",
+ "successNotificationHeader": "Omdøbt",
+ "successNotificationDescriptionForFolder": "Mappen er blevet omdøbt."
+ },
+ "formConditions": {
+ "title": "Betingelser",
+ "enableConditions": "Aktiver betingelser",
+ "actionTypeShow": "Vis",
+ "actionTypeHide": "Skjul",
+ "workflowactionTypeShow": "Kør",
+ "workflowactionTypeHide": "Ignorer",
+ "logicTypeAll": "alle",
+ "logicTypeAny": "hvilken som helst",
+ "operatorIs": "er",
+ "operatorIsNot": "er ikke",
+ "operatorGreaterThen": "er større end",
+ "operatorLessThen": "er mindre end",
+ "operatorContains": "indeholder",
+ "operatorStartsWith": "starter med",
+ "operatorEndsWith": "slutter med",
+ "thisFieldSetIf": "dette fieldset hvis",
+ "thisFieldIf": "dette felt hvis",
+ "buttonsForThisPageIf": "knapper til denne side hvis",
+ "thisWorkflowIf": "denne arbejdsgang hvis",
+ "ofTheFollowingMatch": "af det følgende matcher",
+ "selectField": "Vælg felt",
+ "addCondition": "Tilføj betingelse",
+ "pageConditionsDescription": "Definer betingelserne for at vise \"Indsend\" eller \"Næste\" knappen for siden (valgfri).",
+ "pageButtonConditionStatus": " %0% knapperne for denne side hvis %1% er af det følgende match:",
+ "fieldsetConditionStatus": " %0% denne gruppe hvis %1% er af det følgende match:",
+ "fieldConditionStatus": " %0% Dette spørgsmål hvis %1% er af det følgende match:",
+ "empty": "empty"
+ },
+ "formThemes": {
+ "noThemesAvailable": "Der er ingen tilgængelige temaer. Tilføj temaer til /views/partials/forms/themes"
+ },
+ "formWorkflows": {
+ "workflowNameLabel": "Navn på arbejdsgang",
+ "workflowNameDescription": "Angiv et beskrivende navn til din arbejdsgang",
+ "activeLabel": "Aktiv",
+ "activeDescription": "Aktiver eller deaktiver arbejdsgangen",
+ "includeSensitiveDataLabel": "Inkluder følsomme data",
+ "includeSensitiveDataDescription": "Skal følsomme data inkluderes når denne arbejdsgang udføres?",
+ "submitMessage": "Send besked / GÃ¥ til side",
+ "approve": "Godkend",
+ "automatic": "automatisk",
+ "noWorkflowsAdded": "Ingen arbejdsgange er tilføjet",
+ "configureWorkflow": "Konfigurer arbejdsgang",
+ "saveFailedTitle": "Lagring af arbejdsgang mislykkedes",
+ "closeConfirmationTitle": "Bekræftelse",
+ "closeConfirmationMessage": "Der er ændringer som ikke er blevet gemt. Er du sikker på at du vil lukke?",
+ "chooseWorkflow": "Vælg arbejdsgang",
+ "on": "Ved",
+ "onSubmit": "Ved indsendelse",
+ "onSubmitDescription": "Vi sørger for at udføre disse arbejdsgange for dig når formularen bliver afsendt",
+ "onApprove": "Ved godkendelse",
+ "onApproveDescription": "Disse arbejdsgange bliver udført når en besvarelse bliver godkendt",
+ "onApproveAutomaticDescription": "Dette sker automatisk efter indsendelses-eventet med de nuværende formularindstillinger",
+ "defaultWorkflowName": "Send besked / GÃ¥ til side",
+ "defaultWorkflowDescription": "Vis en besked når formularen bliver indsendt eller gå til en Umbraco-side",
+ "addWorkflow": "Tilføj arbejdsgang",
+ "messageOnSubmit": "Besked ved indsendelse",
+ "messageOnSubmitDescription": "Vis en besked når formularen er blevet indsendt",
+ "messageOnSubmitIsHtmlToggleTextOn": "Formater besked i rig tekst",
+ "messageOnSubmitIsHtmlToggleTextOff": "Formater besked i almindelig tekst",
+ "goToPage": "GÃ¥ til side",
+ "goToPageDescription": "Gå til en Umbraco-side når formularen er blevet indsendt"
+ },
+ "fieldSetColumns": {
+ "title": "Kolonner",
+ "setNumber": "Angiv hvor mange kolonner du ønsker at have i din gruppe.",
+ "columnNumberDescription": "Lige nu har denne gruppe %0%.",
+ "addColumn": "Tilføj kolonne"
+ },
+ "fieldSettings": {
+ "namePlaceholder": "Angiv spørgsmål...",
+ "descriptionPlaceholder": "Angiv hjælpetekst...",
+ "requiredLabel": "Krævet etiket",
+ "chooseAnswerType": "Vælg svartype",
+ "sensitiveData": "Følsomme data",
+ "sensitiveDataDescription": "Forhinder data fra at blive tilgået eller eksporteret hvis en bruger ikke har tilstrækkelige tilladelser.",
+ "sensitiveDataLabel": "Ja, dette felt indeholder følsomme data",
+ "allowedFileUploadTypes": "Tilladte filuploadtyper",
+ "prevalues": "Foruddefinerede værdier",
+ "prevaluesProvideWithSources": "Du skal enten angive en liste af værdier (foruddefinerede værdier) specifikt til dette felt, eller vælge en kilde til foruddefinerede værdier.",
+ "prevaluesProvide": "Angiv en liste af værdier (foruddefinerede værdier) til dette felt.",
+ "prevaluesItems": "Værdier",
+ "prevaluesSource": "Kilde til foruddefinerede værdier",
+ "pressEnterToAdd": "Tryk på enter for at tilføje en værdi",
+ "settings": "Indstillinger",
+ "mandatory": "Obligatorisk",
+ "enterRegex": "Angiv et regulært udtryk",
+ "invalidPlaceholder": "Skriv en besked for et ugyldigt felt...",
+ "allowMultipleFileUploads": "Tillad upload af flere filer",
+ "multipleFilesToggleTextOn": "Flere filer er tilladt",
+ "multipleFilesToggleTextOff": "Kun en fil"
+ },
+ "formSettings": {
+ "storeRecords": "Gem besvarelser",
+ "storeRecordsDescription": "\n Afkryds denne boks for at gemme besvarelser i databasen.\n Dette vil give dig mulighed for at gennemgå og eksportere besvarelser via oversigten.\n Hvis du ikke vil gemme data (på grund af regler i din organisation), så skal du lade boksen være uafkrydset.\n ",
+ "storeRecordsConfirm": "Ja, gem besvarelser i databasen så de kan gennemgås og blive eksporteret senere.",
+ "captions": "Etiketter",
+ "captionsDescription": "Ændr knappernes etiketter for Send, Næste og Forrige.",
+ "captionSubmitButton": "'Send' knappens etiket",
+ "captionNextButton": "'Næste' knappens etiket",
+ "captionPreviousButton": "'Forrige' knappens etiket",
+ "styling": "Fremtoning",
+ "stylingDescription": "Tilføj en eller flere klasser for at indhylle din formular hvilket muliggør brugerdefineret styling, deaktivere standard styling og indlæse aktiver med klient afhængigheder.",
+ "formCssClass": "Formular CSS klasse",
+ "disableDefaultStylesheet": "Deaktiver standard stylesheet",
+ "loadWithClientDependency": "Indlæs aktiver med klient afhængigheder",
+ "validation": "Validering",
+ "validationDescription": "Skriv bedre valideringsbeskeder, fjern valideringsetiketter og ændr eller deaktiver etiketten for krævet/obligatorisk.",
+ "mandatoryErrorMessage": "Fejlbesked ved obligatorisk",
+ "mandatoryErrorMessageDescription": "Besked som vises når et obligatorisk felt ikke er blevet udfyldt",
+ "invalidErrorMessage": "Fejlbesked ved ugyldig",
+ "invalidErrorMessageDescription": "Besked som vises når et felt ikke er udfyldt korrekt",
+ "showValidationSummary": "Vis valideringsresume",
+ "hideFieldValidationLabels": "Skjul felt valideringsetiketter",
+ "markFields": "Marker felter",
+ "markFieldsNoIndicator": "Ingen indikator",
+ "markMandatoryFields": "Marker obligatoriske felter",
+ "markOptionalFields": "Marker valgfri felter",
+ "indicator": "Indikator",
+ "changeIndicatorSymbol": "Ændr indikator-symbolet for obligatoriske felter",
+ "autocomplete": "Autocomplete",
+ "autocompleteDescription": "Tilføj en attribut til at styre formularens overordnede autocomplete opførsel.",
+ "autocompleteNone": "Ingen",
+ "autocompleteOn": "Tændt",
+ "autocompleteOff": "Slukket",
+ "moderation": "Moderation",
+ "moderationDescription": "Tillad at besvarelser kan blive ændres efter indsendelse. Dette bruges oftes for besvarelser som er offentlige tilgængelige, såsom kommentarer til blog posteringer eller indsendelser til en social kompagne.",
+ "enablePostModeration": "Tillad moderation efter indsendelse",
+ "fieldsDisplayed": "Felter vises",
+ "fieldsDisplayedDescription": "Vælg, hvilke felter der skal vises på listen over formularposter.",
+ "displayDefaultFields": "Vis standardfelter",
+ "displayDefaultFieldsDescription": "Som standard vises værdierne for de første tre felter i formularen sammen med nogle systemfelter.",
+ "formFields": "Formularfelter",
+ "systemFields": "System felter",
+ "noSelectedDisplayFields": "Der er ikke valgt nogen felter til visning.",
+ "resetDisplayDefaultFieldsMessage": "Er du sikker på, at du vil vende tilbage til standardfeltet for visning? De brugerdefinerede felter, du har valgt, vil blive fjernet, når formularen er gemt.",
+ "dataRetention": "Opbevaring af data",
+ "dataRetentionDescription": "Definer, hvor længe formularindsendelser skal opbevares, før de automatisk slettes.",
+ "dataRetentionForSubmittedRecords": "Antal dage til at opbevare indsendte optegnelser",
+ "dataRetentionForApprovedRecords": "Antal dage til at opbevare godkendte optegnelser",
+ "dataRetentionRetainSubmittedRecords": "Behold indsendte optegnelser for evigt",
+ "dataRetentionRetainApprovedRecords": "Behold godkendte optegnelser for evigt",
+ "scheduledRecordDeletionNotEnabled": "Den planlagte sletningstjeneste kører ikke i øjeblikket. Disse indstillinger træder ikke i kraft, før tjenesten er aktiveret i konfigurationen."
+ },
+ "formSecurity": {
+ "saveSuccessTitle": "Bruger formularsikkerhed gemt",
+ "saveErrorTitle": "Bruger formularsikkerhed mislykkedes med at gemme",
+ "manageFormsLabel": "Administrer formularer",
+ "manageFormsDescription": "Tillad eller afvis adgang til at administrere formularer",
+ "manageWorkflowsLabel": "Administrer arbejdsgange",
+ "manageWorkflowsDescription": "Tillad eller afvis adgang til at administrere arbejdsgange for alle formularer",
+ "manageDatasourcesLabel": "Administrer datakilder",
+ "manageDatasourcesDescription": "Tillad eller afvis adgang til at administrere datakilder for alle formularer",
+ "managePrevalueSourcesLabel": "Administrer kilde til foruddefinerede værdier",
+ "managePrevalueSourcesDescription": "Tillad eller afvis adgang til at administrere kilder til foruddefinerede værdier for alle formularer",
+ "manageIndividualFormsLabel": "Formular sikkerhed",
+ "manageIndividualFormsDescription": "Tillad eller afvis adgang til individuelle formularer",
+ "startFolders": "Start mapper",
+ "startFoldersDescription": "Definer rodmappen eller mapperne for brugeren",
+ "selectNewStartFolders": "Select Start Folders",
+ "formName": "Formularnavn",
+ "hasAccess": "Har adgang",
+ "viewEntriesLabel": "Se indlæg",
+ "viewEntriesDescription": "Giv eller nægt adgang til visning af indsendte bidrag",
+ "editEntriesLabel": "Rediger poster",
+ "editEntriesDescription": "Giv eller nægt adgang til redigering af indsendte indlæg",
+ "deleteTitle": "Slet brugersikkerhed: %0%",
+ "deleteUserRecordNote": "Ved at slette brugersikkerhedsposten vil brugerens tilladelser blive afledt fra de brugergrupper, som de er medlemmer af.",
+ "deleteSuccessMessage": "Brugersikkerhedspost slettet.",
+ "deleteFailedMessage": "Brugersikkerhedsposten kunne ikke slettes.",
+ "createTitle": "Skab brugersikkerhed",
+ "createUserRecordNote": "Når en brugerpost oprettes, vil den have forrang frem for eventuelle tilladelser, der er tildelt på brugergruppeniveau.",
+ "selectUser": "Vælg bruger",
+ "allUsersHaveRecords": "Alle brugere har allerede oprettet sikkerhedsregistreringer.",
+ "groupPermissions": "Gruppetilladelser",
+ "userPermissions": "Brugertilladelser"
+ },
+ "formDataSources": {
+ "typeDescription": "Vælg datakildetype",
+ "createForm": "Skab formular",
+ "formName": "Formular navn",
+ "selectFields": "Vælg felter",
+ "selectFieldsDescription": "Felter fra datakilden som du ønsker at inkludere på formularen.",
+ "setupForeignKeys": "Indstil fremmednøgler",
+ "setupForeignKeysDescription": "Vælg værdikolonnen til fremmednøgle-felter.",
+ "selectType": "Vælg type",
+ "selectTypeDescription": "Felttype du ønsker at bruge til de inkluderede felter (eller default værdi).",
+ "defaultValue": "Default værdi",
+ "deleteConfirm": "Er du sikker på at du vil slette datakilden %0%?",
+ "saveSuccessTitle": "Datakilde gemt",
+ "saveErrorTitle": "Lagring af datakilde mislykkedes",
+ "accessDeniedMessage": "Du har ikke adgang til at redigere datakilder"
+ },
+ "formPrevalueSources": {
+ "typeDescription": "Vælg typen af kilden for foruddefinerede værdier",
+ "deleteConfirm": "ER du sikker på at du vil slette kilden for foruddefinerede værdier %0%?",
+ "saveSuccessTitle": "Kilde til foruddefinerede værdier gemt",
+ "saveErrorTitle": "Lagring af kilde til foruddefinerede værdier mislykkedes",
+ "accessDeniedMessage": "Du har ikke adgang til at redigere datakilder for foruddefinerede værdier"
+ },
+ "formProviderFieldTypes": {
+ "checkboxName": "Afkrydsningsfelt",
+ "checkboxDescription": "Gengiver et afkrydsningsfelt.",
+ "checkboxDefaultValueLabel": "Standard værdi",
+ "checkboxDefaultValueDescription": "Angiv en standard værdi.",
+ "multipleChoiceName": "Flere svarmuligheder",
+ "multipleChoiceDescription": "Gengiver en samling af afkrydsningsfelter hvor det er muligt at vælge flere svarmuligheder.",
+ "multipleChoiceDefaultValueLabel": "Standard værdi",
+ "multipleChoiceDefaultValueDescription": "Angiv en standard værdi.",
+ "multipleChoiceShowLabelLabel": "Vis etiket",
+ "multipleChoiceShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
+ "dataConsentName": "Data samtykke",
+ "dataConsentDescription": "Gengiver et felt der spørger om brugeren samtykke til at indsamle data.",
+ "dataConsentAcceptCopyLabel": "Accept kopi",
+ "dataConsentAcceptCopyDescription": "Teksten der benyttes til at bekræfte samtykket.",
+ "dataConsentShowLabelLabel": "Vis etiket",
+ "dataConsentShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
+ "dateName": "Dato",
+ "dateDescription": "Gengiver en datovælger.",
+ "datePlaceholderLabel": "Stedfortrædende værdi",
+ "datePlaceholderDescription": "Angiv en stedfortrædende værdi.",
+ "dropdownName": "Dropdown-menu",
+ "dropdownDescription": "Gengiver en liste af værdier i en dropdown-menu",
+ "dropdownDefaultValueLabel": "Standard værdi",
+ "dropdownDefaultValueDescription": "Angiv en standard værdi",
+ "dropdownAllowMultipleSelectionsLabel": "Tillad flere svarmuligheder",
+ "dropdownAllowMultipleSelectionsDescription": "Angiver om det er tilladt at vælge flere svar fra listen.",
+ "dropdownShowLabelLabel": "Vis etiket",
+ "dropdownShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
+ "dropdownAutocompleteAttributeLabel": "Autocomplete attribut",
+ "dropdownAutocompleteAttributeDescription": "Angiv en valgfri værdi til autocomplete attributten.",
+ "dropdownSelectPromptLabel": "Spørg om valg",
+ "dropdownSelectPromptDescription": "Angiv eventuelt en prompt for brugerens valg.",
+ "fileUploadName": "Fil upload",
+ "fileUploadDescription": "Gengiver et felt til fil-upload, som tillader at filer kan uploades.",
+ "hiddenName": "Skjult felt",
+ "hiddenDescription": "Gengiver et skjult felt.",
+ "hiddenDefaultValueLabel": "Standard værdi",
+ "hiddenDefaultValueDescription": "Angiv en standard værdi",
+ "passwordName": "Kodeord",
+ "passwordDescription": "Gengiver et felt til kodeord.",
+ "passwordPlaceholderLabel": "Stedfortrædende værdi",
+ "passwordPlaceholderDescription": "Angiv en stedfortrædende værdi.",
+ "singleChoiceName": "Enkelt valg",
+ "singleChoiceDescription": "Gengiver en liste af radio knapper som kun tillader at vælge en enkelt værdi.",
+ "singleChoiceDefaultValueLabel": "Standard værdi",
+ "singleChoiceDefaultValueDescription": "Angiv en standard værdi",
+ "singleChoiceShowLabelLabel": "Vis etiket",
+ "singleChoiceShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
+ "recaptcha2Name": "reCAPTCHA v2",
+ "recaptcha2Description": "Google reCAPTCHA v2.",
+ "recaptcha2ThemeLabel": "Tema",
+ "recaptcha2ThemeDescription": "reCAPTCHA v2 tema.",
+ "recaptcha2SizeLabel": "Størrelse",
+ "recaptcha2SizeDescription": "reCAPTCHA v2 størrelse.",
+ "recaptcha2ErrorMessageLabel": "Fejlbesked",
+ "recaptcha2ErrorMessageDescription": "Den fejlbesked der vises når brugeren ikke består reCAPTCHA-kontrollen.",
+ "reCAPTCHAV3WithScoreName": "reCAPTCHA v3 med point",
+ "reCAPTCHAV3WithScoreDescription": "Google reCAPTCHA v3 med point grænseværdi",
+ "reCAPTCHAV3WithScoreScoreThresholdLabel": "Point grænseværdi",
+ "reCAPTCHAV3WithScoreScoreThresholdDescription": "En fastlagt reCAPTCHA v3 pointsætning mellem 0 og 1, hvor besvarelser der scorer over vil blive accepteret. En højere score fanger flere spam-besvarelser, men øger også risikoen for at afvise gyldige besvarelser. For de fleste sites er 0.5 et fornuftigt valg.",
+ "reCAPTCHAV3WithScoreScoreErrorMessageLabel": "Fejlbesked",
+ "reCAPTCHAV3WithScoreScoreErrorMessageDescription": "Den fejlbesked der vises når brugeren ikke består reCAPTCHA-kontrollen.",
+ "reCAPTCHAV3WithScoreScoreSaveScoreLabel": "Gem score",
+ "reCAPTCHAV3WithScoreScoreSaveScoreDescription": "Gem den beregnede score med formularen.",
+ "richTextName": "Formatteret tekst",
+ "richTextDescription": "Giv noget beskrivende tekst med formatering.",
+ "richTextHtmlLabel": "Formatteret tekst",
+ "richTextHtmlDescription": "Indtast din formaterede tekst",
+ "titleAndDescriptionName": "Titel og beskrivelse",
+ "titleAndDescriptionDescription": "Dette er brugt til at angive noget beskrivende tekst.",
+ "titleAndDescriptionCaptionLabel": "Overskrift",
+ "titleAndDescriptionCaptionDescription": "Angiv en overskrift.",
+ "titleAndDescriptionBodyTextLabel": "Brødtekst",
+ "titleAndDescriptionBodyTextDescription": "Angiv en brødtekst.",
+ "titleAndDescriptionCaptionTagLabel": "Titel HTML-element",
+ "titleAndDescriptionCaptionTagDescription": "Vælg det HTML-element, der skal bruges ved gengivelse af overskriften.",
+ "titleAndDescriptionShowLabelLabel": "Vis etiket",
+ "titleAndDescriptionShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
+ "longAnswerName": "Langt svar",
+ "longAnswerDescription": "Gengiver et textarea, beregnet til længere svar.",
+ "longAnswerDefaultValueLabel": "Standard værdi",
+ "longAnswerDefaultValueDescription": "Angiv en standard værdi",
+ "longAnswerPlaceholderLabel": "Stedfortrædende værdi",
+ "longAnswerPlaceholderDescription": "Angiv en stedfortrædende værdi.",
+ "longAnswerShowLabelLabel": "Vis etiket",
+ "longAnswerShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
+ "longAnswerAutocompleteAttributeLabel": "Autocomplete attribut",
+ "longAnswerAutocompleteAttributeDescription": "Angiv en valgfri værdi til autocomplete attributten.",
+ "longAnswerNumberOfRowsLabel": "Antal af rækker",
+ "longAnswerNumberOfRowsDescription": "Angiv antallet af rækker der vises for en besvarelse.",
+ "longAnswerMaximumLengthLabel": "Maksimal længde",
+ "longAnswerMaximumLengthDescription": "Indtast det maksimale antal tegn, der accepteres.",
+ "shortAnswerName": "Kort svar",
+ "shortAnswerDescription": "Gengiver et tekst input felt, til korte svar.",
+ "shortAnswerDefaultValueLabel": "Standard værdi",
+ "shortAnswerDefaultValueDescription": "Angiv en standard værdi",
+ "shortAnswerPlaceholderLabel": "Stedfortrædende værdi",
+ "shortAnswerPlaceholderDescription": "Angiv en stedfortrædende værdi.",
+ "shortAnswerShowLabelLabel": "Vis etiket",
+ "shortAnswerShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
+ "shortAnswerMaximumLengthLabel": "Maksimal længde",
+ "shortAnswerMaximumLengthDescription": "Indtast det maksimale antal tegn, der accepteres.",
+ "shortAnswerFieldTypeLabel": "Felttype",
+ "shortAnswerFieldTypeDescription": "Vælg den forventede type information.",
+ "shortAnswerAutocompleteAttributeLabel": "Autocomplete attribut",
+ "shortAnswerAutocompleteAttributeDescription": "Angiv en valgfri værdi til autocomplete attributten."
+ },
+ "formProviderWorkflows": {
+ "changeRecordStateName": "Ændr på besvarelse",
+ "changeRecordStateDescription": "Ændrer på en besvarelse underbearbejdelse når der matches på et/flere ord.",
+ "changeRecordStateWordsLabel": "Ord",
+ "changeRecordStateWordsDescription": "Kommasepareret liste af ord der sammenlignes imod.",
+ "changeRecordStateActionLabel": "Handling",
+ "changeRecordStateActionDescription": "Hvad der sker hvis der er et match.",
+ "postAsXMLName": "Send som XML",
+ "postAsXMLDescription": "Sender formularen som XML til en URL.",
+ "postAsXMLUrlLabel": "URL",
+ "postAsXMLUrlDescription": "Angiv URL'en der skal sendes til.",
+ "postAsXMLMethodLabel": "Metode",
+ "postAsXMLMethodDescription": "POST eller GET.",
+ "postAsXMLXsltFileLabel": "XSLT-fil",
+ "postAsXMLXsltFileDescription": "Transformer XML før afsendelse.",
+ "postAsXMLFieldsLabel": "Felter",
+ "postAsXMLFieldsDescription": "Kortlæg de nødvendige felter.",
+ "postAsXMLUsernameLabel": "Bruger",
+ "postAsXMLUsernameDescription": "(valgfri)",
+ "postAsXMLPasswordLabel": "Kodeord",
+ "postAsXMLPasswordDescription": "(valgfri)",
+ "sendFormToURLName": "Send formular til URL",
+ "sendFormToURLDescription": "Sender formularen til en URL, enten via HTTP POST eller GET.",
+ "sendFormToURLUrlLabel": "URL",
+ "sendFormToURLUrlDescription": "Angiv URL'en der skal sendes til.",
+ "sendFormToURLMethodLabel": "Metode",
+ "sendFormToURLMethodDescription": "POST eller GET.",
+ "sendFormToURLStandardFieldsLabel": "Standard Felter",
+ "sendFormToURLStandardFieldsDescription": "Kortlæg hvilkensomhelst standard formular information til afsendelse.",
+ "sendFormToURLFieldsLabel": "Felter",
+ "sendFormToURLFieldsDescription": "Kortlæg de nødvendige felter.",
+ "sendFormToURLUsernameLabel": "Bruger",
+ "sendFormToURLUsernameDescription": "(valgfri)",
+ "sendFormToURLPasswordLabel": "Kodeord",
+ "sendFormToURLPasswordDescription": "(valgfri)",
+ "saveAsAnXMLFileName": "Gem som en XML-fil",
+ "saveAsAnXMLFileDescription": "Gemmer besvarelsen af formularen som en XML-fil via XSLT.",
+ "saveAsAnXMLFilePathLabel": "Sti",
+ "saveAsAnXMLFilePathDescription": "Angiver stien til placeringen af filen.",
+ "saveAsAnXMLFileExtensionLabel": "Endelse",
+ "saveAsAnXMLFileExtensionDescription": "Filendelsen.",
+ "saveAsAnXMLFileXsltFileLabel": "XSLT-fil",
+ "saveAsAnXMLFileXsltFileDescription": "Transformer XML før den gemmes.",
+ "saveAsUmbracoContentNodeName": "Gem som Umbraco inholdsnode",
+ "saveAsUmbracoContentNodeDescription": "Gemmer formularværdierne som indholdsnoder ved hjælp af en specifik dokumenttype.",
+ "saveAsUmbracoContentNodeFieldsLabel": "Dokumenttype",
+ "saveAsUmbracoContentNodeFieldsDescription": "Kortlæg dokumenttype.",
+ "saveAsUmbracoContentNodePublishLabel": "Udgiv",
+ "saveAsUmbracoContentNodePublishDescription": "Udgiv noden øjeblikkeligt.",
+ "saveAsUmbracoContentNodeRootNodeLabel": "Gem placering",
+ "saveAsUmbracoContentNodeRootNodeDescription": "Vælg hvor den oprettede inholdsnode skal gemmes til.",
+ "sendEmailName": "Send email",
+ "sendEmailDescription": "Sender resultatet af en formular til en emailadresse.",
+ "sendEmailEmailLabel": "Modtager email",
+ "sendEmailEmailDescription": "Angiv modtagerens emailadresse(r).",
+ "sendEmailCcEmailLabel": "CC Email",
+ "sendEmailCcEmailDescription": "Angiv CC email addresser (hvis den er nødvendig).",
+ "sendEmailBccEmailLabel": "BCC Email",
+ "sendEmailBccEmailDescription": "Angiv BCC email addresser (hvis den er nødvendig).",
+ "sendEmailSenderEmailLabel": "Afsenderemail",
+ "sendEmailSenderEmailDescription": "Angiv afsenderemail (hvis feltet er blank benyttes indstillingen fra konfiguration).",
+ "sendEmailReplyToEmailLabel": "Svar-Emailadresse",
+ "sendEmailReplyToEmailDescription": "Angiv den emailadresse som der bruges som svaradresse (hvis nødvendigt).",
+ "sendEmailSubjectLabel": "Emne",
+ "sendEmailSubjectDescription": "Angiv emnet.",
+ "sendEmailMessageLabel": "Besked",
+ "sendEmailMessageDescription": "Angiv en introduktion.",
+ "sendEmailAttachmentLabel": "Vedhæftning",
+ "sendEmailAttachmentDescription": "Vedhæft en filupload til emailen.",
+ "sendEmailWithTemplateRazorName": "Send email med skabelon (Razor)",
+ "sendEmailWithTemplateRazorDescription": "Send formularens besvarelse til en/flere emailadresse/r ved hjælp af en Razor .cshtml skabelon.",
+ "sendEmailWithTemplateRazorEmailLabel": "Modtager email",
+ "sendEmailWithTemplateRazorEmailDescription": "Angiv modtagerens emailadresse(r).",
+ "sendEmailWithTemplateRazorCcEmailLabel": "CC Email",
+ "sendEmailWithTemplateRazorCcEmailDescription": "Angiv CC email addresser (hvis den er nødvendig).",
+ "sendEmailWithTemplateRazorBccEmailLabel": "BCC Email",
+ "sendEmailWithTemplateRazorBccEmailDescription": "Angiv BCC email addresser (hvis den er nødvendig).",
+ "sendEmailWithTemplateRazorSenderEmailLabel": "Afsenderemail",
+ "sendEmailWithTemplateRazorSenderEmailDescription": "Angiv afsenderemail (hvis feltet er blank benyttes indstillingen fra konfiguration).",
+ "sendEmailWithTemplateRazorReplyToEmailLabel": "Svar-Emailadresse",
+ "sendEmailWithTemplateRazorReplyToEmailDescription": "Angiv den emailadresse som der bruges som svaradresse (hvis nødvendigt).",
+ "sendEmailWithTemplateRazorSubjectLabel": "Emne",
+ "sendEmailWithTemplateRazorSubjectDescription": "Angiv emnet",
+ "sendEmailWithTemplateRazorRazorViewFilePathLabel": "Email Skabelon",
+ "sendEmailWithTemplateRazorRazorViewFilePathDescription": "Stien til det Razor view som du vil bruge til at generere emailen. Emailskabeloner er gemt under /views/partials/forms/emails.",
+ "sendEmailWithTemplateRazorHeaderHtmlLabel": "Formateret overskriftstekst",
+ "sendEmailWithTemplateRazorHeaderHtmlDescription": "Indtast formateret tekst, der skal gengives, i e-mail-headeren.",
+ "sendEmailWithTemplateRazorFooterHtmlLabel": "Formateret sidefodstekst",
+ "sendEmailWithTemplateRazorFooterHtmlDescription": "Indtast formateret tekst, der skal gengives, i e-mail-sidefoden.",
+ "sendEmailWithTemplateRazorAttachmentLabel": "Vedhæftning",
+ "sendEmailWithTemplateRazorAttachmentDescription": "Vedhæft en filupload til emailen.",
+ "sendXSLTTransformedEmailName": "Send XSLT transformed email",
+ "sendXSLTTransformedEmailDescription": "Send den resultatet af formularen til en emailadresse.",
+ "sendXSLTTransformedEmailEmailLabel": "Modtager email",
+ "sendXSLTTransformedEmailEmailDescription": "Angiv modtagerens emailadresse(r).",
+ "sendXSLTTransformedEmailCcEmailLabel": "CC Email",
+ "sendXSLTTransformedEmailCcEmailDescription": "Angiv CC email addresser (hvis den er nødvendig).",
+ "sendXSLTTransformedEmailBccEmailLabel": "BCC Email",
+ "sendXSLTTransformedEmailBccEmailDescription": "Angiv BCC email addresser (hvis den er nødvendig).",
+ "sendXSLTTransformedEmailSenderEmailLabel": "Afsenderemail",
+ "sendXSLTTransformedEmailSenderEmailDescription": "Angiv afsenderemail (hvis feltet er blank benyttes indstillingen fra konfiguration).",
+ "sendXSLTTransformedEmailReplyToEmailLabel": "Svar-Emailadresse",
+ "sendXSLTTransformedEmailReplyToEmailDescription": "Angiv den emailadresse som der bruges som svaradresse (hvis nødvendigt).",
+ "sendXSLTTransformedEmailSubjectLabel": "Emne",
+ "sendXSLTTransformedEmailSubjectDescription": "Angiv emnet",
+ "sendXSLTTransformedEmailXsltFileLabel": "XSLT-fil",
+ "sendXSLTTransformedEmailXsltFileDescription": "Transformer XML før emailen sendes.",
+ "slackLegacyName": "Slack (Legacy)",
+ "slackLegacyDescription": "Sender formularens data til en specifik kanal på slack ved hjælp af legacy tokens",
+ "slackLegacyTokenLabel": "API Token",
+ "slackLegacyTokenDescription": "Slack API token.",
+ "slackLegacyChannelLabel": "Kanal",
+ "slackLegacyChannelDescription": "Slack-kanal der skal sendes til.",
+ "slackLegacyUsernameLabel": "Brugernavn",
+ "slackLegacyUsernameDescription": "Det brugernavn eller bot som er afsender.",
+ "slackLegacyAvatarUrlLabel": "Avatar URL",
+ "slackLegacyAvatarUrlDescription": "Den fulde URL (inklusiv http/https) til avatar-billedet.",
+ "slackName": "Slack",
+ "slackDescription": "Sender formularens data til en specifik kanal på slack ved hjælp af webhook.",
+ "slackWebhookUrlLabel": "Webhook URL",
+ "slackWebhookUrlDescription": "Slack Webhook URL."
+ },
+ "formProviderDataSources": {
+ "sQLDatabaseName": "SQL Database",
+ "sQLDatabaseDescription": "Forbind til hvilken som helst databasetabel der understøtter OLEDB og konstruer en datakilde på baggrund af den.",
+ "sQLDatabaseConnectionLabel": "Forbindelsesstreng",
+ "sQLDatabaseConnectionDescription": "OleDB kompatibel forbindelsesstreng.",
+ "sQLDatabaseTableLabel": "Tabelnavn",
+ "sQLDatabaseTableDescription": "Databasens tabelnavn."
+ },
+ "formProviderPrevalueSources": {
+ "dataSourceName": "Datakilde",
+ "dataSourceDescription": "Gemmer på foruddefinerede værdier i tabellen til foruddefinerede værdier.",
+ "getValuesFromTextfileName": "Få værdier fra en tekstfil",
+ "getValuesFromTextfileDescription": "Upload en tekstfil der indeholder foruddefinerede værdier.",
+ "getValuesFromTextfileTextFileLabel": "Tekstfil",
+ "getValuesFromTextfileTextFileDescription": "Fil der indeholder de foruddefinerede værdier (Opdelt ved linjeskift).",
+ "umbracoDocumentsName": "Umbracodokumenter",
+ "umbracoDocumentsDescription": "Bruger noder fra en specifik kilde som foruddefinerede værdier.",
+ "umbracoDocumentsRootNodeLabel": "Rodnode",
+ "umbracoDocumentsRootNodeDescription": "Kilde der hentes noder fra.",
+ "umbracoDocumentsUseCurrentPageLabel": "Brug den nuværende side som rod",
+ "umbracoDocumentsUseCurrentPageDescription": "Virker ikke i forhåndsvisning.",
+ "umbracoDocumentsDocTypeLabel": "Dokumenttype",
+ "umbracoDocumentsDocTypeDescription": "Typen af noder du vil bruge.",
+ "umbracoDocumentsValueFieldLabel": "Værdi felt",
+ "umbracoDocumentsValueFieldDescription": "Vælg hvilket felt der skal bruges til værdien af ​​præværdien.",
+ "umbracoDocumentsListGrandChildrenLabel": "Vis alle undersider",
+ "umbracoDocumentsListGrandChildrenDescription": "Begræns ikke til underelementer, men inkludér yderligere niveauer.",
+ "umbracoDocumentsOrderByLabel": "Sortér efter",
+ "umbracoDocumentsOrderByDescription": "Vælg hvordan listen med foruddefinerede værdier skal sorteres.",
+ "sQLDatabaseName": "SQL Database",
+ "sQLDatabaseDescription": "Forbinder til en OLEDB-kompatibel databasetabel og skaber en kilde af foruddefinerede værdier derfra.",
+ "sQLDatabaseConnectionLabel": "Forbindelsesstreng",
+ "sQLDatabaseConnectionDescription": "OleDB kompatibel forbindelsesstreng.",
+ "sQLDatabaseConnectionStringLabel": "Forbindelsesstreng fra web.config",
+ "sQLDatabaseConnectionStringDescription": "Vælg forbindelsesstreng (den skal være OleDB-kompatibel).",
+ "sQLDatabaseTableNameLabel": "Tabelnavn",
+ "sQLDatabaseTableNameDescription": "",
+ "sQLDatabaseKeyColumnLabel": "Nøgle-kolonne",
+ "sQLDatabaseKeyColumnDescription": "Kolonne der indeholder nøglerne.",
+ "sQLDatabaseValueColumnLabel": "Værdi-kolonne",
+ "sQLDatabaseValueColumnDescription": "Kolonne der indeholder værdierne.",
+ "sQLDatabaseCaptionColumnLabel": "Værdi-billedtekst",
+ "sQLDatabaseCaptionColumnDescription": "Kolonne der indeholder billedtekster.",
+ "umbracoDataTypePreValueName": "Umbraco datatype foruddefinerede værdier",
+ "umbracoDataTypePreValueDescription": "Forbinder til en Umbraco datatype og dens samling af foruddefinerede værdier.",
+ "umbracoDataTypePreValuesDataTypeIdLabel": "Datatype",
+ "umbracoDataTypePreValuesDataTypeIdDescription": "Datatype der skal bruges."
+ },
+ "formProviderExportTypes": {
+ "excelFileName": "Excel-fil (indsendte værdier)",
+ "excelFileDescription": "Eksporterer alle indsendte værdier for formularen til Excel i et format, der er nyttigt til integration med andre systemer.",
+ "excelFileDisplayValuesName": "Excel-fil (værdier til visning)",
+ "excelFileDisplayValuesDescription": "Eksporterer alle værdier for formularen til Excel i et format, der er nyttigt til at gennemgå dataene eller oprette en rapport. Billedtekster bruges til forudgående data, hvor de er tilgængelige.",
+ "excelFileNameOsx": "Excel/Numbers-fil (indsendte værdier)",
+ "excelFileDescriptionOsx": "Eksporterer alle indsendte værdier for formularen til Excel/Numbers i et format, der er nyttigt til integration med andre systemer.",
+ "excelFileDisplayValuesNameOsx": "Excel/Numbers-fil (værdier til visning)",
+ "excelFileDisplayValuesDescriptionOsx": "Eksporterer alle værdier for formularen til Excel/Numbers i et format, der er nyttigt til at gennemgå dataene eller oprette en rapport. Billedtekster bruges til forudgående data, hvor de er tilgængelige.",
+ "saveAllUploadedFilesInDiskStructureName": "Gem alle uploadede filer (in disk structure)",
+ "saveAllUploadedFilesInDiskStructureDescription": "Eksporterer alle filer uploaded via formular til et zip-arkiv, hvor filerne er organiseret som filerne er gemt på disken.",
+ "saveAllUploadedFilesByEntryName": "Gem alle uploadede filer (efter besvarelse)",
+ "saveAllUploadedFilesByEntryDescription": "Eksporterer alle filer uploaded via formular til et zip-arkiv, hvor filerne er organiseret per besvarelse i en undermappe."
+ },
+ "formRecordSetActions": {
+ "deleteConfirm": "Er du sikker på at du vil slette disse besvarelser?"
+ },
+ "propertyEditorPicker": {
+ "title": "Select Property Editor",
+ "openPropertyEditorPicker": "Select Property Editor"
+ },
+ "healthcheck": {
+ "checkSuccessMessage": "Value is set to the recommended value: '%0%'.",
+ "checkErrorMessageDifferentExpectedValue": "Expected value '%1%' for '%2%' in configuration file '%3%', but\n found '%0%'.\n ",
+ "checkErrorMessageUnexpectedValue": "Found unexpected value '%0%' for '%2%' in configuration file '%3%'.\n ",
+ "macroErrorModeCheckSuccessMessage": "MacroErrors are set to '%0%'.",
+ "macroErrorModeCheckErrorMessage": "MacroErrors are set to '%0%' which will prevent some or all pages in\n your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'.\n ",
+ "httpsCheckValidCertificate": "Your website's certificate is valid.",
+ "httpsCheckInvalidCertificate": "Certificate validation error: '%0%'",
+ "httpsCheckExpiredCertificate": "Your website's SSL certificate has expired.",
+ "httpsCheckExpiringCertificate": "Your website's SSL certificate is expiring in %0% days.",
+ "healthCheckInvalidUrl": "Error pinging the URL %0% - '%1%'",
+ "httpsCheckIsCurrentSchemeHttps": "You are currently %0% viewing the site using the HTTPS scheme.",
+ "httpsCheckConfigurationRectifyNotPossible": "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to 'false' in\n your appSettings.json file. Once you access this site using the HTTPS scheme, that should be set to 'true'.\n ",
+ "httpsCheckConfigurationCheckResult": "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to '%0%' in your\n appSettings.json file, your cookies are %1% marked as secure.\n ",
+ "compilationDebugCheckSuccessMessage": "Debug compilation mode is disabled.",
+ "compilationDebugCheckErrorMessage": "Debug compilation mode is currently enabled. It is recommended to\n disable this setting before go live.\n ",
+ "umbracoApplicationUrlCheckResultTrue": "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is set to %0% .",
+ "umbracoApplicationUrlCheckResultFalse": "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is not set.",
+ "clickJackingCheckHeaderFound": "The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was found.",
+ "clickJackingCheckHeaderNotFound": "The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.",
+ "noSniffCheckHeaderFound": "The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was found.",
+ "noSniffCheckHeaderNotFound": "The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was not found.",
+ "hSTSCheckHeaderFound": "The header Strict-Transport-Security , also known as the HSTS-header, was found.",
+ "hSTSCheckHeaderNotFound": "The header Strict-Transport-Security was not found.",
+ "hSTSCheckHeaderFoundOnLocalhost": "The header Strict-Transport-Security , also known as the HSTS-header, was found. This header should not be present on localhost. ",
+ "hSTSCheckHeaderNotFoundOnLocalhost": "The header Strict-Transport-Security was not found. This header should not be present on localhost.",
+ "xssProtectionCheckHeaderFound": "The header X-XSS-Protection was found. It is recommended not to add this header to your website . \n You can read about this on the Mozilla website ",
+ "xssProtectionCheckHeaderNotFound": "The header X-XSS-Protection was not found.",
+ "excessiveHeadersFound": "The following headers revealing information about the website technology were found: %0% .",
+ "excessiveHeadersNotFound": "No headers revealing information about the website technology were found.\n ",
+ "smtpMailSettingsNotFound": "The 'Umbraco:CMS:Global:Smtp' configuration could not be found.",
+ "smtpMailSettingsHostNotConfigured": "The 'Umbraco:CMS:Global:Smtp:Host' configuration could not be\n found.\n ",
+ "smtpMailSettingsConnectionSuccess": "SMTP settings are configured correctly and the service is operating\n as expected.\n ",
+ "smtpMailSettingsConnectionFail": "The SMTP server configured with host '%0%' and port '%1%' could not be\n reached. Please check to ensure the SMTP settings in the configuration 'Umbraco:CMS:Global:Smtp' are correct.\n ",
+ "notificationEmailsCheckSuccessMessage": "Notification email has been set to %0% .",
+ "notificationEmailsCheckErrorMessage": "Notification email is still set to the default value of %0% .",
+ "scheduledHealthCheckEmailBody": "Results of the scheduled Umbraco Health Checks run on %0% at %1% are as follows:
%2%",
+ "scheduledHealthCheckEmailSubject": "Umbraco Health Check Status: %0%",
+ "checkGroup": "Check group",
+ "helpText": "\n The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button.\n You can add your own health checks, have a look at the documentation for more information about custom health checks.
\n "
+ },
+ "nuCache": {
+ "refreshStatus": "Refresh status",
+ "memoryCache": "Memory Cache",
+ "memoryCacheDescription": "\n This button lets you reload the in-memory cache, by entirely reloading it from the database\n cache (but it does not rebuild that database cache). This is relatively fast.\n Use it when you think that the memory cache has not been properly refreshed, after some events\n triggered—which would indicate a minor Umbraco issue.\n (note: triggers the reload on all servers in an LB environment).\n ",
+ "reload": "Reload",
+ "databaseCache": "Database Cache",
+ "databaseCacheDescription": "\n This button lets you rebuild the database cache, ie the content of the cmsContentNu table.\n Rebuilding can be expensive. \n Use it when reloading is not enough, and you think that the database cache has not been\n properly generated—which would indicate some critical Umbraco issue.\n ",
+ "rebuild": "Rebuild",
+ "internals": "Internals",
+ "internalsDescription": "\n This button lets you trigger a NuCache snapshots collection (after running a fullCLR GC).\n Unless you know what that means, you probably do not need to use it.\n ",
+ "collect": "Collect",
+ "publishedCacheStatus": "Published Cache Status",
+ "caches": "Caches"
+ },
+ "profiling": {
+ "performanceProfiling": "Performance profiling",
+ "performanceProfilingDescription": "\n \n Umbraco currently runs in debug mode. This means you can use the built-in performance profiler to assess the performance when rendering pages.\n
\n \n If you want to activate the profiler for a specific page rendering, simply add umbDebug=true to the querystring when requesting the page.\n
\n \n If you want the profiler to be activated by default for all page renderings, you can use the toggle below.\n It will set a cookie in your browser, which then activates the profiler automatically.\n In other words, the profiler will only be active by default in your browser - not everyone else's.\n
\n ",
+ "activateByDefault": "Activate the profiler by default",
+ "reminder": "Friendly reminder",
+ "reminderDescription": "\n \n You should never let a production site run in debug mode. Debug mode is turned off by setting Umbraco:CMS:Hosting:Debug to false in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n ",
+ "profilerEnabledDescription": "\n \n Umbraco currently does not run in debug mode, so you can't use the built-in profiler. This is how it should be for a production site.\n
\n \n Debug mode is turned on by setting Umbraco:CMS:Hosting:Debug to true in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n "
+ },
+ "settingsDashboardVideos": {
+ "trainingHeadline": "Hours of Umbraco training videos are only a click away",
+ "trainingDescription": "\n Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos
\n ",
+ "getStarted": "To get you started"
+ },
+ "settingsDashboard": {
+ "start": "Start here",
+ "startDescription": "This section contains the building blocks for your Umbraco site. Follow the below\n links to find out more about working with the items in the Settings section\n ",
+ "more": "Find out more",
+ "bulletPointOne": "\n Read more about working with the items in Settings in the Documentation section of Our Umbraco\n ",
+ "bulletPointTwo": "\n Ask a question in the Community Forum \n ",
+ "bulletPointTutorials": "\n Watch our free tutorial videos on the Umbraco Learning Base \n ",
+ "bulletPointFour": "\n Find out about our productivity boosting tools and commercial support \n ",
+ "bulletPointFive": "\n Find out about real-life training and certification opportunities\n "
+ },
+ "startupDashboard": {
+ "fallbackHeadline": "Welcome to The Friendly CMS",
+ "fallbackDescription": "Thank you for choosing Umbraco - we think this could be the beginning of something\n beautiful. While it may feel overwhelming at first, we've done a lot to make the learning curve as smooth and fast\n as possible.\n "
+ },
+ "analytics": {
+ "consentForAnalytics": "Consent for telemetry data",
+ "analyticsLevelSavedSuccess": "Telemetry level saved!",
+ "analyticsDescription": "\n In order to improve Umbraco and add new functionality based on as relevant information as possible,\n we would like to collect system- and usage information from your installation.\n Aggregate data will be shared on a regular basis as well as learnings from these metrics.\n Hopefully, you will help us collect some valuable data.\n \n We WILL NOT collect any personal data such as content, code, user information, and all data will be fully anonymized.\n ",
+ "minimalLevelDescription": "We will only send an anonymized site ID to let us know that the site exists.",
+ "basicLevelDescription": "We will send an anonymized site ID, Umbraco version, and packages installed",
+ "detailedLevelDescription": "\n We will send:\n \n Anonymized site ID, Umbraco version, and packages installed. \n Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use. \n System information: Webserver, server OS, server framework, server OS language, and database provider. \n Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode. \n \n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n By choosing \"Detailed\" you agree to current and future anonymized information being collected. \n "
+ },
+ "umbId": {
+ "editProfile": "Edit your Umbraco ID profile",
+ "changePassword": "Change your Umbraco ID password"
+ },
+ "deployManagementDashboard": {
+ "refreshStatus": "Refresh Status",
+ "deployStatus": "Deploy Status",
+ "deployOperations": "Deploy Operations",
+ "triggerOperation": "Trigger Operation",
+ "version": "Version",
+ "status": "Status",
+ "operationTime": "Last operation time",
+ "schemaComparison": "Schema Comparison",
+ "configurationDetails": "Configuration Details",
+ "updateUmbracoSchemaFromDataFiles": "Update Umbraco Schema From Data Files",
+ "updateUmbracoSchemaFromDataFilesDescription": "Update the Umbraco schema based on the information contained in the .uda files on disk.",
+ "schemaDeployment": "Update Umbraco Schema",
+ "exportSchemaToDataFiles": "Export Schema To Data Files",
+ "exportSchemaToDataFilesDescription": "Extract the schema from Umbraco and output it to the .uda files on disk.",
+ "exportSchema": "Export Schema",
+ "clearCachedSignatures": "Clear Cached Signatures",
+ "clearCachedSignaturesDescription": "\n Clear the cached artifact signatures from the Umbraco environment.\n This should not be necessary in normal use. This may solve reports of schema mismatches when transferring content between environments that have been aligned.\n ",
+ "clearSignatures": "Clear Signatures",
+ "setCachedSignatures": "Set Cached Signatures",
+ "setCachedSignaturesDescription": "\n Sets the cached artifact signatures for all entities within the Umbraco environment.\n This can be used when signatures have been cleared and you want to ensure they are pre-generated before attempting a potentially long-running restore or transfer operation.\n ",
+ "setSignatures": "Set Signatures"
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
index a41650b2cc..29bf873007 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
@@ -12,6 +12,16 @@ const translationManifests: Array = [
},
loader: () => import('../../../assets/lang/en-us.js'),
},
+ {
+ type: 'translations',
+ alias: 'Umb.Translations.Da_DK',
+ weight: -100,
+ name: 'Dansk (Danmark)',
+ meta: {
+ culture: 'da-dk',
+ },
+ loader: () => import('../../../assets/lang/da-dk.js'),
+ },
];
export const manifests: Array = [...translationManifests];
From c274d78e596a5747c607ba8d4184218d879cfbdf Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 16:30:47 +0200
Subject: [PATCH 065/122] listen for language change on user
---
.../user-workspace-editor.element.ts | 21 ++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
index 138f56decc..e0e964b249 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
@@ -3,7 +3,7 @@ import { UmbUserRepository } from '../repository/user.repository.js';
import { UmbUserGroupInputElement } from '../../user-groups/components/input-user-group/user-group-input.element.js';
import { type UmbUserDetail } from '../index.js';
import { UmbUserWorkspaceContext } from './user-workspace.context.js';
-import { UUIInputElement, UUIInputEvent, UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
+import { UUIInputElement, UUIInputEvent, UUISelectElement, UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
import {
css,
html,
@@ -149,6 +149,15 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement {
}
}
+ #onLanguageChange(event: Event) {
+ const target = event.composedPath()[0] as UUISelectElement;
+
+ if (typeof target?.value === 'string') {
+ console.log('value', target.value);
+ this.#workspaceContext?.updateProperty('languageIsoCode', target.value);
+ }
+ }
+
#onPasswordChange() {
// TODO: check if current user is admin
this.#modalContext?.open(UMB_CHANGE_PASSWORD_MODAL, {
@@ -185,12 +194,18 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement {
if (!this._user) return nothing;
return html`
- Profile
+ Profile
-
+
+
From d943058b3cc13ffbd68433363eab97c323e2bd8c Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 16:31:04 +0200
Subject: [PATCH 066/122] fetch current user again if that user was changed
---
.../users/workspace/user-workspace.context.ts | 22 ++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts
index 4c412aa48d..8674f4314b 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace.context.ts
@@ -2,15 +2,24 @@ import { UmbUserRepository } from '../repository/user.repository.js';
import { type UmbUserDetail } from '../index.js';
import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
-import { UpdateUserRequestModel } from '@umbraco-cms/backoffice/backend-api';
+import type { UpdateUserRequestModel } from '@umbraco-cms/backoffice/backend-api';
import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api';
+import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api';
+import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
+import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs';
export class UmbUserWorkspaceContext
extends UmbWorkspaceContext
implements UmbEntityWorkspaceContextInterface
{
+ #authContext?: typeof UMB_AUTH.TYPE;
+
constructor(host: UmbControllerHostElement) {
super(host, new UmbUserRepository(host));
+
+ new UmbContextConsumerController(host, UMB_AUTH, (auth) => {
+ this.#authContext = auth;
+ });
}
#data = new UmbObjectState(undefined);
@@ -55,6 +64,17 @@ export class UmbUserWorkspaceContext
}
// If it went well, then its not new anymore?.
this.setIsNew(false);
+
+ // If we are saving the current user, we need to refetch it
+ await this.#reloadCurrentUser(this.#data.value.id);
+ }
+
+ async #reloadCurrentUser(savedUserId: string): Promise {
+ if (!this.#authContext) return;
+ const currentUser = await firstValueFrom(this.#authContext.currentUser);
+ if (currentUser?.id === savedUserId) {
+ await this.#authContext.fetchCurrentUser();
+ }
}
destroy(): void {
From afd3b9add69eb2587cf04c5acc80a731f8eef8a4 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 16:31:17 +0200
Subject: [PATCH 067/122] localize a string in UserRepository
---
.../users/users/repository/user.repository.ts | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts
index 47f71924bb..e1d42814d2 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts
@@ -1,3 +1,4 @@
+import { UMB_LOCALIZATION_CONTEXT } from '@umbraco-cms/backoffice/localization-api';
import {
UmbUserCollectionFilterModel,
UmbUserDetail,
@@ -53,6 +54,10 @@ export class UmbUserRepository
#notificationContext?: UmbNotificationContext;
+ #labels = {
+ userEditSaved: 'User saved',
+ };
+
constructor(host: UmbControllerHostElement) {
this.#host = host;
@@ -77,6 +82,12 @@ export class UmbUserRepository
this.#notificationContext = instance;
}).asPromise(),
]);
+
+ new UmbContextConsumerController(this.#host, UMB_LOCALIZATION_CONTEXT, (instance) => {
+ instance.localizeMany(['speechBubbles_editUserSaved']).subscribe((values) => {
+ this.#labels.userEditSaved = values[0];
+ });
+ });
}
// COLLECTION
@@ -187,7 +198,7 @@ export class UmbUserRepository
if (data) {
this.#detailStore?.append(data);
- const notification = { data: { message: `User saved` } };
+ const notification = { data: { message: this.#labels.userEditSaved } };
this.#notificationContext?.peek('positive', notification);
}
From fd2e125cbd4bdc7ba82faf4a1d38bf01a9cac9cb Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Thu, 27 Jul 2023 16:36:34 +0200
Subject: [PATCH 068/122] remove debugging
---
.../users/users/workspace/user-workspace-editor.element.ts | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
index e0e964b249..02cc921e93 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
@@ -153,7 +153,6 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement {
const target = event.composedPath()[0] as UUISelectElement;
if (typeof target?.value === 'string') {
- console.log('value', target.value);
this.#workspaceContext?.updateProperty('languageIsoCode', target.value);
}
}
From 2c096ddbe190af8ef2109dd5bab965dfc3a4d55d Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Fri, 28 Jul 2023 09:24:06 +0200
Subject: [PATCH 069/122] change variable
---
.../packages/core/localization/localize.element.stories.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
index 867d0f5bfe..c5e06f8ff3 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
@@ -7,19 +7,19 @@ const meta: Meta = {
title: 'Localization/Localize',
component: 'umb-localize',
args: {
- key: 'general_ok',
+ key: 'general_areyousure',
},
decorators: [
(story) => {
return html`
- Component output: ${story()}
+ Localized text: "${story()}"
`;
},
],
parameters: {
docs: {
source: {
- code: ` `,
+ code: ` `,
},
},
},
From 22f23b405ac65182c7019ea211b9f4617545d622 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Fri, 28 Jul 2023 09:28:43 +0200
Subject: [PATCH 070/122] add link to story
---
.../storybook/stories/extending/localization.mdx | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
index 250bedb902..0b4654b9dd 100644
--- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
+++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
@@ -71,6 +71,8 @@ The `umb-localize` component is used to translate text in the UI. It is used lik
+Experiment with the component here: [Localize](/story/localization-localize--overview)
+
### UmbLocalizationContext
The `UmbLocalizationContext` is used to translate text in the UI. It is used like this:
From aa9e41cfa14cd5b5ede9d87fda81b0494749e07b Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Fri, 28 Jul 2023 12:33:14 +0200
Subject: [PATCH 071/122] show a notification regardless if the server returned
data or not
---
.../src/packages/users/users/repository/user.repository.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts
index e1d42814d2..6e3b376b96 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts
@@ -197,7 +197,9 @@ export class UmbUserRepository
if (data) {
this.#detailStore?.append(data);
+ }
+ if (!error) {
const notification = { data: { message: this.#labels.userEditSaved } };
this.#notificationContext?.peek('positive', notification);
}
From 95e1104e371e5a62c5ae2433b0256ac33469a4b3 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Mon, 31 Jul 2023 17:27:49 +0200
Subject: [PATCH 072/122] replace localization context with localize controller
---
src/Umbraco.Web.UI.Client/index.html | 2 +-
.../src/apps/backoffice/backoffice.element.ts | 10 +-
.../controller-host-element.mixin.ts | 2 +
.../src/libs/element-api/element.mixin.ts | 12 ++
.../src/libs/localization-api/index.ts | 3 +-
.../localization.context.test.ts | 195 ------------------
.../localization-api/localization.context.ts | 64 ------
.../localize.controller.test.ts | 106 ++++++++++
.../localization-api/localize.controller.ts | 105 ++++++++++
.../src/libs/localization-api/manager.ts | 58 ++++++
.../registry/translation.registry.ts | 56 ++---
.../localization/localize.element.test.ts | 30 +--
.../core/localization/localize.element.ts | 59 +-----
.../packages/core/localization/manifests.ts | 4 +-
.../current-user-modal.element.ts | 26 +--
.../user-profile-app-profile.element.ts | 28 +--
.../users/users/repository/user.repository.ts | 15 +-
.../web-test-runner.config.mjs | 2 +-
18 files changed, 355 insertions(+), 422 deletions(-)
delete mode 100644 src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
delete mode 100644 src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts
diff --git a/src/Umbraco.Web.UI.Client/index.html b/src/Umbraco.Web.UI.Client/index.html
index 7f6db52d25..9f1236019b 100644
--- a/src/Umbraco.Web.UI.Client/index.html
+++ b/src/Umbraco.Web.UI.Client/index.html
@@ -1,5 +1,5 @@
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index 8b908773fd..d43609d8fc 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -1,6 +1,6 @@
import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context.js';
import { UmbExtensionInitializer } from './extension.controller.js';
-import { UMB_LOCALIZATION_CONTEXT, UmbLocalizationContext } from '@umbraco-cms/backoffice/localization-api';
+import { UmbTranslationRegistry } from '@umbraco-cms/backoffice/localization-api';
import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
@@ -40,14 +40,14 @@ export class UmbBackofficeElement extends UmbLitElement {
const extensionInitializer = new UmbExtensionInitializer(this, umbExtensionsRegistry);
extensionInitializer.setLocalPackages(CORE_PACKAGES);
- const localizationContext = new UmbLocalizationContext(umbExtensionsRegistry);
- this.provideContext(UMB_LOCALIZATION_CONTEXT, localizationContext);
-
+ const translationRegistry = new UmbTranslationRegistry(umbExtensionsRegistry);
+ translationRegistry.loadLanguage('en-us');
this.consumeContext(UMB_AUTH, (auth) => {
this.observe(
auth.languageIsoCode,
(currentLanguageIsoCode) => {
- localizationContext.setLanguage(currentLanguageIsoCode);
+ translationRegistry.loadLanguage(currentLanguageIsoCode);
+ document.documentElement.lang = currentLanguageIsoCode;
},
'languageIsoCode'
);
diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
index 28605231ce..2e2eddf3ae 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
@@ -3,8 +3,10 @@ import { UmbControllerAlias } from './controller-alias.type.js';
import { UmbControllerHostBaseMixin } from './controller-host-base.mixin.js';
import { UmbControllerHost } from './controller-host.interface.js';
import type { UmbController } from './controller.interface.js';
+import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
export declare class UmbControllerHostElement extends HTMLElement implements UmbControllerHost {
+ get localize(): UmbLocalizeController | undefined;
hasController(controller: UmbController): boolean;
getControllers(filterMethod: (ctrl: UmbController) => boolean): UmbController[];
addController(controller: UmbController): void;
diff --git a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
index d178efbdb6..4ae95713ab 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
@@ -9,6 +9,7 @@ import {
UmbContextProviderController,
} from '@umbraco-cms/backoffice/context-api';
import { ObserverCallback, UmbObserverController } from '@umbraco-cms/backoffice/observable-api';
+import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
export declare class UmbElement extends UmbControllerHostElement {
/**
@@ -28,10 +29,21 @@ export declare class UmbElement extends UmbControllerHostElement {
alias: string | UmbContextToken,
callback: UmbContextCallback
): UmbContextConsumerController;
+ get localize(): UmbLocalizeController;
}
export const UmbElementMixin = (superClass: T) => {
class UmbElementMixinClass extends UmbControllerHostElementMixin(superClass) implements UmbElement {
+ #localizeController = new UmbLocalizeController(this);
+
+ /**
+ * Get the localize controller.
+ * @readonly
+ */
+ get localize(): UmbLocalizeController {
+ return this.#localizeController;
+ }
+
/**
* @description Observe a RxJS source of choice.
* @param {Observable} source RxJS source
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
index b89708c78d..139e9726f8 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
@@ -1,2 +1,3 @@
export * from './registry/translation.registry.js';
-export * from './localization.context.js';
+export * from './localize.controller.js';
+export { registerTranslation } from './manager.js';
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
deleted file mode 100644
index efc13fbca7..0000000000
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.test.ts
+++ /dev/null
@@ -1,195 +0,0 @@
-import { expect, aTimeout } from '@open-wc/testing';
-import { firstValueFrom } from 'rxjs';
-import { UmbLocalizationContext } from './localization.context.js';
-import { UmbTranslationRegistry } from './registry/translation.registry.js';
-import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api';
-
-//#region Translations
-const english = {
- type: 'translations',
- alias: 'test.en',
- name: 'Test English',
- meta: {
- culture: 'en',
- translations: {
- general: {
- close: 'Close',
- logout: 'Log out',
- },
- },
- },
-};
-
-const englishOverride = {
- type: 'translations',
- alias: 'test.en.override',
- name: 'Test English',
- meta: {
- culture: 'en',
- translations: {
- general: {
- close: 'Close 2',
- },
- },
- },
-};
-
-const danish = {
- type: 'translations',
- alias: 'test.da',
- name: 'Test Danish',
- meta: {
- culture: 'da',
- translations: {
- general: {
- close: 'Luk',
- },
- },
- },
-};
-//#endregion
-
-describe('Localization', () => {
- let registry: UmbTranslationRegistry;
- let extensionRegistry: UmbExtensionRegistry;
-
- beforeEach(() => {
- extensionRegistry = new UmbExtensionRegistry();
- registry = new UmbTranslationRegistry(extensionRegistry);
- extensionRegistry.register(english);
- extensionRegistry.register(danish);
- registry.register(english.meta.culture, english.meta.culture);
- });
-
- describe('UmbTranslationRegistry', () => {
- it('should register and get translation', (done) => {
- registry.translations.subscribe((translations) => {
- expect(translations.get('general_close')).to.equal('Close');
- done();
- });
- });
- });
-
- describe('UmbLocalizationContext', () => {
- let context: UmbLocalizationContext;
-
- beforeEach(async () => {
- context = new UmbLocalizationContext(extensionRegistry);
- context.setLanguage(english.meta.culture, english.meta.culture);
- });
-
- describe('localize', () => {
- it('should return a value', async () => {
- const value = await firstValueFrom(context.localize('general_close'));
- expect(value).to.equal('Close');
- });
-
- it('should return fallback if key is not found', async () => {
- const value = await firstValueFrom(context.localize('general_not_found', 'Not found'));
- expect(value).to.equal('Not found');
- });
-
- it('should return an empty string if fallback is not provided', async () => {
- const value = await firstValueFrom(context.localize('general_not_found'));
- expect(value).to.equal('');
- });
-
- it('should return a new value if a key is overridden', async () => {
- const value = await firstValueFrom(context.localize('general_close'));
- expect(value).to.equal('Close');
-
- extensionRegistry.register(englishOverride);
-
- const value2 = await firstValueFrom(context.localize('general_close'));
- expect(value2).to.equal('Close 2');
- });
-
- it('should return a new value if the language is changed', async () => {
- const value = await firstValueFrom(context.localize('general_close'));
- expect(value).to.equal('Close');
-
- context.setLanguage(danish.meta.culture, english.meta.culture);
-
- await aTimeout(0);
-
- const value2 = await firstValueFrom(context.localize('general_close'));
- expect(value2).to.equal('Luk');
- });
-
- it('should use fallback language if key is not found', async () => {
- const value = await firstValueFrom(context.localize('general_logout'));
- expect(value).to.equal('Log out');
-
- context.setLanguage(danish.meta.culture, english.meta.culture);
-
- await aTimeout(0);
-
- const value2 = await firstValueFrom(context.localize('general_logout'));
- expect(value2).to.equal('Log out');
- });
- });
-
- describe('localizeMany', () => {
- it('should return values', async () => {
- const values = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
- expect(values[0]).to.equal('Close');
- expect(values[1]).to.equal('Log out');
- });
-
- it('should return empty values if keys are not found', async () => {
- const values = await firstValueFrom(context.localizeMany(['general_close', 'general_not_found']));
- expect(values[0]).to.equal('Close');
- expect(values[1]).to.equal('');
- });
-
- it('should update values if a key is overridden', async () => {
- const values = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
- expect(values[0]).to.equal('Close');
- expect(values[1]).to.equal('Log out');
-
- extensionRegistry.register(englishOverride);
-
- const values2 = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
- expect(values2[0]).to.equal('Close 2');
- expect(values2[1]).to.equal('Log out');
- });
-
- it('should return new values if a language is changed', async () => {
- const values = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
- expect(values[0]).to.equal('Close');
- expect(values[1]).to.equal('Log out');
-
- context.setLanguage(danish.meta.culture, english.meta.culture);
-
- await aTimeout(0);
-
- const values2 = await firstValueFrom(context.localizeMany(['general_close', 'general_logout']));
- expect(values2[0]).to.equal('Luk');
- expect(values2[1]).to.equal('Log out'); // This key does not exist in the danish translation so should use 'en' fallback.
- });
- });
-
- it('should emit new values in same subscription', async () => {
- const values: string[][] = [];
-
- context.localizeMany(['general_close', 'general_logout']).subscribe((value) => {
- values.push(value);
- });
-
- // Let the subscription run (values are available statically)
- await aTimeout(0);
-
- expect(values[0][0]).to.equal('Close');
- expect(values[0][1]).to.equal('Log out');
-
- // it should return new values if a key is overridden
- extensionRegistry.register(englishOverride);
-
- // Let the subscription run again
- await aTimeout(0);
-
- expect(values[1][0]).to.equal('Close 2');
- expect(values[1][1]).to.equal('Log out');
- });
- });
-});
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
deleted file mode 100644
index cc6c54fb9f..0000000000
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.context.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { UmbTranslationRegistry } from './registry/translation.registry.js';
-import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
-import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
-import { combineLatest, distinctUntilChanged, type Observable, map } from '@umbraco-cms/backoffice/external/rxjs';
-
-export class UmbLocalizationContext {
- #translationRegistry;
-
- constructor(umbExtensionRegistry: UmbBackofficeExtensionRegistry) {
- this.#translationRegistry = new UmbTranslationRegistry(umbExtensionRegistry);
- }
-
- get translations() {
- return this.#translationRegistry.translations;
- }
-
- /**
- * Set a new language which will query the manifests for translations and register them.
- * Eventually it will update all codes visible on the screen.
- *
- * @param languageIsoCode The language to use (example: 'en-us')
- * @param fallbackLanguageIsoCode The fallback language to use (example: 'en-us', default: 'en-us')
- */
- setLanguage(languageIsoCode: string, fallbackLanguageIsoCode?: string) {
- this.#translationRegistry.register(languageIsoCode, fallbackLanguageIsoCode);
- }
-
- /**
- * Localize a key.
- * If the key is not found, the fallback is returned.
- * If the fallback is not provided, the key is returned.
- *
- * @param key The key to localize. The key is case sensitive.
- * @param fallback The fallback text to use if the key is not found (default: undefined).
- * @example localize('general_close').subscribe((value) => {
- * console.log(value); // 'Close'
- * });
- */
- localize(key: string, fallback?: string): Observable {
- return this.translations.pipe(
- map((dictionary) => {
- return dictionary.get(key) ?? fallback ?? '';
- })
- );
- }
-
- /**
- * Localize many keys at once.
- * If a key is not found, the key is returned.
- *
- * @description This method combines the results of multiple calls to localize.
- * @param keys The keys to localize. The keys are case sensitive.
- * @example localizeMany(['general_close', 'general_logout']).subscribe((values) => {
- * console.log(values[0]); // 'Close'
- * console.log(values[1]); // 'Log out'
- * });
- * @see localize
- */
- localizeMany(keys: string[]) {
- return combineLatest(keys.map((key) => this.localize(key).pipe(distinctUntilChanged())));
- }
-}
-
-export const UMB_LOCALIZATION_CONTEXT = new UmbContextToken('UmbLocalizationContext');
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
new file mode 100644
index 0000000000..9a6a2e8870
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
@@ -0,0 +1,106 @@
+import { aTimeout, elementUpdated, expect, fixture, html } from '@open-wc/testing';
+import { UmbLocalizeController } from './localize.controller.js';
+import { UmbTranslationRegistry } from './registry/translation.registry.js';
+import { customElement, property } from '@umbraco-cms/backoffice/external/lit';
+import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
+import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
+@customElement('umb-localize-controller-host')
+class UmbLocalizeControllerHostElement extends UmbLitElement {
+ @property()
+ lang = 'en-us';
+}
+
+//#region Translations
+const english = {
+ type: 'translations',
+ alias: 'test.en',
+ name: 'Test English',
+ meta: {
+ culture: 'en-us',
+ translations: {
+ general: {
+ close: 'Close',
+ logout: 'Log out',
+ },
+ },
+ },
+};
+
+const englishOverride = {
+ type: 'translations',
+ alias: 'test.en.override',
+ name: 'Test English',
+ meta: {
+ culture: 'en-us',
+ translations: {
+ general: {
+ close: 'Close 2',
+ },
+ },
+ },
+};
+
+const danish = {
+ type: 'translations',
+ alias: 'test.da',
+ name: 'Test Danish',
+ meta: {
+ culture: 'da-dk',
+ translations: {
+ general: {
+ close: 'Luk',
+ },
+ },
+ },
+};
+//#endregion
+
+describe('UmbLocalizeController', () => {
+ const registry = new UmbTranslationRegistry(umbExtensionsRegistry);
+ umbExtensionsRegistry.register(english);
+ umbExtensionsRegistry.register(danish);
+ registry.loadLanguage(english.meta.culture);
+ registry.loadLanguage(danish.meta.culture);
+
+ let element: UmbLocalizeControllerHostElement;
+
+ beforeEach(async () => {
+ element = await fixture(html` `);
+ });
+
+ it('should have a localize controller', () => {
+ expect(element.localize).to.be.instanceOf(UmbLocalizeController);
+ });
+
+ it('should return a term', async () => {
+ expect(element.localize.term('general_close')).to.equal('Close');
+ });
+
+ it('should update the term when the language changes', async () => {
+ expect(element.localize.term('general_close')).to.equal('Close');
+ element.lang = danish.meta.culture;
+ await elementUpdated(element);
+ expect(element.localize.term('general_close')).to.equal('Luk');
+ });
+
+ it('should update the term when the dir changes', async () => {
+ expect(element.localize.term('general_close')).to.equal('Close');
+ element.dir = 'rtl';
+ await elementUpdated(element);
+ expect(element.localize.term('general_close')).to.equal('Close');
+ });
+
+ it('should provide a fallback term when the term is not found', async () => {
+ element.lang = danish.meta.culture;
+ await elementUpdated(element);
+ expect(element.localize.term('general_close')).to.equal('Luk');
+ expect(element.localize.term('general_logout')).to.equal('Log out');
+ });
+
+ // TODO: fix this test
+ // it('should override a term', async () => {
+ // umbExtensionsRegistry.register(englishOverride);
+ // await aTimeout(0);
+ // expect(element.localize.term('general_close')).to.equal('Close 2');
+ // });
+});
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
new file mode 100644
index 0000000000..8a407397f6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
@@ -0,0 +1,105 @@
+import {
+ DefaultTranslation,
+ FunctionParams,
+ Translation,
+ connectedElements,
+ documentDirection,
+ documentLanguage,
+ fallback,
+ translations,
+} from './manager.js';
+import { UmbController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
+
+export class UmbLocalizeController implements UmbController {
+ host;
+ controllerAlias = 'localize';
+
+ constructor(host: UmbControllerHostElement) {
+ this.host = host;
+ this.host.addController(this);
+ }
+
+ hostConnected(): void {
+ if (connectedElements.has(this.host)) {
+ return;
+ }
+
+ connectedElements.add(this.host);
+ }
+
+ hostDisconnected(): void {
+ connectedElements.delete(this.host);
+ }
+
+ destroy(): void {
+ connectedElements.delete(this.host);
+ this.host.removeController(this);
+ }
+
+ /**
+ * Gets the host element's directionality as determined by the `dir` attribute. The return value is transformed to
+ * lowercase.
+ */
+ dir() {
+ return `${this.host.dir || documentDirection}`.toLowerCase();
+ }
+
+ /**
+ * Gets the host element's language as determined by the `lang` attribute. The return value is transformed to
+ * lowercase.
+ */
+ lang() {
+ return `${this.host.lang || documentLanguage}`.toLowerCase();
+ }
+
+ private getTranslationData(lang: string) {
+ const locale = new Intl.Locale(lang);
+ const language = locale?.language.toLowerCase();
+ const region = locale?.region?.toLowerCase() ?? '';
+ const primary = translations.get(`${language}-${region}`);
+ const secondary = translations.get(language);
+
+ return { locale, language, region, primary, secondary };
+ }
+
+ /** Outputs a translated term. */
+ term(key: K, ...args: FunctionParams): string {
+ const { primary, secondary } = this.getTranslationData(this.lang());
+ let term: any;
+
+ // Look for a matching term using regionCode, code, then the fallback
+ if (primary && primary[key]) {
+ term = primary[key];
+ } else if (secondary && secondary[key]) {
+ term = secondary[key];
+ } else if (fallback && fallback[key as keyof Translation]) {
+ term = fallback[key as keyof Translation];
+ } else {
+ console.error(`No translation found for: ${String(key)}`);
+ return String(key);
+ }
+
+ if (typeof term === 'function') {
+ return term(...args) as string;
+ }
+
+ return term;
+ }
+
+ /** Outputs a localized date in the specified format. */
+ date(dateToFormat: Date | string, options?: Intl.DateTimeFormatOptions): string {
+ dateToFormat = new Date(dateToFormat);
+ return new Intl.DateTimeFormat(this.lang(), options).format(dateToFormat);
+ }
+
+ /** Outputs a localized number in the specified format. */
+ number(numberToFormat: number | string, options?: Intl.NumberFormatOptions): string {
+ numberToFormat = Number(numberToFormat);
+ return isNaN(numberToFormat) ? '' : new Intl.NumberFormat(this.lang(), options).format(numberToFormat);
+ }
+
+ /** Outputs a localized time in relative format. */
+ relativeTime(value: number, unit: Intl.RelativeTimeFormatUnit, options?: Intl.RelativeTimeFormatOptions): string {
+ return new Intl.RelativeTimeFormat(this.lang(), options).format(value, unit);
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts
new file mode 100644
index 0000000000..3b51f06d06
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts
@@ -0,0 +1,58 @@
+import { LitElement } from '@umbraco-cms/backoffice/external/lit';
+
+export type FunctionParams = T extends (...args: infer U) => string ? U : [];
+
+export interface Translation {
+ $code: string; // e.g. en, en-GB
+ $dir: 'ltr' | 'rtl';
+}
+
+export interface DefaultTranslation extends Translation {
+ [key: string]: any;
+}
+
+export const connectedElements = new Set();
+const documentElementObserver = new MutationObserver(update);
+export const translations: Map = new Map();
+export let documentDirection = document.documentElement.dir || 'ltr';
+export let documentLanguage = document.documentElement.lang || navigator.language;
+export let fallback: Translation;
+
+// Watch for changes on
+documentElementObserver.observe(document.documentElement, {
+ attributes: true,
+ attributeFilter: ['dir', 'lang'],
+});
+
+/** Registers one or more translations */
+export function registerTranslation(...translation: Translation[]) {
+ translation.map((t) => {
+ const code = t.$code.toLowerCase();
+
+ if (translations.has(code)) {
+ // Merge translations that share the same language code
+ translations.set(code, { ...translations.get(code), ...t });
+ } else {
+ translations.set(code, t);
+ }
+
+ // The first translation that's registered is the fallback
+ if (!fallback) {
+ fallback = t;
+ }
+ });
+
+ update();
+}
+
+/** Updates all localized elements that are currently connected */
+export function update() {
+ documentDirection = document.documentElement.dir || 'ltr';
+ documentLanguage = document.documentElement.lang || navigator.language;
+
+ [...connectedElements.keys()].map((el) => {
+ if (typeof (el as LitElement).requestUpdate === 'function') {
+ (el as LitElement).requestUpdate();
+ }
+ });
+}
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 0b82ca0a0a..b9425b1d26 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -1,29 +1,21 @@
+import { Translation, registerTranslation } from '../manager.js';
import { hasDefaultExport, loadExtension } from '@umbraco-cms/backoffice/extension-api';
import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
-import { ReplaySubject, Subscription } from '@umbraco-cms/backoffice/external/rxjs';
+import { Subscription } from '@umbraco-cms/backoffice/external/rxjs';
-export type UmbTranslationDictionary = Map;
+export type UmbTranslationDictionary = Record;
export class UmbTranslationRegistry {
- #extensionRegistry;
- #innerDictionary = new ReplaySubject(1);
- #innerDictionaryValue: UmbTranslationDictionary = new Map();
+ #registry;
#subscription?: Subscription;
- constructor(umbExtensionRegistry: UmbBackofficeExtensionRegistry) {
- this.#extensionRegistry = umbExtensionRegistry;
+ constructor(extensionRegistry: UmbBackofficeExtensionRegistry) {
+ this.#registry = extensionRegistry;
}
- get translations() {
- return this.#innerDictionary.asObservable();
- }
-
- register(userCulture: string, fallbackCulture = 'en-us') {
+ loadLanguage(userCulture: string) {
+ // Normalize the culture
userCulture = userCulture.toLowerCase();
- fallbackCulture = fallbackCulture.toLowerCase();
-
- // Reset the inner dictionary.
- this.#innerDictionaryValue = new Map();
// Cancel any previous subscription.
if (this.#subscription) {
@@ -31,17 +23,18 @@ export class UmbTranslationRegistry {
}
// Load new translations
- this.#subscription = this.#extensionRegistry.extensionsOfType('translations').subscribe(async (extensions) => {
+ this.#subscription = this.#registry.extensionsOfType('translations').subscribe(async (extensions) => {
await Promise.all(
extensions
- .filter((x) => x.meta.culture === userCulture || x.meta.culture === fallbackCulture)
+ .filter((x) => x.meta.culture.toLowerCase() === userCulture)
.map(async (extension) => {
+ const innerDictionary: UmbTranslationDictionary = {};
+
// If extension contains a dictionary, add it to the inner dictionary.
if (extension.meta.translations) {
for (const [dictionaryName, dictionary] of Object.entries(extension.meta.translations)) {
- this.#addOrUpdateDictionary(dictionaryName, dictionary);
+ this.#addOrUpdateDictionary(innerDictionary, dictionaryName, dictionary);
}
- return;
}
// If extension contains a js file, load it and add the default dictionary to the inner dictionary.
@@ -49,22 +42,29 @@ export class UmbTranslationRegistry {
if (loadedExtension && hasDefaultExport(loadedExtension)) {
for (const [dictionaryName, dictionary] of Object.entries(loadedExtension.default)) {
- this.#addOrUpdateDictionary(dictionaryName, dictionary);
+ this.#addOrUpdateDictionary(innerDictionary, dictionaryName, dictionary);
}
}
+
+ // Notify subscribers that the inner dictionary has changed.
+ const translation: Translation = {
+ $code: userCulture,
+ $dir: 'ltr',
+ ...innerDictionary,
+ };
+ registerTranslation(translation);
})
);
-
- // Notify subscribers that the inner dictionary has changed.
- if (this.#innerDictionaryValue.size > 0) {
- this.#innerDictionary.next(this.#innerDictionaryValue);
- }
});
}
- #addOrUpdateDictionary(dictionaryName: string, dictionary: Record) {
+ #addOrUpdateDictionary(
+ innerDictionary: UmbTranslationDictionary,
+ dictionaryName: string,
+ dictionary: Record
+ ) {
for (const [key, value] of Object.entries(dictionary)) {
- this.#innerDictionaryValue.set(`${dictionaryName}_${key}`, value);
+ innerDictionary[`${dictionaryName}_${key}`] = value;
}
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
index 81591ae206..ad7a9f85e7 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
@@ -1,9 +1,9 @@
-import { aTimeout, elementUpdated, expect, fixture, html } from '@open-wc/testing';
+import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
import { UmbLocalizeElement } from './localize.element.js';
-import { UMB_LOCALIZATION_CONTEXT, UmbLocalizationContext } from '@umbraco-cms/backoffice/localization-api';
-import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api';
import '@umbraco-cms/backoffice/context-api';
+import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
+import { UmbTranslationRegistry } from '@umbraco-cms/backoffice/localization-api';
const english = {
type: 'translations',
@@ -46,22 +46,13 @@ describe('umb-localize', () => {
});
describe('localization', () => {
- let hostElement: HTMLElement;
- let extensionRegistry: UmbExtensionRegistry;
- let context: UmbLocalizationContext;
+ umbExtensionsRegistry.register(english);
+ umbExtensionsRegistry.register(danish);
+ const translationRegistry = new UmbTranslationRegistry(umbExtensionsRegistry);
+ translationRegistry.loadLanguage(english.meta.culture);
beforeEach(async () => {
- extensionRegistry = new UmbExtensionRegistry();
- extensionRegistry.register(english);
- extensionRegistry.register(danish);
- context = new UmbLocalizationContext(extensionRegistry);
- context.setLanguage(english.meta.culture, english.meta.culture);
- hostElement = await fixture(
- html`
-
- `
- );
- element = hostElement.querySelector('umb-localize') as UmbLocalizeElement;
+ element = await fixture(html` `);
});
it('should localize a key', async () => {
@@ -79,14 +70,11 @@ describe('umb-localize', () => {
});
it('should change the value if the language is changed', async () => {
- await elementUpdated(element);
expect(element.shadowRoot?.innerHTML).to.contain('Close');
- context.setLanguage(danish.meta.culture);
+ element.lang = danish.meta.culture;
await elementUpdated(element);
- await aTimeout(0);
-
expect(element.shadowRoot?.innerHTML).to.contain('Luk');
});
});
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 9343502d82..2cd362de21 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -1,7 +1,5 @@
-import { UMB_LOCALIZATION_CONTEXT } from '@umbraco-cms/backoffice/localization-api';
import { customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
-import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api';
/**
* This element allows you to localize a string with optional interpolation values.
@@ -15,67 +13,24 @@ export class UmbLocalizeElement extends UmbLitElement {
* @example key="general_ok"
*/
@property({ type: String })
- set key(value: string) {
- const isNewKey = this.#key !== value;
- this.#key = value;
-
- // Only reload translations if the key has changed, otherwise the load happens when the context is there.
- if (isNewKey) {
- this.#load();
- }
- }
-
- get key() {
- return this.#key;
- }
+ key!: string;
/**
* If true, the key will be rendered instead of the localized value if the key is not found.
* @attr
*/
- @property({ type: Boolean })
+ @property()
debug = false;
@state()
- protected value?: string;
-
- #key = '';
- #localizationContext?: typeof UMB_LOCALIZATION_CONTEXT.TYPE;
- #subscription?: UmbObserverController;
-
- constructor() {
- super();
- this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
- this.#localizationContext = instance;
- this.#load();
- });
- }
-
- async #load() {
- if (this.#subscription) {
- this.#subscription.destroy();
- }
-
- if (!this.#localizationContext) {
- return;
- }
-
- this.#subscription = this.observe(this.#localizationContext!.localize(this.key), (value) => {
- if (value) {
- (this.getHostElement() as HTMLElement).removeAttribute('data-umb-localize-error');
- this.value = value;
- } else {
- (this.getHostElement() as HTMLElement).setAttribute('data-umb-localize-error', `Key not found: ${this.key}`);
- console.warn('Key not found:', this.key, this);
- if (this.debug) {
- this.value = this.key;
- }
- }
- });
+ get text(): string {
+ const localizedValue = this.localize.term(this.key);
+ console.log('localizedValue', localizedValue);
+ return localizedValue;
}
protected render() {
- return this.value ? html`${this.value}` : html` `;
+ return this.text ? html`${this.text}` : html` `;
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
index 29bf873007..d9d29fced6 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
@@ -10,7 +10,7 @@ const translationManifests: Array = [
meta: {
culture: 'en-us',
},
- loader: () => import('../../../assets/lang/en-us.js'),
+ loader: () => import('../../../assets/lang/en-us.js' as unknown as string),
},
{
type: 'translations',
@@ -20,7 +20,7 @@ const translationManifests: Array = [
meta: {
culture: 'da-dk',
},
- loader: () => import('../../../assets/lang/da-dk.js'),
+ loader: () => import('../../../assets/lang/da-dk.js' as unknown as string),
},
];
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
index 872fe2d25e..5eb6edc4d7 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/modals/current-user/current-user-modal.element.ts
@@ -1,4 +1,3 @@
-import { UMB_LOCALIZATION_CONTEXT } from '@umbraco-cms/backoffice/localization-api';
import { UMB_AUTH, type UmbLoggedInUser } from '@umbraco-cms/backoffice/auth';
import { UMB_APP } from '@umbraco-cms/backoffice/context';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
@@ -11,12 +10,6 @@ export class UmbCurrentUserModalElement extends UmbLitElement {
@property({ attribute: false })
modalContext?: UmbModalContext;
- @state()
- protected labelClose = 'Close';
-
- @state()
- protected labelLogout = 'Log out';
-
@state()
private _currentUser?: UmbLoggedInUser;
@@ -35,13 +28,6 @@ export class UmbCurrentUserModalElement extends UmbLitElement {
this.consumeContext(UMB_APP, (instance) => {
this.#appContext = instance;
});
-
- this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
- instance.localizeMany(['general_close', 'general_logout']).subscribe((values) => {
- this.labelClose = values[0];
- this.labelLogout = values[1];
- });
- });
}
private async _observeCurrentUser() {
@@ -72,9 +58,15 @@ export class UmbCurrentUserModalElement extends UmbLitElement {
- ${this.labelClose}
-
- ${this.labelLogout}
+
+ ${this.localize.term('general_close')}
+
+
+ ${this.localize.term('general_logout')}
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts
index bdfe434667..b7e749582f 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/current-user/user-profile-apps/user-profile-app-profile.element.ts
@@ -1,4 +1,3 @@
-import { UMB_LOCALIZATION_CONTEXT } from '@umbraco-cms/backoffice/localization-api';
import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
@@ -14,15 +13,6 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement {
@state()
private _currentUser?: UmbLoggedInUser;
- @state()
- protected _labelYourProfile = 'Your profile';
-
- @state()
- protected _labelEditProfile = 'Edit';
-
- @state()
- protected _labelChangePassword = 'Change password';
-
private _modalContext?: UmbModalManagerContext;
private _auth?: typeof UMB_AUTH.TYPE;
@@ -37,14 +27,6 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement {
this._auth = instance;
this._observeCurrentUser();
});
-
- this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
- instance.localizeMany(['user_yourProfile', 'general_edit', 'general_changePassword']).subscribe((value) => {
- this._labelYourProfile = value[0];
- this._labelEditProfile = value[1];
- this._labelChangePassword = value[2];
- });
- });
}
private async _observeCurrentUser() {
@@ -72,12 +54,12 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement {
render() {
return html`
-
-
- ${this._labelEditProfile}
+
+
+ ${this.localize.term('general_edit')}
-
- ${this._labelChangePassword}
+
+ ${this.localize.term('general_changePassword')}
`;
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts
index 6e3b376b96..02aeb397b7 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/repository/user.repository.ts
@@ -1,4 +1,3 @@
-import { UMB_LOCALIZATION_CONTEXT } from '@umbraco-cms/backoffice/localization-api';
import {
UmbUserCollectionFilterModel,
UmbUserDetail,
@@ -54,10 +53,6 @@ export class UmbUserRepository
#notificationContext?: UmbNotificationContext;
- #labels = {
- userEditSaved: 'User saved',
- };
-
constructor(host: UmbControllerHostElement) {
this.#host = host;
@@ -82,12 +77,6 @@ export class UmbUserRepository
this.#notificationContext = instance;
}).asPromise(),
]);
-
- new UmbContextConsumerController(this.#host, UMB_LOCALIZATION_CONTEXT, (instance) => {
- instance.localizeMany(['speechBubbles_editUserSaved']).subscribe((values) => {
- this.#labels.userEditSaved = values[0];
- });
- });
}
// COLLECTION
@@ -200,7 +189,9 @@ export class UmbUserRepository
}
if (!error) {
- const notification = { data: { message: this.#labels.userEditSaved } };
+ const notification = {
+ data: { message: this.#host.localize?.term('speechBubbles_editUserSaved') ?? 'User saved' },
+ };
this.#notificationContext?.peek('positive', notification);
}
diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs
index 34fc6663d7..2c476908be 100644
--- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs
+++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs
@@ -126,7 +126,7 @@ export default {
reporters: ['lcovonly', 'text-summary'],
},
testRunnerHtml: (testFramework) =>
- `
+ `
From 75847699b3319f910637654c423e6e7a25b4ecd1 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 09:53:26 +0200
Subject: [PATCH 073/122] fix inheritance
---
.../controller-host-element.mixin.ts | 6 +++++-
.../src/libs/element-api/element.mixin.ts | 14 +++++---------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
index 2e2eddf3ae..c5d873877b 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
@@ -6,7 +6,11 @@ import type { UmbController } from './controller.interface.js';
import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
export declare class UmbControllerHostElement extends HTMLElement implements UmbControllerHost {
- get localize(): UmbLocalizeController | undefined;
+ /**
+ * Use the UmbLocalizeController to localize your element.
+ * @see UmbLocalizeController
+ */
+ localize: UmbLocalizeController;
hasController(controller: UmbController): boolean;
getControllers(filterMethod: (ctrl: UmbController) => boolean): UmbController[];
addController(controller: UmbController): void;
diff --git a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
index 4ae95713ab..8b59c0bae9 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/element-api/element.mixin.ts
@@ -10,6 +10,7 @@ import {
} from '@umbraco-cms/backoffice/context-api';
import { ObserverCallback, UmbObserverController } from '@umbraco-cms/backoffice/observable-api';
import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
+import { property } from '@umbraco-cms/backoffice/external/lit';
export declare class UmbElement extends UmbControllerHostElement {
/**
@@ -29,20 +30,15 @@ export declare class UmbElement extends UmbControllerHostElement {
alias: string | UmbContextToken,
callback: UmbContextCallback
): UmbContextConsumerController;
- get localize(): UmbLocalizeController;
}
export const UmbElementMixin = (superClass: T) => {
class UmbElementMixinClass extends UmbControllerHostElementMixin(superClass) implements UmbElement {
- #localizeController = new UmbLocalizeController(this);
+ // Make `dir` and `lang` reactive properties so they react to language changes:
+ @property() dir = '';
+ @property() lang = '';
- /**
- * Get the localize controller.
- * @readonly
- */
- get localize(): UmbLocalizeController {
- return this.#localizeController;
- }
+ localize: UmbLocalizeController = new UmbLocalizeController(this);
/**
* @description Observe a RxJS source of choice.
From dcd3bcdc992d8b6f243762fa0cbf306015741f06 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 09:53:37 +0200
Subject: [PATCH 074/122] add tests to localize controller
---
.../libs/localization-api/localize.controller.test.ts | 11 +++++------
.../src/libs/localization-api/localize.controller.ts | 1 -
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
index 9a6a2e8870..0f23d801e0 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
@@ -97,10 +97,9 @@ describe('UmbLocalizeController', () => {
expect(element.localize.term('general_logout')).to.equal('Log out');
});
- // TODO: fix this test
- // it('should override a term', async () => {
- // umbExtensionsRegistry.register(englishOverride);
- // await aTimeout(0);
- // expect(element.localize.term('general_close')).to.equal('Close 2');
- // });
+ it('should override a term', async () => {
+ umbExtensionsRegistry.register(englishOverride);
+ await aTimeout(0);
+ expect(element.localize.term('general_close')).to.equal('Close 2');
+ });
});
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
index 8a407397f6..7f5b63dac2 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
@@ -75,7 +75,6 @@ export class UmbLocalizeController
Date: Tue, 1 Aug 2023 09:53:58 +0200
Subject: [PATCH 075/122] add tests to localize element
---
.../localization/localize.element.test.ts | 24 ++++++++++++++++---
.../core/localization/localize.element.ts | 16 +++++++++++--
2 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
index ad7a9f85e7..6249116755 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
@@ -38,7 +38,7 @@ describe('umb-localize', () => {
let element: UmbLocalizeElement;
beforeEach(async () => {
- element = await fixture(html` `);
+ element = await fixture(html`Fallback value `);
});
it('should be defined', () => {
@@ -50,22 +50,22 @@ describe('umb-localize', () => {
umbExtensionsRegistry.register(danish);
const translationRegistry = new UmbTranslationRegistry(umbExtensionsRegistry);
translationRegistry.loadLanguage(english.meta.culture);
+ translationRegistry.loadLanguage(danish.meta.culture);
beforeEach(async () => {
element = await fixture(html` `);
});
it('should localize a key', async () => {
- await elementUpdated(element);
expect(element.shadowRoot?.innerHTML).to.contain('Close');
});
it('should change the value if a new key is set', async () => {
- await elementUpdated(element);
expect(element.shadowRoot?.innerHTML).to.contain('Close');
element.key = 'general_logout';
await elementUpdated(element);
+
expect(element.shadowRoot?.innerHTML).to.contain('Log out');
});
@@ -77,5 +77,23 @@ describe('umb-localize', () => {
expect(element.shadowRoot?.innerHTML).to.contain('Luk');
});
+
+ it('should use the slot if translation is not found', async () => {
+ element.key = 'non-existing-key';
+ await elementUpdated(element);
+
+ expect(element.shadowRoot?.innerHTML).to.contain(' ');
+
+ // It should also have a data attribute to indicate that the key was not found:
+ expect(element.getAttribute('data-localize-missing')).to.equal('non-existing-key');
+ });
+
+ it('should use the key if debug is enabled and translation is not found', async () => {
+ element.key = 'non-existing-key';
+ element.debug = true;
+ await elementUpdated(element);
+
+ expect(element.shadowRoot?.innerHTML).to.contain('non-existing-key');
+ });
});
});
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 2cd362de21..3335512d27 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -25,12 +25,24 @@ export class UmbLocalizeElement extends UmbLitElement {
@state()
get text(): string {
const localizedValue = this.localize.term(this.key);
- console.log('localizedValue', localizedValue);
+
+ // If the value is the same as the key, it means the key was not found.
+ if (localizedValue === this.key) {
+ (this.getHostElement() as HTMLElement).setAttribute('data-localize-missing', this.key);
+ return '';
+ }
+
+ (this.getHostElement() as HTMLElement).removeAttribute('data-localize-missing');
+
return localizedValue;
}
protected render() {
- return this.text ? html`${this.text}` : html` `;
+ return this.text
+ ? html`${this.text}`
+ : this.debug
+ ? html`${this.key} `
+ : html` `;
}
}
From eec8e5676338bde6e33e88bd4ed557c7f123e470 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 10:20:26 +0200
Subject: [PATCH 076/122] add comment
---
.../src/apps/backoffice/backoffice.element.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index d43609d8fc..c219994240 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -41,6 +41,7 @@ export class UmbBackofficeElement extends UmbLitElement {
extensionInitializer.setLocalPackages(CORE_PACKAGES);
const translationRegistry = new UmbTranslationRegistry(umbExtensionsRegistry);
+ // Load default language
translationRegistry.loadLanguage('en-us');
this.consumeContext(UMB_AUTH, (auth) => {
this.observe(
From e82d25ac4c5cf7e7aecddec083693fe67c5526f1 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 10:21:25 +0200
Subject: [PATCH 077/122] do not reset subscription every time a new language
is loaded
use combineLatest to get latest of both culture and extensions so that whenever something changes we update the translations
---
.../registry/translation.registry.ts | 83 +++++++++----------
1 file changed, 39 insertions(+), 44 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index b9425b1d26..bc68b200c6 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -1,61 +1,56 @@
import { Translation, registerTranslation } from '../manager.js';
import { hasDefaultExport, loadExtension } from '@umbraco-cms/backoffice/extension-api';
import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
-import { Subscription } from '@umbraco-cms/backoffice/external/rxjs';
+import { Subject, combineLatest } from '@umbraco-cms/backoffice/external/rxjs';
export type UmbTranslationDictionary = Record;
export class UmbTranslationRegistry {
#registry;
- #subscription?: Subscription;
+ #currentLanguage = new Subject();
constructor(extensionRegistry: UmbBackofficeExtensionRegistry) {
this.#registry = extensionRegistry;
+
+ combineLatest([this.#currentLanguage, this.#registry.extensionsOfType('translations')]).subscribe(
+ async ([userCulture, extensions]) => {
+ await Promise.all(
+ extensions
+ .filter((x) => x.meta.culture.toLowerCase() === userCulture)
+ .map(async (extension) => {
+ const innerDictionary: UmbTranslationDictionary = {};
+
+ // If extension contains a dictionary, add it to the inner dictionary.
+ if (extension.meta.translations) {
+ for (const [dictionaryName, dictionary] of Object.entries(extension.meta.translations)) {
+ this.#addOrUpdateDictionary(innerDictionary, dictionaryName, dictionary);
+ }
+ }
+
+ // If extension contains a js file, load it and add the default dictionary to the inner dictionary.
+ const loadedExtension = await loadExtension(extension);
+
+ if (loadedExtension && hasDefaultExport(loadedExtension)) {
+ for (const [dictionaryName, dictionary] of Object.entries(loadedExtension.default)) {
+ this.#addOrUpdateDictionary(innerDictionary, dictionaryName, dictionary);
+ }
+ }
+
+ // Notify subscribers that the inner dictionary has changed.
+ const translation: Translation = {
+ $code: userCulture,
+ $dir: 'ltr',
+ ...innerDictionary,
+ };
+ registerTranslation(translation);
+ })
+ );
+ }
+ );
}
loadLanguage(userCulture: string) {
- // Normalize the culture
- userCulture = userCulture.toLowerCase();
-
- // Cancel any previous subscription.
- if (this.#subscription) {
- this.#subscription.unsubscribe();
- }
-
- // Load new translations
- this.#subscription = this.#registry.extensionsOfType('translations').subscribe(async (extensions) => {
- await Promise.all(
- extensions
- .filter((x) => x.meta.culture.toLowerCase() === userCulture)
- .map(async (extension) => {
- const innerDictionary: UmbTranslationDictionary = {};
-
- // If extension contains a dictionary, add it to the inner dictionary.
- if (extension.meta.translations) {
- for (const [dictionaryName, dictionary] of Object.entries(extension.meta.translations)) {
- this.#addOrUpdateDictionary(innerDictionary, dictionaryName, dictionary);
- }
- }
-
- // If extension contains a js file, load it and add the default dictionary to the inner dictionary.
- const loadedExtension = await loadExtension(extension);
-
- if (loadedExtension && hasDefaultExport(loadedExtension)) {
- for (const [dictionaryName, dictionary] of Object.entries(loadedExtension.default)) {
- this.#addOrUpdateDictionary(innerDictionary, dictionaryName, dictionary);
- }
- }
-
- // Notify subscribers that the inner dictionary has changed.
- const translation: Translation = {
- $code: userCulture,
- $dir: 'ltr',
- ...innerDictionary,
- };
- registerTranslation(translation);
- })
- );
- });
+ this.#currentLanguage.next(userCulture.toLowerCase());
}
#addOrUpdateDictionary(
From 5c30003abb40f1b91fa2340ab6b40a07ea3bb8d2 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 10:21:46 +0200
Subject: [PATCH 078/122] load languages appropriately in tests
---
.../localization-api/localize.controller.test.ts | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
index 0f23d801e0..71d158851b 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
@@ -4,6 +4,7 @@ import { UmbTranslationRegistry } from './registry/translation.registry.js';
import { customElement, property } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
+
@customElement('umb-localize-controller-host')
class UmbLocalizeControllerHostElement extends UmbLitElement {
@property()
@@ -59,12 +60,11 @@ describe('UmbLocalizeController', () => {
const registry = new UmbTranslationRegistry(umbExtensionsRegistry);
umbExtensionsRegistry.register(english);
umbExtensionsRegistry.register(danish);
- registry.loadLanguage(english.meta.culture);
- registry.loadLanguage(danish.meta.culture);
let element: UmbLocalizeControllerHostElement;
beforeEach(async () => {
+ registry.loadLanguage(english.meta.culture);
element = await fixture(html` `);
});
@@ -78,7 +78,11 @@ describe('UmbLocalizeController', () => {
it('should update the term when the language changes', async () => {
expect(element.localize.term('general_close')).to.equal('Close');
+ // Load Danish
+ registry.loadLanguage(danish.meta.culture);
+ // Switch browser to Danish
element.lang = danish.meta.culture;
+
await elementUpdated(element);
expect(element.localize.term('general_close')).to.equal('Luk');
});
@@ -91,15 +95,20 @@ describe('UmbLocalizeController', () => {
});
it('should provide a fallback term when the term is not found', async () => {
+ // Load Danish
+ registry.loadLanguage(danish.meta.culture);
+ // Switch browser to Danish
element.lang = danish.meta.culture;
await elementUpdated(element);
expect(element.localize.term('general_close')).to.equal('Luk');
expect(element.localize.term('general_logout')).to.equal('Log out');
});
- it('should override a term', async () => {
+ it('should override a term if new extension is registered', async () => {
umbExtensionsRegistry.register(englishOverride);
+ // Let the registry load the new extension
await aTimeout(0);
+ await elementUpdated(element);
expect(element.localize.term('general_close')).to.equal('Close 2');
});
});
From eaecb821aae038e337e16b9acadfed8101a7b6e4 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 10:31:50 +0200
Subject: [PATCH 079/122] update storybook for localization
---
.../.storybook/preview.js | 6 +--
.../stories/extending/localization.mdx | 41 ++++++++++++-------
2 files changed, 29 insertions(+), 18 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/.storybook/preview.js b/src/Umbraco.Web.UI.Client/.storybook/preview.js
index 2df0d61be3..77bdc611b5 100644
--- a/src/Umbraco.Web.UI.Client/.storybook/preview.js
+++ b/src/Umbraco.Web.UI.Client/.storybook/preview.js
@@ -17,7 +17,7 @@ import { UmbDocumentTypeStore } from '../src/packages/documents/document-types/r
import { umbExtensionsRegistry } from '../src/packages/core/extension-registry';
import { UmbIconRegistry } from '../src/shared/icon-registry/icon.registry';
import { UmbLitElement } from '../src/shared/lit-element';
-import { UmbLocalizationContext, UMB_LOCALIZATION_CONTEXT } from '../src/libs/localization-api';
+import { UmbTranslationRegistry } from '../src/libs/localization-api';
import customElementManifests from '../dist-cms/custom-elements.json';
import '../src/libs/context-api/provide/context-provider.element';
@@ -40,9 +40,7 @@ class UmbStoryBookElement extends UmbLitElement {
this.provideContext(UMB_MODAL_CONTEXT_TOKEN, new UmbModalManagerContext(this));
this._registerExtensions(translationManifests);
- const localizationContext = new UmbLocalizationContext(umbExtensionsRegistry);
- localizationContext.setLanguage('en-US');
- this.provideContext(UMB_LOCALIZATION_CONTEXT, localizationContext);
+ new UmbTranslationRegistry(umbExtensionsRegistry).loadLanguage('en-us'); // register default language
}
_registerExtensions(manifests) {
diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
index 0b4654b9dd..1fef40fad8 100644
--- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
+++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
@@ -73,25 +73,38 @@ The `umb-localize` component is used to translate text in the UI. It is used lik
Experiment with the component here: [Localize](/story/localization-localize--overview)
-### UmbLocalizationContext
+### UmbLocalizeController
-The `UmbLocalizationContext` is used to translate text in the UI. It is used like this:
+The `UmbLocalizeController` is used to translate text in the UI. It is used like this:
+
+**UmbElementMixin**
+
+The controller is already initialised if you use the `UmbElementMixin` in your element:
```ts
-this.consumeContext(UMB_LOCALIZATION_CONTEXT, (instance) => {
- // Localize one key
- instance.localize('general_close').subscribe((value) => {
- console.log(value); // should display "Close" in the console
- });
-
- // Localize many keys
- instance.localizeMany(['general_close', 'general_cancel']).subscribe((values) => {
- console.log(values); // should display ["Close", "Cancel"] in the console
- });
-});
+export class MyElement extends UmbElementMixin(LitElement) {
+ render() {
+ return html` `;
+ }
+}
```
-The values can then be assigned to a stateful property in the component and rendered to the user.
+**Reactive controller**
+
+If you do not use the `UmbElementMixin` in your element, you can use the reactive controller like this:
+
+```ts
+import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
+
+export class MyElement extends LitElement {
+ // Create a new instance of the controller and attach it to the element
+ private localize = new UmbLocalizeController(this);
+
+ render() {
+ return html` `;
+ }
+}
+```
### Fallback
From 95a57c249c66c21aaefa70eb6cae9601b060cadd Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 10:41:08 +0200
Subject: [PATCH 080/122] add tests for other Intl wrappers
---
.../localize.controller.test.ts | 144 ++++++++++++++----
1 file changed, 114 insertions(+), 30 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
index 71d158851b..abc52f76e2 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
@@ -72,43 +72,127 @@ describe('UmbLocalizeController', () => {
expect(element.localize).to.be.instanceOf(UmbLocalizeController);
});
- it('should return a term', async () => {
- expect(element.localize.term('general_close')).to.equal('Close');
+ describe('term', () => {
+ it('should return a term', async () => {
+ expect(element.localize.term('general_close')).to.equal('Close');
+ });
+
+ it('should update the term when the language changes', async () => {
+ expect(element.localize.term('general_close')).to.equal('Close');
+ // Load Danish
+ registry.loadLanguage(danish.meta.culture);
+ // Switch browser to Danish
+ element.lang = danish.meta.culture;
+
+ await elementUpdated(element);
+ expect(element.localize.term('general_close')).to.equal('Luk');
+ });
+
+ it('should update the term when the dir changes', async () => {
+ expect(element.localize.term('general_close')).to.equal('Close');
+ element.dir = 'rtl';
+ await elementUpdated(element);
+ expect(element.localize.term('general_close')).to.equal('Close');
+ });
+
+ it('should provide a fallback term when the term is not found', async () => {
+ // Load Danish
+ registry.loadLanguage(danish.meta.culture);
+ // Switch browser to Danish
+ element.lang = danish.meta.culture;
+ await elementUpdated(element);
+ expect(element.localize.term('general_close')).to.equal('Luk');
+ expect(element.localize.term('general_logout')).to.equal('Log out');
+ });
+
+ it('should override a term if new extension is registered', async () => {
+ umbExtensionsRegistry.register(englishOverride);
+ // Let the registry load the new extension
+ await aTimeout(0);
+ await elementUpdated(element);
+ expect(element.localize.term('general_close')).to.equal('Close 2');
+ });
});
- it('should update the term when the language changes', async () => {
- expect(element.localize.term('general_close')).to.equal('Close');
- // Load Danish
- registry.loadLanguage(danish.meta.culture);
- // Switch browser to Danish
- element.lang = danish.meta.culture;
+ describe('date', () => {
+ it('should return a date', async () => {
+ expect(element.localize.date(new Date(2020, 0, 1))).to.equal('1/1/2020');
+ });
- await elementUpdated(element);
- expect(element.localize.term('general_close')).to.equal('Luk');
+ it('should accept a string input', async () => {
+ expect(element.localize.date('2020-01-01')).to.equal('1/1/2020');
+ });
+
+ it('should update the date when the language changes', async () => {
+ expect(element.localize.date(new Date(2020, 11, 31))).to.equal('12/31/2020');
+
+ // Switch browser to Danish
+ element.lang = danish.meta.culture;
+
+ await elementUpdated(element);
+ expect(element.localize.date(new Date(2020, 11, 31))).to.equal('31.12.2020');
+ });
+
+ it('should update the date when the dir changes', async () => {
+ expect(element.localize.date(new Date(2020, 11, 31))).to.equal('12/31/2020');
+ element.dir = 'rtl';
+ await elementUpdated(element);
+ expect(element.localize.date(new Date(2020, 11, 31))).to.equal('12/31/2020');
+ });
+
+ it('should return a date with a custom format', async () => {
+ expect(
+ element.localize.date(new Date(2020, 11, 31), { month: 'long', day: '2-digit', year: 'numeric' })
+ ).to.equal('December 31, 2020');
+ });
});
- it('should update the term when the dir changes', async () => {
- expect(element.localize.term('general_close')).to.equal('Close');
- element.dir = 'rtl';
- await elementUpdated(element);
- expect(element.localize.term('general_close')).to.equal('Close');
+ describe('number', () => {
+ it('should return a number', async () => {
+ expect(element.localize.number(123456.789)).to.equal('123,456.789');
+ });
+
+ it('should accept a string input', async () => {
+ expect(element.localize.number('123456.789')).to.equal('123,456.789');
+ });
+
+ it('should update the number when the language changes', async () => {
+ expect(element.localize.number(123456.789)).to.equal('123,456.789');
+
+ // Switch browser to Danish
+ element.lang = danish.meta.culture;
+
+ await elementUpdated(element);
+ expect(element.localize.number(123456.789)).to.equal('123.456,789');
+ });
+
+ it('should update the number when the dir changes', async () => {
+ expect(element.localize.number(123456.789)).to.equal('123,456.789');
+ element.dir = 'rtl';
+ await elementUpdated(element);
+ expect(element.localize.number(123456.789)).to.equal('123,456.789');
+ });
+
+ it('should return a number with a custom format', async () => {
+ expect(element.localize.number(123456.789, { minimumFractionDigits: 2, maximumFractionDigits: 2 })).to.equal(
+ '123,456.79'
+ );
+ });
});
- it('should provide a fallback term when the term is not found', async () => {
- // Load Danish
- registry.loadLanguage(danish.meta.culture);
- // Switch browser to Danish
- element.lang = danish.meta.culture;
- await elementUpdated(element);
- expect(element.localize.term('general_close')).to.equal('Luk');
- expect(element.localize.term('general_logout')).to.equal('Log out');
- });
+ describe('relative time', () => {
+ it('should return a relative time', async () => {
+ expect(element.localize.relativeTime(2, 'days')).to.equal('in 2 days');
+ });
- it('should override a term if new extension is registered', async () => {
- umbExtensionsRegistry.register(englishOverride);
- // Let the registry load the new extension
- await aTimeout(0);
- await elementUpdated(element);
- expect(element.localize.term('general_close')).to.equal('Close 2');
+ it('should update the relative time when the language changes', async () => {
+ expect(element.localize.relativeTime(2, 'days')).to.equal('in 2 days');
+
+ // Switch browser to Danish
+ element.lang = danish.meta.culture;
+
+ await elementUpdated(element);
+ expect(element.localize.relativeTime(2, 'days')).to.equal('om 2 dage');
+ });
});
});
From 13c6a29ce3f6b14345b0fbf14979bcc1350dd1a3 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 10:42:56 +0200
Subject: [PATCH 081/122] add support for supplying ltr and rtl
---
.../libs/localization-api/registry/translation.registry.ts | 2 +-
.../core/extension-registry/models/translations.model.ts | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index bc68b200c6..62d5c49b57 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -39,7 +39,7 @@ export class UmbTranslationRegistry {
// Notify subscribers that the inner dictionary has changed.
const translation: Translation = {
$code: userCulture,
- $dir: 'ltr',
+ $dir: extension.meta.direction ?? 'ltr',
...innerDictionary,
};
registerTranslation(translation);
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
index aa2afbd8a9..f392536b49 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
@@ -12,6 +12,13 @@ export interface MetaTranslations {
*/
culture: string;
+ /**
+ * The direction of the translations (left-to-right or right-to-left).
+ * @example "ltr"
+ * @default "ltr"
+ */
+ direction?: 'ltr' | 'rtl';
+
/**
* The translations.
* @example
From 6bacd22d84bdfa144f7ce190809bd6ab18096b68 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 10:52:30 +0200
Subject: [PATCH 082/122] add appropriate copyright
---
.../localization-api/localize.controller.ts | 31 +++++++++++++++++++
.../src/libs/localization-api/manager.ts | 13 ++++++++
2 files changed, 44 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
index 7f5b63dac2..c7095b75cd 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
@@ -1,3 +1,16 @@
+/*
+This module is a modified copy of the original Shoelace localize package: https://github.com/shoelace-style/localize
+
+The original license is included below.
+
+Copyright (c) 2020 A Beautiful Site, LLC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
import {
DefaultTranslation,
FunctionParams,
@@ -10,6 +23,24 @@ import {
} from './manager.js';
import { UmbController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
+/**
+ * The UmbLocalizeController enables localization for your element.
+ *
+ * @see UmbLocalizeElement
+ * @example
+ * ```ts
+ * import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
+ *
+ * \@customElement('my-element')
+ * export class MyElement extends LitElement {
+ * private localize = new UmbLocalizeController(this);
+ *
+ * render() {
+ * return html`${this.localize.term('general_close')}
`;
+ * }
+ * }
+ * ```
+ */
export class UmbLocalizeController implements UmbController {
host;
controllerAlias = 'localize';
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts
index 3b51f06d06..54ae98b0f2 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/manager.ts
@@ -1,3 +1,16 @@
+/*
+This module is a modified copy of the original Shoelace localize package: https://github.com/shoelace-style/localize
+
+The original license is included below.
+
+Copyright (c) 2020 A Beautiful Site, LLC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
import { LitElement } from '@umbraco-cms/backoffice/external/lit';
export type FunctionParams = T extends (...args: infer U) => string ? U : [];
From e270844b24b8db78f1c73c8fa0ddc529deb96771 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 10:57:21 +0200
Subject: [PATCH 083/122] add documentation
---
.../models/translations.model.ts | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
index f392536b49..3e5b21b84c 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
@@ -7,14 +7,24 @@ export interface ManifestTranslations extends ManifestDefaultExport` element.
+ * @see https://en.wikipedia.org/wiki/Language_localisation#Language_tags_and_codes
+ * @examples ["en-us", "en-gb", "da-dk"]
*/
culture: string;
/**
- * The direction of the translations (left-to-right or right-to-left).
- * @example "ltr"
+ * @summary The direction of the translations (left-to-right or right-to-left).
+ * @description
+ * The value is used to describe the direction of the translations according to the extension system
+ * and it will be set as the `dir` attribute on the `` element. It defaults to `ltr`.
+ * @see https://en.wikipedia.org/wiki/Right-to-left
+ * @examples ["ltr"]
* @default "ltr"
*/
direction?: 'ltr' | 'rtl';
From b6016bd9d338f5677f9ffd8fa0dcc0a57fef7d69 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 11:00:54 +0200
Subject: [PATCH 084/122] add test for custom format
---
.../libs/localization-api/localize.controller.test.ts | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
index abc52f76e2..5e4b57e495 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
@@ -22,6 +22,11 @@ const english = {
general: {
close: 'Close',
logout: 'Log out',
+ numUsersSelected: (count: number) => {
+ if (count === 0) return 'No users selected';
+ if (count === 1) return 'One user selected';
+ return `${count} users selected`;
+ },
},
},
},
@@ -112,6 +117,12 @@ describe('UmbLocalizeController', () => {
await elementUpdated(element);
expect(element.localize.term('general_close')).to.equal('Close 2');
});
+
+ it('should return a term with a custom format', async () => {
+ expect(element.localize.term('general_numUsersSelected', 0)).to.equal('No users selected');
+ expect(element.localize.term('general_numUsersSelected', 1)).to.equal('One user selected');
+ expect(element.localize.term('general_numUsersSelected', 2)).to.equal('2 users selected');
+ });
});
describe('date', () => {
From 7b48cead7aa0b818c365da766227df7f1402f291 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 11:01:47 +0200
Subject: [PATCH 085/122] add docs for default slot
---
.../src/packages/core/localization/localize.element.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 3335512d27..247b1ef520 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -4,6 +4,7 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
/**
* This element allows you to localize a string with optional interpolation values.
* @element umb-localize
+ * @slot - The fallback value if the key is not found.
*/
@customElement('umb-localize')
export class UmbLocalizeElement extends UmbLitElement {
From 6b1ea7d272af8b13b4adccf51353c6f666a34e8a Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 11:17:05 +0200
Subject: [PATCH 086/122] set lang and dir when language is loaded
---
.../src/apps/backoffice/backoffice.element.ts | 1 -
.../libs/localization-api/localize.controller.test.ts | 9 +++++++++
.../localization-api/registry/translation.registry.ts | 4 ++++
3 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index c219994240..cdb63cdbb7 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -48,7 +48,6 @@ export class UmbBackofficeElement extends UmbLitElement {
auth.languageIsoCode,
(currentLanguageIsoCode) => {
translationRegistry.loadLanguage(currentLanguageIsoCode);
- document.documentElement.lang = currentLanguageIsoCode;
},
'languageIsoCode'
);
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
index 5e4b57e495..07bd99b59b 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
@@ -18,6 +18,7 @@ const english = {
name: 'Test English',
meta: {
culture: 'en-us',
+ direction: 'ltr',
translations: {
general: {
close: 'Close',
@@ -77,6 +78,14 @@ describe('UmbLocalizeController', () => {
expect(element.localize).to.be.instanceOf(UmbLocalizeController);
});
+ it('should have a default language', () => {
+ expect(element.localize.lang()).to.equal(english.meta.culture);
+ });
+
+ it('should have a default dir', () => {
+ expect(element.localize.dir()).to.equal(english.meta.direction);
+ });
+
describe('term', () => {
it('should return a term', async () => {
expect(element.localize.term('general_close')).to.equal('Close');
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 62d5c49b57..adda5ebd3e 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -43,6 +43,10 @@ export class UmbTranslationRegistry {
...innerDictionary,
};
registerTranslation(translation);
+
+ // Set the document language and direction.
+ document.documentElement.lang = translation.$code;
+ document.documentElement.dir = translation.$dir;
})
);
}
From c84b482a2f44e9db32c736becda03865d1d9a773 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 11:29:09 +0200
Subject: [PATCH 087/122] add exports to support type-checking of translation
keys
---
src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
index 139e9726f8..ea134f4fa2 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
@@ -1,3 +1,3 @@
export * from './registry/translation.registry.js';
export * from './localize.controller.js';
-export { registerTranslation } from './manager.js';
+export { registerTranslation, type DefaultTranslation, type Translation } from './manager.js';
From f4a0ce73a70151c61636d78f9780f4b60b5345df Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 11:46:25 +0200
Subject: [PATCH 088/122] add support for functions in translation values
---
.../src/libs/extension-api/types.ts | 2 --
.../registry/translation.registry.ts | 4 +--
.../models/translations.model.ts | 2 +-
.../stories/extending/localization.mdx | 28 +++++++++++++++----
4 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts
index f546cfefcf..c140a46eda 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts
@@ -103,8 +103,6 @@ export interface ManifestClassWithClassConstructor extends Manifest
export interface ManifestDefaultExport extends ManifestWithLoader<{ default: T }> {
/**
* The file location of the javascript file to load
- *
- * @TJS-require
*/
js?: string;
}
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index adda5ebd3e..bb9d8550e1 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -3,7 +3,7 @@ import { hasDefaultExport, loadExtension } from '@umbraco-cms/backoffice/extensi
import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
import { Subject, combineLatest } from '@umbraco-cms/backoffice/external/rxjs';
-export type UmbTranslationDictionary = Record;
+export type UmbTranslationDictionary = Record;
export class UmbTranslationRegistry {
#registry;
@@ -60,7 +60,7 @@ export class UmbTranslationRegistry {
#addOrUpdateDictionary(
innerDictionary: UmbTranslationDictionary,
dictionaryName: string,
- dictionary: Record
+ dictionary: UmbTranslationDictionary
) {
for (const [key, value] of Object.entries(dictionary)) {
innerDictionary[`${dictionaryName}_${key}`] = value;
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
index 3e5b21b84c..78dbfac203 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
@@ -1,6 +1,6 @@
import type { ManifestDefaultExport } from '@umbraco-cms/backoffice/extension-api';
-export interface ManifestTranslations extends ManifestDefaultExport>> {
+export interface ManifestTranslations extends ManifestDefaultExport>> {
type: 'translations';
meta: MetaTranslations;
}
diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
index 1fef40fad8..96244ea219 100644
--- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
+++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
@@ -50,19 +50,35 @@ If you do not have many translations, you can also choose to include them direct
The language file is a simple JS module with a default export containing a key-value structure organised in sections.
-```json
+```js
export default {
- "section": {
- "key1": "value1",
- "key2": "value2"
- }
-}
+ section: {
+ key1: 'value1',
+ key2: 'value2',
+ },
+};
```
The sections and keys will be formatted into a map in Umbraco
with the format `section_key1` and `section_key2` which forms the unique key
of which they are requested by.
+The values can be either a string or a function that returns a string:
+
+```js
+export default {
+ section: {
+ key1: 'value1',
+ key2: (count) => {
+ count = parseInt(count, 10);
+ if (count === 0) return 'Nothing';
+ if (count === 1) return 'One thing';
+ return 'Many things';
+ },
+ },
+};
+```
+
## Using the translations
### umb-localize
From 3350e4a95a6c2fac4f2dbc9522ea47e8faf72e22 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 12:01:24 +0200
Subject: [PATCH 089/122] umb-localize: add support to forward args to localize
controller using default converter to Array
---
.../localization/localize.element.test.ts | 61 +++++++++++++++++--
.../core/localization/localize.element.ts | 14 ++++-
2 files changed, 68 insertions(+), 7 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
index 6249116755..0dbe013dae 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
@@ -1,4 +1,4 @@
-import { elementUpdated, expect, fixture, html } from '@open-wc/testing';
+import { aTimeout, elementUpdated, expect, fixture, html } from '@open-wc/testing';
import { UmbLocalizeElement } from './localize.element.js';
import '@umbraco-cms/backoffice/context-api';
@@ -15,6 +15,14 @@ const english = {
general: {
close: 'Close',
logout: 'Log out',
+ numUsersSelected: (count: number) => {
+ if (count === 0) return 'No users selected';
+ if (count === 1) return 'One user selected';
+ return `${count} users selected`;
+ },
+ moreThanOneArgument: (arg1: string, arg2: string) => {
+ return `${arg1} ${arg2}`;
+ },
},
},
},
@@ -50,16 +58,49 @@ describe('umb-localize', () => {
umbExtensionsRegistry.register(danish);
const translationRegistry = new UmbTranslationRegistry(umbExtensionsRegistry);
translationRegistry.loadLanguage(english.meta.culture);
- translationRegistry.loadLanguage(danish.meta.culture);
beforeEach(async () => {
- element = await fixture(html` `);
+ element = await fixture(html`Fallback value `);
});
it('should localize a key', async () => {
expect(element.shadowRoot?.innerHTML).to.contain('Close');
});
+ it('should localize a key with arguments', async () => {
+ element.key = 'general_numUsersSelected';
+ element.args = [0];
+ await elementUpdated(element);
+
+ expect(element.shadowRoot?.innerHTML).to.contain('No users selected');
+
+ element.args = [1];
+ await elementUpdated(element);
+
+ expect(element.shadowRoot?.innerHTML).to.contain('One user selected');
+
+ element.args = [2];
+ await elementUpdated(element);
+
+ expect(element.shadowRoot?.innerHTML).to.contain('2 users selected');
+ });
+
+ it('should localize a key with multiple arguments', async () => {
+ element.key = 'general_moreThanOneArgument';
+ element.args = ['Hello', 'World'];
+ await elementUpdated(element);
+
+ expect(element.shadowRoot?.innerHTML).to.contain('Hello World');
+ });
+
+ it('should localize a key with args as an attribute', async () => {
+ element.key = 'general_moreThanOneArgument';
+ element.setAttribute('args', '["Hello","World"]');
+ await elementUpdated(element);
+
+ expect(element.shadowRoot?.innerHTML).to.contain('Hello World');
+ });
+
it('should change the value if a new key is set', async () => {
expect(element.shadowRoot?.innerHTML).to.contain('Close');
@@ -72,7 +113,8 @@ describe('umb-localize', () => {
it('should change the value if the language is changed', async () => {
expect(element.shadowRoot?.innerHTML).to.contain('Close');
- element.lang = danish.meta.culture;
+ translationRegistry.loadLanguage(danish.meta.culture);
+ await aTimeout(0);
await elementUpdated(element);
expect(element.shadowRoot?.innerHTML).to.contain('Luk');
@@ -83,9 +125,18 @@ describe('umb-localize', () => {
await elementUpdated(element);
expect(element.shadowRoot?.innerHTML).to.contain(' ');
+ });
+
+ it('should toggle a data attribute', async () => {
+ element.key = 'non-existing-key';
+ await elementUpdated(element);
- // It should also have a data attribute to indicate that the key was not found:
expect(element.getAttribute('data-localize-missing')).to.equal('non-existing-key');
+
+ element.key = 'general_close';
+ await elementUpdated(element);
+
+ expect(element.hasAttribute('data-localize-missing')).to.equal(false);
});
it('should use the key if debug is enabled and translation is not found', async () => {
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 247b1ef520..5eabaaee29 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -13,9 +13,19 @@ export class UmbLocalizeElement extends UmbLitElement {
* @attr
* @example key="general_ok"
*/
- @property({ type: String })
+ @property()
key!: string;
+ /**
+ * The comma-separated values to forward to the localization function.
+ * @attr
+ * @example args="[1,2,3]"
+ */
+ @property({
+ type: Array,
+ })
+ args?: unknown[];
+
/**
* If true, the key will be rendered instead of the localized value if the key is not found.
* @attr
@@ -25,7 +35,7 @@ export class UmbLocalizeElement extends UmbLitElement {
@state()
get text(): string {
- const localizedValue = this.localize.term(this.key);
+ const localizedValue = this.localize.term(this.key, ...(this.args ?? []));
// If the value is the same as the key, it means the key was not found.
if (localizedValue === this.key) {
From ddb81576cf829a97a7f83f4fd2f0629e04c075e5 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 13:28:21 +0200
Subject: [PATCH 090/122] add support to replace tokens
---
.../libs/localization-api/localize.controller.test.ts | 7 +++++++
.../src/libs/localization-api/localize.controller.ts | 10 ++++++++++
2 files changed, 17 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
index 07bd99b59b..d2fd506690 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
@@ -23,6 +23,8 @@ const english = {
general: {
close: 'Close',
logout: 'Log out',
+ withInlineToken: '{0} {1}',
+ withInlineTokenLegacy: '%0% %1%',
numUsersSelected: (count: number) => {
if (count === 0) return 'No users selected';
if (count === 1) return 'One user selected';
@@ -132,6 +134,11 @@ describe('UmbLocalizeController', () => {
expect(element.localize.term('general_numUsersSelected', 1)).to.equal('One user selected');
expect(element.localize.term('general_numUsersSelected', 2)).to.equal('2 users selected');
});
+
+ it('should return a term with a custom format with inline tokens', async () => {
+ expect(element.localize.term('general_withInlineToken', 'Hello', 'World')).to.equal('Hello World');
+ expect(element.localize.term('general_withInlineTokenLegacy', 'Hello', 'World')).to.equal('Hello World');
+ });
});
describe('date', () => {
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
index c7095b75cd..8c97bd5115 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
@@ -113,6 +113,16 @@ export class UmbLocalizeController 0) {
+ // Replace placeholders of format "%index%" and "{index}" with provided values
+ term = term.replace(/(%(\d+)%|\{(\d+)\})/g, (match, _p1, p2, p3): string => {
+ const index = p2 || p3;
+ return String(args[index] || match);
+ });
+ }
+ }
+
return term;
}
From b340e659514c59656070bcbebeb0d25cf35269a9 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 13:32:01 +0200
Subject: [PATCH 091/122] storybook: add story for args
---
.../core/localization/localize.element.stories.ts | 14 ++++++++++++++
.../packages/core/localization/localize.element.ts | 3 ++-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
index c5e06f8ff3..ae2ed56aa3 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
@@ -9,6 +9,13 @@ const meta: Meta = {
args: {
key: 'general_areyousure',
},
+ argTypes: {
+ args: {
+ control: {
+ type: 'array',
+ },
+ },
+ },
decorators: [
(story) => {
return html`
@@ -31,6 +38,13 @@ type Story = StoryObj
;
export const Overview: Story = {};
+export const WithArguments: Story = {
+ args: {
+ key: 'blueprints_createdBlueprintMessage',
+ args: ['About us'],
+ },
+};
+
export const KeyNotFound: Story = {
args: {
key: 'general_ok_not_found',
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 5eabaaee29..d561e999c9 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -17,9 +17,10 @@ export class UmbLocalizeElement extends UmbLitElement {
key!: string;
/**
- * The comma-separated values to forward to the localization function.
+ * The values to forward to the localization function (must be JSON compatible).
* @attr
* @example args="[1,2,3]"
+ * @type {any[] | undefined}
*/
@property({
type: Array,
From 1cf90e8eb5b7186f7aaef2edb742ffd8a0bbb18a Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 13:33:24 +0200
Subject: [PATCH 092/122] clean language files
---
.../src/assets/lang/da-dk.js | 42 -------------------
.../src/assets/lang/en-us.js | 40 ------------------
2 files changed, 82 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js
index b109ce453a..479ae5e5f6 100644
--- a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js
@@ -936,38 +936,6 @@ export default {
"lockoutWillOccur": "Du har været inaktiv, og du vil blive logget ud om",
"renewSession": "Forny for at gemme dine ændringer"
},
- "login": {
- "greeting0": "Så er det søndag!",
- "greeting1": "Smil, det er mandag!",
- "greeting2": "Hurra, det er tirsdag!",
- "greeting3": "Hvilken herlig onsdag!",
- "greeting4": "Glædelig torsdag!",
- "greeting5": "Endelig fredag!",
- "greeting6": "Glædelig lørdag",
- "instruction": "Log ind nedenfor",
- "signInWith": "Log ind med",
- "timeout": "Din session er udløbet",
- "bottomText": "© 2001 - %0% umbraco.com
",
- "forgottenPassword": "Glemt adgangskode?",
- "forgottenPasswordInstruction": "En e-mail vil blive sendt til den angivne adresse med et link til at\n nulstille din adgangskode\n ",
- "requestPasswordResetConfirmation": "En e-mail med instruktioner for nulstilling af adgangskoden vil blive\n sendt til den angivne adresse, hvis det matcher vores optegnelser\n ",
- "showPassword": "Vis adgangskode",
- "hidePassword": "Skjul adgangskode",
- "returnToLogin": "Tilbage til login formular",
- "setPasswordInstruction": "Angiv en ny adgangskode",
- "setPasswordConfirmation": "Din adgangskode er blevet opdateret",
- "resetCodeExpired": "Det link, du har klikket på, er ugyldigt eller udløbet",
- "resetPasswordEmailCopySubject": "Umbraco: Nulstil adgangskode",
- "resetPasswordEmailCopyFormat": "Dit brugernavn til at logge på Umbraco backoffice er: %0%
Klik her for at nulstille din adgangskode eller kopier/indsæt denne URL i din browser:
%1%
",
- "mfaSecurityCodeSubject": "Umbraco: Sikkerhedskode",
- "mfaSecurityCodeMessage": "Din sikkerhedskode er: %0%",
- "2faTitle": "Sidste skridt",
- "2faText": "Det er påkrævet at du bekræfter din identitet.",
- "2faMultipleText": "Vælg venligst en godkendelsesmetode",
- "2faCodeInput": "Kode",
- "2faCodeInputHelp": "Indtast venligst bekræftelseskoden",
- "2faInvalidCode": "Ugyldig kode indtastet"
- },
"main": {
"dashboard": "Skrivebord",
"sections": "Sektioner",
@@ -990,12 +958,7 @@ export default {
"notifications": {
"editNotifications": "Vælg dine notificeringer for %0% ",
"notificationsSavedFor": "Notificeringer er gemt for",
- "mailBody": "\nHej %0%\n\nDette er en automatisk mail for at fortælle at handlingen '%1%'\ner blevet udført på siden '%2%'\naf brugeren '%3%'\n\nGå til http://%4%/#/content/content/edit/%5% for at redigere.\n\nHa' en dejlig dag!\n\nMange hilsner fra Umbraco robotten\n\t\t",
- "mailBodyHtml": "Hej %0%
\n Dette er en automatisk mail for at informere dig om at opgaven '%1%' \n er blevet udførtpå siden '%2%' af brugeren '%3%'
\n
Opdateringssammendrag: Hav en fortsat god dag! De bedste hilsner fra Umbraco robotten
",
- "mailSubject": "[%0%] Notificering om %1% udført på %2%",
"notifications": "Notificeringer",
- "mailBodyVariantSummary": "The following languages have been modified %0%",
- "mailBodyVariantHtmlSummary": "The following languages have been modified:
\n %0%\n "
},
"packager": {
"actions": "Handlinger",
@@ -1608,7 +1571,6 @@ export default {
"DownloadXmlDTD": "Download XML DTD",
"fields": "Felter",
"includeSubpages": "Inkluder undersider",
- "mailBody": "Hej %0%. Dette er en automatisk mail sendt for at informere dig om at dokumentet '%1' har en\n forespørgsel omkring oversættelse til '%5%' af %2%. Gå til http://%3%/translation/details.aspx?id=%4% for at\n redigere. Eller log ind i Umbraco for at få en oversigt over dine oversættelsesopgaver: http://%3%/Umbraco Hav en\n god dag! Mange hilsner Umbraco-robotten\n ",
"noTranslators": "Ingen oversættelsesbrugere er fundet. Opret venligst en oversættelsesbruger før du\n begynder at sende indhold til oversættelse\n ",
"pageHasBeenSendToTranslation": "Siden '%0%' er blevet sent til oversættelse",
"sendToTranslate": "Send siden '%0%' til oversættelse",
@@ -1762,8 +1724,6 @@ export default {
"createUser": "Opret bruger",
"sendInvite": "Send invitation",
"backToUsers": "Tilbage til brugere",
- "inviteEmailCopySubject": "Umbraco: Invitation",
- "inviteEmailCopyFormat": "Hej %0%, du er blevet inviteret af %1% til Umbraco backoffice.
Besked fra %1%: %2%
Klik på dette link for acceptere invitationen
Hvis du ikke kan klikke på linket, så kopier og indsæt denne URL i dit browservindue %3%
",
"defaultInvitationMessage": "Gensender invitation...",
"deleteUser": "Slet bruger",
"deleteUserConfirmation": "Er du sikker på du ønsker at slette denne brugers konto?",
@@ -2947,8 +2907,6 @@ export default {
"smtpMailSettingsConnectionFail": "The SMTP server configured with host '%0%' and port '%1%' could not be\n reached. Please check to ensure the SMTP settings in the configuration 'Umbraco:CMS:Global:Smtp' are correct.\n ",
"notificationEmailsCheckSuccessMessage": "Notification email has been set to %0% .",
"notificationEmailsCheckErrorMessage": "Notification email is still set to the default value of %0% .",
- "scheduledHealthCheckEmailBody": "Results of the scheduled Umbraco Health Checks run on %0% at %1% are as follows:
%2%",
- "scheduledHealthCheckEmailSubject": "Umbraco Health Check Status: %0%",
"checkGroup": "Check group",
"helpText": "\n The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button.\n You can add your own health checks, have a look at the documentation for more information about custom health checks.
\n "
},
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.js b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.js
index a68c44992e..e3f12458f4 100644
--- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.js
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.js
@@ -932,36 +932,6 @@ export default {
"lockoutWillOccur": "You've been idle and logout will automatically occur in",
"renewSession": "Renew now to save your work"
},
- "login": {
- "greeting0": "Happy super Sunday",
- "greeting1": "Happy marvelous Monday",
- "greeting2": "Happy tubular Tuesday",
- "greeting3": "Happy wonderful Wednesday",
- "greeting4": "Happy thunderous Thursday",
- "greeting5": "Happy funky Friday",
- "greeting6": "Happy Caturday",
- "instruction": "Log in below",
- "signInWith": "Sign in with",
- "timeout": "Session timed out",
- "bottomText": "© 2001 - %0% Umbraco.com
",
- "forgottenPassword": "Forgotten password?",
- "forgottenPasswordInstruction": "An email will be sent to the address specified with a link to reset your\n password\n ",
- "requestPasswordResetConfirmation": "An email with password reset instructions will be sent to the\n specified address if it matched our records\n ",
- "showPassword": "Show password",
- "hidePassword": "Hide password",
- "returnToLogin": "Return to login form",
- "setPasswordInstruction": "Please provide a new password",
- "setPasswordConfirmation": "Your Password has been updated",
- "resetCodeExpired": "The link you have clicked on is invalid or has expired",
- "resetPasswordEmailCopySubject": "Umbraco: Reset Password",
- "resetPasswordEmailCopyFormat": "\n \n\t\t\t\n\t\t\t\t \n\t\t\t\t \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n
\n\n \n \n \n
\n \n \n
\n\n\n \n\n\n
\n
\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tPassword reset requested\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t \n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tYour username to login to the Umbraco backoffice is: %0% \n
\n\n
\n\nIf you cannot click on the link, copy and paste this URL into your browser window:
\n\n\n \n \n
\n \n \n
\n
\n
\n \n \n \n
\n\n\n\t",
- "2faTitle": "One last step",
- "2faText": "You have enabled 2-factor authentication and must verify your identity.",
- "2faMultipleText": "Please choose a 2-factor provider",
- "2faCodeInput": "Verification code",
- "2faCodeInputHelp": "Please enter the verification code",
- "2faInvalidCode": "Invalid code entered"
- },
"main": {
"dashboard": "Dashboard",
"sections": "Sections",
@@ -984,11 +954,6 @@ export default {
"notifications": {
"editNotifications": "Select your notification for %0% ",
"notificationsSavedFor": "Notification settings saved for",
- "mailBody": "\n Hi %0%\n\n This is an automated mail to inform you that the task '%1%'\n has been performed on the page '%2%'\n by the user '%3%'\n\n Go to http://%4%/#/content/content/edit/%5% to edit.\n\n %6%\n\n Have a nice day!\n\n Cheers from the Umbraco robot\n ",
- "mailBodyVariantSummary": "The following languages have been modified %0%",
- "mailBodyHtml": "\n \n\t\t\t\n\t\t\t\t \n\t\t\t\t \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n
\n\n \n \n \n
\n \n \n
\n\n\n \n\n\n
\n
\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHi %0%,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t \n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tThis is an automated mail to inform you that the task '%1%' has been performed on the page '%2%' by the user '%3%' \n
\n\n\n
Update summary: \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t%6%\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHave a nice day! \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tCheers from the Umbraco robot\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n \n \n
\n \n \n
\n
\n
\n \n \n \n
\n\n\n\t",
- "mailBodyVariantHtmlSummary": "The following languages have been modified:
\n %0%\n ",
- "mailSubject": "[%0%] Notification about %1% performed on %2%",
"notifications": "Notifications"
},
"packager": {
@@ -1593,7 +1558,6 @@ export default {
"DownloadXmlDTD": "Download XML DTD",
"fields": "Fields",
"includeSubpages": "Include subpages",
- "mailBody": "\n Hi %0%\n\n This is an automated mail to inform you that the document '%1%'\n has been requested for translation into '%5%' by %2%.\n\n Go to http://%3%/translation/details.aspx?id=%4% to edit.\n\n Or log into Umbraco to get an overview of your translation tasks\n http://%3%\n\n Have a nice day!\n\n Cheers from the Umbraco robot\n ",
"noTranslators": "No translator users found. Please create a translator user before you start sending\n content to translation\n ",
"pageHasBeenSendToTranslation": "The page '%0%' has been send to translation",
"sendToTranslate": "Send the page '%0%' to translation",
@@ -1759,8 +1723,6 @@ export default {
"createUser": "Create user",
"sendInvite": "Send invite",
"backToUsers": "Back to users",
- "inviteEmailCopySubject": "Umbraco: Invitation",
- "inviteEmailCopyFormat": "\n \n\t\t\t\n\t\t\t\t \n\t\t\t\t \n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n
\n\n \n \n \n
\n \n \n
\n\n\n \n\n\n
\n
\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tHi %0%,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t \n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tYou have been invited by %1% to the Umbraco Back Office.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tMessage from %1% :\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \n%2% \n
\n\nIf you cannot click on the link, copy and paste this URL into your browser window:
\n\n\n \n \n
\n \n \n
\n
\n
\n \n \n \n
\n\n",
"defaultInvitationMessage": "Resending invitation...",
"deleteUser": "Delete User",
"deleteUserConfirmation": "Are you sure you wish to delete this user account?",
@@ -1856,8 +1818,6 @@ export default {
"smtpMailSettingsConnectionFail": "The SMTP server configured with host '%0%' and port '%1%' could not be\n reached. Please check to ensure the SMTP settings in the configuration 'Umbraco:CMS:Global:Smtp' are correct.\n ",
"notificationEmailsCheckSuccessMessage": "Notification email has been set to %0% .",
"notificationEmailsCheckErrorMessage": "Notification email is still set to the default value of %0% .",
- "scheduledHealthCheckEmailBody": "Results of the scheduled Umbraco Health Checks run on %0% at %1% are as follows:
%2%",
- "scheduledHealthCheckEmailSubject": "Umbraco Health Check Status: %0%",
"checkGroup": "Check group",
"helpText": "\n The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button.\n You can add your own health checks, have a look at the documentation for more information about custom health checks.
\n "
},
From 60d8b49f5c49f0b5c4b2cce116c5c73d7f7122d3 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 14:08:29 +0200
Subject: [PATCH 093/122] set access level on inner getter
---
.../src/packages/core/localization/localize.element.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index d561e999c9..4a964a9508 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -35,7 +35,7 @@ export class UmbLocalizeElement extends UmbLitElement {
debug = false;
@state()
- get text(): string {
+ protected get text(): string {
const localizedValue = this.localize.term(this.key, ...(this.args ?? []));
// If the value is the same as the key, it means the key was not found.
From 8d4e5cd60309c163bc160b99f3d13618adc21800 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 14:20:44 +0200
Subject: [PATCH 094/122] add source code
---
.../localization/localize.element.stories.ts | 27 ++++++++++++++-----
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
index ae2ed56aa3..2973a22ebf 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
@@ -23,6 +23,13 @@ const meta: Meta = {
`;
},
],
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {
parameters: {
docs: {
source: {
@@ -32,17 +39,18 @@ const meta: Meta = {
},
};
-export default meta;
-
-type Story = StoryObj;
-
-export const Overview: Story = {};
-
export const WithArguments: Story = {
args: {
key: 'blueprints_createdBlueprintMessage',
args: ['About us'],
},
+ parameters: {
+ docs: {
+ source: {
+ code: ` `,
+ },
+ },
+ },
};
export const KeyNotFound: Story = {
@@ -50,4 +58,11 @@ export const KeyNotFound: Story = {
key: 'general_ok_not_found',
debug: true,
},
+ parameters: {
+ docs: {
+ source: {
+ code: ` `,
+ },
+ },
+ },
};
From 3e1eca7609c302ff705664194bf9b7256b5f746c Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 14:24:12 +0200
Subject: [PATCH 095/122] add inverted token test
---
.../src/libs/localization-api/localize.controller.test.ts | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
index d2fd506690..4589af4be5 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
@@ -139,6 +139,10 @@ describe('UmbLocalizeController', () => {
expect(element.localize.term('general_withInlineToken', 'Hello', 'World')).to.equal('Hello World');
expect(element.localize.term('general_withInlineTokenLegacy', 'Hello', 'World')).to.equal('Hello World');
});
+
+ it('should return a term with no tokens even though they are provided', async () => {
+ expect(element.localize.term('general_logout', 'Hello', 'World')).to.equal('Log out');
+ });
});
describe('date', () => {
From d656e69cb2f983a9b35ad800d2519bc844fa6419 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 14:33:37 +0200
Subject: [PATCH 096/122] update link to default story
---
.../storybook/stories/extending/localization.mdx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
index 96244ea219..f037ef3972 100644
--- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
+++ b/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
@@ -85,9 +85,9 @@ export default {
The `umb-localize` component is used to translate text in the UI. It is used like this:
-
+
-Experiment with the component here: [Localize](/story/localization-localize--overview)
+Experiment with the component here: [Localize](/story/localization-localize--default)
### UmbLocalizeController
From b77e08ae5768f86660478c814de11ce4badf02c4 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 14:45:45 +0200
Subject: [PATCH 097/122] move stories into API/Localization
---
.../packages/core/localization/stories}/localization.mdx | 4 ++--
.../localization/{ => stories}/localize.element.stories.ts | 6 +++---
2 files changed, 5 insertions(+), 5 deletions(-)
rename src/Umbraco.Web.UI.Client/{storybook/stories/extending => src/packages/core/localization/stories}/localization.mdx (95%)
rename src/Umbraco.Web.UI.Client/src/packages/core/localization/{ => stories}/localize.element.stories.ts (88%)
diff --git a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx b/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localization.mdx
similarity index 95%
rename from src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
rename to src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localization.mdx
index f037ef3972..c2fb371cfd 100644
--- a/src/Umbraco.Web.UI.Client/storybook/stories/extending/localization.mdx
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localization.mdx
@@ -1,8 +1,8 @@
import { Canvas, Meta } from '@storybook/addon-docs';
-import * as LocalizeStories from '../../../src/packages/core/localization/localize.element.stories';
+import * as LocalizeStories from './localize.element.stories';
-
+
# Localization
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localize.element.stories.ts
similarity index 88%
rename from src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
rename to src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localize.element.stories.ts
index 2973a22ebf..8942a47c78 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.stories.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localize.element.stories.ts
@@ -1,10 +1,10 @@
import { Meta, StoryObj } from '@storybook/web-components';
import { html } from 'lit';
-import type { UmbLocalizeElement } from './localize.element.js';
-import './localize.element.js';
+import type { UmbLocalizeElement } from '../localize.element.js';
+import '../localize.element.js';
const meta: Meta = {
- title: 'Localization/Localize',
+ title: 'API/Localization/UmbLocalizeElement',
component: 'umb-localize',
args: {
key: 'general_areyousure',
From 26e5be142f7f9b5c363db764de24e601c0d9d4b5 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Tue, 1 Aug 2023 14:46:29 +0200
Subject: [PATCH 098/122] update link
---
.../src/packages/core/localization/stories/localization.mdx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localization.mdx b/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localization.mdx
index c2fb371cfd..41e743a110 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localization.mdx
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/stories/localization.mdx
@@ -87,7 +87,7 @@ The `umb-localize` component is used to translate text in the UI. It is used lik
-Experiment with the component here: [Localize](/story/localization-localize--default)
+Experiment with the component here: [Localize](/story/api-localization-umblocalizeelement--default)
### UmbLocalizeController
From 32b19e65eeafc8a0e8e31621888a2b3eac3fe6a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 10:00:06 +0200
Subject: [PATCH 099/122] adjusting some types
---
src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts | 3 ++-
.../core/extension-registry/models/translations.model.ts | 8 +++++---
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts
index c140a46eda..d13f72bfe0 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/types.ts
@@ -100,7 +100,8 @@ export interface ManifestClassWithClassConstructor extends Manifest
class: ClassConstructor;
}
-export interface ManifestDefaultExport extends ManifestWithLoader<{ default: T }> {
+export interface ManifestWithLoaderIncludingDefaultExport
+ extends ManifestWithLoader<{ default: T } | Omit> {
/**
* The file location of the javascript file to load
*/
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
index 78dbfac203..929421d740 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
@@ -1,6 +1,8 @@
-import type { ManifestDefaultExport } from '@umbraco-cms/backoffice/extension-api';
+import type { ManifestWithLoaderDefaultExport } from '@umbraco-cms/backoffice/extension-api';
-export interface ManifestTranslations extends ManifestDefaultExport>> {
+export type UmbTranslationsDictionary = Record>;
+
+export interface ManifestTranslations extends ManifestWithLoaderDefaultExport {
type: 'translations';
meta: MetaTranslations;
}
@@ -39,5 +41,5 @@ export interface MetaTranslations {
* }
* }
*/
- translations?: Record>;
+ translations?: UmbTranslationsDictionary;
}
From b4af716fa649558cd28645c15b6ea2c535230614 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 10:59:05 +0200
Subject: [PATCH 100/122] adjusting types for registry
---
.../registry/translation.registry.ts | 16 ++++++++++------
.../core/extension-registry/models/index.ts | 1 +
.../models/translations.model.ts | 7 ++++---
3 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index bb9d8550e1..906e00734a 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -1,9 +1,13 @@
import { Translation, registerTranslation } from '../manager.js';
import { hasDefaultExport, loadExtension } from '@umbraco-cms/backoffice/extension-api';
-import { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry';
+import {
+ UmbBackofficeExtensionRegistry,
+ UmbTranslationEntry,
+ UmbTranslationsDictionary,
+} from '@umbraco-cms/backoffice/extension-registry';
import { Subject, combineLatest } from '@umbraco-cms/backoffice/external/rxjs';
-export type UmbTranslationDictionary = Record;
+export type UmbTranslationsSquashedDictionary = Record;
export class UmbTranslationRegistry {
#registry;
@@ -18,7 +22,7 @@ export class UmbTranslationRegistry {
extensions
.filter((x) => x.meta.culture.toLowerCase() === userCulture)
.map(async (extension) => {
- const innerDictionary: UmbTranslationDictionary = {};
+ const innerDictionary: UmbTranslationsSquashedDictionary = {};
// If extension contains a dictionary, add it to the inner dictionary.
if (extension.meta.translations) {
@@ -30,7 +34,7 @@ export class UmbTranslationRegistry {
// If extension contains a js file, load it and add the default dictionary to the inner dictionary.
const loadedExtension = await loadExtension(extension);
- if (loadedExtension && hasDefaultExport(loadedExtension)) {
+ if (loadedExtension && hasDefaultExport(loadedExtension)) {
for (const [dictionaryName, dictionary] of Object.entries(loadedExtension.default)) {
this.#addOrUpdateDictionary(innerDictionary, dictionaryName, dictionary);
}
@@ -58,9 +62,9 @@ export class UmbTranslationRegistry {
}
#addOrUpdateDictionary(
- innerDictionary: UmbTranslationDictionary,
+ innerDictionary: UmbTranslationsSquashedDictionary,
dictionaryName: string,
- dictionary: UmbTranslationDictionary
+ dictionary: UmbTranslationsDictionary['value']
) {
for (const [key, value] of Object.entries(dictionary)) {
innerDictionary[`${dictionaryName}_${key}`] = value;
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts
index fd0f09fc1f..78b6e6d310 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts
@@ -52,6 +52,7 @@ export * from './section.model.js';
export * from './store.model.js';
export * from './theme.model.js';
export * from './tinymce-plugin.model.js';
+export * from './translations.model.js';
export * from './tree-item.model.js';
export * from './tree.model.js';
export * from './user-profile-app.model.js';
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
index 929421d740..974c6ff2e2 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
@@ -1,8 +1,9 @@
-import type { ManifestWithLoaderDefaultExport } from '@umbraco-cms/backoffice/extension-api';
+import type { ManifestWithLoaderIncludingDefaultExport } from '@umbraco-cms/backoffice/extension-api';
-export type UmbTranslationsDictionary = Record>;
+export type UmbTranslationEntry = string;
+export type UmbTranslationsDictionary = Record>;
-export interface ManifestTranslations extends ManifestWithLoaderDefaultExport {
+export interface ManifestTranslations extends ManifestWithLoaderIncludingDefaultExport {
type: 'translations';
meta: MetaTranslations;
}
From b910f174eb637224afb77b5a03f362c4685abb45 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 10:59:48 +0200
Subject: [PATCH 101/122] rename to flat.
---
.../libs/localization-api/registry/translation.registry.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 906e00734a..10b39ac3d2 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -7,7 +7,7 @@ import {
} from '@umbraco-cms/backoffice/extension-registry';
import { Subject, combineLatest } from '@umbraco-cms/backoffice/external/rxjs';
-export type UmbTranslationsSquashedDictionary = Record;
+export type UmbTranslationsFlatDictionary = Record;
export class UmbTranslationRegistry {
#registry;
@@ -22,7 +22,7 @@ export class UmbTranslationRegistry {
extensions
.filter((x) => x.meta.culture.toLowerCase() === userCulture)
.map(async (extension) => {
- const innerDictionary: UmbTranslationsSquashedDictionary = {};
+ const innerDictionary: UmbTranslationsFlatDictionary = {};
// If extension contains a dictionary, add it to the inner dictionary.
if (extension.meta.translations) {
@@ -62,7 +62,7 @@ export class UmbTranslationRegistry {
}
#addOrUpdateDictionary(
- innerDictionary: UmbTranslationsSquashedDictionary,
+ innerDictionary: UmbTranslationsFlatDictionary,
dictionaryName: string,
dictionary: UmbTranslationsDictionary['value']
) {
From bbd0bc52bc95562ae5ccc601e34d405e4fe1c849 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 11:12:53 +0200
Subject: [PATCH 102/122] change translations info typescript for strictness
---
.../src/assets/lang/da-dk.js | 2989 ---------------
.../src/assets/lang/da-dk.ts | 3246 +++++++++++++++++
.../src/assets/lang/en-us.js | 2966 ---------------
.../src/assets/lang/en-us.ts | 3219 ++++++++++++++++
.../packages/core/localization/manifests.ts | 4 +-
5 files changed, 6467 insertions(+), 5957 deletions(-)
delete mode 100644 src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js
create mode 100644 src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts
delete mode 100644 src/Umbraco.Web.UI.Client/src/assets/lang/en-us.js
create mode 100644 src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js
deleted file mode 100644
index 479ae5e5f6..0000000000
--- a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.js
+++ /dev/null
@@ -1,2989 +0,0 @@
-export default {
- "actions": {
- "assigndomain": "Tilføj domæne",
- "auditTrail": "Revisionsspor",
- "browse": "Gennemse elementer",
- "changeDocType": "Skift Dokument Type",
- "changeDataType": "Skift Input Type",
- "copy": "Kopier",
- "create": "Opret",
- "export": "Eksportér",
- "createPackage": "Opret pakke",
- "createGroup": "Opret gruppe",
- "delete": "Slet",
- "disable": "Deaktivér",
- "editSettings": "Edit settings",
- "emptyrecyclebin": "Tøm papirkurv",
- "enable": "Aktivér",
- "exportDocumentType": "Eksportér dokumenttype",
- "importdocumenttype": "Importér dokumenttype",
- "importPackage": "Importér pakke",
- "liveEdit": "Redigér i Canvas",
- "logout": "Log af",
- "move": "Flyt",
- "notify": "Notificeringer",
- "protect": "Offentlig adgang",
- "publish": "Udgiv",
- "unpublish": "Afpublicér",
- "refreshNode": "Genindlæs elementer",
- "remove": "Fjern",
- "republish": "Genudgiv hele sitet",
- "rename": "Omdøb",
- "restore": "Gendan",
- "chooseWhereToCopy": "Vælg hvor du vil kopiere",
- "chooseWhereToMove": "Vælg hvortil du vil flytte",
- "infiniteEditorChooseWhereToMove": "Vælg hvor du vil flytte de valgte elementer hen",
- "toInTheTreeStructureBelow": "til i træstrukturen nedenfor",
- "infiniteEditorChooseWhereToCopy": "Vælg hvor du vil kopiere de valgte elementer til",
- "wasMovedTo": "blev flyttet til",
- "wasCopiedTo": "blev kopieret til",
- "wasDeleted": "blev slettet",
- "rights": "Rettigheder",
- "rollback": "Fortryd ændringer",
- "sendtopublish": "Send til udgivelse",
- "sendToTranslate": "Send til oversættelse",
- "setGroup": "Sæt gruppe",
- "sort": "Sortér",
- "translate": "Oversæt",
- "update": "Opdatér",
- "setPermissions": "Sæt rettigheder",
- "unlock": "LÃ¥s op",
- "createblueprint": "Opret indholdsskabelon",
- "resendInvite": "Gensend Invitation",
- "defaultValue": "Standard værdi",
- "deployQueueForTransfer": "Sæt i kø for overførsel",
- "deployRestore": "Genskab alt",
- "deployPartialRestore": "Udvalgt gendanelse",
- "deployTransferNow": "Overfør nu",
- "editContent": "Edit content",
- "chooseWhereToImport": "Choose where to import",
- "deployTreeRestore": "Tree restore",
- "deployCompare": "Compare"
- },
- "actionCategories": {
- "content": "Indhold",
- "administration": "Administration",
- "structure": "Struktur",
- "other": "Andet"
- },
- "actionDescriptions": {
- "assignDomain": "Tillad adgang til at tildele sprog og domæner",
- "auditTrail": "Tillad adgang for at få vist en nodes historik",
- "browse": "Tillad adgang for at få vist en node",
- "changeDocType": "Tillad adgang til at ændre dokumenttype for en node",
- "copy": "Tillad adgang til at kopiere en node",
- "create": "Tillad adgang til at oprette noder",
- "delete": "Tillad adgang til at slette noder",
- "move": "Tillad adgang til at flytte en node",
- "protect": "Tillad adgang til at indstille og ændre offentlig adgang til en node",
- "publish": "Tillad adgang til at udgive en node",
- "unpublish": "Tillad adgang til at afpublicere en node",
- "rights": "Tillad adgang til at ændre rettigheder for en node",
- "rollback": "Tillad adgang til at returnere en node til en tidligere tilstand",
- "sendtopublish": "Tillad adgang til at sende en node til godkendelse før den udgives",
- "sendToTranslate": "Tillad adgang til at sende en node til oversættelse",
- "sort": "Tillad adgang til at ændre sorteringsrækkefølge for noder",
- "translate": "Tillad adgang til at oversætte en node",
- "update": "Tillad adgang til at gemme en node",
- "createblueprint": "Tillad adgang til at oprette en indholdsskabelon",
- "notify": "Tillad adgang til at oprette notificeringer for noder",
- "deployQueueForTransfer": "Tillad brugeren at sætte i overførselskøen",
- "deployRestore": "Tillad brugeren at genskabe sider",
- "deployPartialRestore": "Tillad brugeren at genskabe udvalgte sider",
- "deployTreeRestore": "Allow the user to restore items for a tree",
- "deployCompare": "Allow the user to compare items between workspaces"
- },
- "apps": {
- "umbContent": "Indhold",
- "umbInfo": "Info"
- },
- "assignDomain": {
- "permissionDenied": "Tilladelse nægtet.",
- "addNew": "Tilføj nyt domæne",
- "remove": "fjern",
- "invalidNode": "Ugyldig node.",
- "invalidDomain": "Et eller flere domæner har et ugyldigt format.",
- "duplicateDomain": "Domæne er allerede blevet tildelt.",
- "language": "Sprog",
- "domain": "Domæne",
- "domainCreated": "Domænet '%0%' er nu oprettet og tilknyttet siden",
- "domainDeleted": "Domænet '%0%' er nu slettet",
- "domainExists": "Domænet '%0%' er oprettet",
- "domainUpdated": "Domænet '%0%' er nu opdateret",
- "orEdit": "eller rediger nuværende domæner",
- "domainHelpWithVariants": "Gyldige domænenavne er: \"example.com\", \"www.example.com\", \"example.com:8080\" eller \"https://www.example.com/\".\n Yderlgiere understøttes også første niveau af stien efter domænet, f.eks. \"Example.com/en\" eller \"/en\". ",
- "inherit": "Nedarv",
- "setLanguage": "Sprog",
- "setLanguageHelp": "Indstil sproget for noder under den aktuelle node, eller nedarv sprog fra forældre noder. Gælder også \n for den aktuelle node, medmindre et domæne nedenfor også indstiller et sprog.",
- "setDomains": "Domæner",
- "addCurrent": "Add current domain"
- },
- "buttons": {
- "clearSelection": "Ryd valg",
- "select": "Vælg",
- "somethingElse": "Gør noget andet",
- "bold": "Fed",
- "deindent": "Fortryd indryk afsnit",
- "formFieldInsert": "Indsæt formularfelt",
- "graphicHeadline": "Indsæt grafisk overskrift",
- "htmlEdit": "Redigér Html",
- "indent": "Indryk afsnit",
- "italic": "Kursiv",
- "justifyCenter": "Centrér",
- "justifyLeft": "Venstrestil afsnit",
- "justifyRight": "Højrestil afsnit",
- "linkInsert": "Indsæt link",
- "linkLocal": "Indsæt lokalt link (anker)",
- "listBullet": "Punktopstilling",
- "listNumeric": "Nummerorden",
- "macroInsert": "Indsæt makro",
- "pictureInsert": "Indsæt billede",
- "publishAndClose": "Udgiv og luk",
- "publishDescendants": "Udgiv med undersider",
- "relations": "Redigér relationer",
- "returnToList": "Tilbage til listen",
- "save": "Gem",
- "saveAndClose": "Gem og luk",
- "saveAndPublish": "Gem og udgiv",
- "saveToPublish": "Gem og send til udgivelse",
- "saveListView": "Gem listevisning",
- "schedulePublish": "Planlæg",
- "saveAndPreview": "Forhåndsvisning",
- "showPageDisabled": "Forhåndsvisning er deaktiveret fordi der ikke er nogen skabelon tildelt",
- "styleChoose": "Vælg formattering",
- "styleShow": "Vis koder",
- "tableInsert": "Indsæt tabel",
- "generateModelsAndClose": "Generer modeller og luk",
- "saveAndGenerateModels": "Gem og generer modeller",
- "undo": "Fortryd",
- "redo": "Genskab",
- "deleteTag": "Slet tag",
- "confirmActionCancel": "Fortryd",
- "confirmActionConfirm": "Bekræft",
- "morePublishingOptions": "Flere publiseringsmuligheder",
- "submitChanges": "Indsæt"
- },
- "auditTrails": {
- "atViewingFor": "For",
- "delete": "Brugeren har slettet indholdet",
- "unpublish": "Brugeren har afpubliceret indholdet",
- "unpublishvariant": "Brugeren har afpubliceret indholdet for sprogene: %0%",
- "publish": "Brugeren har gemt og udgivet indholdet",
- "publishvariant": "Brugeren har gemt og udgivet indholdet for sprogene: %0%",
- "save": "Brugeren har gemt indholdet",
- "savevariant": "Brugeren har gemt indholdet for sprogene: %0%",
- "move": "Brugeren har flyttet indholdet",
- "copy": "Brugeren har kopieret indholdet",
- "rollback": "Brugeren har tilbagerullet indholdet til en tidligere tilstand",
- "sendtopublish": "Brugeren har sendt indholdet til udgivelse",
- "sendtopublishvariant": "Brugeren har sendt indholdet til udgivelse for sprogene: %0%",
- "sendtotranslate": "Brugeren har sendt indholdet til oversættelse",
- "sort": "Brugeren har sorteret de underliggende sider",
- "custom": "%0%",
- "smallCopy": "Kopieret",
- "smallPublish": "Udgivet",
- "smallPublishVariant": "Udgivet",
- "smallMove": "Flyttet",
- "smallSave": "Gemt",
- "smallSaveVariant": "Gemt",
- "smallDelete": "Slettet",
- "smallUnpublish": "Afpubliceret",
- "smallUnpublishVariant": "Afpubliceret",
- "smallRollBack": "Indhold tilbagerullet",
- "smallSendToPublish": "Sendt til udgivelse",
- "smallSendToPublishVariant": "Sendt til udgivelse",
- "smallSendToTranslate": "Sendt til oversættelse",
- "smallSort": "Sorteret",
- "smallCustom": "Brugerdefineret",
- "historyIncludingVariants": "Historik (alle sprog)",
- "contentversionpreventcleanup": "Cleanup disabled for version: %0%",
- "contentversionenablecleanup": "Cleanup enabled for version: %0%",
- "smallContentVersionPreventCleanup": "Save",
- "smallContentVersionEnableCleanup": "Save"
- },
- "codefile": {
- "createFolderIllegalChars": "Mappens navn må ikke indeholde ugyldige tegn.",
- "deleteItemFailed": "Sletning af filen/mappen fejlede: %0%"
- },
- "content": {
- "isPublished": "Udgivet",
- "about": "Om siden",
- "alias": "Alias",
- "alternativeTextHelp": "(hvordan ville du f.eks. beskrive billedet via telefonen?)",
- "alternativeUrls": "Alternative links",
- "clickToEdit": "Klik for at redigere dette punkt",
- "createBy": "Oprettet af",
- "createByDesc": "Oprindelig forfatter",
- "updatedBy": "Opdateret af",
- "createDate": "Oprettet den",
- "createDateDesc": "Tidspunkt for oprettelse",
- "documentType": "Dokumenttype",
- "editing": "Redigerer",
- "expireDate": "Nedtagningsdato",
- "itemChanged": "Dette punkt er ændret siden udgivelsen",
- "itemNotPublished": "Dette punkt er endnu ikke udgivet",
- "lastPublished": "Sidst udgivet",
- "noItemsToShow": "Der er ingen elementer at vise",
- "listViewNoItems": "Der er ingen elementer at vise på listen.",
- "listViewNoContent": "Intet indhold er blevet tilføjet",
- "listViewNoMembers": "Ingen medlemmer er blevet tilføjet",
- "mediatype": "Medietype",
- "mediaLinks": "Link til medie(r)",
- "membergroup": "Medlemsgruppe",
- "memberrole": "Rolle",
- "membertype": "Medlemstype",
- "noChanges": "Der er endnu ikke lavet nogle ændringer.",
- "noDate": "Ingen dato valgt",
- "nodeName": "Sidetitel",
- "noMediaLink": "Dette medie har ikke noget link",
- "noProperties": "Intet indhold kan tilføjes for dette element",
- "otherElements": "Egenskaber",
- "parentNotPublished": "Dette dokument er udgivet, men ikke synligt da den overliggende side '%0%' ikke er\n udgivet!\n ",
- "parentCultureNotPublished": "Dette sprog er udgivet, men ikke synligt, da den overliggende side '%0%' ikke\n er udgivet!\n ",
- "parentNotPublishedAnomaly": "Ups: dette dokument er udgivet, men er ikke i cachen (intern fejl)",
- "getUrlException": "Kunne ikke hente URL'en",
- "routeError": "Dette dokument er udgivet, men dets URL ville kollidere med indholdet %0%",
- "routeErrorCannotRoute": "Dette dokument er udgivet, men dets URL kan ikke dirigeres",
- "publish": "Udgiv",
- "published": "Udgivet",
- "publishedPendingChanges": "Udgivet (Ventede ændringer)",
- "publishStatus": "Udgivelsesstatus",
- "publishDescendantsHelp": "Klik Udgiv med undersider for at udgive %0% og alle sider under og dermed gøre deres indhold offentligt tilgængelige.",
- "publishDescendantsWithVariantsHelp": "Klik Udgiv med undersider for at udgive de valgte sprog og de samme sprog for sider under og dermed gøre deres indhold offentligt tilgængelige.",
- "releaseDate": "Udgivelsesdato",
- "unpublishDate": "Afpubliceringsdato",
- "removeDate": "Fjern dato",
- "setDate": "Vælg dato",
- "sortDone": "Sorteringsrækkefølgen er opdateret",
- "sortHelp": "For at sortere, træk siderne eller klik på en af kolonnehovederne. Du kan vælge flere sider\n ved at holde \"shift\" eller \"control\" nede mens du vælger.\n ",
- "statistics": "Statistik",
- "titleOptional": "Titel (valgfri)",
- "altTextOptional": "Alternativ tekst (valgfri)",
- "captionTextOptional": "Overskrift (valgfri)",
- "type": "Type",
- "variantsToPublish": "Hvilke varianter vil du udgive?",
- "variantsToSave": "Vælg hvilke varianter, der skal gemmes.",
- "unpublish": "Afpublicér",
- "unpublished": "Afpubliceret",
- "notCreated": "Ikke oprettet",
- "updateDate": "Sidst redigeret",
- "updateDateDesc": "Tidspunkt for seneste redigering",
- "uploadClear": "Fjern fil",
- "uploadClearImageContext": "Klik her for at fjerne billedet fra medie filen",
- "uploadClearFileContext": "Klik her for at fjerne filen fra medie filen",
- "urls": "Link til dokument",
- "memberof": "Medlem af grupper(ne)",
- "notmemberof": "Ikke medlem af grupper(ne)",
- "childItems": "Undersider",
- "target": "Ã…ben i vindue",
- "scheduledPublishServerTime": "Dette oversætter til den følgende tid på serveren:",
- "scheduledPublishDocumentation": "Hvad betyder det? ",
- "nestedContentDeleteItem": "Er du sikker på, at du vil slette dette element?",
- "nestedContentDeleteAllItems": "Er du sikker på, at du vil slette alle elementer?",
- "nestedContentEditorNotSupported": "Egenskaben %0% anvender editoren %1% som ikke er understøttet af Nested\n Content.\n ",
- "nestedContentNoContentTypes": "Der er ikke konfigureret nogen indholdstyper for denne egenskab.",
- "nestedContentAddElementType": "Tilføj element type",
- "nestedContentSelectElementTypeModalTitle": "Vælg element type",
- "nestedContentGroupHelpText": "Vælg gruppen, hvis værdier skal vises. Hvis dette er efterladt blankt vil\n den første gruppe på element typen bruges.\n ",
- "addTextBox": "Tilføj en ny tekstboks",
- "removeTextBox": "Fjern denne tekstboks",
- "contentRoot": "Indholdsrod",
- "includeUnpublished": "Inkluder ikke-udgivet indhold.",
- "isSensitiveValue": "Denne værdi er skjult.Hvis du har brug for adgang til at se denne værdi, bedes du\n kontakte din web-administrator.\n ",
- "isSensitiveValue_short": "Denne værdi er skjult.",
- "languagesToPublish": "Hvilke sprog vil du gerne udgive?",
- "languagesToSendForApproval": "Hvilke sprog vil du gerne sende til godkendelse?",
- "languagesToSchedule": "Hvilke sprog vil du gerne planlægge?",
- "languagesToUnpublish": "Vælg sproget du vil afpublicere. Afpublicering af et obligatorisk sprog vil\n afpublicere alle sprog.\n ",
- "resetFocalPoint": "Nulstil fokuspunkt",
- "variantsWillBeSaved": "Alle nye varianter vil blive gemt.",
- "publishRequiresVariants": "De følgende varianter er krævet for at en udgivelse kan finde sted:",
- "notReadyToPublish": "Vi er ikke klar til at udgive",
- "readyToPublish": "Klar til at udgive?",
- "readyToSave": "Klar til at gemme?",
- "sendForApproval": "Send til godkendelse",
- "schedulePublishHelp": "Vælg dato og klokkeslæt for at udgive og/eller afpublicere indholdet.",
- "createEmpty": "Opret ny",
- "createFromClipboard": "Indsæt fra udklipsmappen",
- "nodeIsInTrash": "Dette element er i papirkurven",
- "nestedContentTemplateHelpTextPart1": "Enter an angular expression to evaluate against each item for its\n name. Use\n ",
- "nestedContentTemplateHelpTextPart2": "to display the item index",
- "nestedContentNoGroups": "The selected element type does not contain any supported groups (tabs are not supported by this editor, either change them to groups or use the Block List editor).",
- "variantSaveNotAllowed": "Save is not allowed",
- "variantPublishNotAllowed": "Publish is not allowed",
- "variantSendForApprovalNotAllowed": "Send for approval is not allowed",
- "variantScheduleNotAllowed": "Schedule is not allowed",
- "variantUnpublishNotAllowed": "Unpublish is not allowed"
- },
- "blueprints": {
- "createBlueprintFrom": "Opret en ny indholdsskabelon fra %0% ",
- "blankBlueprint": "Blank",
- "selectBlueprint": "Vælg en indholdsskabelon",
- "createdBlueprintHeading": "Indholdsskabelon oprettet",
- "createdBlueprintMessage": "En indholdsskabelon blev oprettet fra '%0%'",
- "duplicateBlueprintMessage": "En anden indholdsskabelon med samme navn eksisterer allerede",
- "blueprintDescription": "En indholdskabelon er foruddefineret indhold, som en redaktør kan vælge at bruge\n som grundlag for at oprette nyt indhold\n "
- },
- "media": {
- "clickToUpload": "Klik for at uploade",
- "orClickHereToUpload": "eller klik her for at vælge filer",
- "disallowedFileType": "Kan ikke uploade denne fil, den har ikke en godkendt filtype",
- "maxFileSize": "Maks filstørrelse er",
- "mediaRoot": "Medie rod",
- "moveToSameFolderFailed": "Overordnet og destinations mappe kan ikke være den samme",
- "createFolderFailed": "Oprettelse af mappen under parent med id %0% fejlede",
- "renameFolderFailed": "Omdøbning af mappen med id %0% fejlede",
- "dragAndDropYourFilesIntoTheArea": "Træk dine filer ind i dropzonen for, at uploade dem til\n mediebiblioteket.\n ",
- "uploadNotAllowed": "Upload er ikke tiladt på denne lokation",
- "disallowedMediaType": "Cannot upload this file, the media type with alias '%0%' is not allowed here",
- "invalidFileName": "Cannot upload this file, it does not have a valid file name"
- },
- "member": {
- "createNewMember": "Opret et nyt medlem",
- "allMembers": "Alle medlemmer",
- "memberGroupNoProperties": "Medlemgrupper har ingen yderligere egenskaber til redigering.",
- "2fa": "Totrinsbekræftelse",
- "duplicateMemberLogin": "A member with this login already exists",
- "memberHasGroup": "The member is already in group '%0%'",
- "memberHasPassword": "The member already has a password set",
- "memberLockoutNotEnabled": "Lockout is not enabled for this member",
- "memberNotInGroup": "The member is not in group '%0%'"
- },
- "contentType": {
- "copyFailed": "Kopiering af indholdstypen fejlede",
- "moveFailed": "Flytning af indholdstypen fejlede"
- },
- "mediaType": {
- "copyFailed": "Kopiering af medietypen fejlede",
- "moveFailed": "Flytning af medietypen fejlede",
- "autoPickMediaType": "Auto vælg"
- },
- "memberType": {
- "copyFailed": "Kopiering af medlemstypen fejlede"
- },
- "create": {
- "chooseNode": "Hvor ønsker du at oprette den nye %0%",
- "createUnder": "Opret under",
- "createContentBlueprint": "Vælg den dokumenttype, du vil oprette en indholdsskabelon til",
- "enterFolderName": "Angiv et navn for mappen",
- "updateData": "Vælg en type og skriv en titel",
- "noDocumentTypes": "Der kunne ikke findes nogen tilladte dokumenttyper. Du skal tillade disse i indstillinger under \"dokumenttyper\" .",
- "noDocumentTypesAtRoot": "There are no document types available for creating content here. You must create these in Document Types within the Settings section.",
- "noDocumentTypesWithNoSettingsAccess": "Den valgte side i træet tillader ikke at sider oprettes under\n den.\n ",
- "noDocumentTypesEditPermissions": "Rediger tilladelser for denne dokumenttype.",
- "noDocumentTypesCreateNew": "Opret en ny dokumenttype",
- "noDocumentTypesAllowedAtRoot": "Der er ingen tilladte Dokumenttyper tilgængelige for at lave indhold her. Du skal tillade dette i Dokumenttyper inde i Indstillinger sektionen, ved at ændre Tillad på rodniveau indestillingen under Permissions .",
- "noMediaTypes": "Der kunne ikke findes nogen tilladte media typer. Du skal tillade disse i indstillinger under \"media typer\" .",
- "noMediaTypesWithNoSettingsAccess": "Det valgte medie i træet tillader ikke at medier oprettes under det.\n ",
- "noMediaTypesEditPermissions": "Rediger tilladelser for denne medietype.",
- "documentTypeWithoutTemplate": "Dokumenttype uden skabelon",
- "documentTypeWithTemplate": "Dokumenttype med skabelon",
- "documentTypeWithTemplateDescription": "Definerer en indholdsside, der kan oprettes af redaktørerne i\n indholdstræet, og som er kan tilgås direkte på en URL.\n ",
- "documentType": "Dokumenttype",
- "documentTypeDescription": "Definerer en indholdskomponent, der kan oprettes af redaktørerne i\n indholdstræet og benyttes i sammenhæng med andet indhold, men som ikke kan tilgås direkte på en URL.\n ",
- "elementType": "Element-type",
- "elementTypeDescription": "Definerer skabelonen for et sæt at egenskaber, der kan anvendes som skema i\n avancerede felter som f.eks. 'Block List' eller 'Block Grid'.\n ",
- "composition": "Komposition",
- "compositionDescription": "Definerer et sæt genbrugbare egenskaber, der kan inkluderes i definitionen af\n andre dokumenttyper - f.eks. et sæt 'Almindelige side-data'.\n ",
- "folder": "Mappe",
- "folderDescription": "Benyttes til at organisere dokumenttyper, element-typer og kompositioner i\n dokumenttype-træet.\n ",
- "newFolder": "Ny mappe",
- "newDataType": "Ny datatype",
- "newJavascriptFile": "Ny JavaScript-fil",
- "newEmptyPartialView": "Ny tom partial view",
- "newPartialViewMacro": "Ny partial view makro",
- "newPartialViewFromSnippet": "Ny partial view fra snippet",
- "newPartialViewMacroFromSnippet": "Ny partial view makro fra snippet",
- "newPartialViewMacroNoMacro": "Ny partial view makro (uden makro)",
- "newStyleSheetFile": "Ny stylesheet-fil",
- "newRteStyleSheetFile": "Ny Rich Text Editor stylesheet-fil"
- },
- "dashboard": {
- "browser": "Til dit website",
- "dontShowAgain": "- Skjul",
- "nothinghappens": "Hvis Umbraco ikke starter, kan det skyldes at din browser ikke tillader pop-up vinduer\n ",
- "openinnew": "er åbnet i nyt vindue",
- "restart": "Genstart",
- "visit": "Besøg",
- "welcome": "Velkommen"
- },
- "prompt": {
- "stay": "Bliv",
- "discardChanges": "Kassér ændringer",
- "unsavedChanges": "Du har ikke-gemte ændringer",
- "unsavedChangesWarning": "Er du sikker på du vil navigere væk fra denne side? - du har ikke-gemte\n ændringer\n ",
- "confirmListViewPublish": "Udgivelse vil gøre de valgte sider synlige på sitet.",
- "confirmListViewUnpublish": "Afpublicering vil fjerne de valgte sider og deres undersider fra sitet.",
- "confirmUnpublish": "Afpublicering vil fjerne denne side og alle dets undersider fra websitet.",
- "doctypeChangeWarning": "Du har ikke-gemte ændringer. Hvis du ændrer dokumenttype, kasseres ændringerne.\n "
- },
- "bulk": {
- "done": "Færdig",
- "deletedItem": "Slettede %0% element",
- "deletedItems": "Slettede %0% elementer",
- "deletedItemOfItem": "Slettede %0% ud af %1% element",
- "deletedItemOfItems": "Slettede %0% ud af %1% elementer",
- "publishedItem": "Udgav %0% element",
- "publishedItems": "Udgav %0% elementer",
- "publishedItemOfItem": "Udgav %0% ud af %1% element",
- "publishedItemOfItems": "Udgav %0% ud af %1% elementer",
- "unpublishedItem": "Fjernede %0% element fra udgivelse",
- "unpublishedItems": "Fjernede %0% elementer fra udgivelse",
- "unpublishedItemOfItem": "Fjernede %0% ud af %1% element fra udgivelse",
- "unpublishedItemOfItems": "Fjernede %0% ud af %1% elementer fra udgivelse",
- "movedItem": "Flyttede %0% element",
- "movedItems": "Flyttede %0% elementer",
- "movedItemOfItem": "Flyttede %0% ud af %1% element",
- "movedItemOfItems": "Flyttede %0% ud af %1% elementer",
- "copiedItem": "Kopierede %0% element",
- "copiedItems": "Kopierede %0% elementer",
- "copiedItemOfItem": "Kopierede %0% ud af %1% element",
- "copiedItemOfItems": "Kopierede %0% ud af %1% elementer"
- },
- "defaultdialogs": {
- "nodeNameLinkPicker": "Link titel",
- "urlLinkPicker": "Link",
- "anchorLinkPicker": "Lokalt link / querystreng",
- "anchorInsert": "Navn på lokalt link",
- "assignDomain": "Rediger domæner",
- "closeThisWindow": "Luk denne dialog",
- "confirmdelete": "Er du sikker på at du vil slette",
- "confirmdisable": "Er du sikker på du vil deaktivere",
- "confirmremove": "Er du sikker på at du vil fjerne",
- "confirmremoveusageof": "Er du sikker på du vil fjerne brugen af %0% ",
- "confirmlogout": "Er du sikker på at du vil forlade Umbraco?",
- "confirmSure": "Er du sikker?",
- "cut": "Klip",
- "editdictionary": "Rediger ordbogsnøgle",
- "editlanguage": "Rediger sprog",
- "editSelectedMedia": "Rediger det valgte medie",
- "insertAnchor": "Indsæt lokalt link",
- "insertCharacter": "Indsæt tegn",
- "insertgraphicheadline": "Indsæt grafisk overskrift",
- "insertimage": "Indsæt billede",
- "insertlink": "Indsæt link",
- "insertMacro": "Indsæt makro",
- "inserttable": "Indsæt tabel",
- "languagedeletewarning": "Dette vil slette sproget",
- "languageChangeWarning": "Ændring af kulturen for et sprog kan forsage en krævende opration og vil\n resultere i indholds cache og indeksering vil blive genlavet\n ",
- "lastEdited": "Sidst redigeret",
- "link": "Link",
- "linkinternal": "Internt link:",
- "linklocaltip": "Ved lokalt link, indsæt da en \"#\" foran linket",
- "linknewwindow": "Ã…ben i nyt vindue?",
- "macroDoesNotHaveProperties": "Denne makro har ingen egenskaber du kan redigere",
- "paste": "Indsæt tekst",
- "permissionsEdit": "Rediger rettigheder for",
- "permissionsSet": "Sæt rettigheder for",
- "permissionsSetForGroup": "Sæt rettigheder for %0% for brugergruppe %1%",
- "permissionsHelp": "Vælg de brugergrupper, du vil angive tilladelser til",
- "recycleBinDeleting": "Elementerne i papirkurven slettes. Luk venligst ikke dette vindue mens sletningen\n foregår\n ",
- "recycleBinIsEmpty": "Papirkurven er nu tom",
- "recycleBinWarning": "NÃ¥r elementer slettes fra papirkurven, slettes de for altid",
- "regexSearchError": "regexlib.com 's webservice oplever i øjeblikket problemer, vi ikke har kontrol over. Beklager ulejligheden. ",
- "regexSearchHelp": "Søg efter et regulært udtryk for at tilføje validering til et formularfelt. Eksempel:\n 'e-mail', 'postnr.', 'URL'\n ",
- "removeMacro": "Fjern makro",
- "requiredField": "Obligatorisk",
- "sitereindexed": "Sitet er genindekseret",
- "siterepublished": "Sitet er nu genudgivet",
- "siterepublishHelp": "Websitets cache vil blive genopfrisket. Alt udgivet indhold vil blive opdateret, mens\n upubliceret indhold vil forblive upubliceret.\n ",
- "tableColumns": "Antal kolonner",
- "tableRows": "Antal rækker",
- "thumbnailimageclickfororiginal": "Klik på billedet for at se den fulde størrelse",
- "treepicker": "Vælg",
- "viewCacheItem": "Se cache element",
- "relateToOriginalLabel": "Relatér til original",
- "includeDescendants": "Inkludér undersider",
- "theFriendliestCommunity": "Det venligste community",
- "linkToPage": "Link til side",
- "openInNewWindow": "Ã…ben linket i et nyt vindue eller fane",
- "linkToMedia": "Link til medie",
- "selectContentStartNode": "Vælg startnode for indhold",
- "selectMedia": "Vælg medie",
- "selectMediaType": "Vælg medietype",
- "selectIcon": "Vælg ikon",
- "selectItem": "Vælg item",
- "selectLink": "Vælg link",
- "selectMacro": "Vælg makro",
- "selectContent": "Vælg indhold",
- "selectContentType": "Vælg indholdstype",
- "selectMediaStartNode": "Vælg startnode for mediearkivet",
- "selectMember": "Vælg medlem",
- "selectMemberGroup": "Vælg medlemsgruppe",
- "selectMemberType": "Vælg medlemstype",
- "selectNode": "Vælg node",
- "selectLanguages": "Vælg sprog",
- "selectSections": "Vælg sektioner",
- "selectUser": "Vælg bruger",
- "selectUsers": "Vælg brugere",
- "noIconsFound": "Ingen ikoner blev fundet",
- "noMacroParams": "Der er ingen parametre for denne makro",
- "noMacros": "Der er ikke tilføjet nogen makroer",
- "externalLoginProviders": "Eksterne login-udbydere",
- "exceptionDetail": "Undtagelsesdetaljer",
- "stacktrace": "Stacktrace",
- "innerException": "Indre undtagelse",
- "linkYour": "Link dit",
- "unLinkYour": "Fjern link fra dit",
- "account": "konto",
- "selectEditor": "Vælg editor",
- "selectEditorConfiguration": "Vælg konfiguration",
- "selectSnippet": "Vælg snippet",
- "variantdeletewarning": "Dette vil slette noden og alle dets sprog. Hvis du kun vil slette et sprog, så\n afpublicér det i stedet.\n ",
- "propertyuserpickerremovewarning": "Dette vil fjerne brugeren %0% ",
- "userremovewarning": "Dette vil fjerne brugeren %0% fra %1% gruppen",
- "yesRemove": "Ja, fjern",
- "confirmdeleteNumberOfItems": "Are you sure you want to delete %0% of %1% items",
- "deleteLayout": "You are deleting the layout",
- "deletingALayout": "Modifying layout will result in loss of data for any existing content that is based on this configuration."
- },
- "dictionary": {
- "noItems": "Der er ingen ordbogselementer.",
- "importDictionaryItemHelp": "\n To import a dictionary item, find the \".udt\" file on your computer by clicking the\n \"Import\" button (you'll be asked for confirmation on the next screen)\n ",
- "itemDoesNotExists": "Dictionary item does not exist.",
- "parentDoesNotExists": "Parent item does not exist.",
- "noItemsInFile": "There are no dictionary items in this file.",
- "noItemsFound": "There were no dictionary items found.",
- "createNew": "Create dictionary item"
- },
- "dictionaryItem": {
- "description": "\n Rediger de forskellige sprogversioner for ordbogselementet '%0%' herunder. Du tilføjer flere sprog under 'sprog' i menuen til venstre \n ",
- "displayName": "Kulturnavn",
- "changeKeyError": "\n Navnet '%0%' eksisterer allerede.\n ",
- "overviewTitle": "Ordbogsoversigt"
- },
- "examineManagement": {
- "configuredSearchers": "Konfigurerede søgere",
- "configuredSearchersDescription": "Viser egenskaber og værktøjer til enhver konfigureret søger (dvs. som en\n multi-indekssøger)\n ",
- "fieldValues": "Feltværdier",
- "healthStatus": "Sundhedstilstand",
- "healthStatusDescription": "Indeksets sundhedstilstand, og hvis det kan læses",
- "indexers": "Indeksører",
- "indexInfo": "Indeksinfo",
- "indexInfoDescription": "Viser indeksets egenskaber",
- "manageIndexes": "Administrer Examine indekserne",
- "manageIndexesDescription": "Giver dig mulighed for at se detaljerne for hvert indeks og giver nogle\n værktøjer til styring af indeksørerne\n ",
- "rebuildIndex": "Genopbyg indeks",
- "rebuildIndexWarning": "\n Dette vil medføre, at indekset genopbygges. \n Afhængigt af hvor meget indhold der er på dit website, kan det tage et stykke tid. \n Det anbefales ikke at genopbygge et indeks i perioder med høj websitetrafik eller når redaktører redigerer indhold.\n ",
- "searchers": "Søgere",
- "searchDescription": "Søg i indekset og se resultaterne",
- "tools": "Værktøjer",
- "toolsDescription": "Værktøjer til at administrere indekset",
- "fields": "felter",
- "indexCannotRead": "Indexet skal bygges igen, for at kunne læses",
- "processIsTakingLonger": "Processen tager længere tid end forventet. Kontrollér Umbraco loggen for at se om\n der er sket fejl under operationen\n ",
- "indexCannotRebuild": "Dette index kan ikke genbygges for det ikke har nogen",
- "iIndexPopulator": "IIndexPopulator",
- "contentInIndex": "Content in index"
- },
- "placeholders": {
- "username": "Indtast dit brugernavn",
- "password": "Indtast dit kodeord",
- "confirmPassword": "Bekræft dit kodeord",
- "nameentity": "Navngiv %0%...",
- "entername": "Indtast navn...",
- "enteremail": "Indtast en e-mail...",
- "enterusername": "Indtast et brugernavn...",
- "label": "Label...",
- "enterDescription": "Indtast beskrivelse",
- "search": "Søg...",
- "filter": "Filtrér...",
- "enterTags": "Indtast nøgleord (tryk på Enter efter hvert nøgleord)...",
- "email": "Indtast din e-mail",
- "enterMessage": "Indtast en besked...",
- "usernameHint": "Dit brugernavn er typisk din e-mailadresse",
- "anchor": "#value eller ?key=value",
- "enterAlias": "Indtast alias...",
- "generatingAlias": "Genererer alias...",
- "a11yCreateItem": "Opret element",
- "a11yEdit": "Rediger",
- "a11yName": "Navn"
- },
- "editcontenttype": {
- "createListView": "Opret brugerdefineret listevisning",
- "removeListView": "Fjern brugerdefineret listevisning",
- "aliasAlreadyExists": "En dokumenttype, medietype eller medlemstype med dette alias findes allerede"
- },
- "renamecontainer": {
- "renamed": "Omdøbt",
- "enterNewFolderName": "Indtast et ny mappenavn her",
- "folderWasRenamed": "%0% was renamed to %1%"
- },
- "editdatatype": {
- "addPrevalue": "Tilføj førværdi",
- "dataBaseDatatype": "Database-datatype",
- "guid": "Data Editor GUID",
- "renderControl": "Visningskontrol",
- "rteButtons": "Knapper",
- "rteEnableAdvancedSettings": "Aktiver avancerede indstillinger for",
- "rteEnableContextMenu": "Aktiver kontekstmenu",
- "rteMaximumDefaultImgSize": "Maks. std. størrelse på indsatte billeder",
- "rteRelatedStylesheets": "Relaterede stylesheets",
- "rteShowLabel": "Vis label",
- "rteWidthAndHeight": "Bredde og højde",
- "selectFolder": "Vælg den mappe, der skal flyttes",
- "inTheTree": "til i træstrukturen nedenfor",
- "wasMoved": "blev flyttet under",
- "hasReferencesDeleteConsequence": "Ved sletning af %0% fjernes egnskaber og egnskabernes data fra følgende elementer",
- "acceptDeleteConsequence": "I understand this action will delete the properties and data based on this Data\n Type\n ",
- "canChangePropertyEditorHelp": "Changing a property editor on a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json."
- },
- "errorHandling": {
- "errorButDataWasSaved": "Dine data er blevet gemt, men før du kan udgive denne side er der nogle fejl der\n skal rettes:\n ",
- "errorChangingProviderPassword": "Den nuværende membership-provider understøtter ikke skift af kodeord\n (EnablePasswordRetrieval skal være true)\n ",
- "errorExistsWithoutTab": "%0% der findes allerede",
- "errorHeader": "Der var fejl i dokumentet:",
- "errorHeaderWithoutTab": "Der var fejl i formularen:",
- "errorInPasswordFormat": "Kodeordet skal være på minimum %0% tegn og indeholde mindst %1% alfanumeriske\n karakterer\n ",
- "errorIntegerWithoutTab": "%0% skal være et heltal",
- "errorMandatory": "%0% under %1% er et obligatorisk felt og skal udfyldes",
- "errorMandatoryWithoutTab": "%0% er et obligatorisk felt og skal udfyldes",
- "errorRegExp": "%0% under %1% er ikke i et korrekt format",
- "errorRegExpWithoutTab": "%0% er ikke i et korrekt format"
- },
- "errors": {
- "receivedErrorFromServer": "Der skete en fejl på severen",
- "dissallowedMediaType": "Denne filttype er blevet deaktiveret af administratoren",
- "codemirroriewarning": "OBS! Selvom CodeMirror er slået til i konfigurationen, så er den deaktiveret i\n Internet Explorer fordi den ikke er stabil nok.\n ",
- "contentTypeAliasAndNameNotNull": "Du skal udfylde både Alias & Navn på den nye egenskabstype!",
- "filePermissionsError": "Der mangler læse/skrive rettigheder til bestemte filer og mapper",
- "macroErrorLoadingPartialView": "Fejl ved indlæsning af Partial View script (fil: %0%)",
- "missingTitle": "Skriv venligst en titel",
- "missingType": "Du skal vælge en type",
- "pictureResizeBiggerThanOrg": "Du er ved at gøre billedet større end originalen. Det vil forringe\n kvaliteten af billedet. Ønsker du at fortsætte?\n ",
- "startNodeDoesNotExists": "Startnode er slettet, kontakt systemadministrator",
- "stylesMustMarkBeforeSelect": "Du skal markere noget indhold, før du kan ændre stylen",
- "stylesNoStylesOnPage": "Der er ingen aktive styles eller formatteringer på denne side",
- "tableColMergeLeft": "Du skal stå til venstre for de 2 celler du ønsker at samle!",
- "tableSplitNotSplittable": "Du kan ikke opdele en celle, som ikke allerede er delt.",
- "propertyHasErrors": "Denne egenskab er ugyldig",
- "defaultError": "An unknown failure has occurred",
- "concurrencyError": "Optimistic concurrency failure, object has been modified"
- },
- "general": {
- "options": "Valgmuligheder",
- "about": "Om",
- "action": "Handling",
- "actions": "Muligheder",
- "add": "Tilføj",
- "alias": "Alias",
- "all": "Alle",
- "areyousure": "Er du sikker?",
- "back": "Tilbage",
- "backToOverview": "Tilbage til oversigt",
- "border": "Kant",
- "by": "af",
- "cancel": "Fortryd",
- "cellMargin": "Celle margen",
- "choose": "Vælg",
- "clear": "Ryd",
- "close": "Luk",
- "closewindow": "Luk vindue",
- "closepane": "Luk vindue",
- "comment": "Kommentar",
- "confirm": "Bekræft",
- "constrain": "Proportioner",
- "constrainProportions": "Behold proportioner",
- "content": "Indhold",
- "continue": "Fortsæt",
- "copy": "Kopiér",
- "create": "Opret",
- "cropSection": "Beskær sektion",
- "database": "Database",
- "date": "Dato",
- "default": "Standard",
- "delete": "Slet",
- "deleted": "Slettet",
- "deleting": "Sletter...",
- "design": "Design",
- "dictionary": "Ordbog",
- "dimensions": "Dimensioner",
- "discard": "Kassér",
- "down": "Ned",
- "download": "Hent",
- "edit": "Rediger",
- "edited": "Redigeret",
- "elements": "Elementer",
- "email": "E-mail",
- "error": "Fejl",
- "field": "Felt",
- "findDocument": "Find",
- "first": "Første",
- "focalPoint": "Fokuspunkt",
- "general": "Generelt",
- "groups": "Grupper",
- "group": "Gruppe",
- "height": "Højde",
- "help": "Hjælp",
- "hide": "Skjul",
- "history": "Historik",
- "icon": "Ikon",
- "id": "Id",
- "import": "Importer",
- "excludeFromSubFolders": "Søg kun i denne mappe",
- "info": "Info",
- "innerMargin": "Indre margen",
- "insert": "Indsæt",
- "install": "Installér",
- "invalid": "Ugyldig",
- "justify": "Justering",
- "label": "Mærke",
- "language": "Sprog",
- "last": "Sidste",
- "layout": "Layout",
- "links": "Links",
- "loading": "Henter",
- "locked": "LÃ¥st",
- "login": "Log ind",
- "logoff": "Log af",
- "logout": "Log ud",
- "macro": "Makro",
- "mandatory": "Påkrævet",
- "message": "Besked",
- "move": "Flyt",
- "name": "Navn",
- "new": "Ny",
- "next": "Næste",
- "no": "Nej",
- "of": "af",
- "off": "Fra",
- "ok": "OK",
- "open": "Ã…ben",
- "on": "Til",
- "or": "eller",
- "orderBy": "Sortér efter",
- "password": "Kodeord",
- "path": "Sti",
- "pleasewait": "Et øjeblik...",
- "previous": "Forrige",
- "properties": "Egenskaber",
- "rebuild": "Genopbyg",
- "reciept": "E-mail der skal modtage indhold af formular",
- "recycleBin": "Papirkurv",
- "recycleBinEmpty": "Din papirkurv er tom",
- "reload": "Genindlæs",
- "remaining": "Mangler",
- "remove": "Fjern",
- "rename": "Omdøb",
- "renew": "Forny",
- "required": "Påkrævet",
- "retrieve": "Hent",
- "retry": "Prøv igen",
- "rights": "Rettigheder",
- "scheduledPublishing": "Planlagt publicering",
- "search": "Søg",
- "searchNoResult": "Beklager, vi kan ikke finde det, du leder efter.",
- "noItemsInList": "Ingen elementer er blevet tilføjet",
- "server": "Server",
- "settings": "Indstillinger",
- "show": "Vis",
- "showPageOnSend": "Hvilken side skal vises efter at formularen er sendt",
- "size": "Størrelse",
- "sort": "Sortér",
- "status": "Status",
- "submit": "Indsend",
- "type": "Type",
- "typeToSearch": "Skriv for at søge...",
- "under": "under",
- "up": "Op",
- "update": "Opdatér",
- "upgrade": "Opdatér",
- "upload": "Upload",
- "url": "URL",
- "user": "Bruger",
- "username": "Brugernavn",
- "value": "Værdi",
- "view": "Vis",
- "welcome": "Velkommen...",
- "width": "Bredde",
- "yes": "Ja",
- "folder": "Mappe",
- "searchResults": "Søgeresultater",
- "readMore": "Læs mere",
- "reorder": "Sortér",
- "reorderDone": "Afslut sortering",
- "preview": "Eksempel",
- "changePassword": "Skift kodeord",
- "to": "til",
- "listView": "Listevisning",
- "saving": "Gemmer...",
- "current": "nuværende",
- "embed": "Indlejring",
- "selected": "valgt",
- "other": "Andet",
- "articles": "Artikler",
- "videos": "Videoer",
- "avatar": "Avatar til",
- "header": "Overskrift",
- "systemField": "system felt",
- "Deploy": "Deploy",
- "restore": "Genskab",
- "generic": "Generic",
- "media": "Media",
- "nodeName": "Node Name",
- "revert": "Revert",
- "umbracoInfo": "Umbraco info",
- "shared": "Shared",
- "success": "Success",
- "typeName": "Type Name",
- "validate": "Validate",
- "lastUpdated": "Last Updated",
- "skipToMenu": "Skip to menu",
- "skipToContent": "Skip to content"
- },
- "colors": {
- "blue": "Blå"
- },
- "shortcuts": {
- "addGroup": "Tilføj fane",
- "addProperty": "Tilføj egenskab",
- "addEditor": "Tilføj editor",
- "addTemplate": "Tilføj skabelon",
- "addChildNode": "Tilføj child node",
- "addChild": "Tilføj child",
- "editDataType": "Rediger datatype",
- "navigateSections": "Naviger sektioner",
- "shortcut": "Genveje",
- "showShortcuts": "Vis genveje",
- "toggleListView": "Brug listevisning",
- "toggleAllowAsRoot": "Tillad på rodniveau",
- "commentLine": "Kommentér/Udkommentér linjer",
- "removeLine": "Slet linje",
- "copyLineUp": "Kopiér linjer op",
- "copyLineDown": "Kopiér linjer ned",
- "moveLineUp": "Flyt linjer op",
- "moveLineDown": "Flyt linjer ned",
- "generalHeader": "Generelt",
- "editorHeader": "Editor",
- "toggleAllowCultureVariants": "Skift tillad sprogvarianter",
- "addTab": "Add tab"
- },
- "graphicheadline": {
- "backgroundcolor": "Baggrundsfarve",
- "bold": "Fed",
- "color": "Tekstfarve",
- "font": "Skrifttype",
- "text": "Tekst"
- },
- "headers": {
- "page": "Side"
- },
- "installer": {
- "databaseErrorCannotConnect": "Installeringsprogrammet kan ikke forbinde til databasen.",
- "databaseErrorWebConfig": "Kunne ikke gemme web.config filen. Du bedes venligst manuelt ændre database\n forbindelses strengen.\n ",
- "databaseFound": "Din database er blevet fundet og identificeret som",
- "databaseHeader": "Database konfiguration",
- "databaseInstall": "\n Klik på installér knappen for at installere Umbraco %0% databasen\n ",
- "databaseInstallDone": "Umbraco %0% er nu blevet kopieret til din database. Tryk på Næste for at fortsætte.",
- "databaseNotFound": "Databasen er ikke fundet. Kontrollér venligst at informationen i database forbindelsesstrengen i \"web.config\" filen er korrekt.
\nFor at fortsætte bedes du venligst rette \"web.config\" filen (ved at bruge Visual Studio eller dit favoritprogram), scroll til bunden, tilføj forbindelsesstrengen til din database i feltet som hedder \"umbracoDbDSN\" og gem filen.
Klik på Forsøg igen knappen når du er færdig.Mere information om at redigere web.config her.
",
- "databaseText": "For at afslutte dette skridt er du nødt til at have nogle informationer om din database parat (\"database forbindelsesstrengen\"). Kontakt venligst din ISP hvis det er nødvendigt. Hvis du installerer på en lokal maskine eller server kan du muligvis få informationerne fra din systemadministrator.",
- "databaseUpgrade": "Tryk på Opgradér knappen for at opgradere din database til Umbraco %0%
Bare rolig - intet indhold vil blive slettet og alt vil stadig fungere bagefter!
",
- "databaseUpgradeDone": "Din database er blevet opgraderet til den endelige version %0%. Tryk på Næste for at fortsætte.",
- "databaseUpToDate": "Din database er up-to-date!. Klik på Næste for at fortsætte med konfigurationsguiden.",
- "defaultUserChangePass": "Normalbrugerens adgangskode er nødt til at blive ændret! ",
- "defaultUserDisabled": "Normalbrugeren er blevet gjort utjenstdygtig eller har ikke adgang til Umbraco!
Du behøver ikke foretage yderligere handlinger. Tryk på Næste for at fortsætte.
",
- "defaultUserPassChanged": "Normalbrugerens adgangskode er på succesfuld vis blevet ændret siden installationen!
Du behøver ikke foretage yderligere handlinger. Tryk på Næste for at fortsætte.
",
- "defaultUserPasswordChanged": "Adgangskoden er blevet ændret!",
- "greatStart": "FÃ¥ en fremragende start, se vores videoer",
- "licenseText": "Ved at klikke på næste knappen (eller ved at ændre UmbracoConfigurationStatus i web.config\n filen), accepterer du licensaftalen for denne software, som specificeret i boksen nedenfor. Bemærk venligst at\n denne Umbraco distribution består af to forskellige licenser, MIT's Open Source Licens for frameworket og Umbraco\n Freeware Licensen som dækker UI'en.\n ",
- "None": "Endnu ikke installeret",
- "permissionsAffectedFolders": "Berørte filer og foldere",
- "permissionsAffectedFoldersMoreInfo": "Flere informationer om at opsætte rettigheder for Umbraco her",
- "permissionsAffectedFoldersText": "Du er nødt til at give ASP.NET 'modify' rettigheder på følgende\n filer/foldere\n ",
- "permissionsAlmostPerfect": "Dine rettighedsindstillinger er næsten perfekte! Du kan køre Umbraco uden problemer, men du vil ikke være i stand til at installere pakker, som er anbefalet for at få fuldt udbytte af Umbraco.",
- "permissionsHowtoResolve": "Hvorledes besluttes",
- "permissionsHowtoResolveLink": "Klik her for at læse tekstversionen",
- "permissionsHowtoResolveText": "Se vores video tutorials om at opsætte folderrettigheder for Umbraco eller læs tekstversionen.",
- "permissionsMaybeAnIssue": "Dine rettighedsindstillinger kan være et problem! Du kan afvikle Umbraco uden problemer, men du vil ikke være i stand til at oprette foldere eller installere pakker, hvilket er anbefalet for at få fuldt udbytte af Umbraco.",
- "permissionsNotReady": "Dine rettighedsindstillinger er ikke klar til Umbraco! For at afvikle Umbraco er du nødt til at opdatere dine rettighedsindstillinger.",
- "permissionsPerfect": "Dine rettighedsindstillinger er perfekte! Du er nu parat til at afvikle Umbraco og installere pakker!",
- "permissionsResolveFolderIssues": "Løser folder problem",
- "permissionsResolveFolderIssuesLink": "Følg dette link for mere information om udfordringer med ASP.NET og\n oprettelse af foldere\n ",
- "permissionsSettingUpPermissions": "Sætter folderrettigheder op",
- "permissionsText": "Umbraco har behov for 'write/modify' adgang til bestemte foldere, for at kunne gemme\n filer som billeder og PDF'er. Umbraco gemmer også midlertidige data (eksempelvis cachen) for at forbedre ydelsen\n på dit website.\n ",
- "runwayFromScratch": "Jeg har lyst til at begynde på bar bund",
- "runwayFromScratchText": "Dit website er helt tomt for øjeblikket, så det er perfekt hvis du ønsker at begynde på bar bund og oprette dine egne dokumenttyper og skabeloner. (lær hvordan ) Du kan stadig vælge at installere Runway senere. Gå venligst til Udvikler-sektionen og vælg Pakker.",
- "runwayHeader": "Du har lige opsat en ren Umbraco-platform. Hvad ønsker du nu at gøre?",
- "runwayInstalled": "Runway er installeret",
- "runwayInstalledText": "Du har fundamentet på plads. Vælg hvilke moduler du ønsker at installere ovenpå det. Dette er vores liste over anbefalede moduler. Kryds dem af du ønsker at installere eller se den fulde liste af moduler ",
- "runwayOnlyProUsers": "Kun anbefalet for erfarne brugere",
- "runwaySimpleSite": "Jeg ønsker at begynder med et simpelt website",
- "runwaySimpleSiteText": "\"Runway\" er et simpelt website som stiller nogle basale dokumenttyper og skabeloner til rådighed. Installeringsprogrammet kan automatisk opsætte Runway for dig, men du kan nemt redigere, udvide eller fjerne det. Det er ikke nødvendigt og du kan sagtens bruge Umbraco uden. Men Runway tilbyder et fundament, som er baseret på 'Best Practices', som får dig igang hurtigere end nogensinde før. Hvis du vælger at installere Runway, kan du efter eget valg vælge de grundlæggende byggesten kaldet 'Runway Modules' til at forbedre dine Runway-sider.
Inkluderet med Runway: Home Page, Getting Started page, Installing Modules page. Valgfri Moduler: Top Navigation, Sitemap, Contact, Gallery.
",
- "runwayWhatIsRunway": "Hvad er Runway",
- "step1": "Skridt 1/5: Acceptér licens",
- "step2": "Skridt 2/5: Database-konfiguration",
- "step3": "Skridt 3/5: Validerer filrettigheder",
- "step4": "Skridt 4/5: Kontrollér Umbraco sikkerhed",
- "step5": "Skridt 5/5: Umbraco er parat til at få dig igang",
- "thankYou": "Tak fordi du valgte Umbraco",
- "theEndBrowseSite": "Gennemse dit nye site Du installerede Runway, så hvorfor ikke se hvordan dit nye website ser ud.",
- "theEndFurtherHelp": "Yderligere hjælpe og informationer Få hjælp fra vores prisvindende fællesskab, gennemse dokumentationen eller se nogle gratis videoer om hvordan du opsætter et simpelt site, hvordan du bruger pakker og en 'quick guide' til Umbraco terminologier",
- "theEndHeader": "Umbraco %0% er installeret og klar til brug",
- "theEndInstallFailed": "For at afslutte installationen er du nødt til manuelt at rette /web.config filen og opdatére 'AppSetting' feltet UmbracoConfigurationStatus i bunden til '%0%' .",
- "theEndInstallSuccess": "Du kan komme igang med det samme ved at klikke på \"Start Umbraco\" knappen nedenfor. Hvis du er ny med Umbraco , kan du finde masser af ressourcer på vores 'getting started' sider.\n",
- "theEndOpenUmbraco": "Start Umbraco For at administrere dit website skal du blot åbne Umbraco administrationen og begynde at tilføje indhold, opdatere skabelonerne og stylesheets'ene eller tilføje ny funktionalitet.",
- "Unavailable": "Forbindelse til databasen fejlede.",
- "Version3": "Umbraco Version 3",
- "Version4": "Umbraco Version 4",
- "watch": "Se",
- "welcomeIntro": "Denne guide vil bringe dig gennem konfigurationsprocessen af Umbraco %0% for en frisk installation eller for en opgradering fra version 3.0. Tryk på Næste for at begynde på guiden."
- },
- "language": {
- "cultureCode": "Culture Code",
- "displayName": "Culture Name"
- },
- "lockout": {
- "lockoutWillOccur": "Du har været inaktiv, og du vil blive logget ud om",
- "renewSession": "Forny for at gemme dine ændringer"
- },
- "main": {
- "dashboard": "Skrivebord",
- "sections": "Sektioner",
- "tree": "Indhold"
- },
- "moveOrCopy": {
- "choose": "Vælg siden ovenover...",
- "copyDone": "%0% er nu kopieret til %1%",
- "copyTo": "Kopier til",
- "moveDone": "%0% er nu flyttet til %1%",
- "moveTo": "Flyt til",
- "nodeSelected": "er blevet valgt som roden for dit nye indhold, klik 'ok' nedenunder.",
- "noNodeSelected": "Intet element valgt, vælg et element i listen ovenfor før der klikkes 'fortsæt'",
- "notAllowedByContentType": "Det nuværende element kan ikke lægges under denne pga. sin type",
- "notAllowedByPath": "Det nuværende element kan ikke ligge under en af dens undersider",
- "notAllowedAtRoot": "Dette element må ikke findes på rodniveau",
- "notValid": "Denne handling er ikke tilladt fordi du ikke har de fornødne rettigheder på et eller flere af\n under-dokumenterne\n ",
- "relateToOriginal": "Relater det kopierede element til originalen"
- },
- "notifications": {
- "editNotifications": "Vælg dine notificeringer for %0% ",
- "notificationsSavedFor": "Notificeringer er gemt for",
- "notifications": "Notificeringer",
- },
- "packager": {
- "actions": "Handlinger",
- "created": "Oprettet",
- "createPackage": "Opret pakke",
- "chooseLocalPackageText": "Vælg pakken fra din computer. Umbraco pakker er oftest en \".zip\" fil",
- "deletewarning": "Dette vil slette pakken",
- "includeAllChildNodes": "Inkludér alle underliggende sider",
- "installed": "Installeret",
- "installedPackages": "Installerede pakker",
- "noConfigurationView": "Denne pakke har ingen konfigurationsvisning",
- "noPackagesCreated": "Der er ikke blevet oprettet nogle pakker endnu",
- "noPackages": "Du har ingen pakker installeret",
- "noPackagesDescription": "Du har ikke nogen pakker installeret. Du kan enten installere en lokal pakke ved at vælge den fra din computer eller gennemse de tilgængelige pakker ved hjælp af ikonet 'Pakker' øverst til højre på din skærm",
- "packageContent": "Pakkeindhold",
- "packageLicense": "Licens",
- "packageSearch": "Søg efter pakker",
- "packageSearchResults": "Resultater for",
- "packageNoResults": "Vi kunne ikke finde resultater for",
- "packageNoResultsDescription": "Prøv venligst at søge efter en anden pakke eller gennemse kategorierne\n ",
- "packagesPopular": "Populære",
- "packagesNew": "Nye udgivelser",
- "packageHas": "har",
- "packageKarmaPoints": "karma points",
- "packageInfo": "Information",
- "packageOwner": "Ejer",
- "packageContrib": "Bidragsydere",
- "packageCreated": "Oprettet",
- "packageCurrentVersion": "Nuværende version",
- "packageNetVersion": ".NET version",
- "packageDownloads": "Downloads",
- "packageLikes": "Likes",
- "packageCompatibility": "Kompatibilitet",
- "packageCompatibilityDescription": "Denne pakke er kompatibel med de følgende versioner af Umbraco, som\n rapporteret af community-medlemmer. Fuld kompatibilitet kan ikke garanteres for versioner rapporteret nedenfor\n 100%\n ",
- "packageExternalSources": "Eksterne kilder",
- "packageAuthor": "Forfatter",
- "packageDocumentation": "Dokumentation",
- "packageMetaData": "Pakke meta data",
- "packageName": "Pakkenavn",
- "packageNoItemsHeader": "Pakken indeholder ingen elementer",
- "packageNoItemsText": "Denne pakkefil indeholder ingen elementer som kan af-installeres. Du kan roligt fjerne denne fra systemet ved at klikke på \"Fjern pakke\" nedenfor.",
- "packageOptions": "Pakkevalg",
- "packageReadme": "Pakke læs mig",
- "packageRepository": "Pakke opbevaringsbase",
- "packageUninstallConfirm": "Bekræft af-installering",
- "packageUninstalledHeader": "Pakken blev fjernet",
- "packageUninstalledText": "Pakken er på succesfuld vis blevet fjernet",
- "packageUninstallHeader": "Afinstallér pakke",
- "packageUninstallText": "Du kan fjerne markeringen på elementer du ikke ønsker at fjerne, på dette tidspunkt, nedenfor. Når du klikker 'bekræft' vil alle afkrydsede elemenet blive fjernet \nBemærk: at dokumenter og medier som afhænger af denne pakke vil muligvis holde op med at virke, så vær forsigtig. Hvis i tvivl, kontakt personen som har udviklet pakken.",
- "packageVersion": "Pakke version",
- "installInstructions": "Install instructions",
- "packagesPromoted": "Promoted",
- "packageMigrationsRun": "Run pending package migrations",
- "packageMigrationsComplete": "Package migrations have successfully completed.",
- "packageMigrationsNonePending": "All package migrations have successfully completed.",
- "verifiedToWorkOnUmbracoCloud": "Verified to work on Umbraco Cloud"
- },
- "paste": {
- "doNothing": "Indsæt med fuld formattering (Anbefales ikke)",
- "errorMessage": "Den tekst du er ved at indsætte indeholder specialtegn eller formattering. Dette kan\n skyldes at du kopierer fra f.eks. Microsoft Word. Umbraco kan fjerne denne specialformattering automatisk så\n indholdet er mere velegnet til visning på en webside.\n ",
- "removeAll": "Indsæt som ren tekst, dvs. fjern al formattering",
- "removeSpecialFormattering": "Indsæt, men fjern formattering som ikke bør være på en webside (Anbefales)\n "
- },
- "publicAccess": {
- "paGroups": "Gruppebaseret beskyttelse",
- "paGroupsHelp": "Hvis du ønsker at give adgang til alle medlemmer af specifikke medlemsgrupper",
- "paGroupsNoGroups": "Du skal oprette en medlemsgruppe før du kan bruge gruppebaseret beskyttelse",
- "paErrorPage": "Fejlside",
- "paErrorPageHelp": "Brugt når folk er logget ind, men ingen adgang",
- "paHowWould": "Vælg hvordan siden %0% skal beskyttes",
- "paIsProtected": "%0% er nu beskyttet",
- "paIsRemoved": "Beskyttelse fjernet fra %0% ",
- "paLoginPage": "Log ind-side",
- "paLoginPageHelp": "Vælg siden der indeholder log ind-formularen",
- "paRemoveProtection": "Fjern beskyttelse...",
- "paRemoveProtectionConfirm": "Er du sikker på at du vil fjerne beskyttelsen fra siden %0% ?",
- "paSelectPages": "Vælg siderne der indeholder log ind-formularer og fejlmeddelelser",
- "paSelectGroups": "Vælg de grupper der har adgang til siden %0% ",
- "paSelectMembers": "Vælg de medlemmer der har adgang til siden %0% ",
- "paMembers": "Adgang til enkelte medlemmer",
- "paMembersHelp": "Hvis du ønsker at give adgang til enkelte medlemmer"
- },
- "publish": {
- "invalidPublishBranchPermissions": "Utilstrækkelige bruger adgang til a udgive alle under dokumenter",
- "contentPublishedFailedAwaitingRelease": "Udgivelsen kunne ikke udgives da publiceringsdato er sat",
- "contentPublishedFailedIsTrashed": "\n %0% kunne ikke publiceres da elementet er i skraldespanden.\n ",
- "contentPublishedFailedExpired": "\n %0% Udgivelsen kunne ikke blive publiceret da publiceringsdatoen er overskredet\n ",
- "contentPublishedFailedInvalid": "\n %0% kunne ikke publiceres da følgende egenskaber : %1% ikke overholdte valderingsreglerne.\n ",
- "contentPublishedFailedByEvent": "%0% kunne ikke udgives, fordi et 3. parts modul annullerede handlingen\n ",
- "contentPublishedFailedByMissingName": "%0% kan ikke udgives, fordi det mangler et navn.",
- "includeUnpublished": "Medtag ikke-udgivede undersider",
- "inProgress": "Publicerer - vent venligst...",
- "inProgressCounter": "%0% ud af %1% sider er blevet udgivet...",
- "nodePublish": "%0% er nu publiceret",
- "nodePublishAll": "%0% og alle undersider er nu publiceret",
- "publishAll": "Publicér alle undersider",
- "publishHelp": "Klik ok for at udgive %0% og derved gøre indholdet offentligt tilgængeligt.. Du kan udgive denne side og dens undersider ved at klikke Udgiv alle undersider forneden",
- "contentPublishedFailedByParent": "\n %0% can not be published, because a parent page is not published.\n ",
- "contentPublishedFailedReqCultureValidationError": "Validation failed for required language '%0%'. This\n language was saved but not published.\n "
- },
- "colorpicker": {
- "noColors": "Du har ikke konfigureret nogen godkendte farver"
- },
- "contentPicker": {
- "allowedItemTypes": "Du kan kun vælge følgende type(r) dokumenter: %0%",
- "pickedTrashedItem": "Du har valgt et dokument som er slettet eller lagt i papirkurven",
- "pickedTrashedItems": "Du har valgt dokumenter som er slettede eller lagt i papirkurven"
- },
- "mediaPicker": {
- "deletedItem": "Slettet medie",
- "pickedTrashedItem": "Du har valgt et medie som er slettet eller lagt i papirkurven",
- "pickedTrashedItems": "Du har valgt medier som er slettede eller lagt i papirkurven",
- "trashed": "Slettet",
- "openMedia": "Ã…ben i mediebiblioteket",
- "changeMedia": "Skift medie",
- "editMediaEntryLabel": "Rediger %0% på %1%",
- "confirmCancelMediaEntryCreationHeadline": "Annuller indsættelse?",
- "confirmCancelMediaEntryCreationMessage": "Er du sikker på at du vil annullere indsættelsen?",
- "confirmCancelMediaEntryHasChanges": "Du har foretaget ændringer til bruge af dette media. Er du sikker på\n at du vil annullere?\n ",
- "confirmRemoveAllMediaEntryMessage": "Fjern brugen af alle medier?",
- "tabClipboard": "Udklipsholder",
- "notAllowed": "Ikke tilladt",
- "openMediaPicker": "Open media picker"
- },
- "relatedlinks": {
- "enterExternal": "indtast eksternt link",
- "chooseInternal": "vælg en intern side",
- "caption": "Tekst",
- "link": "Link",
- "newWindow": "Nyt vindue",
- "captionPlaceholder": "Indtast en tekst",
- "externalLinkPlaceholder": "Indtast et link"
- },
- "imagecropper": {
- "reset": "Nulstil",
- "updateEditCrop": "Acceptér",
- "undoEditCrop": "Fortryd",
- "customCrop": "Brugerdefineret"
- },
- "rollback": {
- "changes": "Ændringer",
- "headline": "Vælg en version at sammenligne med den nuværende version",
- "diffHelp": "Her vises forskellene mellem den nuværende version og den valgte versionRød tekst vil ikke blive vist i den valgte version. Grøn betyder tilføjet ",
- "noDiff": "Der er ingen forskelle mellem den nuværende version og den valgte version",
- "documentRolledBack": "Dokument tilbagerullet",
- "htmlHelp": "Her vises den valgte version som html. Hvis du ønsker at se forskellen mellem de 2 versioner\n på samme tid, brug 'diff'-oversigten\n ",
- "rollbackTo": "Tilbagerulning til",
- "selectVersion": "Vælg version",
- "view": "Vis",
- "created": "Created",
- "currentVersion": "Current version",
- "pagination": "Showing version %0% to %1% of %2% versions",
- "versions": "Versions",
- "currentDraftVersion": "Current draft version",
- "currentPublishedVersion": "Current published version"
- },
- "scripts": {
- "editscript": "Rediger script"
- },
- "sections": {
- "concierge": "Concierge",
- "content": "Indhold",
- "courier": "Courier",
- "developer": "Udvikler",
- "installer": "Umbraco konfigurationsguide",
- "media": "Mediearkiv",
- "member": "Medlemmer",
- "packages": "Pakker",
- "marketplace": "Marketplace",
- "newsletters": "Nyhedsbreve",
- "settings": "Indstillinger",
- "statistics": "Statistik",
- "translation": "Oversættelse",
- "users": "Brugere",
- "help": "Hjælp",
- "forms": "Formularer",
- "deploy": "Deploy",
- "deployOpenPortal": "Ã…ben portalen",
- "deployHelpAndDocumentation": "Hjælp og dokumentation",
- "deployOpenQueue": "Åben overførselskøen",
- "deployGettingStarted": "Kom godt igang",
- "deploySetupProject": "Opsæt dit projekt",
- "deployDeployment": "Lær om 'Deployment'",
- "deployTroubleshooting": "Fejlsøgning"
- },
- "help": {
- "tours": "Tours",
- "theBestUmbracoVideoTutorials": "De bedste Umbraco video tutorials",
- "umbracoForum": "Besøg our.umbraco.com",
- "umbracoTv": "Besøg umbraco.tv",
- "umbracoLearningBase": "Watch our free tutorial videos",
- "umbracoLearningBaseDescription": "on the Umbraco Learning Base"
- },
- "settings": {
- "defaulttemplate": "Standardskabelon",
- "importDocumentTypeHelp": "For at importere en dokumenttype, find \".udt\"-filen på din computer ved at\n klikke på \"Gennemse\"-knappen og klik \"Import\" (Du vil blive bedt om bekræftelse på næste skærmbillede)\n ",
- "newtabname": "Ny titel på faneblad",
- "nodetype": "Nodetype",
- "objecttype": "Type",
- "stylesheet": "Stylesheet",
- "script": "Script",
- "tab": "Faneblad",
- "tabname": "Titel på faneblad",
- "tabs": "Faneblade",
- "createMatchingTemplate": "Opret tilsvarende skabelon",
- "addIcon": "Tilføj ikon",
- "contentTypeEnabled": "Master Content Type enabled",
- "contentTypeUses": "This Content Type uses",
- "noPropertiesDefinedOnTab": "No properties defined on this tab. Click on the \"add a new property\" link at\n the top to create a new property.\n "
- },
- "sort": {
- "sortOrder": "Sorteringsrækkefølge",
- "sortCreationDate": "Oprettelsesdato",
- "sortDone": "Sortering udført",
- "sortHelp": "Træk de forskellige sider op eller ned for at indstille hvordan de skal arrangeres, eller klik\n på kolonnehovederne for at sortere hele rækken af sider\n ",
- "sortPleaseWait": "Vent venligst mens siderne sorteres. Det kan tage et stykke tid.",
- "sortEmptyState": "Denne node har ingen under noder at sortere"
- },
- "speechBubbles": {
- "validationFailedHeader": "Validering",
- "validationFailedMessage": "Valideringsfejl skal rettes før elementet kan gemmes",
- "operationFailedHeader": "Fejlet",
- "operationSavedHeader": "Gemt",
- "operationSavedHeaderReloadUser": "Gemt. For at se ændringerne skal du genindlæse din browser",
- "invalidUserPermissionsText": "Utilstrækkelige brugerrettigheder, kunne ikke fuldføre handlingen",
- "operationCancelledHeader": "Annulleret",
- "operationCancelledText": "Handlingen blev annulleret af et 3. part tilføjelsesprogram",
- "contentPublishedFailedByEvent": "Udgivelsen blev annulleret af et 3. part tilføjelsesprogram",
- "contentTypeDublicatePropertyType": "Property type eksisterer allerede",
- "contentTypePropertyTypeCreated": "Egenskabstype oprettet",
- "contentTypePropertyTypeCreatedText": "Navn: %0% DataType: %1%",
- "contentTypePropertyTypeDeleted": "Egenskabs type slettet",
- "contentTypeSavedHeader": "Indholdstype gemt",
- "contentTypeTabCreated": "Du har oprettet et faneblad",
- "contentTypeTabDeleted": "Faneblad slettet",
- "contentTypeTabDeletedText": "Faneblad med id: %0% slettet",
- "cssErrorHeader": "Stylesheetet blev ikke gemt",
- "cssSavedHeader": "Stylesheet gemt",
- "cssSavedText": "Stylesheet gemt uden fejl",
- "dataTypeSaved": "Datatype gemt",
- "dictionaryItemSaved": "Ordbogsnøgle gemt",
- "editContentPublishedFailedByParent": "Udgivelse fejlede da overliggende side ikke er udgivet",
- "editContentPublishedHeader": "Indhold publiceret",
- "editContentPublishedText": "og nu synligt for besøgende",
- "editMultiContentPublishedText": "%0% dokumenter udgivet og synlige på hjemmesiden",
- "editVariantPublishedText": "%0% udgivet og synligt på hjemmesiden",
- "editMultiVariantPublishedText": "%0% dokumenter udgivet for sprogene %1% og synlige på hjemmesiden",
- "editBlueprintSavedHeader": "Indholdsskabelon gemt",
- "editBlueprintSavedText": "Rettelser er blevet gemt",
- "editContentSavedHeader": "Indhold gemt",
- "editContentSavedText": "Husk at publicere for at gøre det synligt for besøgende",
- "editContentScheduledSavedText": "En planlægning for udgivelse er blevet opdateret",
- "editVariantSavedText": "%0% gemt",
- "editContentSendToPublish": "Send til Godkendelse",
- "editContentSendToPublishText": "Rettelser er blevet sendt til godkendelse",
- "editVariantSendToPublishText": "%0% rettelser er blevet sendt til godkendelse",
- "editMediaSaved": "Medie gemt",
- "editMediaSavedText": "Medie gemt uden problemer",
- "editMemberSaved": "Medlem gemt",
- "editStylesheetPropertySaved": "Stylesheetegenskab gemt",
- "editStylesheetSaved": "Stylesheet gemt",
- "editTemplateSaved": "Skabelon gemt",
- "editUserError": "Der er opstået en fejl under redigering",
- "editUserSaved": "Bruger gemt",
- "editUserTypeSaved": "Brugertype gemt",
- "editUserGroupSaved": "Brugergruppe gemt",
- "editCulturesAndHostnamesSaved": "Sprog og domæner gemt",
- "editCulturesAndHostnamesError": "Der opstod en fejl ved at gemme sprog og domæner",
- "fileErrorHeader": "Fil ikke gemt",
- "fileErrorText": "Filen kunne ikke gemmes. Tjek filrettighederne",
- "fileSavedHeader": "Fil gemt",
- "fileSavedText": "Fil gemt uden fejl",
- "languageSaved": "Sprog gemt",
- "mediaTypeSavedHeader": "Medietype gemt",
- "memberTypeSavedHeader": "Medlemstype gemt",
- "memberGroupSavedHeader": "Medlemsgruppe gemt",
- "templateErrorHeader": "Skabelon ikke gemt",
- "templateErrorText": "Undgå venligst at du har 2 templates med samme alias",
- "templateSavedHeader": "Skabelon gemt",
- "templateSavedText": "Skabelon gemt uden fejl!",
- "contentUnpublished": "Indhold fjernet fra udgivelse",
- "contentCultureUnpublished": "Indhold variation %0% afpubliceret",
- "contentMandatoryCultureUnpublished": "Det krævet sprog '%0%' var afpubliceret. Alle sprog for dette\n indholds element er nu afpubliceret.\n ",
- "partialViewSavedHeader": "Partial view gemt",
- "partialViewSavedText": "Partial view gemt uden fejl!",
- "partialViewErrorHeader": "Partial view ikke gemt",
- "partialViewErrorText": "Der opstod en fejl ved at gemme filen.",
- "permissionsSavedFor": "Rettigheder gemt for",
- "deleteUserGroupsSuccess": "Slettede %0% brugergrupper",
- "deleteUserGroupSuccess": "%0% blev slettet",
- "enableUsersSuccess": "Aktiverede %0% brugere",
- "disableUsersSuccess": "Deaktiverede %0% brugere",
- "enableUserSuccess": "%0% er nu aktiveret",
- "disableUserSuccess": "%0% er nu deaktiveret",
- "setUserGroupOnUsersSuccess": "Brugergrupper er blevet indstillet",
- "unlockUsersSuccess": "LÃ¥ste %0% brugere op",
- "unlockUserSuccess": "%0% er nu låst op",
- "memberExportedSuccess": "Medlem blev exportet til fil",
- "memberExportedError": "Der skete en fejl under exporteringen af medlemmet",
- "deleteUserSuccess": "Brugeren %0% blev slettet",
- "resendInviteHeader": "Invitér bruger",
- "resendInviteSuccess": "Invitationen blev gensendt til %0%",
- "contentReqCulturePublishError": "Kan ikke udgive dokumentet da det krævet '%0%' ikke er udgivet",
- "contentCultureValidationError": "Validering fejlede for sproget '%0%'",
- "documentTypeExportedSuccess": "Dokumenttypen blev eksporteret til en fil",
- "documentTypeExportedError": "Der skete en fejl under eksport af en dokumenttype",
- "scheduleErrReleaseDate1": "Udgivelses datoen kan ikke ligge i fortiden",
- "scheduleErrReleaseDate2": "Kan ikke planlægge dokumentes udgivelse da det krævet '%0%' ikke er udgivet\n ",
- "scheduleErrReleaseDate3": "Kan ikke planlægge dokumentes udgivelse da det krævet '%0%' har en senere\n udgivelses dato end et ikke krævet sprog\n ",
- "scheduleErrExpireDate1": "Afpubliceringsdatoen kan ikke ligge i fortiden",
- "scheduleErrExpireDate2": "Afpubliceringsdatoen kan ikke være før udgivelsesdatoen",
- "publishWithNoDomains": "Domæner er ikke konfigureret for en flersproget side, kontakt vensligst en\n administrator, se loggen for mere information\n ",
- "publishWithMissingDomain": "Der er ikke noget domæne konfigureret for %0%, kontakt vensligst en\n administrator, se loggen for mere information\n ",
- "copySuccessMessage": "Dit systems information er blevet kopieret til udklipsholderen",
- "cannotCopyInformation": "Kunne desværre ikke kopiere dit systems information til udklipsholderen",
- "folderUploadNotAllowed": "This file is being uploaded as part of a folder, but creating a new folder is not allowed here",
- "folderCreationNotAllowed": "Creating a new folder is not allowed here",
- "memberGroupNameDuplicate": "Another Member Group with the same name already exists",
- "dictionaryItemExportedSuccess": "Dictionary item(s) was exported to file",
- "dictionaryItemExportedError": "An error occurred while exporting the dictionary item(s)",
- "dictionaryItemImported": "The following dictionary item(s) has been imported!",
- "preventCleanupEnableError": "An error occurred while enabling version cleanup for %0%",
- "preventCleanupDisableError": "An error occurred while disabling version cleanup for %0%"
- },
- "stylesheet": {
- "addRule": "Tilføj style",
- "editRule": "Redigér style",
- "editorRules": "Teksteditor-styles",
- "editorRulesHelp": "Definér de styles, der skal være tilgængelige i teksteditoren for dette stylesheet\n ",
- "selector": "Selector",
- "selectorHelp": "Bruger CSS-syntaks, f.eks. \"h1\" eller \".redheader\"",
- "editstylesheet": "Rediger stylesheet",
- "editstylesheetproperty": "Rediger CSS-egenskab",
- "nameHelp": "Det navn der vises i teksteditoren",
- "preview": "Forhåndsvisning",
- "previewHelp": "Hvordan teksten vil se ud i teksteditoren.",
- "styles": "Styles",
- "stylesHelp": "Den CSS der skal anvendes i teksteditoren, f.eks. \"color:red;\"",
- "tabCode": "Kode",
- "tabRules": "Editor"
- },
- "template": {
- "deleteByIdFailed": "Sletning af skabelonen med ID %0% fejlede",
- "edittemplate": "Rediger skabelon",
- "insertSections": "Sektioner",
- "insertContentArea": "Indsæt indholdsområde",
- "insertContentAreaPlaceHolder": "Indsæt pladsholder for indholdsområde",
- "insert": "Indsæt",
- "insertDesc": "Hvad vil du indsætte?",
- "insertDictionaryItem": "Oversættelse",
- "insertDictionaryItemDesc": "Indsætter en oversætbar tekst, som skifter efter det sprog, som websitet vises\n i.\n ",
- "insertMacro": "Makro",
- "insertMacroDesc": "\n En makro er et element, som kan have forskellige indstillinger, når det indsættes.\n Brug det som en genbrugelig del af dit design såsom gallerier, formularer og lister.\n ",
- "insertPageField": "Sideværdi",
- "insertPageFieldDesc": "\n Viser værdien af et felt fra den nuværende side. Kan indstilles til at bruge rekursive værdier eller\n vise en standardværdi i tilfælde af, at feltet er tomt.\n ",
- "insertPartialView": "Partial view",
- "insertPartialViewDesc": "\n Et Partial View er et skabelonelement, som kan indsættes i andre skabeloner og derved\n genbruges og deles på tværs af sideskabelonerne.\n ",
- "mastertemplate": "Master skabelon",
- "quickGuide": "Lynguide til Umbracos skabelontags",
- "noMaster": "Ingen master",
- "renderBody": "Indsæt en underliggende skabelon",
- "renderBodyDesc": "\n Henter indholdet af en underliggende skabelon ind, ved at\n indsætte et @RenderBody() element.\n ",
- "defineSection": "Definer en sektion",
- "defineSectionDesc": "\n Definerer en del af din skabelon som en navngivet sektion, ved at\n omkranse den i @section { ... }. Herefter kan denne sektion flettes ind i\n overliggende skabelon ved at indsætte et @RenderSection element.\n ",
- "renderSection": "Indsæt en sektion",
- "renderSectionDesc": "\n Henter indholdet af en sektion fra den underliggende skabelon ind, ved at indsætte et\n @RenderSection(name) element. Den underliggende skabelon skal have\n defineret en sektion via et @section [name]{ ... } element.\n ",
- "sectionName": "Sektionsnavn",
- "sectionMandatory": "Sektionen er obligatorisk",
- "sectionMandatoryDesc": "\n Hvis obligatorisk, skal underskabelonen indeholde en @section -definition.\n ",
- "queryBuilder": "Query builder",
- "itemsReturned": "sider returneret, på",
- "iWant": "Returner",
- "allContent": "alt indhold",
- "contentOfType": "indhold af typen \"%0%\"",
- "from": "fra",
- "websiteRoot": "mit website",
- "where": "hvor",
- "and": "og",
- "is": "er",
- "isNot": "ikke er",
- "before": "er før",
- "beforeIncDate": "er før (inkl. valgte dato)",
- "after": "er efter",
- "afterIncDate": "er efter (inkl. valgte dato)",
- "equals": "er",
- "doesNotEqual": "ikke er",
- "contains": "indeholder",
- "doesNotContain": "ikke indeholder",
- "greaterThan": "er større end",
- "greaterThanEqual": "er større end eller det samme som",
- "lessThan": "er mindre end",
- "lessThanEqual": "er mindre end eller det samme som",
- "id": "Id",
- "name": "Navn",
- "createdDate": "Oprettelsesdato",
- "lastUpdatedDate": "Sidste opdatering",
- "orderBy": "Sortér efter",
- "ascending": "stigende rækkefølge",
- "descending": "faldende rækkefølge",
- "template": "Skabelon",
- "runtimeModeProduction": "Content is not editable when using runtime mode Production."
- },
- "grid": {
- "media": "Billede",
- "macro": "Macro",
- "insertControl": "Vælg indholdstype",
- "chooseLayout": "Vælg layout",
- "addRows": "Tilføj række",
- "addElement": "Tilføj indhold",
- "dropElement": "Slip indhold",
- "settingsApplied": "Indstillinger tilføjet",
- "contentNotAllowed": "Indholdet er ikke tilladt her",
- "contentAllowed": "Indholdet er tilladt her",
- "clickToEmbed": "Klik for at indlejre",
- "clickToInsertImage": "Klik for at indsætte et billede",
- "placeholderWriteHere": "Skriv her...",
- "gridLayouts": "Grid layout",
- "gridLayoutsDetail": "Et layout er det overordnede arbejdsområde til dit grid - du vil typisk kun behøve ét\n eller to\n ",
- "addGridLayout": "Tilføj grid layout",
- "editGridLayout": "Rediger grid layout",
- "addGridLayoutDetail": "Juster dit layout ved at justere kolonnebredder og tilføj yderligere sektioner\n ",
- "rowConfigurations": "Rækkekonfigurationer",
- "rowConfigurationsDetail": "Rækker er foruddefinerede celler, der arrangeres vandret",
- "addRowConfiguration": "Tilføj rækkekonfiguration",
- "editRowConfiguration": "Rediger rækkekonfiguration",
- "addRowConfigurationDetail": "Juster rækken ved at indstille cellebredder og tilføje yderligere celler\n ",
- "noConfiguration": "Ingen yderligere konfiguration tilgængelig",
- "columns": "Kolonner",
- "columnsDetails": "Det totale antal kolonner i dit grid",
- "settings": "Indstillinger",
- "settingsDetails": "Konfigurer, hvilket indstillinger, brugeren kan ændre",
- "styles": "Typografi",
- "stylesDetails": "Vælg hvilke typografiværdier en redaktør kan ændre",
- "allowAllEditors": "Tillad alle editorer",
- "allowAllRowConfigurations": "Tillad alle rækkekonfigurationer",
- "setAsDefault": "Sæt som standard",
- "chooseExtra": "Vælg ekstra",
- "chooseDefault": "Vælg standard",
- "areAdded": "er tilføjet",
- "youAreDeleting": "Du sletter en rækkekonfiguration",
- "deletingARow": "Sletning af et rækkekonfigurations navn vil resultere i et tab af data for alle\n eksiterende indhold som bruger dens konfiguration.\n ",
- "deleteLayout": "Du sletter et layoutet",
- "deletingALayout": "Når du redigerer et layout vil data gå tabt de steder, hvor denne konfiguration\n bruges.\n ",
- "maxItems": "Maksimalt emner",
- "maxItemsDescription": "Efterlad blank eller sæt til 0 for ubegrænset",
- "clickToInsertMacro": "Click to insert macro",
- "warning": "Warning",
- "warningText": "Modifying a row configuration name will result in loss of data for any existing content that is based on this configuration.
Modifying only the label will not result in data loss.
"
- },
- "contentTypeEditor": {
- "compositions": "Kompositioner",
- "group": "Gruppe",
- "noGroups": "Du har ikke tilføjet nogen grupper",
- "addGroup": "Tilføj gruppe",
- "inheritedFrom": "Nedarvet fra",
- "addProperty": "Tilføj egenskab",
- "requiredLabel": "Påkrævet label",
- "enableListViewHeading": "Aktivér listevisning",
- "enableListViewDescription": "Konfigurér indholdet til at blive vist i en sortérbar og søgbar liste;\n undersider vil ikke blive vist i træet\n ",
- "allowedTemplatesHeading": "Tilladte skabeloner",
- "allowedTemplatesDescription": "Vælg hvilke skabeloner, der er tilladt at bruge på dette indhold.",
- "allowAsRootHeading": "Tillad på rodniveau",
- "allowAsRootDescription": "Kun dokumenttyper med denne indstilling aktiveret kan oprettes i rodniveau under\n indhold og mediearkiv.\n ",
- "childNodesHeading": "Tilladte typer",
- "childNodesDescription": "Tillad at oprette indhold af en specifik type under denne.",
- "chooseChildNode": "Vælg child node",
- "compositionsDescription": "Nedarv faner og egenskaber fra en anden dokumenttype. Nye faner vil blive\n tilføjet den nuværende dokumenttype eller sammenflettet hvis fanenavnene er ens.\n ",
- "compositionInUse": "Indholdstypen bliver brugt i en komposition og kan derfor ikke blive anvendt som\n komposition\n ",
- "noAvailableCompositions": "Der er ingen indholdstyper tilgængelige at bruge som komposition",
- "compositionRemoveWarning": "Når du fjerner en komposition vil alle associerede indholdsdata blive slettet.\n Når først dokumenttypen er gemt, er der ingen vej tilbage.\n ",
- "availableEditors": "Opret ny indstilling",
- "reuse": "Genbrug",
- "editorSettings": "Input indstillinger",
- "searchResultSettings": "Tilgængelige indstillinger",
- "searchResultEditors": "Opret ny indstilling",
- "configuration": "Konfiguration",
- "yesDelete": "Ja, slet",
- "movedUnderneath": "blev flyttet til",
- "copiedUnderneath": "blev kopieret til",
- "folderToMove": "Vælg hvor",
- "folderToCopy": "Vælg hvor",
- "structureBelow": "skal flyttes til",
- "allDocumentTypes": "Alle dokumenttyper",
- "allDocuments": "Alle dokumenter",
- "allMediaItems": "Alle medier",
- "usingThisDocument": "som benytter denne dokumenttype vil blive slettet permanent. Bekræft at du også vil\n slette dem.\n ",
- "usingThisMedia": "som benytter denne medietype vil blive slettet permanent. Bekræft at du også vil slette\n dem.\n ",
- "usingThisMember": "som benytter denne medlemstype vil blive slettet permanent. Bekræft at du også vil\n slette dem.\n ",
- "andAllDocuments": "og alle dokumenter, som benytter denne type",
- "andAllMediaItems": "og alle medier, som benytter denne type",
- "andAllMembers": "og alle medlemmer, som benytter denne type",
- "memberCanEdit": "Medlem kan redigere",
- "memberCanEditDescription": "Tillad at denne egenskab kan redigeres af medlemmet på dets profil.",
- "isSensitiveData": "Er følsom data",
- "isSensitiveDataDescription": "Skjul værdien af denne egenskab for indholdsredaktører der ikke har adgang\n til at se følsomme data\n ",
- "showOnMemberProfile": "Vis på medlemsprofil",
- "showOnMemberProfileDescription": "Tillad at denne egenskab kan vises på medlemmets profil.",
- "tabHasNoSortOrder": "fane har ingen sorteringsrækkefølge",
- "compositionUsageHeading": "Hvor er denne komposition brugt?",
- "compositionUsageSpecification": "Denne komposition brugt i kompositionen af de følgende indholdstyper:\n ",
- "variantsHeading": "Tillad variationer",
- "cultureVariantHeading": "Tillad sprogvariation",
- "segmentVariantHeading": "Tillad segmentering",
- "cultureVariantLabel": "Tillader sprogvariationer",
- "segmentVariantLabel": "Tillader segmentering",
- "variantsDescription": "Tillad at redaktører kan oprette indhold af denne type på flere sprog.",
- "cultureVariantDescription": "Tillad at redaktører kan oprette dette indhold på flere sprog.",
- "segmentVariantDescription": "Tillad at redaktører kan oprette flere udgaver af denne type indhold.",
- "allowVaryByCulture": "Tillad sprogvariation",
- "allowVaryBySegment": "Tillad segmentering",
- "elementType": "Element-type",
- "elementHeading": "Er en Element-type",
- "elementDescription": "En Element-type er tiltænkt brug i andre Dokumenttyper, ikke i indholdstræet.\n ",
- "elementCannotToggle": "En Dokumenttype kan ikke ændres til en Element-type efter den er blevet brugt til\n at oprette en eller flere indholds elementer.\n ",
- "elementDoesNotSupport": "Dette benyttes ikke for en Element-type",
- "propertyHasChanges": "Du har lavet ændringer til denne egenskab. Er du sikker på at du vil kassere dem?\n ",
- "displaySettingsHeadline": "Visning",
- "displaySettingsLabelOnTop": "Label hen over (fuld bredde)",
- "removeChildNode": "Du fjerner noden",
- "removeChildNodeWarning": "Fjernelse af noden, begrænser redaktørens muligheder for at oprette forskellige\n typer af underindhold.\n ",
- "groupReorderSameAliasError": "You can't move the group %0% to this tab because the group will get the same\n alias as a tab: \"%1%\". Rename the group to continue.\n ",
- "confirmDeleteTabMessage": "Are you sure you want to delete the tab %0% ?",
- "confirmDeleteGroupMessage": "Are you sure you want to delete the group %0% ?",
- "confirmDeletePropertyMessage": "Are you sure you want to delete the property %0% ?",
- "confirmDeleteTabNotice": "This will also delete all items below this tab.",
- "confirmDeleteGroupNotice": "This will also delete all items below this group.",
- "addTab": "Add tab",
- "convertToTab": "Convert to tab",
- "tabDirectPropertiesDropZone": "Drag properties here to place directly on the tab",
- "usingEditor": "using this editor will get updated with the new settings.",
- "historyCleanupHeading": "History cleanup",
- "historyCleanupDescription": "Allow overriding the global history cleanup settings.",
- "historyCleanupKeepAllVersionsNewerThanDays": "Keep all versions newer than days",
- "historyCleanupKeepLatestVersionPerDayForDays": "Keep latest version per day for days",
- "historyCleanupPreventCleanup": "Prevent cleanup",
- "historyCleanupEnableCleanup": "Enable cleanup",
- "historyCleanupGloballyDisabled": "NOTE! The cleanup of historically content versions are disabled globally. These settings will not take effect before it is enabled.",
- "changeDataTypeHelpText": "Changing a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json."
- },
- "languages": {
- "addLanguage": "Tilføj sprog",
- "mandatoryLanguage": "Påkrævet sprog",
- "mandatoryLanguageHelp": "Egenskaber på dette sprog skal være udfyldt før noden kan blive udgivet.",
- "defaultLanguage": "Standardsprog",
- "defaultLanguageHelp": "Et Umbraco-site kan kun have ét standardsprog.",
- "changingDefaultLanguageWarning": "At skifte standardsprog kan resultere i at standardindhold mangler.\n ",
- "fallsbackToLabel": "Fallback til",
- "noFallbackLanguageOption": "Intet fallback-sprog",
- "fallbackLanguageDescription": "For at tillade flersproget indhold, som ikke er tilgængeligt i det anmodede\n sprog, skal du her vælge et sprog at falde tilbage på.\n ",
- "fallbackLanguage": "Fallback-sprog",
- "none": "ingen",
- "culture": "ISO code",
- "invariantPropertyUnlockHelp": "%0% is shared across languages and segments.",
- "invariantCulturePropertyUnlockHelp": "%0% is shared across all languages.",
- "invariantSegmentPropertyUnlockHelp": "%0% is shared across all segments.",
- "invariantLanguageProperty": "Shared: Languages",
- "invariantSegmentProperty": "Shared: Segments"
- },
- "macro": {
- "addParameter": "Tilføj parameter",
- "editParameter": "Redigér parameter",
- "enterMacroName": "Indtast makronavn",
- "parameters": "Parametre",
- "parametersDescription": "Definér de parametre der skal være tilgængelige, når du bruger denne makro.",
- "selectViewFile": "Vælg partial view makrofil"
- },
- "modelsBuilder": {
- "buildingModels": "Bygger modeller",
- "waitingMessage": "dette kan tage lidt tid",
- "modelsGenerated": "Modeller genereret",
- "modelsGeneratedError": "Modeller kunne ikke genereres",
- "modelsExceptionInUlog": "Modelgeneration fejlet, se fejlmeddelelse i log"
- },
- "templateEditor": {
- "addDefaultValue": "Tilføj standard værdi",
- "defaultValue": "Standard værdi",
- "alternativeField": "Alternativt felt",
- "alternativeText": "Alternativ tekst",
- "casing": "Casing",
- "encoding": "Kodning",
- "chooseField": "Felt som skal indsættes",
- "convertLineBreaks": "Konvertér linjeskift",
- "convertLineBreaksHelp": "Erstatter et linjeskift med html-tag'et <br>",
- "customFields": "Custom felter",
- "dateOnly": "Ja, kun dato",
- "formatAsDate": "Formatér som dato",
- "htmlEncode": "HTML indkod",
- "htmlEncodeHelp": "Vil erstatte specielle karakterer med deres HTML jævnbyrdige.",
- "insertedAfter": "Denne tekst vil blive sat ind lige efter værdien af feltet",
- "insertedBefore": "Denne tekst vil blive sat ind lige før værdien af feltet",
- "lowercase": "Lowercase",
- "none": "Ingen",
- "outputSample": "Udskrift eksempel",
- "postContent": "Indsæt efter felt",
- "preContent": "Indsæt før felt",
- "recursive": "Rekursivt",
- "recursiveDescr": "Ja, lav det rekursivt",
- "removeParagraph": "Fjern paragraf-tags",
- "removeParagraphHelp": "Fjerner eventuelle <P> omkring teksten",
- "standardFields": "Standard felter",
- "uppercase": "Store bogstaver",
- "urlEncode": "URL encode",
- "urlEncodeHelp": "Hvis indholdet af felterne skal sendes til en URL, skal denne slåes til så specialtegn\n formateres\n ",
- "usedIfAllEmpty": "Denne tekst bruges hvis ovenstående felter er tomme",
- "usedIfEmpty": "Dette felt vil blive brugt hvis ovenstående felt er tomt",
- "withTime": "Ja, med klokkeslæt. Dato/tid separator:"
- },
- "translation": {
- "details": "Oversættelsesdetaljer",
- "DownloadXmlDTD": "Download XML DTD",
- "fields": "Felter",
- "includeSubpages": "Inkluder undersider",
- "noTranslators": "Ingen oversættelsesbrugere er fundet. Opret venligst en oversættelsesbruger før du\n begynder at sende indhold til oversættelse\n ",
- "pageHasBeenSendToTranslation": "Siden '%0%' er blevet sent til oversættelse",
- "sendToTranslate": "Send siden '%0%' til oversættelse",
- "totalWords": "Totalt antal ord",
- "translateTo": "Oversæt til",
- "translationDone": "Oversættelse gennemført.",
- "translationDoneHelp": "Du kan gennemse de sider, som du lige har oversat, ved at klikke nedenfor. Hvis den\n originale side bliver fundet, vil du blive præsenteret for en sammenligning af de to sider.\n ",
- "translationFailed": "Oversættelse fejlede, XML-filen kan være korrupt (indeholde fejl)",
- "translationOptions": "Oversættelsesmuligheder",
- "translator": "Oversætter",
- "uploadTranslationXml": "Upload oversættelse (xml)"
- },
- "treeHeaders": {
- "content": "Indhold",
- "contentBlueprints": "Indholdsskabeloner",
- "media": "Mediearkiv",
- "cacheBrowser": "Cacheviser",
- "contentRecycleBin": "Papirkurv",
- "createdPackages": "Oprettede pakker",
- "dataTypes": "Datatyper",
- "dictionary": "Ordbog",
- "installedPackages": "Installerede pakker",
- "installSkin": "Installér et skin",
- "installStarterKit": "Installér et starterkit",
- "languages": "Sprog",
- "localPackage": "Installér lokal pakke",
- "macros": "Makroer",
- "mediaTypes": "Medietyper",
- "member": "Medlemmer",
- "memberGroups": "Medlemsgrupper",
- "memberRoles": "Roller",
- "memberTypes": "Medlemstyper",
- "documentTypes": "Dokumenttyper",
- "relationTypes": "Relationstyper",
- "packager": "Pakker",
- "packages": "Pakker",
- "partialViews": "Partial Views",
- "partialViewMacros": "Partial View makrofiler",
- "repositories": "Installer fra \"repository\"",
- "runway": "Installer Runway",
- "runwayModules": "Runway-moduler",
- "scripting": "Scripting filer",
- "scripts": "Scripts",
- "stylesheets": "Stylesheets",
- "templates": "Skabeloner",
- "logViewer": "Logfremviser",
- "userPermissions": "Brugertilladelser",
- "userTypes": "Brugertyper",
- "users": "Brugere",
- "settingsGroup": "Indstillinger",
- "templatingGroup": "Design og layout",
- "thirdPartyGroup": "Tredjepart"
- },
- "update": {
- "updateAvailable": "Ny opdatering er klar",
- "updateDownloadText": "%0% er klar, klik her for at downloade",
- "updateNoServer": "Ingen forbindelse til server",
- "updateNoServerError": "Der kunne ikke tjekkes for ny opdatering. Se trace for mere info."
- },
- "user": {
- "access": "Adgang",
- "accessHelp": "Baseret på de tildelte grupper og startnoder har brugeren adgang til følgende noder",
- "assignAccess": "Tildel adgang",
- "administrators": "Administrator",
- "categoryField": "Kategorifelt",
- "createDate": "Bruger oprettet",
- "changePassword": "Skift dit kodeord",
- "changePhoto": "Skift billede",
- "newPassword": "Nyt kodeord",
- "newPasswordFormatLengthTip": "Minium %0% karakterer tilbage!",
- "newPasswordFormatNonAlphaTip": "Der skal som minium være %0% specielle karakterer.",
- "noLockouts": "er ikke blevet låst ude",
- "noPasswordChange": "Kodeordet er ikke blevet ændret",
- "confirmNewPassword": "Gentag dit nye kodeord",
- "changePasswordDescription": "Du kan ændre dit kodeord, som giver dig adgang til Umbraco backoffice ved at\n udfylde formularen og klikke på knappen 'Skift dit kodeord'\n ",
- "contentChannel": "Indholdskanal",
- "createAnotherUser": "Opret endnu en bruger",
- "createUserHelp": "Opret nye brugere for at give dem adgang til Umbraco. NÃ¥r en ny bruger oprettes,\n genereres der en adgangskode, som du kan dele med brugeren.\n ",
- "descriptionField": "Beskrivelsesfelt",
- "disabled": "Deaktivér bruger",
- "documentType": "Dokumenttype",
- "editors": "Redaktør",
- "excerptField": "Uddragsfelt",
- "failedPasswordAttempts": "Fejlede loginforsøg",
- "goToProfile": "GÃ¥ til brugerprofil",
- "groupsHelp": "Tilføj grupper for at tildele adgang og tilladelser",
- "inviteAnotherUser": "Invitér anden bruger",
- "inviteUserHelp": "Invitér nye brugere til at give dem adgang til Umbraco. En invitation vil blive sendt\n via e-mail til brugeren med oplysninger om, hvordan man logger ind i Umbraco.\n ",
- "language": "Sprog",
- "languageHelp": "Indstil det sprog, du vil se i menuer og dialoger",
- "lastLockoutDate": "Senest låst ude",
- "lastLogin": "Seneste login",
- "lastPasswordChangeDate": "Kodeord sidst ændret",
- "loginname": "Brugernavn",
- "mediastartnode": "Startnode i mediearkivet",
- "mediastartnodehelp": "Begræns mediebiblioteket til en bestemt startnode",
- "mediastartnodes": "Medie startnoder",
- "mediastartnodeshelp": "Begræns mediebiblioteket til bestemte startnoder",
- "modules": "Moduler",
- "noConsole": "Deaktivér adgang til Umbraco",
- "noLogin": "har endnu ikke logget ind",
- "oldPassword": "Gammelt kodeord",
- "password": "Adgangskode",
- "resetPassword": "Nulstil kodeord",
- "passwordChanged": "Dit kodeord er blevet ændret!",
- "passwordChangedGeneric": "Kodeord ændret",
- "passwordConfirm": "Bekræft venligst dit nye kodeord",
- "passwordEnterNew": "Indtast dit nye kodeord",
- "passwordIsBlank": "Dit nye kodeord kan ikke være blankt!",
- "passwordCurrent": "Nuværende kodeord",
- "passwordInvalid": "ugyldig nuværende kodeord",
- "passwordIsDifferent": "Dit nye kodeord og dit bekræftede kodeord var ikke ens, forsøg venligst igen!",
- "passwordMismatch": "Det bekræftede kodeord matcher ikke det nye kodeord",
- "permissionReplaceChildren": "Erstat underelement-rettigheder",
- "permissionSelectedPages": "Du ændrer i øjeblikket rettigheder for siderne:",
- "permissionSelectPages": "Vælg sider for at ændre deres rettigheder",
- "removePhoto": "Fjern billede",
- "permissionsDefault": "Standardrettigheder",
- "permissionsGranular": "Granulære rettigheder",
- "permissionsGranularHelp": "Sæt rettigheder for specifikke noder",
- "profile": "Profil",
- "searchAllChildren": "Søg alle 'børn'",
- "languagesHelp": "Tilføj sprog for at give brugerne adgang til at redigere",
- "sectionsHelp": "Tilføj sektioner for at give brugerne adgang",
- "selectUserGroups": "Vælg brugergrupper",
- "noStartNode": "Ingen startnode valgt",
- "noStartNodes": "Ingen startnoder valgt",
- "startnode": "Indhold startnode",
- "startnodehelp": "Begræns indholdstræet til en bestemt startnode",
- "startnodes": "Indhold startnoder",
- "startnodeshelp": "Begræns indholdstræet til bestemte startnoder",
- "updateDate": "Bruger sidst opdateret",
- "userCreated": "er blevet oprettet",
- "userCreatedSuccessHelp": "Den nye bruger er blevet oprettet. For at logge ind i Umbraco skal du bruge\n adgangskoden nedenfor.\n ",
- "userManagement": "Brugeradministration",
- "username": "Navn",
- "userPermissions": "Brugertilladelser",
- "usergroup": "Brugergruppe",
- "userInvited": "er blevet inviteret",
- "userInvitedSuccessHelp": "En invitation er blevet sendt til den nye bruger med oplysninger om, hvordan man\n logger ind i Umbraco.\n ",
- "userinviteWelcomeMessage": "Hej og velkommen til Umbraco! På bare 1 minut vil du være klar til at komme i\n gang, vi skal bare have dig til at oprette en adgangskode og tilføje et billede til din avatar.\n ",
- "userinviteExpiredMessage": "Velkommen til Umbraco! Desværre er din invitation udløbet. Kontakt din\n administrator og bed om at gensende invitationen.\n ",
- "userinviteAvatarMessage": "Hvis du uploader et billede af dig selv, gør du det nemt for andre brugere at\n genkende dig. Klik på cirklen ovenfor for at uploade et billede.\n ",
- "writer": "Forfatter",
- "configureTwoFactor": "Konfigurer totrinsbekræftelse",
- "change": "Skift",
- "yourProfile": "Din profil",
- "yourHistory": "Din historik",
- "sessionExpires": "Session udløber",
- "inviteUser": "Invitér bruger",
- "createUser": "Opret bruger",
- "sendInvite": "Send invitation",
- "backToUsers": "Tilbage til brugere",
- "defaultInvitationMessage": "Gensender invitation...",
- "deleteUser": "Slet bruger",
- "deleteUserConfirmation": "Er du sikker på du ønsker at slette denne brugers konto?",
- "stateAll": "Alle",
- "stateActive": "Aktiv",
- "stateDisabled": "Deaktiveret",
- "stateLockedOut": "LÃ¥st ude",
- "stateApproved": "Godkendt",
- "stateInvited": "Inviteret",
- "stateInactive": "Inaktiv",
- "sortNameAscending": "Navn (A-Ã…)",
- "sortNameDescending": "Navn (Ã…-A)",
- "sortCreateDateAscending": "Nyeste",
- "sortCreateDateDescending": "Ældste",
- "sortLastLoginDateDescending": "Sidst logget ind",
- "noUserGroupsAdded": "Ingen brugere er blevet tilføjet",
- "2faDisableText": "Hvis du ønsker at slå denne totrinsbekræftelse fra, så skal du nu indtaste koden fra din enhed:",
- "2faProviderIsEnabled": "Denne totrinsbekræftelse er slået til",
- "2faProviderIsDisabledMsg": "Den valgte totrinsbekræftelse er nu slået fra",
- "2faProviderIsNotDisabledMsg": "Der skete en ukendt fejl da denne totrinsbekræftelse skulles slåes fra",
- "2faDisableForUser": "Er du sikker på, at du vil fjerne denne totrinsbekræftelse for denne bruger?",
- "emailRequired": "Required - enter an email address for this user",
- "duplicateLogin": "A user with this login already exists",
- "nameRequired": "Required - enter a name for this user",
- "passwordRequiresDigit": "The password must have at least one digit ('0'-'9')",
- "passwordRequiresLower": "The password must have at least one lowercase ('a'-'z')",
- "passwordRequiresNonAlphanumeric": "The password must have at least one non alphanumeric character",
- "passwordRequiresUniqueChars": "The password must use at least %0% different characters",
- "passwordRequiresUpper": "The password must have at least one uppercase ('A'-'Z')",
- "passwordTooShort": "The password must be at least %0% characters long",
- "allowAccessToAllLanguages": "Allow access to all languages",
- "userHasPassword": "The user already has a password set",
- "userHasGroup": "The user is already in group '%0%'",
- "userLockoutNotEnabled": "Lockout is not enabled for this user",
- "userNotInGroup": "The user is not in group '%0%'"
- },
- "validation": {
- "validation": "Validering",
- "validateAsEmail": "Valider som e-mail",
- "validateAsNumber": "Valider som tal",
- "validateAsUrl": "Valider som URL",
- "enterCustomValidation": "...eller indtast din egen validering",
- "fieldIsMandatory": "Feltet er påkrævet",
- "mandatoryMessage": "Indtast en selvvalgt validerings fejlbesked (valgfrit)",
- "validationRegExp": "Indtast et regulært udtryk",
- "validationRegExpMessage": "Indtast en selvvalgt validerings fejlbesked (valgfrit)",
- "minCount": "Du skal tilføje mindst",
- "maxCount": "Du kan kun have",
- "addUpTo": "Tilføj op til",
- "items": "elementer",
- "urls": "URL(er)",
- "urlsSelected": "URL(er) valgt",
- "itemsSelected": "elementer valgt",
- "invalidDate": "Ugyldig dato",
- "invalidNumber": "Ikke et tal",
- "invalidNumberStepSize": "Ikke en gyldig numerisk trinstørrelse",
- "invalidEmail": "Ugyldig e-mail",
- "invalidNull": "Værdien kan ikke være tom",
- "invalidEmpty": "Værdien kan ikke være tom",
- "invalidPattern": "Værdien er ugyldig, som ikke matcher det korrekte format",
- "customValidation": "Selvvalgt validering",
- "entriesShort": "Minimum %0% element(er), tilføj %1% mere.",
- "entriesExceed": "Maksimum %0% element(er), %1% for mange.",
- "entriesAreasMismatch": "Ét eller flere områder lever ikke op til kravene for antal indholdselementer.",
- "invalidMemberGroupName": "Invalid member group name",
- "invalidUserGroupName": "Invalid user group name",
- "invalidToken": "Invalid token",
- "invalidUsername": "Invalid username",
- "duplicateEmail": "Email '%0%' is already taken",
- "duplicateUserGroupName": "User group name '%0%' is already taken",
- "duplicateMemberGroupName": "Member group name '%0%' is already taken",
- "duplicateUsername": "Username '%0%' is already taken"
- },
- "redirectUrls": {
- "disableUrlTracker": "Slå URL tracker fra",
- "enableUrlTracker": "Slå URL tracker til",
- "culture": "Kultur",
- "originalUrl": "Original URL",
- "redirectedTo": "Viderestillet til",
- "redirectUrlManagement": "Viderestil URL håndtering",
- "panelInformation": "De følgende URLs viderestiller til dette indholds element",
- "noRedirects": "Der er ikke lavet nogen viderestillinger",
- "noRedirectsDescription": "Når en udgivet side bliver omdøbt eller flyttet, vil en viderestilling\n automatisk blive lavet til den nye side.\n ",
- "redirectRemoved": "Viderestillings URL fjernet.",
- "redirectRemoveError": "Fejl under fjernelse af viderestillings URL.",
- "redirectRemoveWarning": "Dette vil fjerne viderestillingen",
- "confirmDisable": "Er du sikker på at du vil slå URL trackeren fra?",
- "disabledConfirm": "URL tracker er nu slået fra.",
- "disableError": "Der opstod en fejl under forsøget på at slå URL trackeren fra, der findes mere information\n i logfilen.\n ",
- "enabledConfirm": "URL tracker er nu slået fra.",
- "enableError": "Der opstod en fejl under forsøget på at slå URL trackeren til, der findes mere information\n i logfilen.\n "
- },
- "emptyStates": {
- "emptyDictionaryTree": "Ingen ordbog elementer at vælge imellem"
- },
- "textbox": {
- "characters_left": "%0% tegn tilbage.",
- "characters_exceed": "Maksimum %0% tegn, %1% for mange."
- },
- "recycleBin": {
- "contentTrashed": "Slettet indhold med Id: {0} Relateret til original \"parent\" med id: {1}",
- "mediaTrashed": "Slettet medie med Id: {0} relateret til original \"parent\" / mappe med id: {1}",
- "itemCannotBeRestored": "Kan ikke automatisk genoprette dette element",
- "itemCannotBeRestoredHelpText": "Der er ikke nogen placering hvor dette element automatisk kan genoprettes.\n Du kan flytte elementet manuelt i træet nedenfor.\n ",
- "wasRestored": "blev genoprettet under"
- },
- "relationType": {
- "direction": "Retning",
- "parentToChild": "Forælder til barn",
- "bidirectional": "Tovejs",
- "parent": "Forælder",
- "child": "Barn",
- "count": "Antal",
- "relations": "Relationer",
- "created": "Oprettet",
- "comment": "Kommentar",
- "name": "Navn",
- "noRelations": "Der er ingen relationer for denne relationstype.",
- "tabRelationType": "Relationstype",
- "tabRelations": "Relationer",
- "relation": "Relation",
- "isDependency": "Is Dependency",
- "dependency": "Yes",
- "noDependency": "No"
- },
- "dashboardTabs": {
- "contentIntro": "Kom godt i gang",
- "contentRedirectManager": "Redirects håndtering",
- "mediaFolderBrowser": "Indhold",
- "settingsWelcome": "Velkommen",
- "settingsExamine": "Examine Management",
- "settingsPublishedStatus": "Published Cache",
- "settingsModelsBuilder": "Models Builder",
- "settingsHealthCheck": "Health Check",
- "settingsProfiler": "Profiling",
- "memberIntro": "Kom godt i gang",
- "formsInstall": "Installer Umbraco Forms",
- "deploy": "Arbejdsområder",
- "settingsAnalytics": "Telemetry data",
- "deployManagement": "Deploy"
- },
- "visuallyHiddenTexts": {
- "goBack": "GÃ¥ tilbage",
- "activeListLayout": "Aktivt layout:",
- "jumpTo": "GÃ¥ til",
- "group": "gruppe",
- "passed": "bestået",
- "warning": "advarsel",
- "failed": "fejlet",
- "suggestion": "forslag",
- "checkPassed": "Test bestået",
- "checkFailed": "Test fejlet",
- "openBackofficeSearch": "Åben backoffice søgning",
- "openCloseBackofficeHelp": "Åben/Luk backoffice hjælp",
- "openCloseBackofficeProfileOptions": "Ã…ben/Luk dine profil indstillinger",
- "assignDomainDescription": "Tilføj domæne på %0%",
- "createDescription": "Opret ny node under %0%",
- "protectDescription": "Opsæt offentlig adgang på %0%",
- "rightsDescription": "Opsæt rettigheder på %0%",
- "sortDescription": "Juster soterings rækkefølgen for %0%",
- "createblueprintDescription": "Opret indholds skabelon baseret på %0%",
- "openContextMenu": "Ã…ben kontext menu for",
- "currentLanguage": "Aktivt sprog",
- "switchLanguage": "Skift sprog til",
- "createNewFolder": "Opret ny mappe",
- "newPartialView": "Delvist View",
- "newPartialViewMacro": "Delvist View Macro",
- "newMember": "Medlem",
- "newDataType": "Data type",
- "redirectDashboardSearchLabel": "Søg i viderestillings dashboardet",
- "userGroupSearchLabel": "Søg i brugergruppe sektionen",
- "userSearchLabel": "Søg i bruger sektionen",
- "createItem": "Opret element",
- "create": "Opret",
- "edit": "Rediger",
- "name": "Navn",
- "addNewRow": "Tilføj ny række",
- "tabExpand": "Vis flere muligheder",
- "searchOverlayTitle": "Søg i Umbraco backoffice",
- "searchOverlayDescription": "Søg efter indholdsnoder, medienoder osv. i backoffice",
- "searchInputDescription": "Når autoudfyldnings resultaterne er klar, tryk op og ned pilene, eller benyt tab\n knappen og brug enter knappen til at vælge.\n ",
- "path": "Vej",
- "foundIn": "Fundet i",
- "hasTranslation": "Har oversættelse",
- "noTranslation": "Mangler oversættelse",
- "dictionaryListCaption": "Ordbogs elementer",
- "contextMenuDescription": "Udfør handling %0% på %1% noden",
- "addImageCaption": "Tilføj billede overskrift",
- "searchContentTree": "Søg i indholdstræet",
- "maxAmount": "Maximum antal",
- "contextDialogDescription": "Perform action %0% on the %1% node"
- },
- "references": {
- "tabName": "Referencer",
- "DataTypeNoReferences": "Denne Data Type har ingen referencer.",
- "labelUsedByMediaTypes": "Brugt i Medie Typer",
- "labelUsedByMemberTypes": "Brugt i Medlems Typer",
- "usedByProperties": "Brugt af",
- "labelUsedByDocuments": "Brugt i Dokumenter",
- "labelUsedByMembers": "Brugt i Medlemmer",
- "labelUsedByMedia": "Brugt i Medier",
- "itemHasNoReferences": "This item has no references.",
- "labelUsedByDocumentTypes": "Referenced by the following Document Types",
- "labelUsedByItems": "Referenced by the following items",
- "labelDependsOnThis": "The following items depend on this",
- "labelUsedItems": "The following items are referenced",
- "labelUsedDescendants": "The following descendant items have dependencies",
- "labelDependentDescendants": "The following descending items have dependencies",
- "deleteWarning": "This item or its descendants is being referenced. Deletion can lead to broken links on your website.",
- "unpublishWarning": "This item or its descendants is being referenced. Unpublishing can lead to broken links on your website. Please take the appropriate actions.",
- "deleteDisabledWarning": "This item or its descendants is being referenced. Therefore, deletion has been disabled.",
- "listViewDialogWarning": "The following items you are trying to %0% are referenced by other content."
- },
- "logViewer": {
- "deleteSavedSearch": "Slet gemte søgning",
- "logLevels": "Log type",
- "selectAllLogLevelFilters": "Vælg alle",
- "deselectAllLogLevelFilters": "Fravælg alle",
- "savedSearches": "Gemte søgninger",
- "saveSearch": "Gem søgning",
- "saveSearchDescription": "Indtast et navn for din søgebetingelse",
- "filterSearch": "Filter søgning",
- "totalItems": "Samlet resultat",
- "timestamp": "Dato",
- "level": "Type",
- "machine": "Maskine",
- "message": "Besked",
- "exception": "Exception",
- "properties": "Egenskaber",
- "searchWithGoogle": "Søg med Google",
- "searchThisMessageWithGoogle": "Søg efter denne besked på Google",
- "searchWithBing": "Søg med Bing",
- "searchThisMessageWithBing": "Søg efter denne besked på Bing",
- "searchOurUmbraco": "Søg på Our Umbraco",
- "searchThisMessageOnOurUmbracoForumsAndDocs": "Søg efter denne besked på Our Umbraco forum og\n dokumentation\n ",
- "searchOurUmbracoWithGoogle": "Søg på Our Umbraco med Google",
- "searchOurUmbracoForumsUsingGoogle": "Søg på Our Umbraco forum med Google",
- "searchUmbracoSource": "Søg i Umbraco kildekoden",
- "searchWithinUmbracoSourceCodeOnGithub": "Søg i Umbraco kildekoden på Github",
- "searchUmbracoIssues": "Søg i Umbraco issues",
- "searchUmbracoIssuesOnGithub": "Søg i Umbraco issues på Github",
- "deleteThisSearch": "Slet denne søgning",
- "findLogsWithRequestId": "Find logs med request Id",
- "findLogsWithNamespace": "Find logs med Namespace",
- "findLogsWithMachineName": "Find logs med maskin navn",
- "open": "Ã…ben",
- "polling": "Henter",
- "every2": "Hver 2 sekunder",
- "every5": "Hver 5 sekunder",
- "every10": "Hver 10 sekunder",
- "every20": "Hver 20 sekunder",
- "every30": "Hver 30 sekunder",
- "pollingEvery2": "Henter hver 2s",
- "pollingEvery5": "Henter hver 5s",
- "pollingEvery10": "Henter hver 10s",
- "pollingEvery20": "Henter hver 20s",
- "pollingEvery30": "Henter hver 30s"
- },
- "clipboard": {
- "labelForCopyAllEntries": "Kopier %0%",
- "labelForArrayOfItemsFrom": "%0% fra %1%",
- "labelForArrayOfItems": "Samling af %0%",
- "labelForRemoveAllEntries": "Fjern alle elementer",
- "labelForClearClipboard": "Ryd udklipsholder"
- },
- "propertyActions": {
- "tooltipForPropertyActionsMenu": "Ã…ben egenskabshandlinger",
- "tooltipForPropertyActionsMenuClose": "Luk egenskabshandlinger"
- },
- "blockEditor": {
- "headlineCreateBlock": "Vælg elementtype",
- "headlineAddSettingsElementType": "Tilføj en indstillings elementtype",
- "headlineAddCustomView": "Tilføj visning",
- "headlineAddCustomStylesheet": "Tilføj stylesheet",
- "headlineAddThumbnail": "Vælg billede",
- "labelcreateNewElementType": "Opret ny elementtype",
- "labelCustomStylesheet": "Overskriv stylesheet",
- "addCustomStylesheet": "Tilføj stylesheet",
- "headlineEditorAppearance": "Redigerings udseende",
- "headlineDataModels": "Data modeller",
- "headlineCatalogueAppearance": "katalog udseende",
- "labelBackgroundColor": "Baggrunds farve",
- "labelIconColor": "Ikon farve",
- "labelContentElementType": "Indholds model",
- "labelLabelTemplate": "Label",
- "labelCustomView": "Speciel visning",
- "labelCustomViewInfoTitle": "Vis speciel visning beskrivelsen",
- "labelCustomViewDescription": "Overskrift hvordan denne block præsenteres i backoffice interfacet. Vælg en\n .html fil der indeholder din præsensation.\n ",
- "labelSettingsElementType": "Indstillings model",
- "labelEditorSize": "Rederings lagets størrelse",
- "addCustomView": "Tilføj speciel visning",
- "addSettingsElementType": "Tilføj instillinger",
- "confirmDeleteBlockMessage": "Er du sikker på at du vil slette indholdet %0% ?",
- "confirmDeleteBlockTypeMessage": "Er du sikker på at du vil slette konfigurationen %0% ?",
- "confirmDeleteBlockTypeNotice": "Indholdet vil stadigt eksistere, men redigering af dette indhold vil ikke\n være muligt. Indholdet vil blive vist som ikke understøttet indhold.\n ",
- "confirmDeleteBlockGroupMessage": "Er du sikker på at du vil slette gruppen %0% og blok konfigurationer?",
- "confirmDeleteBlockGroupNotice": "Indholdet af gruppens blokke vil stadigt eksistere, men redigering af dette indhold vil ikke\n være muligt. Indholdet vil blive vist som ikke understøttet indhold.\n ",
- "blockConfigurationOverlayTitle": "Konfiguration af '%0%'",
- "elementTypeDoesNotExist": "Kan ikke redigeres fordi elementtypen ikke eksisterer.",
- "thumbnail": "Billede",
- "addThumbnail": "Tilføj billede",
- "tabCreateEmpty": "Opret ny",
- "tabClipboard": "Udklipsholder",
- "tabBlockSettings": "Indstillinger",
- "headlineAdvanced": "Avanceret",
- "forceHideContentEditor": "Skjul indholdseditoren",
- "forceHideContentEditorHelp": "Skjul indholds redigerings knappen samt indholdseditoren i Blok Redigerings vinduet",
- "girdInlineEditing": "Direkte redigering",
- "girdInlineEditingHelp": "Tilføjer direkte redigering a det første felt. Yderligere felter optræder kun i redigerings vinduet.",
- "blockHasChanges": "Du har lavet ændringer til dette indhold. Er du sikker på at du vil kassere dem?",
- "confirmCancelBlockCreationHeadline": "Annuller oprettelse?",
- "confirmCancelBlockCreationMessage": "Er du sikker på at du vil annullere oprettelsen.",
- "elementTypeDoesNotExistHeadline": "Fejl!",
- "elementTypeDoesNotExistDescription": "Elementtypen for denne blok eksisterer ikke længere",
- "addBlock": "Tilføj indhold",
- "addThis": "Tilføj %0%",
- "propertyEditorNotSupported": "Feltet %0% bruger editor %1% som ikke er supporteret for blokke.",
- "focusParentBlock": "Fokusér på den ydre blok",
- "areaIdentification": "Identifikation",
- "areaValidation": "Validering",
- "areaValidationEntriesShort": "%0% skal tilføjes minimum %2% gang(e).",
- "areaValidationEntriesExceed": "%0% må maksimalt tilføjes %3% gang(e).",
- "areaNumberOfBlocks": "Antal blokke",
- "areaDisallowAllBlocks": "Tillad kun specifikke blok-typer",
- "areaAllowedBlocks": "Tilladte blok-typer",
- "areaAllowedBlocksHelp": "Vælg de blok-typer, der er tilladt i dette område, og evt. også hvor mange af hver type, redaktørerne skal tilføje til området.",
- "areaAllowedBlocksEmpty": "Når denne er tom er alle block-typer tilladt for områder tilladt.",
- "confirmDeleteBlockAreaMessage": "Er du sikker på, at du vil slette dette område?",
- "confirmDeleteBlockAreaNotice": "Alle blokke, der er oprettet i dette område, vil blive slettet.",
- "layoutOptions": "Layout-opsætning",
- "structuralOptions": "Struktur",
- "sizeOptions": "Størrelses opsætning",
- "allowedBlockColumns": "Tilgængelige kolonne-størrelser",
- "allowedBlockColumnsHelp": "Vælg de forskellige antal kolonner denne blok må optage i layoutet. Dette forhindre ikke blokken i at optræde i et mindre område.",
- "allowedBlockRows": "TIlgængelige række-størrelser",
- "allowedBlockRowsHelp": "Vælg hvor mange rækker denne blok på optage i layoutet.",
- "allowBlockInRoot": "Tillad på rodniveau",
- "allowBlockInRootHelp": "Gør denne blok tilgængelig i layoutets rodniveau. Hvis dette ikke er valgt, kan denne blok kun bruges inden for andre blokkes definerede områder.",
- "areas": "Blok-områder",
- "areasLayoutColumns": "Layout-kolonner",
- "areasLayoutColumnsHelp": "Vælg hvor mange layout-kolonnner der skal være tilgængelig for blokkens områder. Hvis der ikke er valgt noget her, benyttes det antal layout-kolonner der er valgt for hele layoutet.",
- "areasConfigurations": "Opsætning af områder",
- "areasConfigurationsHelp": "Hvis det skal være muligt at indsætte nye blokke indeni denne blok, skal der oprettes ét eller flere områder til at indsætte de nye blokke i.",
- "invalidDropPosition": "Ikke tilladt placering.",
- "defaultLayoutStylesheet": "Standardlayout stylesheet",
- "confirmPasteDisallowedNestedBlockHeadline": "Ikke tilladt indhold blev afvist",
- "confirmPasteDisallowedNestedBlockMessage": "Det indsatte indhold bestod af ikke tilladt del-indhold, disse dele er blevet afvist. Vil du beholde det resterene alligevel?",
- "areaAliasHelp": "Dette alias skrives ud via GetBlockGridHTML(), brug aliaset til at fange det element der repræsentere dette område. F.eks.. .umb-block-grid__area[data-area-alias=\"MitOmraadeAlias\"] { ... }",
- "scaleHandlerButtonTitle": "Træk for at skalere",
- "areaCreateLabelTitle": "Tilføj indhold label",
- "areaCreateLabelHelp": "Overskriv labellen for tilføj indholds knappen i dette område.",
- "showSizeOptions": "Tilføj skalerings muligheder",
- "addBlockType": "Tilføj Blok",
- "addBlockGroup": "Tilføj gruppe",
- "pickSpecificAllowance": "Tilføj gruppe eller Blok",
- "allowanceMinimum": "Sæt minimum krav",
- "allowanceMaximum": "Sæt maksimum krav",
- "block": "Blok",
- "tabBlock": "Blok",
- "tabBlockTypeSettings": "Indstillinger",
- "tabAreas": "Områder",
- "tabAdvanced": "Avanceret",
- "headlineAllowance": "Tilladelser",
- "getSampleHeadline": "Installer demo konfiguration",
- "getSampleDescription": "Dette tilføjer basale og hjælper dig til at komme igang med Block Grid Editor. Dette indeholder Blokke for Overskrift, Beriget-Tekst, Billede og To-Koloners-Layout.",
- "getSampleButton": "Installer",
- "actionEnterSortMode": "Sortings tilstand",
- "actionExitSortMode": "Afslut sortings tilstand",
- "areaAliasIsNotUnique": "Dette område alias skal være unikt sammenlignet med andre områder af denne Blok.",
- "configureArea": "Konfigurer område",
- "deleteArea": "Slet område",
- "addColumnSpanOption": "Tilføj mulighed for %0% koloner",
- "sizeOptionsHelp": "Define one or more size options, this enables resizing of the Block",
- "allowBlockInAreas": "Allow in areas",
- "allowBlockInAreasHelp": "Make this block available by default within the areas of other Blocks (unless explicit permissions are set for these areas)."
- },
- "contentTemplatesDashboard": {
- "whatHeadline": "Hvad er Indholdsskabeloner?",
- "whatDescription": "Indholdsskabeloner er foruddefineret indhold der kan vælges når der oprettes nye\n indholdselementer.\n ",
- "createHeadline": "Hvordan opretter jeg en Indholdsskabelon?",
- "createDescription": "\n Der er to måder at oprette Indholdsskabeloner på:
\n \n Højreklik på en indholdsnode og vælg \"Opret indholdsskabelon\" for at oprette en ny Indholdsskabelon. \n Højreklik på Indholdsskabeloner i sektionen Indstillinger og vælg den dokumenttype du vil oprette en Indholdsskabelon for. \n \n Når indholdsskabelonen har fået et navn, kan redaktører begynde at bruge indholdsskabelonen som udgangspunkt for deres nye side.
\n ",
- "manageHeadline": "Hvordan vedligeholder jeg Indholdsskabeloner?",
- "manageDescription": "Du kan redigere og slette Indholdsskabeloner fra \"Indholdsskabeloner\" i sektionen\n Indstillinger. Fold dokumenttypen som Indholdsskabelonen er baseret på ud og klik på den for at redigere eller\n slette den.\n "
- },
- "preview": {
- "endLabel": "Afslut",
- "endTitle": "Afslut forhåndsvisning",
- "openWebsiteLabel": "Vis i nyt vindue",
- "openWebsiteTitle": "Åben forhåndsvisning i nyt vindue",
- "returnToPreviewHeadline": "Forhåndsvisning af indholdet?",
- "returnToPreviewDescription": "Du har afslutet forhåndsvisning, vil du starte forhåndsvisning igen for at\n se seneste gemte version af indholdet?\n ",
- "returnToPreviewDeclineButton": "Se udgivet indhold",
- "viewPublishedContentHeadline": "Se udgivet indhold?",
- "viewPublishedContentDescription": "Du er i forhåndsvisning, vil du afslutte for at se den udgivet\n version?\n ",
- "viewPublishedContentAcceptButton": "Se udgivet version",
- "viewPublishedContentDeclineButton": "Forbliv i forhåndsvisning",
- "returnToPreviewAcceptButton": "Preview latest version"
- },
- "permissions": {
- "FolderCreation": "Mappeoprettelse",
- "FileWritingForPackages": "Filskrivning for pakker",
- "FileWriting": "Filskrivning",
- "MediaFolderCreation": "Medie mappeoprettelse"
- },
- "treeSearch": {
- "searchResult": "resultat",
- "searchResults": "resultater"
- },
- "dialogs": {
- "deployTransferNowTitle": "Overfør nu",
- "deployTransferNowHeadline": "Overfør %0% til %1% ",
- "deployTransferNowDescription": "Du er ved at igangsætte overførsel af %0% direkte til %1%, uden at tilføje til køen.
",
- "deployAddToQueueHeadline": "Sæt %0% i køen for overførsel til %1% ",
- "deployAddToQueueDescription": "Denne handling sætter %0% i køen til næste overførsel, intet vil blive overført endnu.
",
- "deployAddToQueueChildPageDescription": "Skal alle underliggende sider af %0% inkluderes i denne overførsel?
",
- "deployIncludeChildPages": "Inkluder underliggende sider",
- "deployAddToQueueDone": "Ændringer er lagt i køen Når du er klar til at overfører gå til arbejdsområde siden for at starte overførselen.
",
- "deployRestoreFrom": "Fra",
- "deployRestoreWorkspace": "arbejdsområde",
- "deployRestoreThis": "Genskab",
- "deployRestoreIncludingDescendants": "Inklusiv alle underliggende sider",
- "deployRestoreNotIncludingDescendants": "Uden underliggende sider",
- "deployRestoreDescription": "\n Dette inkludere rettelser til alt referred indhold og medier.
\n Bemærk: Genskabning af store mængder indhold kan tage langtid af udføre, undervejs bør du ikke ændre eller overfører indhold.
\n ",
- "deployRestorePickFrom": "Eller vælg indhold fra",
- "deployFullRestoreFrom": "Genskab dette arbejdsområde fra",
- "deployFullRestoreDescription": "\n Denne handling vil overfører rettelser fra %0% til dette arbejdsmiljø. Dette inkludere rettelser til referred indhold og medier.
\n \n Bemærk: Genskabning af store mængder indhold kan tage langtid af udføre, undervejs bør du ikke ændre eller overfører indhold.\n
\n ",
- "deployFullRestoreAction": "Genskab fra",
- "deployGoToTransferQueue": "Åben overførselskøen",
- "deployAddToQueueCultureDescription": "Select language to include in transfer:
",
- "deployAddToQueueReleaseDateDescription": "The published or unpublished status will be transferred along with the content. To schedule the update for publishing in the future, please set a date:
",
- "deployVariantQueueForTransferNotAllowed": "Transfer is not allowed",
- "deployTreeRestoreFrom": "Restore this tree from",
- "deployTreeRestoreDescription": "\n This will transfer changes from %0% and apply them to the selected tree in this workspace. This will include changes to any referenced content, media or other items.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ",
- "deployCompareTitle": "Compare"
- },
- "formPicker": {
- "selectFromFolder": "Vælg fra mappe",
- "selectFromList": "Vælg fra listen over alle formularer"
- },
- "formsDashboard": {
- "yourForms": "Dine formularer",
- "showMore": "Vis mere",
- "entries": "Besvarelser",
- "newVersion": "Der er en ny version tilgængelig",
- "installOverlayTitle": "Tillykke",
- "installOverlayDescription": "Du har installeret Umbraco Forms - Lad os oprette din første formular",
- "emptyOverlayTitle": "Opret formular",
- "emptyOverlayDescription": "Du har ikke klargjort nogle formularer endnu, vil du starte på en nu?",
- "createAForm": "Opret formular",
- "newVersionTitle": "Der er en ny version tilgængelig",
- "newVersionDescription": "Nu kan du installere Umbraco Forms",
- "upgradeNow": "Opgrader nu",
- "downloading": "Henter og opgraderer Forms...",
- "invalidLicense": "Ugyldig licens",
- "invalidLicenseValidFor": "Din nuværende Forms licens udløber snart:",
- "reconfigure": "Omkonfigurer din licens nedenfor.",
- "trialTitle": "Tak fordi du afprøver Umbraco Forms",
- "trialDescription": "For at fortsætte med at bruge Umbraco Forms, skal du enten købe en licens eller bruge en eksisterende",
- "configureLicense": "Konfigurer eksisterende licens",
- "buyLicense": "Køb licens",
- "buyLicenseTitle": "Køb en licens",
- "buyLicenseCopy": "\n \n Det tager kun et par minutter at købe en licens til Umbraco Forms og din licens bliver leveret øjeblikkeligt .\n
\n \n Du skal bare:\n
\n Klikke på køb-knappen nedenfor \n Checkout med Kreditkort (eller faktura) \n Konfigurere licensen inde fra Umbraco Forms og så er du klar \n \n \n ",
- "buyLink": "Køb Umbraco Forms",
- "buyLicenseFAQs": "\n FAQ: \n Hvad koster det? \n Priserne starter ved €209 og det er en engangsudgift (intet abonnement nødvendigt).
\n Hvad dækker en license over? \n En licens dækker over et enkelt domæne og vil også virke på alle subdomæner. Det inkluderer desuden to yderligere development domæner.
\n Kan jeg tilføje yderligere domæner til licensen? \n Ja, der kan godt tilføjes yderligere domæner. Du kan tilkøbe flere domæner til din licens fra din konto på Umbraco.com.
\n Har du flere spørgsmål? \n \n Bare rolig, der er flere detaljer i dokumentationen og du er velkommen til at kontakte os . Vi svarer typisk i løbet af et par timer.\n
\n ",
- "configureLicenseTitle": "Konfigurer en Umbraco Forms licens",
- "configureLicenseCopy": "\n Hvis du allerede har købt Umbraco Forms, kan du automatisk hente og konfigurere din licens her. Du skal bare angive dine brugeroplysninger herunder og vi\n finder din licens.\n ",
- "configureLicenseFAQs": "\n FAQ: \n Jeg ved ikke hvad mine brugeroplysninger er? \n \n Det er en kombination af din e-mail og kodeord fra da du lavede din bestilling. Du kan altid nulstille dit kodeord her .\n
\n Hvordan køber jeg en licens? \n \n Hvis du ikke har en licens, kan du få fat i en herfra og det tager kun et øjeblik .\n
\n ",
- "findLicenses": "Find Licenser",
- "invalidEmail": "Forkert email eller kodeord",
- "noLicensesAvailable": "Der er ingen Umbraco Forms licenser tilgængelige på denne konto",
- "availableLicensesTitle": "Tilgængelige Licenser",
- "foundLicenses": "Fundede",
- "foundLicensesAccount": "på kontoen",
- "noDomainsAssigned": "Har ikke tilknyttet et domæne",
- "setDomain": "Tilknyt venligst et domæne til denne licens",
- "configureAndInstall": "Konfigurer og installer",
- "installLicense": "Installer denne licens",
- "validDomains": "Gyldige domæner",
- "licenseValidOnDomain": "Denne licens er gyldig til det nuværende domæne",
- "licenseNotValidOnDomain": "Denne licens er ikke gyldig til det nuværende domæne",
- "plainTextPasswordWarning": "\n Advarsel: indstillingerne for kodeord er sat til klar tekst i din konfiguration! \n Når du benytter et felt til kodeord på en formular, bliver det data som dine besøgende udfylder feltet med, gemt som klar tekst. Dette er et sikkerhedsmæssigt problem og bør undgås.
\n For at udbedre problemet kan du i din ~/App_Plugins/UmbracoForms/UmbracoForms.config fil sætte nøglen SavePlainTextPasswords til False .
\n Efter opdateringen af denne indstilling skal du sikre dig at sitets application pool bliver recycled så den nye indstilling træder i kraft.
\n Bemærk: kodeordsværdier vil stadig blive sendt videre til arbejdsgange, uanset indstillingen i UmbracoForms.config
\n ",
- "currentVersion": "Nuværende installerede version af Umbraco Forms:",
- "licenseConfiguredNotificationTitle": "Licens er konfigureret",
- "licenseConfiguredNotificationMessage": "Umbraco Forms er blevet konfigureret til brug med dette website.",
- "insufficientPermissionsError": "Manglende tilladelser",
- "insufficientPermissionsMessage": "Du har ikke tilladelse til at oprette og varetage formularer.",
- "insufficientPermissionsUpgradeMessage": "Kun admin-brugere kan opgradere Umbraco Forms.",
- "licensedDomains": "Licenserede domæner",
- "formsHeadline": "Umbraco Forms",
- "formsDescription": "Create forms using an intuitive drag and drop interface. From simple contact forms\n that sends e-mails to advanced questionaires that integrate with CRM systems. Your clients will love it!\n "
- },
- "formCopy": {
- "title": "Kopierer formular '%0%'",
- "enterName": "Angiv et navn til den kopierede formular",
- "alsoCopyWorkflows": "Skal arbejdsgange også kopieres?",
- "copyToNewFolder": "Kopier til en anden mappe?",
- "selectLocation": "Vælg placering til den kopierede formular"
- },
- "formCreate": {
- "title": "Opret en ny formular eller mappe",
- "emptyForm": "Tom formular",
- "emptyFormDescription": "Start fra bunden",
- "folder": "Mappe",
- "folderDescription": "Bruges til at organisere formularer",
- "enterFolderName": "Angiv et navn til mappen"
- },
- "formExport": {
- "formExportedSuccess": "Formularen blev eksporteret til en fil."
- },
- "formImport": {
- "importInstruction1": "\n For at importere en formular skal du finde den eksporterede .json-fil på din computer ved at klikke på knappen 'Importer' (du bliver bedt om bekræftelse på næste skærmbillede).\n ",
- "importInstruction2": "\n Hvis der allerede findes en formular med id'et for den valgte fil, vil den blive opdateret og flyttet til den valgte placering.\n Hvis der ikke findes en eksisterende formular, oprettes en ny på det valgte sted.\n "
- },
- "formPermissions": {
- "accessDeniedTitle": "Ingen adgang"
- },
- "formMessages": {
- "saveErrorMessage": "Undersøg venligst om dine indstillinger er gyldige."
- },
- "formEdit": {
- "addQuestion": "Tilføj spørgsmål",
- "groupIsEmpty": "Gruppen er tom",
- "dropQuestionHere": "Smid et spørgsmål her...",
- "letGo": "Yaay.. så går det løs",
- "pageIsEmpty": "Siden er tom",
- "dropGroupHere": "Smid en gruppe her...",
- "addGroup": "Tilføj en ny gruppe",
- "addPage": "Tilføj en ny side",
- "pageTitlePlaceholder": "Side uden titel (valgfri)",
- "groupTitlePlaceholder": "Gruppe uden titel (valgfri)",
- "saveFieldFailedTitle": "Felt kunne ikke gemmes",
- "accessDeniedMessage": "Du har ikke rettigheder til at rette på denne formular.",
- "formSaved": "Formular gemt",
- "unableToLoadForm": "Kan ikke indlæse formular",
- "helpText": "Hjælpetekst",
- "editPage": "Ret Side",
- "editGroup": "Ret Gruppe",
- "editQuestion": "Ret spørgsmål",
- "workflows": "Arbejdsgange",
- "magicStringsForFieldsNote": "\n Mange feltindstillinger understøtter brugen af ​​magiske strenge .\n Når formularen vises, kan disse strenge erstattes med værdier fra forskellige kilder, herunder ordbogsværdier, sessions- eller cookiedata og Umbraco-sidefelter.\n Læs mere .",
- "magicStringsForWorkflowsNote": "\n Mange workflow-indstillinger understøtter brugen af ​​magiske strenge .\n Når arbejdsgangen behandles, kan disse strenge erstattes med værdier fra forskellige kilder, herunder registreringsdata og ordbogsværdier.\n Læs mere .",
- "fieldTypeNotAvailable": "Felttypen, der er konfigureret til dette felt, er ikke længere tilgængelig.",
- "fieldTypeRichTextNotAvailable": "Den rige tekst kan ikke formateres, da der ikke er konfigureret en gyldig datatype.",
- "fieldTypeRichTextNotAvailableLinkText": "Læs, hvordan du konfigurerer en datatype."
- },
- "formFileUpload": {
- "allowAllFiles": "Tillad alle filer",
- "allowOnlySpecifiedFiles": "Tillad kun specifikke filer",
- "predefinedAllowedFileTypes": "Foruddefinerede tilladte filtyper",
- "userDefinedAllowedFileTypes": "Brugerdefinerede tilladte filtyper",
- "deleteAllowedFileTypeConfirmationTitle": "Bekræftelse",
- "deleteAllowedFileTypeConfirmationDescription": "Er du sikker på at du vil slette denne?",
- "duplicateFileTypeErrorTitle": "Filtypefejl",
- "duplicateFileTypeErrorMessage": "Kan ikke tilføje filtype fordi typen allerede eksisterer.",
- "pickFile": "Vælg fil",
- "uploading": "Uploader",
- "currentFile": "Nuværende fil"
- },
- "formPrevalues": {
- "newValue": "Ny værdi",
- "newCaption": "Ny billedtekst",
- "caption": "Billedtekst",
- "duplicateErrorTitle": "Fejl på foruddefineret værdi",
- "duplicateAddErrorMessage": "Kan ikke tilføje værdi da værdien allerede eksisterer.",
- "duplicateEditErrorMessage": "Kan ikke ændre værdi da værdien allerede eksisterer."
- },
- "formDelete": {
- "title": "Er du sikker på at du vil slette %0% '%1%'?",
- "timingNote": "Bemærk at dette kan tage lang tid alt afhængig af antallet af besvarelser.",
- "recordDeleteNote": "Sletning af formularen vil også slette de tilknyttede poster.",
- "recordDetail": "Der er %0% poster, med den seneste indsendt på %1%.",
- "cannotDeleteFolder": "Den valgte mappe kan ikke slettes da den ikke er tom.",
- "successMessageForForm": "Sletning af formular er gennemført.",
- "failedMessageForForm": "Sletning af formular mislykkedes.",
- "successMessageForFolder": "Sletning af mappe er gennemført.",
- "failedMessageForFolder": "Sletning af mappe mislykkedes.",
- "noRecordDetail": "There are 0 records."
- },
- "formEntries": {
- "title": "%0% besvarelser",
- "filterEntries": "Filtrer besvarelser...",
- "selectedRowsDescription": "%0% af %1% er valgt",
- "export": "Eksporter",
- "chooseExportFormat": "Vælg et format som du til eksportere besvarelserne til",
- "entriesNotStored": "For nuværende bliver besvarelser ikke gemt i databasen.",
- "enableStoreEntries": "For at aktivere dette, skal du gå til indstillinger og aktivere indstillingen \"Gem fortegnelser\".",
- "noEntriesInRange": "Der findes endnu ingen besvarelser inden for valgte datoer.",
- "noEntriesInRangeDetail": "Vi kan ikke finde nogen besvarelser, er du sikker på at du har udgivet formularen? eller prøv at udvidde datointervalet.",
- "noEntriesMatchingSearch": "Vi kan ikke finde nogle besvarelser der matcher din søgning.",
- "noEntriesMatchingSearchDetail": "Prøv at søge efter noget andet, måske er du heldig næste gang.",
- "selectedEntryPaging": "Besvarelse %0% af %1%",
- "previousEntry": "Forrige besvarelse",
- "nextEntry": "Næste besvarelse",
- "accessDeniedMessage": "Du har ikke adgang til at se denne formulars besvarelser.",
- "executeCompleteTitle": "Udfør handling",
- "executeSuccessMessage": "Handling %0% er gennemført",
- "executeErrorMessage": "Handling %0% mislykkedes på grund af fejlen: %1%.",
- "entryDetails": "Besvarelse",
- "closeDetails": "Luk detaljer",
- "submittedOn": "Indsendt",
- "updatedOn": "Opdateret",
- "fromPage": "Forside",
- "member": "Medlem",
- "state": "Tilstand",
- "uniqueId": "Unikt ID",
- "auditTrail": "Revisionsspor",
- "showAuditTrail": "Vis revisionsspor",
- "hideAuditTrail": "Skjul revisionsspor",
- "updatedBy": "Opdateret af",
- "updateRecordSuccess": "Rekord opdateret",
- "updateRecordError": "Record kunne ikke opdateres",
- "workflowAudit": "Workflow revision",
- "workflowAuditName": "Navn",
- "workflowAuditType": "Type",
- "workflowAuditExecutedOn": "Udført den",
- "workflowAuditExecutionStage": "Fase",
- "workflowAuditResult": "Resultat",
- "workflowAuditTitleFormatSingular": "%0% af %1% arbejdsgang lykkedes",
- "workflowAuditTitleFormatPlural": "%0% af %1% arbejdsgange lykkedes",
- "workflowAuditRetry": "Prøve igen",
- "workflowAuditRunAgain": "Udfør igen",
- "workflowAuditRunAnyway": "Udfør alligevel",
- "workflowAuditRetryConfirmTitle": "Bekræftelse",
- "workflowAuditRetryConfirmMessage": "Er du sikker på, at du vil køre den valgte arbejdsgang igen?",
- "workflowAuditRetrySuccessMessage": "Workflow-udførelsen afsluttet (se revisionsspor for status og konsulter logfiler for et mislykket resultat)",
- "workflowAuditRetryFailedMessage": "Udførelsen af ​​arbejdsgangen mislykkedes",
- "workflowAuditRetryFailedMessageDetailWorkflowNotFound": "Arbejdsgangen er ikke længere knyttet til formularen.",
- "workflowExecutionStageSubmitted": "Indsendt",
- "workflowExecutionStageApproved": "Godkendt",
- "workflowExecutionStatusCompleted": "Færdiggjort",
- "workflowExecutionStatusFailed": "Mislykkedes",
- "workflowExecutionStatusNotConfigured": "Ikke konfigureret",
- "workflowExecutionStatusCancelled": "Annulleret",
- "workflowExecutionStatusSkippedDueToConditions": "Ignoreret af betingelser"
- },
- "formMove": {
- "title": "Vælg den mappe du vil flytte %0% til i træstrukturen nedenfor.",
- "successMessage": "%0% blev flyttet indunder %1% .",
- "successNotificationHeader": "Flyttet",
- "successNotificationDescriptionForForm": "Formularen blev flyttet til den valgte placering.",
- "successNotificationDescriptionForFolder": "Mappen blev flyttet til den valgte placering."
- },
- "formRename": {
- "enterNewName": "Angiv et nyt navn",
- "successNotificationHeader": "Omdøbt",
- "successNotificationDescriptionForFolder": "Mappen er blevet omdøbt."
- },
- "formConditions": {
- "title": "Betingelser",
- "enableConditions": "Aktiver betingelser",
- "actionTypeShow": "Vis",
- "actionTypeHide": "Skjul",
- "workflowactionTypeShow": "Kør",
- "workflowactionTypeHide": "Ignorer",
- "logicTypeAll": "alle",
- "logicTypeAny": "hvilken som helst",
- "operatorIs": "er",
- "operatorIsNot": "er ikke",
- "operatorGreaterThen": "er større end",
- "operatorLessThen": "er mindre end",
- "operatorContains": "indeholder",
- "operatorStartsWith": "starter med",
- "operatorEndsWith": "slutter med",
- "thisFieldSetIf": "dette fieldset hvis",
- "thisFieldIf": "dette felt hvis",
- "buttonsForThisPageIf": "knapper til denne side hvis",
- "thisWorkflowIf": "denne arbejdsgang hvis",
- "ofTheFollowingMatch": "af det følgende matcher",
- "selectField": "Vælg felt",
- "addCondition": "Tilføj betingelse",
- "pageConditionsDescription": "Definer betingelserne for at vise \"Indsend\" eller \"Næste\" knappen for siden (valgfri).",
- "pageButtonConditionStatus": " %0% knapperne for denne side hvis %1% er af det følgende match:",
- "fieldsetConditionStatus": " %0% denne gruppe hvis %1% er af det følgende match:",
- "fieldConditionStatus": " %0% Dette spørgsmål hvis %1% er af det følgende match:",
- "empty": "empty"
- },
- "formThemes": {
- "noThemesAvailable": "Der er ingen tilgængelige temaer. Tilføj temaer til /views/partials/forms/themes"
- },
- "formWorkflows": {
- "workflowNameLabel": "Navn på arbejdsgang",
- "workflowNameDescription": "Angiv et beskrivende navn til din arbejdsgang",
- "activeLabel": "Aktiv",
- "activeDescription": "Aktiver eller deaktiver arbejdsgangen",
- "includeSensitiveDataLabel": "Inkluder følsomme data",
- "includeSensitiveDataDescription": "Skal følsomme data inkluderes når denne arbejdsgang udføres?",
- "submitMessage": "Send besked / GÃ¥ til side",
- "approve": "Godkend",
- "automatic": "automatisk",
- "noWorkflowsAdded": "Ingen arbejdsgange er tilføjet",
- "configureWorkflow": "Konfigurer arbejdsgang",
- "saveFailedTitle": "Lagring af arbejdsgang mislykkedes",
- "closeConfirmationTitle": "Bekræftelse",
- "closeConfirmationMessage": "Der er ændringer som ikke er blevet gemt. Er du sikker på at du vil lukke?",
- "chooseWorkflow": "Vælg arbejdsgang",
- "on": "Ved",
- "onSubmit": "Ved indsendelse",
- "onSubmitDescription": "Vi sørger for at udføre disse arbejdsgange for dig når formularen bliver afsendt",
- "onApprove": "Ved godkendelse",
- "onApproveDescription": "Disse arbejdsgange bliver udført når en besvarelse bliver godkendt",
- "onApproveAutomaticDescription": "Dette sker automatisk efter indsendelses-eventet med de nuværende formularindstillinger",
- "defaultWorkflowName": "Send besked / GÃ¥ til side",
- "defaultWorkflowDescription": "Vis en besked når formularen bliver indsendt eller gå til en Umbraco-side",
- "addWorkflow": "Tilføj arbejdsgang",
- "messageOnSubmit": "Besked ved indsendelse",
- "messageOnSubmitDescription": "Vis en besked når formularen er blevet indsendt",
- "messageOnSubmitIsHtmlToggleTextOn": "Formater besked i rig tekst",
- "messageOnSubmitIsHtmlToggleTextOff": "Formater besked i almindelig tekst",
- "goToPage": "GÃ¥ til side",
- "goToPageDescription": "Gå til en Umbraco-side når formularen er blevet indsendt"
- },
- "fieldSetColumns": {
- "title": "Kolonner",
- "setNumber": "Angiv hvor mange kolonner du ønsker at have i din gruppe.",
- "columnNumberDescription": "Lige nu har denne gruppe %0%.",
- "addColumn": "Tilføj kolonne"
- },
- "fieldSettings": {
- "namePlaceholder": "Angiv spørgsmål...",
- "descriptionPlaceholder": "Angiv hjælpetekst...",
- "requiredLabel": "Krævet etiket",
- "chooseAnswerType": "Vælg svartype",
- "sensitiveData": "Følsomme data",
- "sensitiveDataDescription": "Forhinder data fra at blive tilgået eller eksporteret hvis en bruger ikke har tilstrækkelige tilladelser.",
- "sensitiveDataLabel": "Ja, dette felt indeholder følsomme data",
- "allowedFileUploadTypes": "Tilladte filuploadtyper",
- "prevalues": "Foruddefinerede værdier",
- "prevaluesProvideWithSources": "Du skal enten angive en liste af værdier (foruddefinerede værdier) specifikt til dette felt, eller vælge en kilde til foruddefinerede værdier.",
- "prevaluesProvide": "Angiv en liste af værdier (foruddefinerede værdier) til dette felt.",
- "prevaluesItems": "Værdier",
- "prevaluesSource": "Kilde til foruddefinerede værdier",
- "pressEnterToAdd": "Tryk på enter for at tilføje en værdi",
- "settings": "Indstillinger",
- "mandatory": "Obligatorisk",
- "enterRegex": "Angiv et regulært udtryk",
- "invalidPlaceholder": "Skriv en besked for et ugyldigt felt...",
- "allowMultipleFileUploads": "Tillad upload af flere filer",
- "multipleFilesToggleTextOn": "Flere filer er tilladt",
- "multipleFilesToggleTextOff": "Kun en fil"
- },
- "formSettings": {
- "storeRecords": "Gem besvarelser",
- "storeRecordsDescription": "\n Afkryds denne boks for at gemme besvarelser i databasen.\n Dette vil give dig mulighed for at gennemgå og eksportere besvarelser via oversigten.\n Hvis du ikke vil gemme data (på grund af regler i din organisation), så skal du lade boksen være uafkrydset.\n ",
- "storeRecordsConfirm": "Ja, gem besvarelser i databasen så de kan gennemgås og blive eksporteret senere.",
- "captions": "Etiketter",
- "captionsDescription": "Ændr knappernes etiketter for Send, Næste og Forrige.",
- "captionSubmitButton": "'Send' knappens etiket",
- "captionNextButton": "'Næste' knappens etiket",
- "captionPreviousButton": "'Forrige' knappens etiket",
- "styling": "Fremtoning",
- "stylingDescription": "Tilføj en eller flere klasser for at indhylle din formular hvilket muliggør brugerdefineret styling, deaktivere standard styling og indlæse aktiver med klient afhængigheder.",
- "formCssClass": "Formular CSS klasse",
- "disableDefaultStylesheet": "Deaktiver standard stylesheet",
- "loadWithClientDependency": "Indlæs aktiver med klient afhængigheder",
- "validation": "Validering",
- "validationDescription": "Skriv bedre valideringsbeskeder, fjern valideringsetiketter og ændr eller deaktiver etiketten for krævet/obligatorisk.",
- "mandatoryErrorMessage": "Fejlbesked ved obligatorisk",
- "mandatoryErrorMessageDescription": "Besked som vises når et obligatorisk felt ikke er blevet udfyldt",
- "invalidErrorMessage": "Fejlbesked ved ugyldig",
- "invalidErrorMessageDescription": "Besked som vises når et felt ikke er udfyldt korrekt",
- "showValidationSummary": "Vis valideringsresume",
- "hideFieldValidationLabels": "Skjul felt valideringsetiketter",
- "markFields": "Marker felter",
- "markFieldsNoIndicator": "Ingen indikator",
- "markMandatoryFields": "Marker obligatoriske felter",
- "markOptionalFields": "Marker valgfri felter",
- "indicator": "Indikator",
- "changeIndicatorSymbol": "Ændr indikator-symbolet for obligatoriske felter",
- "autocomplete": "Autocomplete",
- "autocompleteDescription": "Tilføj en attribut til at styre formularens overordnede autocomplete opførsel.",
- "autocompleteNone": "Ingen",
- "autocompleteOn": "Tændt",
- "autocompleteOff": "Slukket",
- "moderation": "Moderation",
- "moderationDescription": "Tillad at besvarelser kan blive ændres efter indsendelse. Dette bruges oftes for besvarelser som er offentlige tilgængelige, såsom kommentarer til blog posteringer eller indsendelser til en social kompagne.",
- "enablePostModeration": "Tillad moderation efter indsendelse",
- "fieldsDisplayed": "Felter vises",
- "fieldsDisplayedDescription": "Vælg, hvilke felter der skal vises på listen over formularposter.",
- "displayDefaultFields": "Vis standardfelter",
- "displayDefaultFieldsDescription": "Som standard vises værdierne for de første tre felter i formularen sammen med nogle systemfelter.",
- "formFields": "Formularfelter",
- "systemFields": "System felter",
- "noSelectedDisplayFields": "Der er ikke valgt nogen felter til visning.",
- "resetDisplayDefaultFieldsMessage": "Er du sikker på, at du vil vende tilbage til standardfeltet for visning? De brugerdefinerede felter, du har valgt, vil blive fjernet, når formularen er gemt.",
- "dataRetention": "Opbevaring af data",
- "dataRetentionDescription": "Definer, hvor længe formularindsendelser skal opbevares, før de automatisk slettes.",
- "dataRetentionForSubmittedRecords": "Antal dage til at opbevare indsendte optegnelser",
- "dataRetentionForApprovedRecords": "Antal dage til at opbevare godkendte optegnelser",
- "dataRetentionRetainSubmittedRecords": "Behold indsendte optegnelser for evigt",
- "dataRetentionRetainApprovedRecords": "Behold godkendte optegnelser for evigt",
- "scheduledRecordDeletionNotEnabled": "Den planlagte sletningstjeneste kører ikke i øjeblikket. Disse indstillinger træder ikke i kraft, før tjenesten er aktiveret i konfigurationen."
- },
- "formSecurity": {
- "saveSuccessTitle": "Bruger formularsikkerhed gemt",
- "saveErrorTitle": "Bruger formularsikkerhed mislykkedes med at gemme",
- "manageFormsLabel": "Administrer formularer",
- "manageFormsDescription": "Tillad eller afvis adgang til at administrere formularer",
- "manageWorkflowsLabel": "Administrer arbejdsgange",
- "manageWorkflowsDescription": "Tillad eller afvis adgang til at administrere arbejdsgange for alle formularer",
- "manageDatasourcesLabel": "Administrer datakilder",
- "manageDatasourcesDescription": "Tillad eller afvis adgang til at administrere datakilder for alle formularer",
- "managePrevalueSourcesLabel": "Administrer kilde til foruddefinerede værdier",
- "managePrevalueSourcesDescription": "Tillad eller afvis adgang til at administrere kilder til foruddefinerede værdier for alle formularer",
- "manageIndividualFormsLabel": "Formular sikkerhed",
- "manageIndividualFormsDescription": "Tillad eller afvis adgang til individuelle formularer",
- "startFolders": "Start mapper",
- "startFoldersDescription": "Definer rodmappen eller mapperne for brugeren",
- "selectNewStartFolders": "Select Start Folders",
- "formName": "Formularnavn",
- "hasAccess": "Har adgang",
- "viewEntriesLabel": "Se indlæg",
- "viewEntriesDescription": "Giv eller nægt adgang til visning af indsendte bidrag",
- "editEntriesLabel": "Rediger poster",
- "editEntriesDescription": "Giv eller nægt adgang til redigering af indsendte indlæg",
- "deleteTitle": "Slet brugersikkerhed: %0%",
- "deleteUserRecordNote": "Ved at slette brugersikkerhedsposten vil brugerens tilladelser blive afledt fra de brugergrupper, som de er medlemmer af.",
- "deleteSuccessMessage": "Brugersikkerhedspost slettet.",
- "deleteFailedMessage": "Brugersikkerhedsposten kunne ikke slettes.",
- "createTitle": "Skab brugersikkerhed",
- "createUserRecordNote": "Når en brugerpost oprettes, vil den have forrang frem for eventuelle tilladelser, der er tildelt på brugergruppeniveau.",
- "selectUser": "Vælg bruger",
- "allUsersHaveRecords": "Alle brugere har allerede oprettet sikkerhedsregistreringer.",
- "groupPermissions": "Gruppetilladelser",
- "userPermissions": "Brugertilladelser"
- },
- "formDataSources": {
- "typeDescription": "Vælg datakildetype",
- "createForm": "Skab formular",
- "formName": "Formular navn",
- "selectFields": "Vælg felter",
- "selectFieldsDescription": "Felter fra datakilden som du ønsker at inkludere på formularen.",
- "setupForeignKeys": "Indstil fremmednøgler",
- "setupForeignKeysDescription": "Vælg værdikolonnen til fremmednøgle-felter.",
- "selectType": "Vælg type",
- "selectTypeDescription": "Felttype du ønsker at bruge til de inkluderede felter (eller default værdi).",
- "defaultValue": "Default værdi",
- "deleteConfirm": "Er du sikker på at du vil slette datakilden %0%?",
- "saveSuccessTitle": "Datakilde gemt",
- "saveErrorTitle": "Lagring af datakilde mislykkedes",
- "accessDeniedMessage": "Du har ikke adgang til at redigere datakilder"
- },
- "formPrevalueSources": {
- "typeDescription": "Vælg typen af kilden for foruddefinerede værdier",
- "deleteConfirm": "ER du sikker på at du vil slette kilden for foruddefinerede værdier %0%?",
- "saveSuccessTitle": "Kilde til foruddefinerede værdier gemt",
- "saveErrorTitle": "Lagring af kilde til foruddefinerede værdier mislykkedes",
- "accessDeniedMessage": "Du har ikke adgang til at redigere datakilder for foruddefinerede værdier"
- },
- "formProviderFieldTypes": {
- "checkboxName": "Afkrydsningsfelt",
- "checkboxDescription": "Gengiver et afkrydsningsfelt.",
- "checkboxDefaultValueLabel": "Standard værdi",
- "checkboxDefaultValueDescription": "Angiv en standard værdi.",
- "multipleChoiceName": "Flere svarmuligheder",
- "multipleChoiceDescription": "Gengiver en samling af afkrydsningsfelter hvor det er muligt at vælge flere svarmuligheder.",
- "multipleChoiceDefaultValueLabel": "Standard værdi",
- "multipleChoiceDefaultValueDescription": "Angiv en standard værdi.",
- "multipleChoiceShowLabelLabel": "Vis etiket",
- "multipleChoiceShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
- "dataConsentName": "Data samtykke",
- "dataConsentDescription": "Gengiver et felt der spørger om brugeren samtykke til at indsamle data.",
- "dataConsentAcceptCopyLabel": "Accept kopi",
- "dataConsentAcceptCopyDescription": "Teksten der benyttes til at bekræfte samtykket.",
- "dataConsentShowLabelLabel": "Vis etiket",
- "dataConsentShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
- "dateName": "Dato",
- "dateDescription": "Gengiver en datovælger.",
- "datePlaceholderLabel": "Stedfortrædende værdi",
- "datePlaceholderDescription": "Angiv en stedfortrædende værdi.",
- "dropdownName": "Dropdown-menu",
- "dropdownDescription": "Gengiver en liste af værdier i en dropdown-menu",
- "dropdownDefaultValueLabel": "Standard værdi",
- "dropdownDefaultValueDescription": "Angiv en standard værdi",
- "dropdownAllowMultipleSelectionsLabel": "Tillad flere svarmuligheder",
- "dropdownAllowMultipleSelectionsDescription": "Angiver om det er tilladt at vælge flere svar fra listen.",
- "dropdownShowLabelLabel": "Vis etiket",
- "dropdownShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
- "dropdownAutocompleteAttributeLabel": "Autocomplete attribut",
- "dropdownAutocompleteAttributeDescription": "Angiv en valgfri værdi til autocomplete attributten.",
- "dropdownSelectPromptLabel": "Spørg om valg",
- "dropdownSelectPromptDescription": "Angiv eventuelt en prompt for brugerens valg.",
- "fileUploadName": "Fil upload",
- "fileUploadDescription": "Gengiver et felt til fil-upload, som tillader at filer kan uploades.",
- "hiddenName": "Skjult felt",
- "hiddenDescription": "Gengiver et skjult felt.",
- "hiddenDefaultValueLabel": "Standard værdi",
- "hiddenDefaultValueDescription": "Angiv en standard værdi",
- "passwordName": "Kodeord",
- "passwordDescription": "Gengiver et felt til kodeord.",
- "passwordPlaceholderLabel": "Stedfortrædende værdi",
- "passwordPlaceholderDescription": "Angiv en stedfortrædende værdi.",
- "singleChoiceName": "Enkelt valg",
- "singleChoiceDescription": "Gengiver en liste af radio knapper som kun tillader at vælge en enkelt værdi.",
- "singleChoiceDefaultValueLabel": "Standard værdi",
- "singleChoiceDefaultValueDescription": "Angiv en standard værdi",
- "singleChoiceShowLabelLabel": "Vis etiket",
- "singleChoiceShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
- "recaptcha2Name": "reCAPTCHA v2",
- "recaptcha2Description": "Google reCAPTCHA v2.",
- "recaptcha2ThemeLabel": "Tema",
- "recaptcha2ThemeDescription": "reCAPTCHA v2 tema.",
- "recaptcha2SizeLabel": "Størrelse",
- "recaptcha2SizeDescription": "reCAPTCHA v2 størrelse.",
- "recaptcha2ErrorMessageLabel": "Fejlbesked",
- "recaptcha2ErrorMessageDescription": "Den fejlbesked der vises når brugeren ikke består reCAPTCHA-kontrollen.",
- "reCAPTCHAV3WithScoreName": "reCAPTCHA v3 med point",
- "reCAPTCHAV3WithScoreDescription": "Google reCAPTCHA v3 med point grænseværdi",
- "reCAPTCHAV3WithScoreScoreThresholdLabel": "Point grænseværdi",
- "reCAPTCHAV3WithScoreScoreThresholdDescription": "En fastlagt reCAPTCHA v3 pointsætning mellem 0 og 1, hvor besvarelser der scorer over vil blive accepteret. En højere score fanger flere spam-besvarelser, men øger også risikoen for at afvise gyldige besvarelser. For de fleste sites er 0.5 et fornuftigt valg.",
- "reCAPTCHAV3WithScoreScoreErrorMessageLabel": "Fejlbesked",
- "reCAPTCHAV3WithScoreScoreErrorMessageDescription": "Den fejlbesked der vises når brugeren ikke består reCAPTCHA-kontrollen.",
- "reCAPTCHAV3WithScoreScoreSaveScoreLabel": "Gem score",
- "reCAPTCHAV3WithScoreScoreSaveScoreDescription": "Gem den beregnede score med formularen.",
- "richTextName": "Formatteret tekst",
- "richTextDescription": "Giv noget beskrivende tekst med formatering.",
- "richTextHtmlLabel": "Formatteret tekst",
- "richTextHtmlDescription": "Indtast din formaterede tekst",
- "titleAndDescriptionName": "Titel og beskrivelse",
- "titleAndDescriptionDescription": "Dette er brugt til at angive noget beskrivende tekst.",
- "titleAndDescriptionCaptionLabel": "Overskrift",
- "titleAndDescriptionCaptionDescription": "Angiv en overskrift.",
- "titleAndDescriptionBodyTextLabel": "Brødtekst",
- "titleAndDescriptionBodyTextDescription": "Angiv en brødtekst.",
- "titleAndDescriptionCaptionTagLabel": "Titel HTML-element",
- "titleAndDescriptionCaptionTagDescription": "Vælg det HTML-element, der skal bruges ved gengivelse af overskriften.",
- "titleAndDescriptionShowLabelLabel": "Vis etiket",
- "titleAndDescriptionShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
- "longAnswerName": "Langt svar",
- "longAnswerDescription": "Gengiver et textarea, beregnet til længere svar.",
- "longAnswerDefaultValueLabel": "Standard værdi",
- "longAnswerDefaultValueDescription": "Angiv en standard værdi",
- "longAnswerPlaceholderLabel": "Stedfortrædende værdi",
- "longAnswerPlaceholderDescription": "Angiv en stedfortrædende værdi.",
- "longAnswerShowLabelLabel": "Vis etiket",
- "longAnswerShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
- "longAnswerAutocompleteAttributeLabel": "Autocomplete attribut",
- "longAnswerAutocompleteAttributeDescription": "Angiv en valgfri værdi til autocomplete attributten.",
- "longAnswerNumberOfRowsLabel": "Antal af rækker",
- "longAnswerNumberOfRowsDescription": "Angiv antallet af rækker der vises for en besvarelse.",
- "longAnswerMaximumLengthLabel": "Maksimal længde",
- "longAnswerMaximumLengthDescription": "Indtast det maksimale antal tegn, der accepteres.",
- "shortAnswerName": "Kort svar",
- "shortAnswerDescription": "Gengiver et tekst input felt, til korte svar.",
- "shortAnswerDefaultValueLabel": "Standard værdi",
- "shortAnswerDefaultValueDescription": "Angiv en standard værdi",
- "shortAnswerPlaceholderLabel": "Stedfortrædende værdi",
- "shortAnswerPlaceholderDescription": "Angiv en stedfortrædende værdi.",
- "shortAnswerShowLabelLabel": "Vis etiket",
- "shortAnswerShowLabelDescription": "Angiver om et felts etiket skal vises når formularen bliver gengivet.",
- "shortAnswerMaximumLengthLabel": "Maksimal længde",
- "shortAnswerMaximumLengthDescription": "Indtast det maksimale antal tegn, der accepteres.",
- "shortAnswerFieldTypeLabel": "Felttype",
- "shortAnswerFieldTypeDescription": "Vælg den forventede type information.",
- "shortAnswerAutocompleteAttributeLabel": "Autocomplete attribut",
- "shortAnswerAutocompleteAttributeDescription": "Angiv en valgfri værdi til autocomplete attributten."
- },
- "formProviderWorkflows": {
- "changeRecordStateName": "Ændr på besvarelse",
- "changeRecordStateDescription": "Ændrer på en besvarelse underbearbejdelse når der matches på et/flere ord.",
- "changeRecordStateWordsLabel": "Ord",
- "changeRecordStateWordsDescription": "Kommasepareret liste af ord der sammenlignes imod.",
- "changeRecordStateActionLabel": "Handling",
- "changeRecordStateActionDescription": "Hvad der sker hvis der er et match.",
- "postAsXMLName": "Send som XML",
- "postAsXMLDescription": "Sender formularen som XML til en URL.",
- "postAsXMLUrlLabel": "URL",
- "postAsXMLUrlDescription": "Angiv URL'en der skal sendes til.",
- "postAsXMLMethodLabel": "Metode",
- "postAsXMLMethodDescription": "POST eller GET.",
- "postAsXMLXsltFileLabel": "XSLT-fil",
- "postAsXMLXsltFileDescription": "Transformer XML før afsendelse.",
- "postAsXMLFieldsLabel": "Felter",
- "postAsXMLFieldsDescription": "Kortlæg de nødvendige felter.",
- "postAsXMLUsernameLabel": "Bruger",
- "postAsXMLUsernameDescription": "(valgfri)",
- "postAsXMLPasswordLabel": "Kodeord",
- "postAsXMLPasswordDescription": "(valgfri)",
- "sendFormToURLName": "Send formular til URL",
- "sendFormToURLDescription": "Sender formularen til en URL, enten via HTTP POST eller GET.",
- "sendFormToURLUrlLabel": "URL",
- "sendFormToURLUrlDescription": "Angiv URL'en der skal sendes til.",
- "sendFormToURLMethodLabel": "Metode",
- "sendFormToURLMethodDescription": "POST eller GET.",
- "sendFormToURLStandardFieldsLabel": "Standard Felter",
- "sendFormToURLStandardFieldsDescription": "Kortlæg hvilkensomhelst standard formular information til afsendelse.",
- "sendFormToURLFieldsLabel": "Felter",
- "sendFormToURLFieldsDescription": "Kortlæg de nødvendige felter.",
- "sendFormToURLUsernameLabel": "Bruger",
- "sendFormToURLUsernameDescription": "(valgfri)",
- "sendFormToURLPasswordLabel": "Kodeord",
- "sendFormToURLPasswordDescription": "(valgfri)",
- "saveAsAnXMLFileName": "Gem som en XML-fil",
- "saveAsAnXMLFileDescription": "Gemmer besvarelsen af formularen som en XML-fil via XSLT.",
- "saveAsAnXMLFilePathLabel": "Sti",
- "saveAsAnXMLFilePathDescription": "Angiver stien til placeringen af filen.",
- "saveAsAnXMLFileExtensionLabel": "Endelse",
- "saveAsAnXMLFileExtensionDescription": "Filendelsen.",
- "saveAsAnXMLFileXsltFileLabel": "XSLT-fil",
- "saveAsAnXMLFileXsltFileDescription": "Transformer XML før den gemmes.",
- "saveAsUmbracoContentNodeName": "Gem som Umbraco inholdsnode",
- "saveAsUmbracoContentNodeDescription": "Gemmer formularværdierne som indholdsnoder ved hjælp af en specifik dokumenttype.",
- "saveAsUmbracoContentNodeFieldsLabel": "Dokumenttype",
- "saveAsUmbracoContentNodeFieldsDescription": "Kortlæg dokumenttype.",
- "saveAsUmbracoContentNodePublishLabel": "Udgiv",
- "saveAsUmbracoContentNodePublishDescription": "Udgiv noden øjeblikkeligt.",
- "saveAsUmbracoContentNodeRootNodeLabel": "Gem placering",
- "saveAsUmbracoContentNodeRootNodeDescription": "Vælg hvor den oprettede inholdsnode skal gemmes til.",
- "sendEmailName": "Send email",
- "sendEmailDescription": "Sender resultatet af en formular til en emailadresse.",
- "sendEmailEmailLabel": "Modtager email",
- "sendEmailEmailDescription": "Angiv modtagerens emailadresse(r).",
- "sendEmailCcEmailLabel": "CC Email",
- "sendEmailCcEmailDescription": "Angiv CC email addresser (hvis den er nødvendig).",
- "sendEmailBccEmailLabel": "BCC Email",
- "sendEmailBccEmailDescription": "Angiv BCC email addresser (hvis den er nødvendig).",
- "sendEmailSenderEmailLabel": "Afsenderemail",
- "sendEmailSenderEmailDescription": "Angiv afsenderemail (hvis feltet er blank benyttes indstillingen fra konfiguration).",
- "sendEmailReplyToEmailLabel": "Svar-Emailadresse",
- "sendEmailReplyToEmailDescription": "Angiv den emailadresse som der bruges som svaradresse (hvis nødvendigt).",
- "sendEmailSubjectLabel": "Emne",
- "sendEmailSubjectDescription": "Angiv emnet.",
- "sendEmailMessageLabel": "Besked",
- "sendEmailMessageDescription": "Angiv en introduktion.",
- "sendEmailAttachmentLabel": "Vedhæftning",
- "sendEmailAttachmentDescription": "Vedhæft en filupload til emailen.",
- "sendEmailWithTemplateRazorName": "Send email med skabelon (Razor)",
- "sendEmailWithTemplateRazorDescription": "Send formularens besvarelse til en/flere emailadresse/r ved hjælp af en Razor .cshtml skabelon.",
- "sendEmailWithTemplateRazorEmailLabel": "Modtager email",
- "sendEmailWithTemplateRazorEmailDescription": "Angiv modtagerens emailadresse(r).",
- "sendEmailWithTemplateRazorCcEmailLabel": "CC Email",
- "sendEmailWithTemplateRazorCcEmailDescription": "Angiv CC email addresser (hvis den er nødvendig).",
- "sendEmailWithTemplateRazorBccEmailLabel": "BCC Email",
- "sendEmailWithTemplateRazorBccEmailDescription": "Angiv BCC email addresser (hvis den er nødvendig).",
- "sendEmailWithTemplateRazorSenderEmailLabel": "Afsenderemail",
- "sendEmailWithTemplateRazorSenderEmailDescription": "Angiv afsenderemail (hvis feltet er blank benyttes indstillingen fra konfiguration).",
- "sendEmailWithTemplateRazorReplyToEmailLabel": "Svar-Emailadresse",
- "sendEmailWithTemplateRazorReplyToEmailDescription": "Angiv den emailadresse som der bruges som svaradresse (hvis nødvendigt).",
- "sendEmailWithTemplateRazorSubjectLabel": "Emne",
- "sendEmailWithTemplateRazorSubjectDescription": "Angiv emnet",
- "sendEmailWithTemplateRazorRazorViewFilePathLabel": "Email Skabelon",
- "sendEmailWithTemplateRazorRazorViewFilePathDescription": "Stien til det Razor view som du vil bruge til at generere emailen. Emailskabeloner er gemt under /views/partials/forms/emails.",
- "sendEmailWithTemplateRazorHeaderHtmlLabel": "Formateret overskriftstekst",
- "sendEmailWithTemplateRazorHeaderHtmlDescription": "Indtast formateret tekst, der skal gengives, i e-mail-headeren.",
- "sendEmailWithTemplateRazorFooterHtmlLabel": "Formateret sidefodstekst",
- "sendEmailWithTemplateRazorFooterHtmlDescription": "Indtast formateret tekst, der skal gengives, i e-mail-sidefoden.",
- "sendEmailWithTemplateRazorAttachmentLabel": "Vedhæftning",
- "sendEmailWithTemplateRazorAttachmentDescription": "Vedhæft en filupload til emailen.",
- "sendXSLTTransformedEmailName": "Send XSLT transformed email",
- "sendXSLTTransformedEmailDescription": "Send den resultatet af formularen til en emailadresse.",
- "sendXSLTTransformedEmailEmailLabel": "Modtager email",
- "sendXSLTTransformedEmailEmailDescription": "Angiv modtagerens emailadresse(r).",
- "sendXSLTTransformedEmailCcEmailLabel": "CC Email",
- "sendXSLTTransformedEmailCcEmailDescription": "Angiv CC email addresser (hvis den er nødvendig).",
- "sendXSLTTransformedEmailBccEmailLabel": "BCC Email",
- "sendXSLTTransformedEmailBccEmailDescription": "Angiv BCC email addresser (hvis den er nødvendig).",
- "sendXSLTTransformedEmailSenderEmailLabel": "Afsenderemail",
- "sendXSLTTransformedEmailSenderEmailDescription": "Angiv afsenderemail (hvis feltet er blank benyttes indstillingen fra konfiguration).",
- "sendXSLTTransformedEmailReplyToEmailLabel": "Svar-Emailadresse",
- "sendXSLTTransformedEmailReplyToEmailDescription": "Angiv den emailadresse som der bruges som svaradresse (hvis nødvendigt).",
- "sendXSLTTransformedEmailSubjectLabel": "Emne",
- "sendXSLTTransformedEmailSubjectDescription": "Angiv emnet",
- "sendXSLTTransformedEmailXsltFileLabel": "XSLT-fil",
- "sendXSLTTransformedEmailXsltFileDescription": "Transformer XML før emailen sendes.",
- "slackLegacyName": "Slack (Legacy)",
- "slackLegacyDescription": "Sender formularens data til en specifik kanal på slack ved hjælp af legacy tokens",
- "slackLegacyTokenLabel": "API Token",
- "slackLegacyTokenDescription": "Slack API token.",
- "slackLegacyChannelLabel": "Kanal",
- "slackLegacyChannelDescription": "Slack-kanal der skal sendes til.",
- "slackLegacyUsernameLabel": "Brugernavn",
- "slackLegacyUsernameDescription": "Det brugernavn eller bot som er afsender.",
- "slackLegacyAvatarUrlLabel": "Avatar URL",
- "slackLegacyAvatarUrlDescription": "Den fulde URL (inklusiv http/https) til avatar-billedet.",
- "slackName": "Slack",
- "slackDescription": "Sender formularens data til en specifik kanal på slack ved hjælp af webhook.",
- "slackWebhookUrlLabel": "Webhook URL",
- "slackWebhookUrlDescription": "Slack Webhook URL."
- },
- "formProviderDataSources": {
- "sQLDatabaseName": "SQL Database",
- "sQLDatabaseDescription": "Forbind til hvilken som helst databasetabel der understøtter OLEDB og konstruer en datakilde på baggrund af den.",
- "sQLDatabaseConnectionLabel": "Forbindelsesstreng",
- "sQLDatabaseConnectionDescription": "OleDB kompatibel forbindelsesstreng.",
- "sQLDatabaseTableLabel": "Tabelnavn",
- "sQLDatabaseTableDescription": "Databasens tabelnavn."
- },
- "formProviderPrevalueSources": {
- "dataSourceName": "Datakilde",
- "dataSourceDescription": "Gemmer på foruddefinerede værdier i tabellen til foruddefinerede værdier.",
- "getValuesFromTextfileName": "Få værdier fra en tekstfil",
- "getValuesFromTextfileDescription": "Upload en tekstfil der indeholder foruddefinerede værdier.",
- "getValuesFromTextfileTextFileLabel": "Tekstfil",
- "getValuesFromTextfileTextFileDescription": "Fil der indeholder de foruddefinerede værdier (Opdelt ved linjeskift).",
- "umbracoDocumentsName": "Umbracodokumenter",
- "umbracoDocumentsDescription": "Bruger noder fra en specifik kilde som foruddefinerede værdier.",
- "umbracoDocumentsRootNodeLabel": "Rodnode",
- "umbracoDocumentsRootNodeDescription": "Kilde der hentes noder fra.",
- "umbracoDocumentsUseCurrentPageLabel": "Brug den nuværende side som rod",
- "umbracoDocumentsUseCurrentPageDescription": "Virker ikke i forhåndsvisning.",
- "umbracoDocumentsDocTypeLabel": "Dokumenttype",
- "umbracoDocumentsDocTypeDescription": "Typen af noder du vil bruge.",
- "umbracoDocumentsValueFieldLabel": "Værdi felt",
- "umbracoDocumentsValueFieldDescription": "Vælg hvilket felt der skal bruges til værdien af ​​præværdien.",
- "umbracoDocumentsListGrandChildrenLabel": "Vis alle undersider",
- "umbracoDocumentsListGrandChildrenDescription": "Begræns ikke til underelementer, men inkludér yderligere niveauer.",
- "umbracoDocumentsOrderByLabel": "Sortér efter",
- "umbracoDocumentsOrderByDescription": "Vælg hvordan listen med foruddefinerede værdier skal sorteres.",
- "sQLDatabaseName": "SQL Database",
- "sQLDatabaseDescription": "Forbinder til en OLEDB-kompatibel databasetabel og skaber en kilde af foruddefinerede værdier derfra.",
- "sQLDatabaseConnectionLabel": "Forbindelsesstreng",
- "sQLDatabaseConnectionDescription": "OleDB kompatibel forbindelsesstreng.",
- "sQLDatabaseConnectionStringLabel": "Forbindelsesstreng fra web.config",
- "sQLDatabaseConnectionStringDescription": "Vælg forbindelsesstreng (den skal være OleDB-kompatibel).",
- "sQLDatabaseTableNameLabel": "Tabelnavn",
- "sQLDatabaseTableNameDescription": "",
- "sQLDatabaseKeyColumnLabel": "Nøgle-kolonne",
- "sQLDatabaseKeyColumnDescription": "Kolonne der indeholder nøglerne.",
- "sQLDatabaseValueColumnLabel": "Værdi-kolonne",
- "sQLDatabaseValueColumnDescription": "Kolonne der indeholder værdierne.",
- "sQLDatabaseCaptionColumnLabel": "Værdi-billedtekst",
- "sQLDatabaseCaptionColumnDescription": "Kolonne der indeholder billedtekster.",
- "umbracoDataTypePreValueName": "Umbraco datatype foruddefinerede værdier",
- "umbracoDataTypePreValueDescription": "Forbinder til en Umbraco datatype og dens samling af foruddefinerede værdier.",
- "umbracoDataTypePreValuesDataTypeIdLabel": "Datatype",
- "umbracoDataTypePreValuesDataTypeIdDescription": "Datatype der skal bruges."
- },
- "formProviderExportTypes": {
- "excelFileName": "Excel-fil (indsendte værdier)",
- "excelFileDescription": "Eksporterer alle indsendte værdier for formularen til Excel i et format, der er nyttigt til integration med andre systemer.",
- "excelFileDisplayValuesName": "Excel-fil (værdier til visning)",
- "excelFileDisplayValuesDescription": "Eksporterer alle værdier for formularen til Excel i et format, der er nyttigt til at gennemgå dataene eller oprette en rapport. Billedtekster bruges til forudgående data, hvor de er tilgængelige.",
- "excelFileNameOsx": "Excel/Numbers-fil (indsendte værdier)",
- "excelFileDescriptionOsx": "Eksporterer alle indsendte værdier for formularen til Excel/Numbers i et format, der er nyttigt til integration med andre systemer.",
- "excelFileDisplayValuesNameOsx": "Excel/Numbers-fil (værdier til visning)",
- "excelFileDisplayValuesDescriptionOsx": "Eksporterer alle værdier for formularen til Excel/Numbers i et format, der er nyttigt til at gennemgå dataene eller oprette en rapport. Billedtekster bruges til forudgående data, hvor de er tilgængelige.",
- "saveAllUploadedFilesInDiskStructureName": "Gem alle uploadede filer (in disk structure)",
- "saveAllUploadedFilesInDiskStructureDescription": "Eksporterer alle filer uploaded via formular til et zip-arkiv, hvor filerne er organiseret som filerne er gemt på disken.",
- "saveAllUploadedFilesByEntryName": "Gem alle uploadede filer (efter besvarelse)",
- "saveAllUploadedFilesByEntryDescription": "Eksporterer alle filer uploaded via formular til et zip-arkiv, hvor filerne er organiseret per besvarelse i en undermappe."
- },
- "formRecordSetActions": {
- "deleteConfirm": "Er du sikker på at du vil slette disse besvarelser?"
- },
- "propertyEditorPicker": {
- "title": "Select Property Editor",
- "openPropertyEditorPicker": "Select Property Editor"
- },
- "healthcheck": {
- "checkSuccessMessage": "Value is set to the recommended value: '%0%'.",
- "checkErrorMessageDifferentExpectedValue": "Expected value '%1%' for '%2%' in configuration file '%3%', but\n found '%0%'.\n ",
- "checkErrorMessageUnexpectedValue": "Found unexpected value '%0%' for '%2%' in configuration file '%3%'.\n ",
- "macroErrorModeCheckSuccessMessage": "MacroErrors are set to '%0%'.",
- "macroErrorModeCheckErrorMessage": "MacroErrors are set to '%0%' which will prevent some or all pages in\n your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'.\n ",
- "httpsCheckValidCertificate": "Your website's certificate is valid.",
- "httpsCheckInvalidCertificate": "Certificate validation error: '%0%'",
- "httpsCheckExpiredCertificate": "Your website's SSL certificate has expired.",
- "httpsCheckExpiringCertificate": "Your website's SSL certificate is expiring in %0% days.",
- "healthCheckInvalidUrl": "Error pinging the URL %0% - '%1%'",
- "httpsCheckIsCurrentSchemeHttps": "You are currently %0% viewing the site using the HTTPS scheme.",
- "httpsCheckConfigurationRectifyNotPossible": "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to 'false' in\n your appSettings.json file. Once you access this site using the HTTPS scheme, that should be set to 'true'.\n ",
- "httpsCheckConfigurationCheckResult": "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to '%0%' in your\n appSettings.json file, your cookies are %1% marked as secure.\n ",
- "compilationDebugCheckSuccessMessage": "Debug compilation mode is disabled.",
- "compilationDebugCheckErrorMessage": "Debug compilation mode is currently enabled. It is recommended to\n disable this setting before go live.\n ",
- "umbracoApplicationUrlCheckResultTrue": "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is set to %0% .",
- "umbracoApplicationUrlCheckResultFalse": "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is not set.",
- "clickJackingCheckHeaderFound": "The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was found.",
- "clickJackingCheckHeaderNotFound": "The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.",
- "noSniffCheckHeaderFound": "The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was found.",
- "noSniffCheckHeaderNotFound": "The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was not found.",
- "hSTSCheckHeaderFound": "The header Strict-Transport-Security , also known as the HSTS-header, was found.",
- "hSTSCheckHeaderNotFound": "The header Strict-Transport-Security was not found.",
- "hSTSCheckHeaderFoundOnLocalhost": "The header Strict-Transport-Security , also known as the HSTS-header, was found. This header should not be present on localhost. ",
- "hSTSCheckHeaderNotFoundOnLocalhost": "The header Strict-Transport-Security was not found. This header should not be present on localhost.",
- "xssProtectionCheckHeaderFound": "The header X-XSS-Protection was found. It is recommended not to add this header to your website . \n You can read about this on the Mozilla website ",
- "xssProtectionCheckHeaderNotFound": "The header X-XSS-Protection was not found.",
- "excessiveHeadersFound": "The following headers revealing information about the website technology were found: %0% .",
- "excessiveHeadersNotFound": "No headers revealing information about the website technology were found.\n ",
- "smtpMailSettingsNotFound": "The 'Umbraco:CMS:Global:Smtp' configuration could not be found.",
- "smtpMailSettingsHostNotConfigured": "The 'Umbraco:CMS:Global:Smtp:Host' configuration could not be\n found.\n ",
- "smtpMailSettingsConnectionSuccess": "SMTP settings are configured correctly and the service is operating\n as expected.\n ",
- "smtpMailSettingsConnectionFail": "The SMTP server configured with host '%0%' and port '%1%' could not be\n reached. Please check to ensure the SMTP settings in the configuration 'Umbraco:CMS:Global:Smtp' are correct.\n ",
- "notificationEmailsCheckSuccessMessage": "Notification email has been set to %0% .",
- "notificationEmailsCheckErrorMessage": "Notification email is still set to the default value of %0% .",
- "checkGroup": "Check group",
- "helpText": "\n The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button.\n You can add your own health checks, have a look at the documentation for more information about custom health checks.
\n "
- },
- "nuCache": {
- "refreshStatus": "Refresh status",
- "memoryCache": "Memory Cache",
- "memoryCacheDescription": "\n This button lets you reload the in-memory cache, by entirely reloading it from the database\n cache (but it does not rebuild that database cache). This is relatively fast.\n Use it when you think that the memory cache has not been properly refreshed, after some events\n triggered—which would indicate a minor Umbraco issue.\n (note: triggers the reload on all servers in an LB environment).\n ",
- "reload": "Reload",
- "databaseCache": "Database Cache",
- "databaseCacheDescription": "\n This button lets you rebuild the database cache, ie the content of the cmsContentNu table.\n Rebuilding can be expensive. \n Use it when reloading is not enough, and you think that the database cache has not been\n properly generated—which would indicate some critical Umbraco issue.\n ",
- "rebuild": "Rebuild",
- "internals": "Internals",
- "internalsDescription": "\n This button lets you trigger a NuCache snapshots collection (after running a fullCLR GC).\n Unless you know what that means, you probably do not need to use it.\n ",
- "collect": "Collect",
- "publishedCacheStatus": "Published Cache Status",
- "caches": "Caches"
- },
- "profiling": {
- "performanceProfiling": "Performance profiling",
- "performanceProfilingDescription": "\n \n Umbraco currently runs in debug mode. This means you can use the built-in performance profiler to assess the performance when rendering pages.\n
\n \n If you want to activate the profiler for a specific page rendering, simply add umbDebug=true to the querystring when requesting the page.\n
\n \n If you want the profiler to be activated by default for all page renderings, you can use the toggle below.\n It will set a cookie in your browser, which then activates the profiler automatically.\n In other words, the profiler will only be active by default in your browser - not everyone else's.\n
\n ",
- "activateByDefault": "Activate the profiler by default",
- "reminder": "Friendly reminder",
- "reminderDescription": "\n \n You should never let a production site run in debug mode. Debug mode is turned off by setting Umbraco:CMS:Hosting:Debug to false in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n ",
- "profilerEnabledDescription": "\n \n Umbraco currently does not run in debug mode, so you can't use the built-in profiler. This is how it should be for a production site.\n
\n \n Debug mode is turned on by setting Umbraco:CMS:Hosting:Debug to true in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n "
- },
- "settingsDashboardVideos": {
- "trainingHeadline": "Hours of Umbraco training videos are only a click away",
- "trainingDescription": "\n Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos
\n ",
- "getStarted": "To get you started"
- },
- "settingsDashboard": {
- "start": "Start here",
- "startDescription": "This section contains the building blocks for your Umbraco site. Follow the below\n links to find out more about working with the items in the Settings section\n ",
- "more": "Find out more",
- "bulletPointOne": "\n Read more about working with the items in Settings in the Documentation section of Our Umbraco\n ",
- "bulletPointTwo": "\n Ask a question in the Community Forum \n ",
- "bulletPointTutorials": "\n Watch our free tutorial videos on the Umbraco Learning Base \n ",
- "bulletPointFour": "\n Find out about our productivity boosting tools and commercial support \n ",
- "bulletPointFive": "\n Find out about real-life training and certification opportunities\n "
- },
- "startupDashboard": {
- "fallbackHeadline": "Welcome to The Friendly CMS",
- "fallbackDescription": "Thank you for choosing Umbraco - we think this could be the beginning of something\n beautiful. While it may feel overwhelming at first, we've done a lot to make the learning curve as smooth and fast\n as possible.\n "
- },
- "analytics": {
- "consentForAnalytics": "Consent for telemetry data",
- "analyticsLevelSavedSuccess": "Telemetry level saved!",
- "analyticsDescription": "\n In order to improve Umbraco and add new functionality based on as relevant information as possible,\n we would like to collect system- and usage information from your installation.\n Aggregate data will be shared on a regular basis as well as learnings from these metrics.\n Hopefully, you will help us collect some valuable data.\n \n We WILL NOT collect any personal data such as content, code, user information, and all data will be fully anonymized.\n ",
- "minimalLevelDescription": "We will only send an anonymized site ID to let us know that the site exists.",
- "basicLevelDescription": "We will send an anonymized site ID, Umbraco version, and packages installed",
- "detailedLevelDescription": "\n We will send:\n \n Anonymized site ID, Umbraco version, and packages installed. \n Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use. \n System information: Webserver, server OS, server framework, server OS language, and database provider. \n Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode. \n \n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n By choosing \"Detailed\" you agree to current and future anonymized information being collected. \n "
- },
- "umbId": {
- "editProfile": "Edit your Umbraco ID profile",
- "changePassword": "Change your Umbraco ID password"
- },
- "deployManagementDashboard": {
- "refreshStatus": "Refresh Status",
- "deployStatus": "Deploy Status",
- "deployOperations": "Deploy Operations",
- "triggerOperation": "Trigger Operation",
- "version": "Version",
- "status": "Status",
- "operationTime": "Last operation time",
- "schemaComparison": "Schema Comparison",
- "configurationDetails": "Configuration Details",
- "updateUmbracoSchemaFromDataFiles": "Update Umbraco Schema From Data Files",
- "updateUmbracoSchemaFromDataFilesDescription": "Update the Umbraco schema based on the information contained in the .uda files on disk.",
- "schemaDeployment": "Update Umbraco Schema",
- "exportSchemaToDataFiles": "Export Schema To Data Files",
- "exportSchemaToDataFilesDescription": "Extract the schema from Umbraco and output it to the .uda files on disk.",
- "exportSchema": "Export Schema",
- "clearCachedSignatures": "Clear Cached Signatures",
- "clearCachedSignaturesDescription": "\n Clear the cached artifact signatures from the Umbraco environment.\n This should not be necessary in normal use. This may solve reports of schema mismatches when transferring content between environments that have been aligned.\n ",
- "clearSignatures": "Clear Signatures",
- "setCachedSignatures": "Set Cached Signatures",
- "setCachedSignaturesDescription": "\n Sets the cached artifact signatures for all entities within the Umbraco environment.\n This can be used when signatures have been cleared and you want to ensure they are pre-generated before attempting a potentially long-running restore or transfer operation.\n ",
- "setSignatures": "Set Signatures"
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts
new file mode 100644
index 0000000000..7991cf30d6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts
@@ -0,0 +1,3246 @@
+import type { UmbTranslationsDictionary } from '@umbraco-cms/backoffice/extension-registry';
+
+export default {
+ actions: {
+ assigndomain: 'Tilføj domæne',
+ auditTrail: 'Revisionsspor',
+ browse: 'Gennemse elementer',
+ changeDocType: 'Skift Dokument Type',
+ changeDataType: 'Skift Input Type',
+ copy: 'Kopier',
+ create: 'Opret',
+ export: 'Eksportér',
+ createPackage: 'Opret pakke',
+ createGroup: 'Opret gruppe',
+ delete: 'Slet',
+ disable: 'Deaktivér',
+ editSettings: 'Edit settings',
+ emptyrecyclebin: 'Tøm papirkurv',
+ enable: 'Aktivér',
+ exportDocumentType: 'Eksportér dokumenttype',
+ importdocumenttype: 'Importér dokumenttype',
+ importPackage: 'Importér pakke',
+ liveEdit: 'Redigér i Canvas',
+ logout: 'Log af',
+ move: 'Flyt',
+ notify: 'Notificeringer',
+ protect: 'Offentlig adgang',
+ publish: 'Udgiv',
+ unpublish: 'Afpublicér',
+ refreshNode: 'Genindlæs elementer',
+ remove: 'Fjern',
+ republish: 'Genudgiv hele sitet',
+ rename: 'Omdøb',
+ restore: 'Gendan',
+ chooseWhereToCopy: 'Vælg hvor du vil kopiere',
+ chooseWhereToMove: 'Vælg hvortil du vil flytte',
+ infiniteEditorChooseWhereToMove: 'Vælg hvor du vil flytte de valgte elementer hen',
+ toInTheTreeStructureBelow: 'til i træstrukturen nedenfor',
+ infiniteEditorChooseWhereToCopy: 'Vælg hvor du vil kopiere de valgte elementer til',
+ wasMovedTo: 'blev flyttet til',
+ wasCopiedTo: 'blev kopieret til',
+ wasDeleted: 'blev slettet',
+ rights: 'Rettigheder',
+ rollback: 'Fortryd ændringer',
+ sendtopublish: 'Send til udgivelse',
+ sendToTranslate: 'Send til oversættelse',
+ setGroup: 'Sæt gruppe',
+ sort: 'Sortér',
+ translate: 'Oversæt',
+ update: 'Opdatér',
+ setPermissions: 'Sæt rettigheder',
+ unlock: 'LÃ¥s op',
+ createblueprint: 'Opret indholdsskabelon',
+ resendInvite: 'Gensend Invitation',
+ defaultValue: 'Standard værdi',
+ deployQueueForTransfer: 'Sæt i kø for overførsel',
+ deployRestore: 'Genskab alt',
+ deployPartialRestore: 'Udvalgt gendanelse',
+ deployTransferNow: 'Overfør nu',
+ editContent: 'Edit content',
+ chooseWhereToImport: 'Choose where to import',
+ deployTreeRestore: 'Tree restore',
+ deployCompare: 'Compare',
+ },
+ actionCategories: {
+ content: 'Indhold',
+ administration: 'Administration',
+ structure: 'Struktur',
+ other: 'Andet',
+ },
+ actionDescriptions: {
+ assignDomain: 'Tillad adgang til at tildele sprog og domæner',
+ auditTrail: 'Tillad adgang for at få vist en nodes historik',
+ browse: 'Tillad adgang for at få vist en node',
+ changeDocType: 'Tillad adgang til at ændre dokumenttype for en node',
+ copy: 'Tillad adgang til at kopiere en node',
+ create: 'Tillad adgang til at oprette noder',
+ delete: 'Tillad adgang til at slette noder',
+ move: 'Tillad adgang til at flytte en node',
+ protect: 'Tillad adgang til at indstille og ændre offentlig adgang til en node',
+ publish: 'Tillad adgang til at udgive en node',
+ unpublish: 'Tillad adgang til at afpublicere en node',
+ rights: 'Tillad adgang til at ændre rettigheder for en node',
+ rollback: 'Tillad adgang til at returnere en node til en tidligere tilstand',
+ sendtopublish: 'Tillad adgang til at sende en node til godkendelse før den udgives',
+ sendToTranslate: 'Tillad adgang til at sende en node til oversættelse',
+ sort: 'Tillad adgang til at ændre sorteringsrækkefølge for noder',
+ translate: 'Tillad adgang til at oversætte en node',
+ update: 'Tillad adgang til at gemme en node',
+ createblueprint: 'Tillad adgang til at oprette en indholdsskabelon',
+ notify: 'Tillad adgang til at oprette notificeringer for noder',
+ deployQueueForTransfer: 'Tillad brugeren at sætte i overførselskøen',
+ deployRestore: 'Tillad brugeren at genskabe sider',
+ deployPartialRestore: 'Tillad brugeren at genskabe udvalgte sider',
+ deployTreeRestore: 'Allow the user to restore items for a tree',
+ deployCompare: 'Allow the user to compare items between workspaces',
+ },
+ apps: {
+ umbContent: 'Indhold',
+ umbInfo: 'Info',
+ },
+ assignDomain: {
+ permissionDenied: 'Tilladelse nægtet.',
+ addNew: 'Tilføj nyt domæne',
+ remove: 'fjern',
+ invalidNode: 'Ugyldig node.',
+ invalidDomain: 'Et eller flere domæner har et ugyldigt format.',
+ duplicateDomain: 'Domæne er allerede blevet tildelt.',
+ language: 'Sprog',
+ domain: 'Domæne',
+ domainCreated: "Domænet '%0%' er nu oprettet og tilknyttet siden",
+ domainDeleted: "Domænet '%0%' er nu slettet",
+ domainExists: "Domænet '%0%' er oprettet",
+ domainUpdated: "Domænet '%0%' er nu opdateret",
+ orEdit: 'eller rediger nuværende domæner',
+ domainHelpWithVariants:
+ 'Gyldige domænenavne er: "example.com", "www.example.com", "example.com:8080" eller "https://www.example.com/".\n Yderlgiere understøttes også første niveau af stien efter domænet, f.eks. "Example.com/en" eller "/en". ',
+ inherit: 'Nedarv',
+ setLanguage: 'Sprog',
+ setLanguageHelp:
+ 'Indstil sproget for noder under den aktuelle node, eller nedarv sprog fra forældre noder. Gælder også \n for den aktuelle node, medmindre et domæne nedenfor også indstiller et sprog.',
+ setDomains: 'Domæner',
+ addCurrent: 'Add current domain',
+ },
+ buttons: {
+ clearSelection: 'Ryd valg',
+ select: 'Vælg',
+ somethingElse: 'Gør noget andet',
+ bold: 'Fed',
+ deindent: 'Fortryd indryk afsnit',
+ formFieldInsert: 'Indsæt formularfelt',
+ graphicHeadline: 'Indsæt grafisk overskrift',
+ htmlEdit: 'Redigér Html',
+ indent: 'Indryk afsnit',
+ italic: 'Kursiv',
+ justifyCenter: 'Centrér',
+ justifyLeft: 'Venstrestil afsnit',
+ justifyRight: 'Højrestil afsnit',
+ linkInsert: 'Indsæt link',
+ linkLocal: 'Indsæt lokalt link (anker)',
+ listBullet: 'Punktopstilling',
+ listNumeric: 'Nummerorden',
+ macroInsert: 'Indsæt makro',
+ pictureInsert: 'Indsæt billede',
+ publishAndClose: 'Udgiv og luk',
+ publishDescendants: 'Udgiv med undersider',
+ relations: 'Redigér relationer',
+ returnToList: 'Tilbage til listen',
+ save: 'Gem',
+ saveAndClose: 'Gem og luk',
+ saveAndPublish: 'Gem og udgiv',
+ saveToPublish: 'Gem og send til udgivelse',
+ saveListView: 'Gem listevisning',
+ schedulePublish: 'Planlæg',
+ saveAndPreview: 'Forhåndsvisning',
+ showPageDisabled: 'Forhåndsvisning er deaktiveret fordi der ikke er nogen skabelon tildelt',
+ styleChoose: 'Vælg formattering',
+ styleShow: 'Vis koder',
+ tableInsert: 'Indsæt tabel',
+ generateModelsAndClose: 'Generer modeller og luk',
+ saveAndGenerateModels: 'Gem og generer modeller',
+ undo: 'Fortryd',
+ redo: 'Genskab',
+ deleteTag: 'Slet tag',
+ confirmActionCancel: 'Fortryd',
+ confirmActionConfirm: 'Bekræft',
+ morePublishingOptions: 'Flere publiseringsmuligheder',
+ submitChanges: 'Indsæt',
+ },
+ auditTrails: {
+ atViewingFor: 'For',
+ delete: 'Brugeren har slettet indholdet',
+ unpublish: 'Brugeren har afpubliceret indholdet',
+ unpublishvariant: 'Brugeren har afpubliceret indholdet for sprogene: %0%',
+ publish: 'Brugeren har gemt og udgivet indholdet',
+ publishvariant: 'Brugeren har gemt og udgivet indholdet for sprogene: %0%',
+ save: 'Brugeren har gemt indholdet',
+ savevariant: 'Brugeren har gemt indholdet for sprogene: %0%',
+ move: 'Brugeren har flyttet indholdet',
+ copy: 'Brugeren har kopieret indholdet',
+ rollback: 'Brugeren har tilbagerullet indholdet til en tidligere tilstand',
+ sendtopublish: 'Brugeren har sendt indholdet til udgivelse',
+ sendtopublishvariant: 'Brugeren har sendt indholdet til udgivelse for sprogene: %0%',
+ sendtotranslate: 'Brugeren har sendt indholdet til oversættelse',
+ sort: 'Brugeren har sorteret de underliggende sider',
+ custom: '%0%',
+ smallCopy: 'Kopieret',
+ smallPublish: 'Udgivet',
+ smallPublishVariant: 'Udgivet',
+ smallMove: 'Flyttet',
+ smallSave: 'Gemt',
+ smallSaveVariant: 'Gemt',
+ smallDelete: 'Slettet',
+ smallUnpublish: 'Afpubliceret',
+ smallUnpublishVariant: 'Afpubliceret',
+ smallRollBack: 'Indhold tilbagerullet',
+ smallSendToPublish: 'Sendt til udgivelse',
+ smallSendToPublishVariant: 'Sendt til udgivelse',
+ smallSendToTranslate: 'Sendt til oversættelse',
+ smallSort: 'Sorteret',
+ smallCustom: 'Brugerdefineret',
+ historyIncludingVariants: 'Historik (alle sprog)',
+ contentversionpreventcleanup: 'Cleanup disabled for version: %0%',
+ contentversionenablecleanup: 'Cleanup enabled for version: %0%',
+ smallContentVersionPreventCleanup: 'Save',
+ smallContentVersionEnableCleanup: 'Save',
+ },
+ codefile: {
+ createFolderIllegalChars: 'Mappens navn må ikke indeholde ugyldige tegn.',
+ deleteItemFailed: 'Sletning af filen/mappen fejlede: %0%',
+ },
+ content: {
+ isPublished: 'Udgivet',
+ about: 'Om siden',
+ alias: 'Alias',
+ alternativeTextHelp: '(hvordan ville du f.eks. beskrive billedet via telefonen?)',
+ alternativeUrls: 'Alternative links',
+ clickToEdit: 'Klik for at redigere dette punkt',
+ createBy: 'Oprettet af',
+ createByDesc: 'Oprindelig forfatter',
+ updatedBy: 'Opdateret af',
+ createDate: 'Oprettet den',
+ createDateDesc: 'Tidspunkt for oprettelse',
+ documentType: 'Dokumenttype',
+ editing: 'Redigerer',
+ expireDate: 'Nedtagningsdato',
+ itemChanged: 'Dette punkt er ændret siden udgivelsen',
+ itemNotPublished: 'Dette punkt er endnu ikke udgivet',
+ lastPublished: 'Sidst udgivet',
+ noItemsToShow: 'Der er ingen elementer at vise',
+ listViewNoItems: 'Der er ingen elementer at vise på listen.',
+ listViewNoContent: 'Intet indhold er blevet tilføjet',
+ listViewNoMembers: 'Ingen medlemmer er blevet tilføjet',
+ mediatype: 'Medietype',
+ mediaLinks: 'Link til medie(r)',
+ membergroup: 'Medlemsgruppe',
+ memberrole: 'Rolle',
+ membertype: 'Medlemstype',
+ noChanges: 'Der er endnu ikke lavet nogle ændringer.',
+ noDate: 'Ingen dato valgt',
+ nodeName: 'Sidetitel',
+ noMediaLink: 'Dette medie har ikke noget link',
+ noProperties: 'Intet indhold kan tilføjes for dette element',
+ otherElements: 'Egenskaber',
+ parentNotPublished:
+ "Dette dokument er udgivet, men ikke synligt da den overliggende side '%0%' ikke er\n udgivet!\n ",
+ parentCultureNotPublished:
+ "Dette sprog er udgivet, men ikke synligt, da den overliggende side '%0%' ikke\n er udgivet!\n ",
+ parentNotPublishedAnomaly: 'Ups: dette dokument er udgivet, men er ikke i cachen (intern fejl)',
+ getUrlException: "Kunne ikke hente URL'en",
+ routeError: 'Dette dokument er udgivet, men dets URL ville kollidere med indholdet %0%',
+ routeErrorCannotRoute: 'Dette dokument er udgivet, men dets URL kan ikke dirigeres',
+ publish: 'Udgiv',
+ published: 'Udgivet',
+ publishedPendingChanges: 'Udgivet (Ventede ændringer)',
+ publishStatus: 'Udgivelsesstatus',
+ publishDescendantsHelp:
+ 'Klik Udgiv med undersider for at udgive %0% og alle sider under og dermed gøre deres indhold offentligt tilgængelige.',
+ publishDescendantsWithVariantsHelp:
+ 'Klik Udgiv med undersider for at udgive de valgte sprog og de samme sprog for sider under og dermed gøre deres indhold offentligt tilgængelige.',
+ releaseDate: 'Udgivelsesdato',
+ unpublishDate: 'Afpubliceringsdato',
+ removeDate: 'Fjern dato',
+ setDate: 'Vælg dato',
+ sortDone: 'Sorteringsrækkefølgen er opdateret',
+ sortHelp:
+ 'For at sortere, træk siderne eller klik på en af kolonnehovederne. Du kan vælge flere sider\n ved at holde "shift" eller "control" nede mens du vælger.\n ',
+ statistics: 'Statistik',
+ titleOptional: 'Titel (valgfri)',
+ altTextOptional: 'Alternativ tekst (valgfri)',
+ captionTextOptional: 'Overskrift (valgfri)',
+ type: 'Type',
+ variantsToPublish: 'Hvilke varianter vil du udgive?',
+ variantsToSave: 'Vælg hvilke varianter, der skal gemmes.',
+ unpublish: 'Afpublicér',
+ unpublished: 'Afpubliceret',
+ notCreated: 'Ikke oprettet',
+ updateDate: 'Sidst redigeret',
+ updateDateDesc: 'Tidspunkt for seneste redigering',
+ uploadClear: 'Fjern fil',
+ uploadClearImageContext: 'Klik her for at fjerne billedet fra medie filen',
+ uploadClearFileContext: 'Klik her for at fjerne filen fra medie filen',
+ urls: 'Link til dokument',
+ memberof: 'Medlem af grupper(ne)',
+ notmemberof: 'Ikke medlem af grupper(ne)',
+ childItems: 'Undersider',
+ target: 'Ã…ben i vindue',
+ scheduledPublishServerTime: 'Dette oversætter til den følgende tid på serveren:',
+ scheduledPublishDocumentation:
+ 'Hvad betyder det? ',
+ nestedContentDeleteItem: 'Er du sikker på, at du vil slette dette element?',
+ nestedContentDeleteAllItems: 'Er du sikker på, at du vil slette alle elementer?',
+ nestedContentEditorNotSupported:
+ 'Egenskaben %0% anvender editoren %1% som ikke er understøttet af Nested\n Content.\n ',
+ nestedContentNoContentTypes: 'Der er ikke konfigureret nogen indholdstyper for denne egenskab.',
+ nestedContentAddElementType: 'Tilføj element type',
+ nestedContentSelectElementTypeModalTitle: 'Vælg element type',
+ nestedContentGroupHelpText:
+ 'Vælg gruppen, hvis værdier skal vises. Hvis dette er efterladt blankt vil\n den første gruppe på element typen bruges.\n ',
+ addTextBox: 'Tilføj en ny tekstboks',
+ removeTextBox: 'Fjern denne tekstboks',
+ contentRoot: 'Indholdsrod',
+ includeUnpublished: 'Inkluder ikke-udgivet indhold.',
+ isSensitiveValue:
+ 'Denne værdi er skjult.Hvis du har brug for adgang til at se denne værdi, bedes du\n kontakte din web-administrator.\n ',
+ isSensitiveValue_short: 'Denne værdi er skjult.',
+ languagesToPublish: 'Hvilke sprog vil du gerne udgive?',
+ languagesToSendForApproval: 'Hvilke sprog vil du gerne sende til godkendelse?',
+ languagesToSchedule: 'Hvilke sprog vil du gerne planlægge?',
+ languagesToUnpublish:
+ 'Vælg sproget du vil afpublicere. Afpublicering af et obligatorisk sprog vil\n afpublicere alle sprog.\n ',
+ resetFocalPoint: 'Nulstil fokuspunkt',
+ variantsWillBeSaved: 'Alle nye varianter vil blive gemt.',
+ publishRequiresVariants: 'De følgende varianter er krævet for at en udgivelse kan finde sted:',
+ notReadyToPublish: 'Vi er ikke klar til at udgive',
+ readyToPublish: 'Klar til at udgive?',
+ readyToSave: 'Klar til at gemme?',
+ sendForApproval: 'Send til godkendelse',
+ schedulePublishHelp: 'Vælg dato og klokkeslæt for at udgive og/eller afpublicere indholdet.',
+ createEmpty: 'Opret ny',
+ createFromClipboard: 'Indsæt fra udklipsmappen',
+ nodeIsInTrash: 'Dette element er i papirkurven',
+ nestedContentTemplateHelpTextPart1:
+ 'Enter an angular expression to evaluate against each item for its\n name. Use\n ',
+ nestedContentTemplateHelpTextPart2: 'to display the item index',
+ nestedContentNoGroups:
+ 'The selected element type does not contain any supported groups (tabs are not supported by this editor, either change them to groups or use the Block List editor).',
+ variantSaveNotAllowed: 'Save is not allowed',
+ variantPublishNotAllowed: 'Publish is not allowed',
+ variantSendForApprovalNotAllowed: 'Send for approval is not allowed',
+ variantScheduleNotAllowed: 'Schedule is not allowed',
+ variantUnpublishNotAllowed: 'Unpublish is not allowed',
+ },
+ blueprints: {
+ createBlueprintFrom: 'Opret en ny indholdsskabelon fra %0% ',
+ blankBlueprint: 'Blank',
+ selectBlueprint: 'Vælg en indholdsskabelon',
+ createdBlueprintHeading: 'Indholdsskabelon oprettet',
+ createdBlueprintMessage: "En indholdsskabelon blev oprettet fra '%0%'",
+ duplicateBlueprintMessage: 'En anden indholdsskabelon med samme navn eksisterer allerede',
+ blueprintDescription:
+ 'En indholdskabelon er foruddefineret indhold, som en redaktør kan vælge at bruge\n som grundlag for at oprette nyt indhold\n ',
+ },
+ media: {
+ clickToUpload: 'Klik for at uploade',
+ orClickHereToUpload: 'eller klik her for at vælge filer',
+ disallowedFileType: 'Kan ikke uploade denne fil, den har ikke en godkendt filtype',
+ maxFileSize: 'Maks filstørrelse er',
+ mediaRoot: 'Medie rod',
+ moveToSameFolderFailed: 'Overordnet og destinations mappe kan ikke være den samme',
+ createFolderFailed: 'Oprettelse af mappen under parent med id %0% fejlede',
+ renameFolderFailed: 'Omdøbning af mappen med id %0% fejlede',
+ dragAndDropYourFilesIntoTheArea:
+ 'Træk dine filer ind i dropzonen for, at uploade dem til\n mediebiblioteket.\n ',
+ uploadNotAllowed: 'Upload er ikke tiladt på denne lokation',
+ disallowedMediaType: "Cannot upload this file, the media type with alias '%0%' is not allowed here",
+ invalidFileName: 'Cannot upload this file, it does not have a valid file name',
+ },
+ member: {
+ createNewMember: 'Opret et nyt medlem',
+ allMembers: 'Alle medlemmer',
+ memberGroupNoProperties: 'Medlemgrupper har ingen yderligere egenskaber til redigering.',
+ '2fa': 'Totrinsbekræftelse',
+ duplicateMemberLogin: 'A member with this login already exists',
+ memberHasGroup: "The member is already in group '%0%'",
+ memberHasPassword: 'The member already has a password set',
+ memberLockoutNotEnabled: 'Lockout is not enabled for this member',
+ memberNotInGroup: "The member is not in group '%0%'",
+ },
+ contentType: {
+ copyFailed: 'Kopiering af indholdstypen fejlede',
+ moveFailed: 'Flytning af indholdstypen fejlede',
+ },
+ mediaType: {
+ copyFailed: 'Kopiering af medietypen fejlede',
+ moveFailed: 'Flytning af medietypen fejlede',
+ autoPickMediaType: 'Auto vælg',
+ },
+ memberType: {
+ copyFailed: 'Kopiering af medlemstypen fejlede',
+ },
+ create: {
+ chooseNode: 'Hvor ønsker du at oprette den nye %0%',
+ createUnder: 'Opret under',
+ createContentBlueprint: 'Vælg den dokumenttype, du vil oprette en indholdsskabelon til',
+ enterFolderName: 'Angiv et navn for mappen',
+ updateData: 'Vælg en type og skriv en titel',
+ noDocumentTypes:
+ 'Der kunne ikke findes nogen tilladte dokumenttyper. Du skal tillade disse i indstillinger under "dokumenttyper" .',
+ noDocumentTypesAtRoot:
+ 'There are no document types available for creating content here. You must create these in Document Types within the Settings section.',
+ noDocumentTypesWithNoSettingsAccess:
+ 'Den valgte side i træet tillader ikke at sider oprettes under\n den.\n ',
+ noDocumentTypesEditPermissions: 'Rediger tilladelser for denne dokumenttype.',
+ noDocumentTypesCreateNew: 'Opret en ny dokumenttype',
+ noDocumentTypesAllowedAtRoot:
+ 'Der er ingen tilladte Dokumenttyper tilgængelige for at lave indhold her. Du skal tillade dette i Dokumenttyper inde i Indstillinger sektionen, ved at ændre Tillad på rodniveau indestillingen under Permissions .',
+ noMediaTypes:
+ 'Der kunne ikke findes nogen tilladte media typer. Du skal tillade disse i indstillinger under "media typer" .',
+ noMediaTypesWithNoSettingsAccess: 'Det valgte medie i træet tillader ikke at medier oprettes under det.\n ',
+ noMediaTypesEditPermissions: 'Rediger tilladelser for denne medietype.',
+ documentTypeWithoutTemplate: 'Dokumenttype uden skabelon',
+ documentTypeWithTemplate: 'Dokumenttype med skabelon',
+ documentTypeWithTemplateDescription:
+ 'Definerer en indholdsside, der kan oprettes af redaktørerne i\n indholdstræet, og som er kan tilgås direkte på en URL.\n ',
+ documentType: 'Dokumenttype',
+ documentTypeDescription:
+ 'Definerer en indholdskomponent, der kan oprettes af redaktørerne i\n indholdstræet og benyttes i sammenhæng med andet indhold, men som ikke kan tilgås direkte på en URL.\n ',
+ elementType: 'Element-type',
+ elementTypeDescription:
+ "Definerer skabelonen for et sæt at egenskaber, der kan anvendes som skema i\n avancerede felter som f.eks. 'Block List' eller 'Block Grid'.\n ",
+ composition: 'Komposition',
+ compositionDescription:
+ "Definerer et sæt genbrugbare egenskaber, der kan inkluderes i definitionen af\n andre dokumenttyper - f.eks. et sæt 'Almindelige side-data'.\n ",
+ folder: 'Mappe',
+ folderDescription:
+ 'Benyttes til at organisere dokumenttyper, element-typer og kompositioner i\n dokumenttype-træet.\n ',
+ newFolder: 'Ny mappe',
+ newDataType: 'Ny datatype',
+ newJavascriptFile: 'Ny JavaScript-fil',
+ newEmptyPartialView: 'Ny tom partial view',
+ newPartialViewMacro: 'Ny partial view makro',
+ newPartialViewFromSnippet: 'Ny partial view fra snippet',
+ newPartialViewMacroFromSnippet: 'Ny partial view makro fra snippet',
+ newPartialViewMacroNoMacro: 'Ny partial view makro (uden makro)',
+ newStyleSheetFile: 'Ny stylesheet-fil',
+ newRteStyleSheetFile: 'Ny Rich Text Editor stylesheet-fil',
+ },
+ dashboard: {
+ browser: 'Til dit website',
+ dontShowAgain: '- Skjul',
+ nothinghappens: 'Hvis Umbraco ikke starter, kan det skyldes at din browser ikke tillader pop-up vinduer\n ',
+ openinnew: 'er åbnet i nyt vindue',
+ restart: 'Genstart',
+ visit: 'Besøg',
+ welcome: 'Velkommen',
+ },
+ prompt: {
+ stay: 'Bliv',
+ discardChanges: 'Kassér ændringer',
+ unsavedChanges: 'Du har ikke-gemte ændringer',
+ unsavedChangesWarning:
+ 'Er du sikker på du vil navigere væk fra denne side? - du har ikke-gemte\n ændringer\n ',
+ confirmListViewPublish: 'Udgivelse vil gøre de valgte sider synlige på sitet.',
+ confirmListViewUnpublish: 'Afpublicering vil fjerne de valgte sider og deres undersider fra sitet.',
+ confirmUnpublish: 'Afpublicering vil fjerne denne side og alle dets undersider fra websitet.',
+ doctypeChangeWarning: 'Du har ikke-gemte ændringer. Hvis du ændrer dokumenttype, kasseres ændringerne.\n ',
+ },
+ bulk: {
+ done: 'Færdig',
+ deletedItem: 'Slettede %0% element',
+ deletedItems: 'Slettede %0% elementer',
+ deletedItemOfItem: 'Slettede %0% ud af %1% element',
+ deletedItemOfItems: 'Slettede %0% ud af %1% elementer',
+ publishedItem: 'Udgav %0% element',
+ publishedItems: 'Udgav %0% elementer',
+ publishedItemOfItem: 'Udgav %0% ud af %1% element',
+ publishedItemOfItems: 'Udgav %0% ud af %1% elementer',
+ unpublishedItem: 'Fjernede %0% element fra udgivelse',
+ unpublishedItems: 'Fjernede %0% elementer fra udgivelse',
+ unpublishedItemOfItem: 'Fjernede %0% ud af %1% element fra udgivelse',
+ unpublishedItemOfItems: 'Fjernede %0% ud af %1% elementer fra udgivelse',
+ movedItem: 'Flyttede %0% element',
+ movedItems: 'Flyttede %0% elementer',
+ movedItemOfItem: 'Flyttede %0% ud af %1% element',
+ movedItemOfItems: 'Flyttede %0% ud af %1% elementer',
+ copiedItem: 'Kopierede %0% element',
+ copiedItems: 'Kopierede %0% elementer',
+ copiedItemOfItem: 'Kopierede %0% ud af %1% element',
+ copiedItemOfItems: 'Kopierede %0% ud af %1% elementer',
+ },
+ defaultdialogs: {
+ nodeNameLinkPicker: 'Link titel',
+ urlLinkPicker: 'Link',
+ anchorLinkPicker: 'Lokalt link / querystreng',
+ anchorInsert: 'Navn på lokalt link',
+ assignDomain: 'Rediger domæner',
+ closeThisWindow: 'Luk denne dialog',
+ confirmdelete: 'Er du sikker på at du vil slette',
+ confirmdisable: 'Er du sikker på du vil deaktivere',
+ confirmremove: 'Er du sikker på at du vil fjerne',
+ confirmremoveusageof: 'Er du sikker på du vil fjerne brugen af %0% ',
+ confirmlogout: 'Er du sikker på at du vil forlade Umbraco?',
+ confirmSure: 'Er du sikker?',
+ cut: 'Klip',
+ editdictionary: 'Rediger ordbogsnøgle',
+ editlanguage: 'Rediger sprog',
+ editSelectedMedia: 'Rediger det valgte medie',
+ insertAnchor: 'Indsæt lokalt link',
+ insertCharacter: 'Indsæt tegn',
+ insertgraphicheadline: 'Indsæt grafisk overskrift',
+ insertimage: 'Indsæt billede',
+ insertlink: 'Indsæt link',
+ insertMacro: 'Indsæt makro',
+ inserttable: 'Indsæt tabel',
+ languagedeletewarning: 'Dette vil slette sproget',
+ languageChangeWarning:
+ 'Ændring af kulturen for et sprog kan forsage en krævende opration og vil\n resultere i indholds cache og indeksering vil blive genlavet\n ',
+ lastEdited: 'Sidst redigeret',
+ link: 'Link',
+ linkinternal: 'Internt link:',
+ linklocaltip: 'Ved lokalt link, indsæt da en "#" foran linket',
+ linknewwindow: 'Ã…ben i nyt vindue?',
+ macroDoesNotHaveProperties: 'Denne makro har ingen egenskaber du kan redigere',
+ paste: 'Indsæt tekst',
+ permissionsEdit: 'Rediger rettigheder for',
+ permissionsSet: 'Sæt rettigheder for',
+ permissionsSetForGroup: 'Sæt rettigheder for %0% for brugergruppe %1%',
+ permissionsHelp: 'Vælg de brugergrupper, du vil angive tilladelser til',
+ recycleBinDeleting:
+ 'Elementerne i papirkurven slettes. Luk venligst ikke dette vindue mens sletningen\n foregår\n ',
+ recycleBinIsEmpty: 'Papirkurven er nu tom',
+ recycleBinWarning: 'NÃ¥r elementer slettes fra papirkurven, slettes de for altid',
+ regexSearchError:
+ "regexlib.com 's webservice oplever i øjeblikket problemer, vi ikke har kontrol over. Beklager ulejligheden. ",
+ regexSearchHelp:
+ "Søg efter et regulært udtryk for at tilføje validering til et formularfelt. Eksempel:\n 'e-mail', 'postnr.', 'URL'\n ",
+ removeMacro: 'Fjern makro',
+ requiredField: 'Obligatorisk',
+ sitereindexed: 'Sitet er genindekseret',
+ siterepublished: 'Sitet er nu genudgivet',
+ siterepublishHelp:
+ 'Websitets cache vil blive genopfrisket. Alt udgivet indhold vil blive opdateret, mens\n upubliceret indhold vil forblive upubliceret.\n ',
+ tableColumns: 'Antal kolonner',
+ tableRows: 'Antal rækker',
+ thumbnailimageclickfororiginal: 'Klik på billedet for at se den fulde størrelse',
+ treepicker: 'Vælg',
+ viewCacheItem: 'Se cache element',
+ relateToOriginalLabel: 'Relatér til original',
+ includeDescendants: 'Inkludér undersider',
+ theFriendliestCommunity: 'Det venligste community',
+ linkToPage: 'Link til side',
+ openInNewWindow: 'Ã…ben linket i et nyt vindue eller fane',
+ linkToMedia: 'Link til medie',
+ selectContentStartNode: 'Vælg startnode for indhold',
+ selectMedia: 'Vælg medie',
+ selectMediaType: 'Vælg medietype',
+ selectIcon: 'Vælg ikon',
+ selectItem: 'Vælg item',
+ selectLink: 'Vælg link',
+ selectMacro: 'Vælg makro',
+ selectContent: 'Vælg indhold',
+ selectContentType: 'Vælg indholdstype',
+ selectMediaStartNode: 'Vælg startnode for mediearkivet',
+ selectMember: 'Vælg medlem',
+ selectMemberGroup: 'Vælg medlemsgruppe',
+ selectMemberType: 'Vælg medlemstype',
+ selectNode: 'Vælg node',
+ selectLanguages: 'Vælg sprog',
+ selectSections: 'Vælg sektioner',
+ selectUser: 'Vælg bruger',
+ selectUsers: 'Vælg brugere',
+ noIconsFound: 'Ingen ikoner blev fundet',
+ noMacroParams: 'Der er ingen parametre for denne makro',
+ noMacros: 'Der er ikke tilføjet nogen makroer',
+ externalLoginProviders: 'Eksterne login-udbydere',
+ exceptionDetail: 'Undtagelsesdetaljer',
+ stacktrace: 'Stacktrace',
+ innerException: 'Indre undtagelse',
+ linkYour: 'Link dit',
+ unLinkYour: 'Fjern link fra dit',
+ account: 'konto',
+ selectEditor: 'Vælg editor',
+ selectEditorConfiguration: 'Vælg konfiguration',
+ selectSnippet: 'Vælg snippet',
+ variantdeletewarning:
+ 'Dette vil slette noden og alle dets sprog. Hvis du kun vil slette et sprog, så\n afpublicér det i stedet.\n ',
+ propertyuserpickerremovewarning: 'Dette vil fjerne brugeren %0% ',
+ userremovewarning: 'Dette vil fjerne brugeren %0% fra %1% gruppen',
+ yesRemove: 'Ja, fjern',
+ confirmdeleteNumberOfItems: 'Are you sure you want to delete %0% of %1% items',
+ deleteLayout: 'You are deleting the layout',
+ deletingALayout:
+ 'Modifying layout will result in loss of data for any existing content that is based on this configuration.',
+ },
+ dictionary: {
+ noItems: 'Der er ingen ordbogselementer.',
+ importDictionaryItemHelp:
+ '\n To import a dictionary item, find the ".udt" file on your computer by clicking the\n "Import" button (you\'ll be asked for confirmation on the next screen)\n ',
+ itemDoesNotExists: 'Dictionary item does not exist.',
+ parentDoesNotExists: 'Parent item does not exist.',
+ noItemsInFile: 'There are no dictionary items in this file.',
+ noItemsFound: 'There were no dictionary items found.',
+ createNew: 'Create dictionary item',
+ },
+ dictionaryItem: {
+ description:
+ "\n Rediger de forskellige sprogversioner for ordbogselementet '%0%' herunder. Du tilføjer flere sprog under 'sprog' i menuen til venstre \n ",
+ displayName: 'Kulturnavn',
+ changeKeyError: "\n Navnet '%0%' eksisterer allerede.\n ",
+ overviewTitle: 'Ordbogsoversigt',
+ },
+ examineManagement: {
+ configuredSearchers: 'Konfigurerede søgere',
+ configuredSearchersDescription:
+ 'Viser egenskaber og værktøjer til enhver konfigureret søger (dvs. som en\n multi-indekssøger)\n ',
+ fieldValues: 'Feltværdier',
+ healthStatus: 'Sundhedstilstand',
+ healthStatusDescription: 'Indeksets sundhedstilstand, og hvis det kan læses',
+ indexers: 'Indeksører',
+ indexInfo: 'Indeksinfo',
+ indexInfoDescription: 'Viser indeksets egenskaber',
+ manageIndexes: 'Administrer Examine indekserne',
+ manageIndexesDescription:
+ 'Giver dig mulighed for at se detaljerne for hvert indeks og giver nogle\n værktøjer til styring af indeksørerne\n ',
+ rebuildIndex: 'Genopbyg indeks',
+ rebuildIndexWarning:
+ '\n Dette vil medføre, at indekset genopbygges. \n Afhængigt af hvor meget indhold der er på dit website, kan det tage et stykke tid. \n Det anbefales ikke at genopbygge et indeks i perioder med høj websitetrafik eller når redaktører redigerer indhold.\n ',
+ searchers: 'Søgere',
+ searchDescription: 'Søg i indekset og se resultaterne',
+ tools: 'Værktøjer',
+ toolsDescription: 'Værktøjer til at administrere indekset',
+ fields: 'felter',
+ indexCannotRead: 'Indexet skal bygges igen, for at kunne læses',
+ processIsTakingLonger:
+ 'Processen tager længere tid end forventet. Kontrollér Umbraco loggen for at se om\n der er sket fejl under operationen\n ',
+ indexCannotRebuild: 'Dette index kan ikke genbygges for det ikke har nogen',
+ iIndexPopulator: 'IIndexPopulator',
+ contentInIndex: 'Content in index',
+ },
+ placeholders: {
+ username: 'Indtast dit brugernavn',
+ password: 'Indtast dit kodeord',
+ confirmPassword: 'Bekræft dit kodeord',
+ nameentity: 'Navngiv %0%...',
+ entername: 'Indtast navn...',
+ enteremail: 'Indtast en e-mail...',
+ enterusername: 'Indtast et brugernavn...',
+ label: 'Label...',
+ enterDescription: 'Indtast beskrivelse',
+ search: 'Søg...',
+ filter: 'Filtrér...',
+ enterTags: 'Indtast nøgleord (tryk på Enter efter hvert nøgleord)...',
+ email: 'Indtast din e-mail',
+ enterMessage: 'Indtast en besked...',
+ usernameHint: 'Dit brugernavn er typisk din e-mailadresse',
+ anchor: '#value eller ?key=value',
+ enterAlias: 'Indtast alias...',
+ generatingAlias: 'Genererer alias...',
+ a11yCreateItem: 'Opret element',
+ a11yEdit: 'Rediger',
+ a11yName: 'Navn',
+ },
+ editcontenttype: {
+ createListView: 'Opret brugerdefineret listevisning',
+ removeListView: 'Fjern brugerdefineret listevisning',
+ aliasAlreadyExists: 'En dokumenttype, medietype eller medlemstype med dette alias findes allerede',
+ },
+ renamecontainer: {
+ renamed: 'Omdøbt',
+ enterNewFolderName: 'Indtast et ny mappenavn her',
+ folderWasRenamed: '%0% was renamed to %1%',
+ },
+ editdatatype: {
+ addPrevalue: 'Tilføj førværdi',
+ dataBaseDatatype: 'Database-datatype',
+ guid: 'Data Editor GUID',
+ renderControl: 'Visningskontrol',
+ rteButtons: 'Knapper',
+ rteEnableAdvancedSettings: 'Aktiver avancerede indstillinger for',
+ rteEnableContextMenu: 'Aktiver kontekstmenu',
+ rteMaximumDefaultImgSize: 'Maks. std. størrelse på indsatte billeder',
+ rteRelatedStylesheets: 'Relaterede stylesheets',
+ rteShowLabel: 'Vis label',
+ rteWidthAndHeight: 'Bredde og højde',
+ selectFolder: 'Vælg den mappe, der skal flyttes',
+ inTheTree: 'til i træstrukturen nedenfor',
+ wasMoved: 'blev flyttet under',
+ hasReferencesDeleteConsequence:
+ 'Ved sletning af %0% fjernes egnskaber og egnskabernes data fra følgende elementer',
+ acceptDeleteConsequence:
+ 'I understand this action will delete the properties and data based on this Data\n Type\n ',
+ canChangePropertyEditorHelp:
+ 'Changing a property editor on a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json.',
+ },
+ errorHandling: {
+ errorButDataWasSaved:
+ 'Dine data er blevet gemt, men før du kan udgive denne side er der nogle fejl der\n skal rettes:\n ',
+ errorChangingProviderPassword:
+ 'Den nuværende membership-provider understøtter ikke skift af kodeord\n (EnablePasswordRetrieval skal være true)\n ',
+ errorExistsWithoutTab: '%0% der findes allerede',
+ errorHeader: 'Der var fejl i dokumentet:',
+ errorHeaderWithoutTab: 'Der var fejl i formularen:',
+ errorInPasswordFormat:
+ 'Kodeordet skal være på minimum %0% tegn og indeholde mindst %1% alfanumeriske\n karakterer\n ',
+ errorIntegerWithoutTab: '%0% skal være et heltal',
+ errorMandatory: '%0% under %1% er et obligatorisk felt og skal udfyldes',
+ errorMandatoryWithoutTab: '%0% er et obligatorisk felt og skal udfyldes',
+ errorRegExp: '%0% under %1% er ikke i et korrekt format',
+ errorRegExpWithoutTab: '%0% er ikke i et korrekt format',
+ },
+ errors: {
+ receivedErrorFromServer: 'Der skete en fejl på severen',
+ dissallowedMediaType: 'Denne filttype er blevet deaktiveret af administratoren',
+ codemirroriewarning:
+ 'OBS! Selvom CodeMirror er slået til i konfigurationen, så er den deaktiveret i\n Internet Explorer fordi den ikke er stabil nok.\n ',
+ contentTypeAliasAndNameNotNull: 'Du skal udfylde både Alias & Navn på den nye egenskabstype!',
+ filePermissionsError: 'Der mangler læse/skrive rettigheder til bestemte filer og mapper',
+ macroErrorLoadingPartialView: 'Fejl ved indlæsning af Partial View script (fil: %0%)',
+ missingTitle: 'Skriv venligst en titel',
+ missingType: 'Du skal vælge en type',
+ pictureResizeBiggerThanOrg:
+ 'Du er ved at gøre billedet større end originalen. Det vil forringe\n kvaliteten af billedet. Ønsker du at fortsætte?\n ',
+ startNodeDoesNotExists: 'Startnode er slettet, kontakt systemadministrator',
+ stylesMustMarkBeforeSelect: 'Du skal markere noget indhold, før du kan ændre stylen',
+ stylesNoStylesOnPage: 'Der er ingen aktive styles eller formatteringer på denne side',
+ tableColMergeLeft: 'Du skal stå til venstre for de 2 celler du ønsker at samle!',
+ tableSplitNotSplittable: 'Du kan ikke opdele en celle, som ikke allerede er delt.',
+ propertyHasErrors: 'Denne egenskab er ugyldig',
+ defaultError: 'An unknown failure has occurred',
+ concurrencyError: 'Optimistic concurrency failure, object has been modified',
+ },
+ general: {
+ options: 'Valgmuligheder',
+ about: 'Om',
+ action: 'Handling',
+ actions: 'Muligheder',
+ add: 'Tilføj',
+ alias: 'Alias',
+ all: 'Alle',
+ areyousure: 'Er du sikker?',
+ back: 'Tilbage',
+ backToOverview: 'Tilbage til oversigt',
+ border: 'Kant',
+ by: 'af',
+ cancel: 'Fortryd',
+ cellMargin: 'Celle margen',
+ choose: 'Vælg',
+ clear: 'Ryd',
+ close: 'Luk',
+ closewindow: 'Luk vindue',
+ closepane: 'Luk vindue',
+ comment: 'Kommentar',
+ confirm: 'Bekræft',
+ constrain: 'Proportioner',
+ constrainProportions: 'Behold proportioner',
+ content: 'Indhold',
+ continue: 'Fortsæt',
+ copy: 'Kopiér',
+ create: 'Opret',
+ cropSection: 'Beskær sektion',
+ database: 'Database',
+ date: 'Dato',
+ default: 'Standard',
+ delete: 'Slet',
+ deleted: 'Slettet',
+ deleting: 'Sletter...',
+ design: 'Design',
+ dictionary: 'Ordbog',
+ dimensions: 'Dimensioner',
+ discard: 'Kassér',
+ down: 'Ned',
+ download: 'Hent',
+ edit: 'Rediger',
+ edited: 'Redigeret',
+ elements: 'Elementer',
+ email: 'E-mail',
+ error: 'Fejl',
+ field: 'Felt',
+ findDocument: 'Find',
+ first: 'Første',
+ focalPoint: 'Fokuspunkt',
+ general: 'Generelt',
+ groups: 'Grupper',
+ group: 'Gruppe',
+ height: 'Højde',
+ help: 'Hjælp',
+ hide: 'Skjul',
+ history: 'Historik',
+ icon: 'Ikon',
+ id: 'Id',
+ import: 'Importer',
+ excludeFromSubFolders: 'Søg kun i denne mappe',
+ info: 'Info',
+ innerMargin: 'Indre margen',
+ insert: 'Indsæt',
+ install: 'Installér',
+ invalid: 'Ugyldig',
+ justify: 'Justering',
+ label: 'Mærke',
+ language: 'Sprog',
+ last: 'Sidste',
+ layout: 'Layout',
+ links: 'Links',
+ loading: 'Henter',
+ locked: 'LÃ¥st',
+ login: 'Log ind',
+ logoff: 'Log af',
+ logout: 'Log ud',
+ macro: 'Makro',
+ mandatory: 'Påkrævet',
+ message: 'Besked',
+ move: 'Flyt',
+ name: 'Navn',
+ new: 'Ny',
+ next: 'Næste',
+ no: 'Nej',
+ of: 'af',
+ off: 'Fra',
+ ok: 'OK',
+ open: 'Ã…ben',
+ on: 'Til',
+ or: 'eller',
+ orderBy: 'Sortér efter',
+ password: 'Kodeord',
+ path: 'Sti',
+ pleasewait: 'Et øjeblik...',
+ previous: 'Forrige',
+ properties: 'Egenskaber',
+ rebuild: 'Genopbyg',
+ reciept: 'E-mail der skal modtage indhold af formular',
+ recycleBin: 'Papirkurv',
+ recycleBinEmpty: 'Din papirkurv er tom',
+ reload: 'Genindlæs',
+ remaining: 'Mangler',
+ remove: 'Fjern',
+ rename: 'Omdøb',
+ renew: 'Forny',
+ required: 'Påkrævet',
+ retrieve: 'Hent',
+ retry: 'Prøv igen',
+ rights: 'Rettigheder',
+ scheduledPublishing: 'Planlagt publicering',
+ search: 'Søg',
+ searchNoResult: 'Beklager, vi kan ikke finde det, du leder efter.',
+ noItemsInList: 'Ingen elementer er blevet tilføjet',
+ server: 'Server',
+ settings: 'Indstillinger',
+ show: 'Vis',
+ showPageOnSend: 'Hvilken side skal vises efter at formularen er sendt',
+ size: 'Størrelse',
+ sort: 'Sortér',
+ status: 'Status',
+ submit: 'Indsend',
+ type: 'Type',
+ typeToSearch: 'Skriv for at søge...',
+ under: 'under',
+ up: 'Op',
+ update: 'Opdatér',
+ upgrade: 'Opdatér',
+ upload: 'Upload',
+ url: 'URL',
+ user: 'Bruger',
+ username: 'Brugernavn',
+ value: 'Værdi',
+ view: 'Vis',
+ welcome: 'Velkommen...',
+ width: 'Bredde',
+ yes: 'Ja',
+ folder: 'Mappe',
+ searchResults: 'Søgeresultater',
+ readMore: 'Læs mere',
+ reorder: 'Sortér',
+ reorderDone: 'Afslut sortering',
+ preview: 'Eksempel',
+ changePassword: 'Skift kodeord',
+ to: 'til',
+ listView: 'Listevisning',
+ saving: 'Gemmer...',
+ current: 'nuværende',
+ embed: 'Indlejring',
+ selected: 'valgt',
+ other: 'Andet',
+ articles: 'Artikler',
+ videos: 'Videoer',
+ avatar: 'Avatar til',
+ header: 'Overskrift',
+ systemField: 'system felt',
+ Deploy: 'Deploy',
+ restore: 'Genskab',
+ generic: 'Generic',
+ media: 'Media',
+ nodeName: 'Node Name',
+ revert: 'Revert',
+ umbracoInfo: 'Umbraco info',
+ shared: 'Shared',
+ success: 'Success',
+ typeName: 'Type Name',
+ validate: 'Validate',
+ lastUpdated: 'Last Updated',
+ skipToMenu: 'Skip to menu',
+ skipToContent: 'Skip to content',
+ },
+ colors: {
+ blue: 'Blå',
+ },
+ shortcuts: {
+ addGroup: 'Tilføj fane',
+ addProperty: 'Tilføj egenskab',
+ addEditor: 'Tilføj editor',
+ addTemplate: 'Tilføj skabelon',
+ addChildNode: 'Tilføj child node',
+ addChild: 'Tilføj child',
+ editDataType: 'Rediger datatype',
+ navigateSections: 'Naviger sektioner',
+ shortcut: 'Genveje',
+ showShortcuts: 'Vis genveje',
+ toggleListView: 'Brug listevisning',
+ toggleAllowAsRoot: 'Tillad på rodniveau',
+ commentLine: 'Kommentér/Udkommentér linjer',
+ removeLine: 'Slet linje',
+ copyLineUp: 'Kopiér linjer op',
+ copyLineDown: 'Kopiér linjer ned',
+ moveLineUp: 'Flyt linjer op',
+ moveLineDown: 'Flyt linjer ned',
+ generalHeader: 'Generelt',
+ editorHeader: 'Editor',
+ toggleAllowCultureVariants: 'Skift tillad sprogvarianter',
+ addTab: 'Add tab',
+ },
+ graphicheadline: {
+ backgroundcolor: 'Baggrundsfarve',
+ bold: 'Fed',
+ color: 'Tekstfarve',
+ font: 'Skrifttype',
+ text: 'Tekst',
+ },
+ headers: {
+ page: 'Side',
+ },
+ installer: {
+ databaseErrorCannotConnect: 'Installeringsprogrammet kan ikke forbinde til databasen.',
+ databaseErrorWebConfig:
+ 'Kunne ikke gemme web.config filen. Du bedes venligst manuelt ændre database\n forbindelses strengen.\n ',
+ databaseFound: 'Din database er blevet fundet og identificeret som',
+ databaseHeader: 'Database konfiguration',
+ databaseInstall: '\n Klik på installér knappen for at installere Umbraco %0% databasen\n ',
+ databaseInstallDone:
+ 'Umbraco %0% er nu blevet kopieret til din database. Tryk på Næste for at fortsætte.',
+ databaseNotFound:
+ 'Databasen er ikke fundet. Kontrollér venligst at informationen i database forbindelsesstrengen i "web.config" filen er korrekt.
\nFor at fortsætte bedes du venligst rette "web.config" filen (ved at bruge Visual Studio eller dit favoritprogram), scroll til bunden, tilføj forbindelsesstrengen til din database i feltet som hedder "umbracoDbDSN" og gem filen.
Klik på Forsøg igen knappen når du er færdig.Mere information om at redigere web.config her.
',
+ databaseText:
+ 'For at afslutte dette skridt er du nødt til at have nogle informationer om din database parat ("database forbindelsesstrengen"). Kontakt venligst din ISP hvis det er nødvendigt. Hvis du installerer på en lokal maskine eller server kan du muligvis få informationerne fra din systemadministrator.',
+ databaseUpgrade:
+ 'Tryk på Opgradér knappen for at opgradere din database til Umbraco %0%
Bare rolig - intet indhold vil blive slettet og alt vil stadig fungere bagefter!
',
+ databaseUpgradeDone:
+ 'Din database er blevet opgraderet til den endelige version %0%. Tryk på Næste for at fortsætte.',
+ databaseUpToDate:
+ 'Din database er up-to-date!. Klik på Næste for at fortsætte med konfigurationsguiden.',
+ defaultUserChangePass: 'Normalbrugerens adgangskode er nødt til at blive ændret! ',
+ defaultUserDisabled:
+ 'Normalbrugeren er blevet gjort utjenstdygtig eller har ikke adgang til Umbraco!
Du behøver ikke foretage yderligere handlinger. Tryk på Næste for at fortsætte.
',
+ defaultUserPassChanged:
+ 'Normalbrugerens adgangskode er på succesfuld vis blevet ændret siden installationen!
Du behøver ikke foretage yderligere handlinger. Tryk på Næste for at fortsætte.
',
+ defaultUserPasswordChanged: 'Adgangskoden er blevet ændret!',
+ greatStart: 'FÃ¥ en fremragende start, se vores videoer',
+ licenseText:
+ "Ved at klikke på næste knappen (eller ved at ændre UmbracoConfigurationStatus i web.config\n filen), accepterer du licensaftalen for denne software, som specificeret i boksen nedenfor. Bemærk venligst at\n denne Umbraco distribution består af to forskellige licenser, MIT's Open Source Licens for frameworket og Umbraco\n Freeware Licensen som dækker UI'en.\n ",
+ None: 'Endnu ikke installeret',
+ permissionsAffectedFolders: 'Berørte filer og foldere',
+ permissionsAffectedFoldersMoreInfo: 'Flere informationer om at opsætte rettigheder for Umbraco her',
+ permissionsAffectedFoldersText:
+ "Du er nødt til at give ASP.NET 'modify' rettigheder på følgende\n filer/foldere\n ",
+ permissionsAlmostPerfect:
+ 'Dine rettighedsindstillinger er næsten perfekte! Du kan køre Umbraco uden problemer, men du vil ikke være i stand til at installere pakker, som er anbefalet for at få fuldt udbytte af Umbraco.',
+ permissionsHowtoResolve: 'Hvorledes besluttes',
+ permissionsHowtoResolveLink: 'Klik her for at læse tekstversionen',
+ permissionsHowtoResolveText:
+ 'Se vores video tutorials om at opsætte folderrettigheder for Umbraco eller læs tekstversionen.',
+ permissionsMaybeAnIssue:
+ 'Dine rettighedsindstillinger kan være et problem! Du kan afvikle Umbraco uden problemer, men du vil ikke være i stand til at oprette foldere eller installere pakker, hvilket er anbefalet for at få fuldt udbytte af Umbraco.',
+ permissionsNotReady:
+ 'Dine rettighedsindstillinger er ikke klar til Umbraco! For at afvikle Umbraco er du nødt til at opdatere dine rettighedsindstillinger.',
+ permissionsPerfect:
+ 'Dine rettighedsindstillinger er perfekte! Du er nu parat til at afvikle Umbraco og installere pakker!',
+ permissionsResolveFolderIssues: 'Løser folder problem',
+ permissionsResolveFolderIssuesLink:
+ 'Følg dette link for mere information om udfordringer med ASP.NET og\n oprettelse af foldere\n ',
+ permissionsSettingUpPermissions: 'Sætter folderrettigheder op',
+ permissionsText:
+ "Umbraco har behov for 'write/modify' adgang til bestemte foldere, for at kunne gemme\n filer som billeder og PDF'er. Umbraco gemmer også midlertidige data (eksempelvis cachen) for at forbedre ydelsen\n på dit website.\n ",
+ runwayFromScratch: 'Jeg har lyst til at begynde på bar bund',
+ runwayFromScratchText:
+ 'Dit website er helt tomt for øjeblikket, så det er perfekt hvis du ønsker at begynde på bar bund og oprette dine egne dokumenttyper og skabeloner. (lær hvordan ) Du kan stadig vælge at installere Runway senere. Gå venligst til Udvikler-sektionen og vælg Pakker.',
+ runwayHeader: 'Du har lige opsat en ren Umbraco-platform. Hvad ønsker du nu at gøre?',
+ runwayInstalled: 'Runway er installeret',
+ runwayInstalledText:
+ 'Du har fundamentet på plads. Vælg hvilke moduler du ønsker at installere ovenpå det. Dette er vores liste over anbefalede moduler. Kryds dem af du ønsker at installere eller se den fulde liste af moduler ',
+ runwayOnlyProUsers: 'Kun anbefalet for erfarne brugere',
+ runwaySimpleSite: 'Jeg ønsker at begynder med et simpelt website',
+ runwaySimpleSiteText:
+ "\"Runway\" er et simpelt website som stiller nogle basale dokumenttyper og skabeloner til rådighed. Installeringsprogrammet kan automatisk opsætte Runway for dig, men du kan nemt redigere, udvide eller fjerne det. Det er ikke nødvendigt og du kan sagtens bruge Umbraco uden. Men Runway tilbyder et fundament, som er baseret på 'Best Practices', som får dig igang hurtigere end nogensinde før. Hvis du vælger at installere Runway, kan du efter eget valg vælge de grundlæggende byggesten kaldet 'Runway Modules' til at forbedre dine Runway-sider.
Inkluderet med Runway: Home Page, Getting Started page, Installing Modules page. Valgfri Moduler: Top Navigation, Sitemap, Contact, Gallery.
",
+ runwayWhatIsRunway: 'Hvad er Runway',
+ step1: 'Skridt 1/5: Acceptér licens',
+ step2: 'Skridt 2/5: Database-konfiguration',
+ step3: 'Skridt 3/5: Validerer filrettigheder',
+ step4: 'Skridt 4/5: Kontrollér Umbraco sikkerhed',
+ step5: 'Skridt 5/5: Umbraco er parat til at få dig igang',
+ thankYou: 'Tak fordi du valgte Umbraco',
+ theEndBrowseSite:
+ 'Gennemse dit nye site Du installerede Runway, så hvorfor ikke se hvordan dit nye website ser ud.',
+ theEndFurtherHelp:
+ "Yderligere hjælpe og informationer Få hjælp fra vores prisvindende fællesskab, gennemse dokumentationen eller se nogle gratis videoer om hvordan du opsætter et simpelt site, hvordan du bruger pakker og en 'quick guide' til Umbraco terminologier",
+ theEndHeader: 'Umbraco %0% er installeret og klar til brug',
+ theEndInstallFailed:
+ "For at afslutte installationen er du nødt til manuelt at rette /web.config filen og opdatére 'AppSetting' feltet UmbracoConfigurationStatus i bunden til '%0%' .",
+ theEndInstallSuccess:
+ 'Du kan komme igang med det samme ved at klikke på "Start Umbraco" knappen nedenfor. Hvis du er ny med Umbraco , kan du finde masser af ressourcer på vores \'getting started\' sider.\n',
+ theEndOpenUmbraco:
+ "Start Umbraco For at administrere dit website skal du blot åbne Umbraco administrationen og begynde at tilføje indhold, opdatere skabelonerne og stylesheets'ene eller tilføje ny funktionalitet.",
+ Unavailable: 'Forbindelse til databasen fejlede.',
+ Version3: 'Umbraco Version 3',
+ Version4: 'Umbraco Version 4',
+ watch: 'Se',
+ welcomeIntro:
+ 'Denne guide vil bringe dig gennem konfigurationsprocessen af Umbraco %0% for en frisk installation eller for en opgradering fra version 3.0. Tryk på Næste for at begynde på guiden.',
+ },
+ language: {
+ cultureCode: 'Culture Code',
+ displayName: 'Culture Name',
+ },
+ lockout: {
+ lockoutWillOccur: 'Du har været inaktiv, og du vil blive logget ud om',
+ renewSession: 'Forny for at gemme dine ændringer',
+ },
+ main: {
+ dashboard: 'Skrivebord',
+ sections: 'Sektioner',
+ tree: 'Indhold',
+ },
+ moveOrCopy: {
+ choose: 'Vælg siden ovenover...',
+ copyDone: '%0% er nu kopieret til %1%',
+ copyTo: 'Kopier til',
+ moveDone: '%0% er nu flyttet til %1%',
+ moveTo: 'Flyt til',
+ nodeSelected: "er blevet valgt som roden for dit nye indhold, klik 'ok' nedenunder.",
+ noNodeSelected: "Intet element valgt, vælg et element i listen ovenfor før der klikkes 'fortsæt'",
+ notAllowedByContentType: 'Det nuværende element kan ikke lægges under denne pga. sin type',
+ notAllowedByPath: 'Det nuværende element kan ikke ligge under en af dens undersider',
+ notAllowedAtRoot: 'Dette element må ikke findes på rodniveau',
+ notValid:
+ 'Denne handling er ikke tilladt fordi du ikke har de fornødne rettigheder på et eller flere af\n under-dokumenterne\n ',
+ relateToOriginal: 'Relater det kopierede element til originalen',
+ },
+ notifications: {
+ editNotifications: 'Vælg dine notificeringer for %0% ',
+ notificationsSavedFor: 'Notificeringer er gemt for',
+ notifications: 'Notificeringer',
+ },
+ packager: {
+ actions: 'Handlinger',
+ created: 'Oprettet',
+ createPackage: 'Opret pakke',
+ chooseLocalPackageText: 'Vælg pakken fra din computer. Umbraco pakker er oftest en ".zip" fil',
+ deletewarning: 'Dette vil slette pakken',
+ includeAllChildNodes: 'Inkludér alle underliggende sider',
+ installed: 'Installeret',
+ installedPackages: 'Installerede pakker',
+ noConfigurationView: 'Denne pakke har ingen konfigurationsvisning',
+ noPackagesCreated: 'Der er ikke blevet oprettet nogle pakker endnu',
+ noPackages: 'Du har ingen pakker installeret',
+ noPackagesDescription:
+ "Du har ikke nogen pakker installeret. Du kan enten installere en lokal pakke ved at vælge den fra din computer eller gennemse de tilgængelige pakker ved hjælp af ikonet 'Pakker' øverst til højre på din skærm",
+ packageContent: 'Pakkeindhold',
+ packageLicense: 'Licens',
+ packageSearch: 'Søg efter pakker',
+ packageSearchResults: 'Resultater for',
+ packageNoResults: 'Vi kunne ikke finde resultater for',
+ packageNoResultsDescription: 'Prøv venligst at søge efter en anden pakke eller gennemse kategorierne\n ',
+ packagesPopular: 'Populære',
+ packagesNew: 'Nye udgivelser',
+ packageHas: 'har',
+ packageKarmaPoints: 'karma points',
+ packageInfo: 'Information',
+ packageOwner: 'Ejer',
+ packageContrib: 'Bidragsydere',
+ packageCreated: 'Oprettet',
+ packageCurrentVersion: 'Nuværende version',
+ packageNetVersion: '.NET version',
+ packageDownloads: 'Downloads',
+ packageLikes: 'Likes',
+ packageCompatibility: 'Kompatibilitet',
+ packageCompatibilityDescription:
+ 'Denne pakke er kompatibel med de følgende versioner af Umbraco, som\n rapporteret af community-medlemmer. Fuld kompatibilitet kan ikke garanteres for versioner rapporteret nedenfor\n 100%\n ',
+ packageExternalSources: 'Eksterne kilder',
+ packageAuthor: 'Forfatter',
+ packageDocumentation: 'Dokumentation',
+ packageMetaData: 'Pakke meta data',
+ packageName: 'Pakkenavn',
+ packageNoItemsHeader: 'Pakken indeholder ingen elementer',
+ packageNoItemsText:
+ 'Denne pakkefil indeholder ingen elementer som kan af-installeres. Du kan roligt fjerne denne fra systemet ved at klikke på "Fjern pakke" nedenfor.',
+ packageOptions: 'Pakkevalg',
+ packageReadme: 'Pakke læs mig',
+ packageRepository: 'Pakke opbevaringsbase',
+ packageUninstallConfirm: 'Bekræft af-installering',
+ packageUninstalledHeader: 'Pakken blev fjernet',
+ packageUninstalledText: 'Pakken er på succesfuld vis blevet fjernet',
+ packageUninstallHeader: 'Afinstallér pakke',
+ packageUninstallText:
+ 'Du kan fjerne markeringen på elementer du ikke ønsker at fjerne, på dette tidspunkt, nedenfor. Når du klikker \'bekræft\' vil alle afkrydsede elemenet blive fjernet \nBemærk: at dokumenter og medier som afhænger af denne pakke vil muligvis holde op med at virke, så vær forsigtig. Hvis i tvivl, kontakt personen som har udviklet pakken.',
+ packageVersion: 'Pakke version',
+ installInstructions: 'Install instructions',
+ packagesPromoted: 'Promoted',
+ packageMigrationsRun: 'Run pending package migrations',
+ packageMigrationsComplete: 'Package migrations have successfully completed.',
+ packageMigrationsNonePending: 'All package migrations have successfully completed.',
+ verifiedToWorkOnUmbracoCloud: 'Verified to work on Umbraco Cloud',
+ },
+ paste: {
+ doNothing: 'Indsæt med fuld formattering (Anbefales ikke)',
+ errorMessage:
+ 'Den tekst du er ved at indsætte indeholder specialtegn eller formattering. Dette kan\n skyldes at du kopierer fra f.eks. Microsoft Word. Umbraco kan fjerne denne specialformattering automatisk så\n indholdet er mere velegnet til visning på en webside.\n ',
+ removeAll: 'Indsæt som ren tekst, dvs. fjern al formattering',
+ removeSpecialFormattering: 'Indsæt, men fjern formattering som ikke bør være på en webside (Anbefales)\n ',
+ },
+ publicAccess: {
+ paGroups: 'Gruppebaseret beskyttelse',
+ paGroupsHelp: 'Hvis du ønsker at give adgang til alle medlemmer af specifikke medlemsgrupper',
+ paGroupsNoGroups: 'Du skal oprette en medlemsgruppe før du kan bruge gruppebaseret beskyttelse',
+ paErrorPage: 'Fejlside',
+ paErrorPageHelp: 'Brugt når folk er logget ind, men ingen adgang',
+ paHowWould: 'Vælg hvordan siden %0% skal beskyttes',
+ paIsProtected: '%0% er nu beskyttet',
+ paIsRemoved: 'Beskyttelse fjernet fra %0% ',
+ paLoginPage: 'Log ind-side',
+ paLoginPageHelp: 'Vælg siden der indeholder log ind-formularen',
+ paRemoveProtection: 'Fjern beskyttelse...',
+ paRemoveProtectionConfirm: 'Er du sikker på at du vil fjerne beskyttelsen fra siden %0% ?',
+ paSelectPages: 'Vælg siderne der indeholder log ind-formularer og fejlmeddelelser',
+ paSelectGroups: 'Vælg de grupper der har adgang til siden %0% ',
+ paSelectMembers: 'Vælg de medlemmer der har adgang til siden %0% ',
+ paMembers: 'Adgang til enkelte medlemmer',
+ paMembersHelp: 'Hvis du ønsker at give adgang til enkelte medlemmer',
+ },
+ publish: {
+ invalidPublishBranchPermissions: 'Utilstrækkelige bruger adgang til a udgive alle under dokumenter',
+ contentPublishedFailedAwaitingRelease: 'Udgivelsen kunne ikke udgives da publiceringsdato er sat',
+ contentPublishedFailedIsTrashed: '\n %0% kunne ikke publiceres da elementet er i skraldespanden.\n ',
+ contentPublishedFailedExpired:
+ '\n %0% Udgivelsen kunne ikke blive publiceret da publiceringsdatoen er overskredet\n ',
+ contentPublishedFailedInvalid:
+ '\n %0% kunne ikke publiceres da følgende egenskaber : %1% ikke overholdte valderingsreglerne.\n ',
+ contentPublishedFailedByEvent: '%0% kunne ikke udgives, fordi et 3. parts modul annullerede handlingen\n ',
+ contentPublishedFailedByMissingName: '%0% kan ikke udgives, fordi det mangler et navn.',
+ includeUnpublished: 'Medtag ikke-udgivede undersider',
+ inProgress: 'Publicerer - vent venligst...',
+ inProgressCounter: '%0% ud af %1% sider er blevet udgivet...',
+ nodePublish: '%0% er nu publiceret',
+ nodePublishAll: '%0% og alle undersider er nu publiceret',
+ publishAll: 'Publicér alle undersider',
+ publishHelp:
+ 'Klik ok for at udgive %0% og derved gøre indholdet offentligt tilgængeligt.. Du kan udgive denne side og dens undersider ved at klikke Udgiv alle undersider forneden',
+ contentPublishedFailedByParent: '\n %0% can not be published, because a parent page is not published.\n ',
+ contentPublishedFailedReqCultureValidationError:
+ "Validation failed for required language '%0%'. This\n language was saved but not published.\n ",
+ },
+ colorpicker: {
+ noColors: 'Du har ikke konfigureret nogen godkendte farver',
+ },
+ contentPicker: {
+ allowedItemTypes: 'Du kan kun vælge følgende type(r) dokumenter: %0%',
+ pickedTrashedItem: 'Du har valgt et dokument som er slettet eller lagt i papirkurven',
+ pickedTrashedItems: 'Du har valgt dokumenter som er slettede eller lagt i papirkurven',
+ },
+ mediaPicker: {
+ deletedItem: 'Slettet medie',
+ pickedTrashedItem: 'Du har valgt et medie som er slettet eller lagt i papirkurven',
+ pickedTrashedItems: 'Du har valgt medier som er slettede eller lagt i papirkurven',
+ trashed: 'Slettet',
+ openMedia: 'Ã…ben i mediebiblioteket',
+ changeMedia: 'Skift medie',
+ editMediaEntryLabel: 'Rediger %0% på %1%',
+ confirmCancelMediaEntryCreationHeadline: 'Annuller indsættelse?',
+ confirmCancelMediaEntryCreationMessage: 'Er du sikker på at du vil annullere indsættelsen?',
+ confirmCancelMediaEntryHasChanges:
+ 'Du har foretaget ændringer til bruge af dette media. Er du sikker på\n at du vil annullere?\n ',
+ confirmRemoveAllMediaEntryMessage: 'Fjern brugen af alle medier?',
+ tabClipboard: 'Udklipsholder',
+ notAllowed: 'Ikke tilladt',
+ openMediaPicker: 'Open media picker',
+ },
+ relatedlinks: {
+ enterExternal: 'indtast eksternt link',
+ chooseInternal: 'vælg en intern side',
+ caption: 'Tekst',
+ link: 'Link',
+ newWindow: 'Nyt vindue',
+ captionPlaceholder: 'Indtast en tekst',
+ externalLinkPlaceholder: 'Indtast et link',
+ },
+ imagecropper: {
+ reset: 'Nulstil',
+ updateEditCrop: 'Acceptér',
+ undoEditCrop: 'Fortryd',
+ customCrop: 'Brugerdefineret',
+ },
+ rollback: {
+ changes: 'Ændringer',
+ headline: 'Vælg en version at sammenligne med den nuværende version',
+ diffHelp:
+ 'Her vises forskellene mellem den nuværende version og den valgte versionRød tekst vil ikke blive vist i den valgte version. Grøn betyder tilføjet ',
+ noDiff: 'Der er ingen forskelle mellem den nuværende version og den valgte version',
+ documentRolledBack: 'Dokument tilbagerullet',
+ htmlHelp:
+ "Her vises den valgte version som html. Hvis du ønsker at se forskellen mellem de 2 versioner\n på samme tid, brug 'diff'-oversigten\n ",
+ rollbackTo: 'Tilbagerulning til',
+ selectVersion: 'Vælg version',
+ view: 'Vis',
+ created: 'Created',
+ currentVersion: 'Current version',
+ pagination: 'Showing version %0% to %1% of %2% versions',
+ versions: 'Versions',
+ currentDraftVersion: 'Current draft version',
+ currentPublishedVersion: 'Current published version',
+ },
+ scripts: {
+ editscript: 'Rediger script',
+ },
+ sections: {
+ concierge: 'Concierge',
+ content: 'Indhold',
+ courier: 'Courier',
+ developer: 'Udvikler',
+ installer: 'Umbraco konfigurationsguide',
+ media: 'Mediearkiv',
+ member: 'Medlemmer',
+ packages: 'Pakker',
+ marketplace: 'Marketplace',
+ newsletters: 'Nyhedsbreve',
+ settings: 'Indstillinger',
+ statistics: 'Statistik',
+ translation: 'Oversættelse',
+ users: 'Brugere',
+ help: 'Hjælp',
+ forms: 'Formularer',
+ deploy: 'Deploy',
+ deployOpenPortal: 'Ã…ben portalen',
+ deployHelpAndDocumentation: 'Hjælp og dokumentation',
+ deployOpenQueue: 'Åben overførselskøen',
+ deployGettingStarted: 'Kom godt igang',
+ deploySetupProject: 'Opsæt dit projekt',
+ deployDeployment: "Lær om 'Deployment'",
+ deployTroubleshooting: 'Fejlsøgning',
+ },
+ help: {
+ tours: 'Tours',
+ theBestUmbracoVideoTutorials: 'De bedste Umbraco video tutorials',
+ umbracoForum: 'Besøg our.umbraco.com',
+ umbracoTv: 'Besøg umbraco.tv',
+ umbracoLearningBase: 'Watch our free tutorial videos',
+ umbracoLearningBaseDescription: 'on the Umbraco Learning Base',
+ },
+ settings: {
+ defaulttemplate: 'Standardskabelon',
+ importDocumentTypeHelp:
+ 'For at importere en dokumenttype, find ".udt"-filen på din computer ved at\n klikke på "Gennemse"-knappen og klik "Import" (Du vil blive bedt om bekræftelse på næste skærmbillede)\n ',
+ newtabname: 'Ny titel på faneblad',
+ nodetype: 'Nodetype',
+ objecttype: 'Type',
+ stylesheet: 'Stylesheet',
+ script: 'Script',
+ tab: 'Faneblad',
+ tabname: 'Titel på faneblad',
+ tabs: 'Faneblade',
+ createMatchingTemplate: 'Opret tilsvarende skabelon',
+ addIcon: 'Tilføj ikon',
+ contentTypeEnabled: 'Master Content Type enabled',
+ contentTypeUses: 'This Content Type uses',
+ noPropertiesDefinedOnTab:
+ 'No properties defined on this tab. Click on the "add a new property" link at\n the top to create a new property.\n ',
+ },
+ sort: {
+ sortOrder: 'Sorteringsrækkefølge',
+ sortCreationDate: 'Oprettelsesdato',
+ sortDone: 'Sortering udført',
+ sortHelp:
+ 'Træk de forskellige sider op eller ned for at indstille hvordan de skal arrangeres, eller klik\n på kolonnehovederne for at sortere hele rækken af sider\n ',
+ sortPleaseWait: 'Vent venligst mens siderne sorteres. Det kan tage et stykke tid.',
+ sortEmptyState: 'Denne node har ingen under noder at sortere',
+ },
+ speechBubbles: {
+ validationFailedHeader: 'Validering',
+ validationFailedMessage: 'Valideringsfejl skal rettes før elementet kan gemmes',
+ operationFailedHeader: 'Fejlet',
+ operationSavedHeader: 'Gemt',
+ operationSavedHeaderReloadUser: 'Gemt. For at se ændringerne skal du genindlæse din browser',
+ invalidUserPermissionsText: 'Utilstrækkelige brugerrettigheder, kunne ikke fuldføre handlingen',
+ operationCancelledHeader: 'Annulleret',
+ operationCancelledText: 'Handlingen blev annulleret af et 3. part tilføjelsesprogram',
+ contentPublishedFailedByEvent: 'Udgivelsen blev annulleret af et 3. part tilføjelsesprogram',
+ contentTypeDublicatePropertyType: 'Property type eksisterer allerede',
+ contentTypePropertyTypeCreated: 'Egenskabstype oprettet',
+ contentTypePropertyTypeCreatedText: 'Navn: %0% DataType: %1%',
+ contentTypePropertyTypeDeleted: 'Egenskabs type slettet',
+ contentTypeSavedHeader: 'Indholdstype gemt',
+ contentTypeTabCreated: 'Du har oprettet et faneblad',
+ contentTypeTabDeleted: 'Faneblad slettet',
+ contentTypeTabDeletedText: 'Faneblad med id: %0% slettet',
+ cssErrorHeader: 'Stylesheetet blev ikke gemt',
+ cssSavedHeader: 'Stylesheet gemt',
+ cssSavedText: 'Stylesheet gemt uden fejl',
+ dataTypeSaved: 'Datatype gemt',
+ dictionaryItemSaved: 'Ordbogsnøgle gemt',
+ editContentPublishedFailedByParent: 'Udgivelse fejlede da overliggende side ikke er udgivet',
+ editContentPublishedHeader: 'Indhold publiceret',
+ editContentPublishedText: 'og nu synligt for besøgende',
+ editMultiContentPublishedText: '%0% dokumenter udgivet og synlige på hjemmesiden',
+ editVariantPublishedText: '%0% udgivet og synligt på hjemmesiden',
+ editMultiVariantPublishedText: '%0% dokumenter udgivet for sprogene %1% og synlige på hjemmesiden',
+ editBlueprintSavedHeader: 'Indholdsskabelon gemt',
+ editBlueprintSavedText: 'Rettelser er blevet gemt',
+ editContentSavedHeader: 'Indhold gemt',
+ editContentSavedText: 'Husk at publicere for at gøre det synligt for besøgende',
+ editContentScheduledSavedText: 'En planlægning for udgivelse er blevet opdateret',
+ editVariantSavedText: '%0% gemt',
+ editContentSendToPublish: 'Send til Godkendelse',
+ editContentSendToPublishText: 'Rettelser er blevet sendt til godkendelse',
+ editVariantSendToPublishText: '%0% rettelser er blevet sendt til godkendelse',
+ editMediaSaved: 'Medie gemt',
+ editMediaSavedText: 'Medie gemt uden problemer',
+ editMemberSaved: 'Medlem gemt',
+ editStylesheetPropertySaved: 'Stylesheetegenskab gemt',
+ editStylesheetSaved: 'Stylesheet gemt',
+ editTemplateSaved: 'Skabelon gemt',
+ editUserError: 'Der er opstået en fejl under redigering',
+ editUserSaved: 'Bruger gemt',
+ editUserTypeSaved: 'Brugertype gemt',
+ editUserGroupSaved: 'Brugergruppe gemt',
+ editCulturesAndHostnamesSaved: 'Sprog og domæner gemt',
+ editCulturesAndHostnamesError: 'Der opstod en fejl ved at gemme sprog og domæner',
+ fileErrorHeader: 'Fil ikke gemt',
+ fileErrorText: 'Filen kunne ikke gemmes. Tjek filrettighederne',
+ fileSavedHeader: 'Fil gemt',
+ fileSavedText: 'Fil gemt uden fejl',
+ languageSaved: 'Sprog gemt',
+ mediaTypeSavedHeader: 'Medietype gemt',
+ memberTypeSavedHeader: 'Medlemstype gemt',
+ memberGroupSavedHeader: 'Medlemsgruppe gemt',
+ templateErrorHeader: 'Skabelon ikke gemt',
+ templateErrorText: 'Undgå venligst at du har 2 templates med samme alias',
+ templateSavedHeader: 'Skabelon gemt',
+ templateSavedText: 'Skabelon gemt uden fejl!',
+ contentUnpublished: 'Indhold fjernet fra udgivelse',
+ contentCultureUnpublished: 'Indhold variation %0% afpubliceret',
+ contentMandatoryCultureUnpublished:
+ "Det krævet sprog '%0%' var afpubliceret. Alle sprog for dette\n indholds element er nu afpubliceret.\n ",
+ partialViewSavedHeader: 'Partial view gemt',
+ partialViewSavedText: 'Partial view gemt uden fejl!',
+ partialViewErrorHeader: 'Partial view ikke gemt',
+ partialViewErrorText: 'Der opstod en fejl ved at gemme filen.',
+ permissionsSavedFor: 'Rettigheder gemt for',
+ deleteUserGroupsSuccess: 'Slettede %0% brugergrupper',
+ deleteUserGroupSuccess: '%0% blev slettet',
+ enableUsersSuccess: 'Aktiverede %0% brugere',
+ disableUsersSuccess: 'Deaktiverede %0% brugere',
+ enableUserSuccess: '%0% er nu aktiveret',
+ disableUserSuccess: '%0% er nu deaktiveret',
+ setUserGroupOnUsersSuccess: 'Brugergrupper er blevet indstillet',
+ unlockUsersSuccess: 'LÃ¥ste %0% brugere op',
+ unlockUserSuccess: '%0% er nu låst op',
+ memberExportedSuccess: 'Medlem blev exportet til fil',
+ memberExportedError: 'Der skete en fejl under exporteringen af medlemmet',
+ deleteUserSuccess: 'Brugeren %0% blev slettet',
+ resendInviteHeader: 'Invitér bruger',
+ resendInviteSuccess: 'Invitationen blev gensendt til %0%',
+ contentReqCulturePublishError: "Kan ikke udgive dokumentet da det krævet '%0%' ikke er udgivet",
+ contentCultureValidationError: "Validering fejlede for sproget '%0%'",
+ documentTypeExportedSuccess: 'Dokumenttypen blev eksporteret til en fil',
+ documentTypeExportedError: 'Der skete en fejl under eksport af en dokumenttype',
+ scheduleErrReleaseDate1: 'Udgivelses datoen kan ikke ligge i fortiden',
+ scheduleErrReleaseDate2: "Kan ikke planlægge dokumentes udgivelse da det krævet '%0%' ikke er udgivet\n ",
+ scheduleErrReleaseDate3:
+ "Kan ikke planlægge dokumentes udgivelse da det krævet '%0%' har en senere\n udgivelses dato end et ikke krævet sprog\n ",
+ scheduleErrExpireDate1: 'Afpubliceringsdatoen kan ikke ligge i fortiden',
+ scheduleErrExpireDate2: 'Afpubliceringsdatoen kan ikke være før udgivelsesdatoen',
+ publishWithNoDomains:
+ 'Domæner er ikke konfigureret for en flersproget side, kontakt vensligst en\n administrator, se loggen for mere information\n ',
+ publishWithMissingDomain:
+ 'Der er ikke noget domæne konfigureret for %0%, kontakt vensligst en\n administrator, se loggen for mere information\n ',
+ copySuccessMessage: 'Dit systems information er blevet kopieret til udklipsholderen',
+ cannotCopyInformation: 'Kunne desværre ikke kopiere dit systems information til udklipsholderen',
+ folderUploadNotAllowed:
+ 'This file is being uploaded as part of a folder, but creating a new folder is not allowed here',
+ folderCreationNotAllowed: 'Creating a new folder is not allowed here',
+ memberGroupNameDuplicate: 'Another Member Group with the same name already exists',
+ dictionaryItemExportedSuccess: 'Dictionary item(s) was exported to file',
+ dictionaryItemExportedError: 'An error occurred while exporting the dictionary item(s)',
+ dictionaryItemImported: 'The following dictionary item(s) has been imported!',
+ preventCleanupEnableError: 'An error occurred while enabling version cleanup for %0%',
+ preventCleanupDisableError: 'An error occurred while disabling version cleanup for %0%',
+ },
+ stylesheet: {
+ addRule: 'Tilføj style',
+ editRule: 'Redigér style',
+ editorRules: 'Teksteditor-styles',
+ editorRulesHelp: 'Definér de styles, der skal være tilgængelige i teksteditoren for dette stylesheet\n ',
+ selector: 'Selector',
+ selectorHelp: 'Bruger CSS-syntaks, f.eks. "h1" eller ".redheader"',
+ editstylesheet: 'Rediger stylesheet',
+ editstylesheetproperty: 'Rediger CSS-egenskab',
+ nameHelp: 'Det navn der vises i teksteditoren',
+ preview: 'Forhåndsvisning',
+ previewHelp: 'Hvordan teksten vil se ud i teksteditoren.',
+ styles: 'Styles',
+ stylesHelp: 'Den CSS der skal anvendes i teksteditoren, f.eks. "color:red;"',
+ tabCode: 'Kode',
+ tabRules: 'Editor',
+ },
+ template: {
+ deleteByIdFailed: 'Sletning af skabelonen med ID %0% fejlede',
+ edittemplate: 'Rediger skabelon',
+ insertSections: 'Sektioner',
+ insertContentArea: 'Indsæt indholdsområde',
+ insertContentAreaPlaceHolder: 'Indsæt pladsholder for indholdsområde',
+ insert: 'Indsæt',
+ insertDesc: 'Hvad vil du indsætte?',
+ insertDictionaryItem: 'Oversættelse',
+ insertDictionaryItemDesc:
+ 'Indsætter en oversætbar tekst, som skifter efter det sprog, som websitet vises\n i.\n ',
+ insertMacro: 'Makro',
+ insertMacroDesc:
+ '\n En makro er et element, som kan have forskellige indstillinger, når det indsættes.\n Brug det som en genbrugelig del af dit design såsom gallerier, formularer og lister.\n ',
+ insertPageField: 'Sideværdi',
+ insertPageFieldDesc:
+ '\n Viser værdien af et felt fra den nuværende side. Kan indstilles til at bruge rekursive værdier eller\n vise en standardværdi i tilfælde af, at feltet er tomt.\n ',
+ insertPartialView: 'Partial view',
+ insertPartialViewDesc:
+ '\n Et Partial View er et skabelonelement, som kan indsættes i andre skabeloner og derved\n genbruges og deles på tværs af sideskabelonerne.\n ',
+ mastertemplate: 'Master skabelon',
+ quickGuide: 'Lynguide til Umbracos skabelontags',
+ noMaster: 'Ingen master',
+ renderBody: 'Indsæt en underliggende skabelon',
+ renderBodyDesc:
+ '\n Henter indholdet af en underliggende skabelon ind, ved at\n indsætte et @RenderBody() element.\n ',
+ defineSection: 'Definer en sektion',
+ defineSectionDesc:
+ '\n Definerer en del af din skabelon som en navngivet sektion, ved at\n omkranse den i @section { ... }. Herefter kan denne sektion flettes ind i\n overliggende skabelon ved at indsætte et @RenderSection element.\n ',
+ renderSection: 'Indsæt en sektion',
+ renderSectionDesc:
+ '\n Henter indholdet af en sektion fra den underliggende skabelon ind, ved at indsætte et\n @RenderSection(name) element. Den underliggende skabelon skal have\n defineret en sektion via et @section [name]{ ... } element.\n ',
+ sectionName: 'Sektionsnavn',
+ sectionMandatory: 'Sektionen er obligatorisk',
+ sectionMandatoryDesc:
+ '\n Hvis obligatorisk, skal underskabelonen indeholde en @section -definition.\n ',
+ queryBuilder: 'Query builder',
+ itemsReturned: 'sider returneret, på',
+ iWant: 'Returner',
+ allContent: 'alt indhold',
+ contentOfType: 'indhold af typen "%0%"',
+ from: 'fra',
+ websiteRoot: 'mit website',
+ where: 'hvor',
+ and: 'og',
+ is: 'er',
+ isNot: 'ikke er',
+ before: 'er før',
+ beforeIncDate: 'er før (inkl. valgte dato)',
+ after: 'er efter',
+ afterIncDate: 'er efter (inkl. valgte dato)',
+ equals: 'er',
+ doesNotEqual: 'ikke er',
+ contains: 'indeholder',
+ doesNotContain: 'ikke indeholder',
+ greaterThan: 'er større end',
+ greaterThanEqual: 'er større end eller det samme som',
+ lessThan: 'er mindre end',
+ lessThanEqual: 'er mindre end eller det samme som',
+ id: 'Id',
+ name: 'Navn',
+ createdDate: 'Oprettelsesdato',
+ lastUpdatedDate: 'Sidste opdatering',
+ orderBy: 'Sortér efter',
+ ascending: 'stigende rækkefølge',
+ descending: 'faldende rækkefølge',
+ template: 'Skabelon',
+ runtimeModeProduction: 'Content is not editable when using runtime mode Production.',
+ },
+ grid: {
+ media: 'Billede',
+ macro: 'Macro',
+ insertControl: 'Vælg indholdstype',
+ chooseLayout: 'Vælg layout',
+ addRows: 'Tilføj række',
+ addElement: 'Tilføj indhold',
+ dropElement: 'Slip indhold',
+ settingsApplied: 'Indstillinger tilføjet',
+ contentNotAllowed: 'Indholdet er ikke tilladt her',
+ contentAllowed: 'Indholdet er tilladt her',
+ clickToEmbed: 'Klik for at indlejre',
+ clickToInsertImage: 'Klik for at indsætte et billede',
+ placeholderWriteHere: 'Skriv her...',
+ gridLayouts: 'Grid layout',
+ gridLayoutsDetail:
+ 'Et layout er det overordnede arbejdsområde til dit grid - du vil typisk kun behøve ét\n eller to\n ',
+ addGridLayout: 'Tilføj grid layout',
+ editGridLayout: 'Rediger grid layout',
+ addGridLayoutDetail: 'Juster dit layout ved at justere kolonnebredder og tilføj yderligere sektioner\n ',
+ rowConfigurations: 'Rækkekonfigurationer',
+ rowConfigurationsDetail: 'Rækker er foruddefinerede celler, der arrangeres vandret',
+ addRowConfiguration: 'Tilføj rækkekonfiguration',
+ editRowConfiguration: 'Rediger rækkekonfiguration',
+ addRowConfigurationDetail: 'Juster rækken ved at indstille cellebredder og tilføje yderligere celler\n ',
+ noConfiguration: 'Ingen yderligere konfiguration tilgængelig',
+ columns: 'Kolonner',
+ columnsDetails: 'Det totale antal kolonner i dit grid',
+ settings: 'Indstillinger',
+ settingsDetails: 'Konfigurer, hvilket indstillinger, brugeren kan ændre',
+ styles: 'Typografi',
+ stylesDetails: 'Vælg hvilke typografiværdier en redaktør kan ændre',
+ allowAllEditors: 'Tillad alle editorer',
+ allowAllRowConfigurations: 'Tillad alle rækkekonfigurationer',
+ setAsDefault: 'Sæt som standard',
+ chooseExtra: 'Vælg ekstra',
+ chooseDefault: 'Vælg standard',
+ areAdded: 'er tilføjet',
+ youAreDeleting: 'Du sletter en rækkekonfiguration',
+ deletingARow:
+ 'Sletning af et rækkekonfigurations navn vil resultere i et tab af data for alle\n eksiterende indhold som bruger dens konfiguration.\n ',
+ deleteLayout: 'Du sletter et layoutet',
+ deletingALayout:
+ 'Når du redigerer et layout vil data gå tabt de steder, hvor denne konfiguration\n bruges.\n ',
+ maxItems: 'Maksimalt emner',
+ maxItemsDescription: 'Efterlad blank eller sæt til 0 for ubegrænset',
+ clickToInsertMacro: 'Click to insert macro',
+ warning: 'Warning',
+ warningText:
+ 'Modifying a row configuration name will result in loss of data for any existing content that is based on this configuration.
Modifying only the label will not result in data loss.
',
+ },
+ contentTypeEditor: {
+ compositions: 'Kompositioner',
+ group: 'Gruppe',
+ noGroups: 'Du har ikke tilføjet nogen grupper',
+ addGroup: 'Tilføj gruppe',
+ inheritedFrom: 'Nedarvet fra',
+ addProperty: 'Tilføj egenskab',
+ requiredLabel: 'Påkrævet label',
+ enableListViewHeading: 'Aktivér listevisning',
+ enableListViewDescription:
+ 'Konfigurér indholdet til at blive vist i en sortérbar og søgbar liste;\n undersider vil ikke blive vist i træet\n ',
+ allowedTemplatesHeading: 'Tilladte skabeloner',
+ allowedTemplatesDescription: 'Vælg hvilke skabeloner, der er tilladt at bruge på dette indhold.',
+ allowAsRootHeading: 'Tillad på rodniveau',
+ allowAsRootDescription:
+ 'Kun dokumenttyper med denne indstilling aktiveret kan oprettes i rodniveau under\n indhold og mediearkiv.\n ',
+ childNodesHeading: 'Tilladte typer',
+ childNodesDescription: 'Tillad at oprette indhold af en specifik type under denne.',
+ chooseChildNode: 'Vælg child node',
+ compositionsDescription:
+ 'Nedarv faner og egenskaber fra en anden dokumenttype. Nye faner vil blive\n tilføjet den nuværende dokumenttype eller sammenflettet hvis fanenavnene er ens.\n ',
+ compositionInUse:
+ 'Indholdstypen bliver brugt i en komposition og kan derfor ikke blive anvendt som\n komposition\n ',
+ noAvailableCompositions: 'Der er ingen indholdstyper tilgængelige at bruge som komposition',
+ compositionRemoveWarning:
+ 'Når du fjerner en komposition vil alle associerede indholdsdata blive slettet.\n Når først dokumenttypen er gemt, er der ingen vej tilbage.\n ',
+ availableEditors: 'Opret ny indstilling',
+ reuse: 'Genbrug',
+ editorSettings: 'Input indstillinger',
+ searchResultSettings: 'Tilgængelige indstillinger',
+ searchResultEditors: 'Opret ny indstilling',
+ configuration: 'Konfiguration',
+ yesDelete: 'Ja, slet',
+ movedUnderneath: 'blev flyttet til',
+ copiedUnderneath: 'blev kopieret til',
+ folderToMove: 'Vælg hvor',
+ folderToCopy: 'Vælg hvor',
+ structureBelow: 'skal flyttes til',
+ allDocumentTypes: 'Alle dokumenttyper',
+ allDocuments: 'Alle dokumenter',
+ allMediaItems: 'Alle medier',
+ usingThisDocument:
+ 'som benytter denne dokumenttype vil blive slettet permanent. Bekræft at du også vil\n slette dem.\n ',
+ usingThisMedia:
+ 'som benytter denne medietype vil blive slettet permanent. Bekræft at du også vil slette\n dem.\n ',
+ usingThisMember:
+ 'som benytter denne medlemstype vil blive slettet permanent. Bekræft at du også vil\n slette dem.\n ',
+ andAllDocuments: 'og alle dokumenter, som benytter denne type',
+ andAllMediaItems: 'og alle medier, som benytter denne type',
+ andAllMembers: 'og alle medlemmer, som benytter denne type',
+ memberCanEdit: 'Medlem kan redigere',
+ memberCanEditDescription: 'Tillad at denne egenskab kan redigeres af medlemmet på dets profil.',
+ isSensitiveData: 'Er følsom data',
+ isSensitiveDataDescription:
+ 'Skjul værdien af denne egenskab for indholdsredaktører der ikke har adgang\n til at se følsomme data\n ',
+ showOnMemberProfile: 'Vis på medlemsprofil',
+ showOnMemberProfileDescription: 'Tillad at denne egenskab kan vises på medlemmets profil.',
+ tabHasNoSortOrder: 'fane har ingen sorteringsrækkefølge',
+ compositionUsageHeading: 'Hvor er denne komposition brugt?',
+ compositionUsageSpecification: 'Denne komposition brugt i kompositionen af de følgende indholdstyper:\n ',
+ variantsHeading: 'Tillad variationer',
+ cultureVariantHeading: 'Tillad sprogvariation',
+ segmentVariantHeading: 'Tillad segmentering',
+ cultureVariantLabel: 'Tillader sprogvariationer',
+ segmentVariantLabel: 'Tillader segmentering',
+ variantsDescription: 'Tillad at redaktører kan oprette indhold af denne type på flere sprog.',
+ cultureVariantDescription: 'Tillad at redaktører kan oprette dette indhold på flere sprog.',
+ segmentVariantDescription: 'Tillad at redaktører kan oprette flere udgaver af denne type indhold.',
+ allowVaryByCulture: 'Tillad sprogvariation',
+ allowVaryBySegment: 'Tillad segmentering',
+ elementType: 'Element-type',
+ elementHeading: 'Er en Element-type',
+ elementDescription: 'En Element-type er tiltænkt brug i andre Dokumenttyper, ikke i indholdstræet.\n ',
+ elementCannotToggle:
+ 'En Dokumenttype kan ikke ændres til en Element-type efter den er blevet brugt til\n at oprette en eller flere indholds elementer.\n ',
+ elementDoesNotSupport: 'Dette benyttes ikke for en Element-type',
+ propertyHasChanges: 'Du har lavet ændringer til denne egenskab. Er du sikker på at du vil kassere dem?\n ',
+ displaySettingsHeadline: 'Visning',
+ displaySettingsLabelOnTop: 'Label hen over (fuld bredde)',
+ removeChildNode: 'Du fjerner noden',
+ removeChildNodeWarning:
+ 'Fjernelse af noden, begrænser redaktørens muligheder for at oprette forskellige\n typer af underindhold.\n ',
+ groupReorderSameAliasError:
+ 'You can\'t move the group %0% to this tab because the group will get the same\n alias as a tab: "%1%". Rename the group to continue.\n ',
+ confirmDeleteTabMessage: 'Are you sure you want to delete the tab %0% ?',
+ confirmDeleteGroupMessage: 'Are you sure you want to delete the group %0% ?',
+ confirmDeletePropertyMessage: 'Are you sure you want to delete the property %0% ?',
+ confirmDeleteTabNotice: 'This will also delete all items below this tab.',
+ confirmDeleteGroupNotice: 'This will also delete all items below this group.',
+ addTab: 'Add tab',
+ convertToTab: 'Convert to tab',
+ tabDirectPropertiesDropZone: 'Drag properties here to place directly on the tab',
+ usingEditor: 'using this editor will get updated with the new settings.',
+ historyCleanupHeading: 'History cleanup',
+ historyCleanupDescription: 'Allow overriding the global history cleanup settings.',
+ historyCleanupKeepAllVersionsNewerThanDays: 'Keep all versions newer than days',
+ historyCleanupKeepLatestVersionPerDayForDays: 'Keep latest version per day for days',
+ historyCleanupPreventCleanup: 'Prevent cleanup',
+ historyCleanupEnableCleanup: 'Enable cleanup',
+ historyCleanupGloballyDisabled:
+ 'NOTE! The cleanup of historically content versions are disabled globally. These settings will not take effect before it is enabled.',
+ changeDataTypeHelpText:
+ 'Changing a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json.',
+ },
+ languages: {
+ addLanguage: 'Tilføj sprog',
+ mandatoryLanguage: 'Påkrævet sprog',
+ mandatoryLanguageHelp: 'Egenskaber på dette sprog skal være udfyldt før noden kan blive udgivet.',
+ defaultLanguage: 'Standardsprog',
+ defaultLanguageHelp: 'Et Umbraco-site kan kun have ét standardsprog.',
+ changingDefaultLanguageWarning: 'At skifte standardsprog kan resultere i at standardindhold mangler.\n ',
+ fallsbackToLabel: 'Fallback til',
+ noFallbackLanguageOption: 'Intet fallback-sprog',
+ fallbackLanguageDescription:
+ 'For at tillade flersproget indhold, som ikke er tilgængeligt i det anmodede\n sprog, skal du her vælge et sprog at falde tilbage på.\n ',
+ fallbackLanguage: 'Fallback-sprog',
+ none: 'ingen',
+ culture: 'ISO code',
+ invariantPropertyUnlockHelp: '%0% is shared across languages and segments.',
+ invariantCulturePropertyUnlockHelp: '%0% is shared across all languages.',
+ invariantSegmentPropertyUnlockHelp: '%0% is shared across all segments.',
+ invariantLanguageProperty: 'Shared: Languages',
+ invariantSegmentProperty: 'Shared: Segments',
+ },
+ macro: {
+ addParameter: 'Tilføj parameter',
+ editParameter: 'Redigér parameter',
+ enterMacroName: 'Indtast makronavn',
+ parameters: 'Parametre',
+ parametersDescription: 'Definér de parametre der skal være tilgængelige, når du bruger denne makro.',
+ selectViewFile: 'Vælg partial view makrofil',
+ },
+ modelsBuilder: {
+ buildingModels: 'Bygger modeller',
+ waitingMessage: 'dette kan tage lidt tid',
+ modelsGenerated: 'Modeller genereret',
+ modelsGeneratedError: 'Modeller kunne ikke genereres',
+ modelsExceptionInUlog: 'Modelgeneration fejlet, se fejlmeddelelse i log',
+ },
+ templateEditor: {
+ addDefaultValue: 'Tilføj standard værdi',
+ defaultValue: 'Standard værdi',
+ alternativeField: 'Alternativt felt',
+ alternativeText: 'Alternativ tekst',
+ casing: 'Casing',
+ encoding: 'Kodning',
+ chooseField: 'Felt som skal indsættes',
+ convertLineBreaks: 'Konvertér linjeskift',
+ convertLineBreaksHelp: "Erstatter et linjeskift med html-tag'et <br>",
+ customFields: 'Custom felter',
+ dateOnly: 'Ja, kun dato',
+ formatAsDate: 'Formatér som dato',
+ htmlEncode: 'HTML indkod',
+ htmlEncodeHelp: 'Vil erstatte specielle karakterer med deres HTML jævnbyrdige.',
+ insertedAfter: 'Denne tekst vil blive sat ind lige efter værdien af feltet',
+ insertedBefore: 'Denne tekst vil blive sat ind lige før værdien af feltet',
+ lowercase: 'Lowercase',
+ none: 'Ingen',
+ outputSample: 'Udskrift eksempel',
+ postContent: 'Indsæt efter felt',
+ preContent: 'Indsæt før felt',
+ recursive: 'Rekursivt',
+ recursiveDescr: 'Ja, lav det rekursivt',
+ removeParagraph: 'Fjern paragraf-tags',
+ removeParagraphHelp: 'Fjerner eventuelle <P> omkring teksten',
+ standardFields: 'Standard felter',
+ uppercase: 'Store bogstaver',
+ urlEncode: 'URL encode',
+ urlEncodeHelp:
+ 'Hvis indholdet af felterne skal sendes til en URL, skal denne slåes til så specialtegn\n formateres\n ',
+ usedIfAllEmpty: 'Denne tekst bruges hvis ovenstående felter er tomme',
+ usedIfEmpty: 'Dette felt vil blive brugt hvis ovenstående felt er tomt',
+ withTime: 'Ja, med klokkeslæt. Dato/tid separator:',
+ },
+ translation: {
+ details: 'Oversættelsesdetaljer',
+ DownloadXmlDTD: 'Download XML DTD',
+ fields: 'Felter',
+ includeSubpages: 'Inkluder undersider',
+ noTranslators:
+ 'Ingen oversættelsesbrugere er fundet. Opret venligst en oversættelsesbruger før du\n begynder at sende indhold til oversættelse\n ',
+ pageHasBeenSendToTranslation: "Siden '%0%' er blevet sent til oversættelse",
+ sendToTranslate: "Send siden '%0%' til oversættelse",
+ totalWords: 'Totalt antal ord',
+ translateTo: 'Oversæt til',
+ translationDone: 'Oversættelse gennemført.',
+ translationDoneHelp:
+ 'Du kan gennemse de sider, som du lige har oversat, ved at klikke nedenfor. Hvis den\n originale side bliver fundet, vil du blive præsenteret for en sammenligning af de to sider.\n ',
+ translationFailed: 'Oversættelse fejlede, XML-filen kan være korrupt (indeholde fejl)',
+ translationOptions: 'Oversættelsesmuligheder',
+ translator: 'Oversætter',
+ uploadTranslationXml: 'Upload oversættelse (xml)',
+ },
+ treeHeaders: {
+ content: 'Indhold',
+ contentBlueprints: 'Indholdsskabeloner',
+ media: 'Mediearkiv',
+ cacheBrowser: 'Cacheviser',
+ contentRecycleBin: 'Papirkurv',
+ createdPackages: 'Oprettede pakker',
+ dataTypes: 'Datatyper',
+ dictionary: 'Ordbog',
+ installedPackages: 'Installerede pakker',
+ installSkin: 'Installér et skin',
+ installStarterKit: 'Installér et starterkit',
+ languages: 'Sprog',
+ localPackage: 'Installér lokal pakke',
+ macros: 'Makroer',
+ mediaTypes: 'Medietyper',
+ member: 'Medlemmer',
+ memberGroups: 'Medlemsgrupper',
+ memberRoles: 'Roller',
+ memberTypes: 'Medlemstyper',
+ documentTypes: 'Dokumenttyper',
+ relationTypes: 'Relationstyper',
+ packager: 'Pakker',
+ packages: 'Pakker',
+ partialViews: 'Partial Views',
+ partialViewMacros: 'Partial View makrofiler',
+ repositories: 'Installer fra "repository"',
+ runway: 'Installer Runway',
+ runwayModules: 'Runway-moduler',
+ scripting: 'Scripting filer',
+ scripts: 'Scripts',
+ stylesheets: 'Stylesheets',
+ templates: 'Skabeloner',
+ logViewer: 'Logfremviser',
+ userPermissions: 'Brugertilladelser',
+ userTypes: 'Brugertyper',
+ users: 'Brugere',
+ settingsGroup: 'Indstillinger',
+ templatingGroup: 'Design og layout',
+ thirdPartyGroup: 'Tredjepart',
+ },
+ update: {
+ updateAvailable: 'Ny opdatering er klar',
+ updateDownloadText: '%0% er klar, klik her for at downloade',
+ updateNoServer: 'Ingen forbindelse til server',
+ updateNoServerError: 'Der kunne ikke tjekkes for ny opdatering. Se trace for mere info.',
+ },
+ user: {
+ access: 'Adgang',
+ accessHelp: 'Baseret på de tildelte grupper og startnoder har brugeren adgang til følgende noder',
+ assignAccess: 'Tildel adgang',
+ administrators: 'Administrator',
+ categoryField: 'Kategorifelt',
+ createDate: 'Bruger oprettet',
+ changePassword: 'Skift dit kodeord',
+ changePhoto: 'Skift billede',
+ newPassword: 'Nyt kodeord',
+ newPasswordFormatLengthTip: 'Minium %0% karakterer tilbage!',
+ newPasswordFormatNonAlphaTip: 'Der skal som minium være %0% specielle karakterer.',
+ noLockouts: 'er ikke blevet låst ude',
+ noPasswordChange: 'Kodeordet er ikke blevet ændret',
+ confirmNewPassword: 'Gentag dit nye kodeord',
+ changePasswordDescription:
+ "Du kan ændre dit kodeord, som giver dig adgang til Umbraco backoffice ved at\n udfylde formularen og klikke på knappen 'Skift dit kodeord'\n ",
+ contentChannel: 'Indholdskanal',
+ createAnotherUser: 'Opret endnu en bruger',
+ createUserHelp:
+ 'Opret nye brugere for at give dem adgang til Umbraco. NÃ¥r en ny bruger oprettes,\n genereres der en adgangskode, som du kan dele med brugeren.\n ',
+ descriptionField: 'Beskrivelsesfelt',
+ disabled: 'Deaktivér bruger',
+ documentType: 'Dokumenttype',
+ editors: 'Redaktør',
+ excerptField: 'Uddragsfelt',
+ failedPasswordAttempts: 'Fejlede loginforsøg',
+ goToProfile: 'GÃ¥ til brugerprofil',
+ groupsHelp: 'Tilføj grupper for at tildele adgang og tilladelser',
+ inviteAnotherUser: 'Invitér anden bruger',
+ inviteUserHelp:
+ 'Invitér nye brugere til at give dem adgang til Umbraco. En invitation vil blive sendt\n via e-mail til brugeren med oplysninger om, hvordan man logger ind i Umbraco.\n ',
+ language: 'Sprog',
+ languageHelp: 'Indstil det sprog, du vil se i menuer og dialoger',
+ lastLockoutDate: 'Senest låst ude',
+ lastLogin: 'Seneste login',
+ lastPasswordChangeDate: 'Kodeord sidst ændret',
+ loginname: 'Brugernavn',
+ mediastartnode: 'Startnode i mediearkivet',
+ mediastartnodehelp: 'Begræns mediebiblioteket til en bestemt startnode',
+ mediastartnodes: 'Medie startnoder',
+ mediastartnodeshelp: 'Begræns mediebiblioteket til bestemte startnoder',
+ modules: 'Moduler',
+ noConsole: 'Deaktivér adgang til Umbraco',
+ noLogin: 'har endnu ikke logget ind',
+ oldPassword: 'Gammelt kodeord',
+ password: 'Adgangskode',
+ resetPassword: 'Nulstil kodeord',
+ passwordChanged: 'Dit kodeord er blevet ændret!',
+ passwordChangedGeneric: 'Kodeord ændret',
+ passwordConfirm: 'Bekræft venligst dit nye kodeord',
+ passwordEnterNew: 'Indtast dit nye kodeord',
+ passwordIsBlank: 'Dit nye kodeord kan ikke være blankt!',
+ passwordCurrent: 'Nuværende kodeord',
+ passwordInvalid: 'ugyldig nuværende kodeord',
+ passwordIsDifferent: 'Dit nye kodeord og dit bekræftede kodeord var ikke ens, forsøg venligst igen!',
+ passwordMismatch: 'Det bekræftede kodeord matcher ikke det nye kodeord',
+ permissionReplaceChildren: 'Erstat underelement-rettigheder',
+ permissionSelectedPages: 'Du ændrer i øjeblikket rettigheder for siderne:',
+ permissionSelectPages: 'Vælg sider for at ændre deres rettigheder',
+ removePhoto: 'Fjern billede',
+ permissionsDefault: 'Standardrettigheder',
+ permissionsGranular: 'Granulære rettigheder',
+ permissionsGranularHelp: 'Sæt rettigheder for specifikke noder',
+ profile: 'Profil',
+ searchAllChildren: "Søg alle 'børn'",
+ languagesHelp: 'Tilføj sprog for at give brugerne adgang til at redigere',
+ sectionsHelp: 'Tilføj sektioner for at give brugerne adgang',
+ selectUserGroups: 'Vælg brugergrupper',
+ noStartNode: 'Ingen startnode valgt',
+ noStartNodes: 'Ingen startnoder valgt',
+ startnode: 'Indhold startnode',
+ startnodehelp: 'Begræns indholdstræet til en bestemt startnode',
+ startnodes: 'Indhold startnoder',
+ startnodeshelp: 'Begræns indholdstræet til bestemte startnoder',
+ updateDate: 'Bruger sidst opdateret',
+ userCreated: 'er blevet oprettet',
+ userCreatedSuccessHelp:
+ 'Den nye bruger er blevet oprettet. For at logge ind i Umbraco skal du bruge\n adgangskoden nedenfor.\n ',
+ userManagement: 'Brugeradministration',
+ username: 'Navn',
+ userPermissions: 'Brugertilladelser',
+ usergroup: 'Brugergruppe',
+ userInvited: 'er blevet inviteret',
+ userInvitedSuccessHelp:
+ 'En invitation er blevet sendt til den nye bruger med oplysninger om, hvordan man\n logger ind i Umbraco.\n ',
+ userinviteWelcomeMessage:
+ 'Hej og velkommen til Umbraco! På bare 1 minut vil du være klar til at komme i\n gang, vi skal bare have dig til at oprette en adgangskode og tilføje et billede til din avatar.\n ',
+ userinviteExpiredMessage:
+ 'Velkommen til Umbraco! Desværre er din invitation udløbet. Kontakt din\n administrator og bed om at gensende invitationen.\n ',
+ userinviteAvatarMessage:
+ 'Hvis du uploader et billede af dig selv, gør du det nemt for andre brugere at\n genkende dig. Klik på cirklen ovenfor for at uploade et billede.\n ',
+ writer: 'Forfatter',
+ configureTwoFactor: 'Konfigurer totrinsbekræftelse',
+ change: 'Skift',
+ yourProfile: 'Din profil',
+ yourHistory: 'Din historik',
+ sessionExpires: 'Session udløber',
+ inviteUser: 'Invitér bruger',
+ createUser: 'Opret bruger',
+ sendInvite: 'Send invitation',
+ backToUsers: 'Tilbage til brugere',
+ defaultInvitationMessage: 'Gensender invitation...',
+ deleteUser: 'Slet bruger',
+ deleteUserConfirmation: 'Er du sikker på du ønsker at slette denne brugers konto?',
+ stateAll: 'Alle',
+ stateActive: 'Aktiv',
+ stateDisabled: 'Deaktiveret',
+ stateLockedOut: 'LÃ¥st ude',
+ stateApproved: 'Godkendt',
+ stateInvited: 'Inviteret',
+ stateInactive: 'Inaktiv',
+ sortNameAscending: 'Navn (A-Ã…)',
+ sortNameDescending: 'Navn (Ã…-A)',
+ sortCreateDateAscending: 'Nyeste',
+ sortCreateDateDescending: 'Ældste',
+ sortLastLoginDateDescending: 'Sidst logget ind',
+ noUserGroupsAdded: 'Ingen brugere er blevet tilføjet',
+ '2faDisableText': 'Hvis du ønsker at slå denne totrinsbekræftelse fra, så skal du nu indtaste koden fra din enhed:',
+ '2faProviderIsEnabled': 'Denne totrinsbekræftelse er slået til',
+ '2faProviderIsDisabledMsg': 'Den valgte totrinsbekræftelse er nu slået fra',
+ '2faProviderIsNotDisabledMsg': 'Der skete en ukendt fejl da denne totrinsbekræftelse skulles slåes fra',
+ '2faDisableForUser': 'Er du sikker på, at du vil fjerne denne totrinsbekræftelse for denne bruger?',
+ emailRequired: 'Required - enter an email address for this user',
+ duplicateLogin: 'A user with this login already exists',
+ nameRequired: 'Required - enter a name for this user',
+ passwordRequiresDigit: "The password must have at least one digit ('0'-'9')",
+ passwordRequiresLower: "The password must have at least one lowercase ('a'-'z')",
+ passwordRequiresNonAlphanumeric: 'The password must have at least one non alphanumeric character',
+ passwordRequiresUniqueChars: 'The password must use at least %0% different characters',
+ passwordRequiresUpper: "The password must have at least one uppercase ('A'-'Z')",
+ passwordTooShort: 'The password must be at least %0% characters long',
+ allowAccessToAllLanguages: 'Allow access to all languages',
+ userHasPassword: 'The user already has a password set',
+ userHasGroup: "The user is already in group '%0%'",
+ userLockoutNotEnabled: 'Lockout is not enabled for this user',
+ userNotInGroup: "The user is not in group '%0%'",
+ },
+ validation: {
+ validation: 'Validering',
+ validateAsEmail: 'Valider som e-mail',
+ validateAsNumber: 'Valider som tal',
+ validateAsUrl: 'Valider som URL',
+ enterCustomValidation: '...eller indtast din egen validering',
+ fieldIsMandatory: 'Feltet er påkrævet',
+ mandatoryMessage: 'Indtast en selvvalgt validerings fejlbesked (valgfrit)',
+ validationRegExp: 'Indtast et regulært udtryk',
+ validationRegExpMessage: 'Indtast en selvvalgt validerings fejlbesked (valgfrit)',
+ minCount: 'Du skal tilføje mindst',
+ maxCount: 'Du kan kun have',
+ addUpTo: 'Tilføj op til',
+ items: 'elementer',
+ urls: 'URL(er)',
+ urlsSelected: 'URL(er) valgt',
+ itemsSelected: 'elementer valgt',
+ invalidDate: 'Ugyldig dato',
+ invalidNumber: 'Ikke et tal',
+ invalidNumberStepSize: 'Ikke en gyldig numerisk trinstørrelse',
+ invalidEmail: 'Ugyldig e-mail',
+ invalidNull: 'Værdien kan ikke være tom',
+ invalidEmpty: 'Værdien kan ikke være tom',
+ invalidPattern: 'Værdien er ugyldig, som ikke matcher det korrekte format',
+ customValidation: 'Selvvalgt validering',
+ entriesShort: 'Minimum %0% element(er), tilføj %1% mere.',
+ entriesExceed: 'Maksimum %0% element(er), %1% for mange.',
+ entriesAreasMismatch: 'Ét eller flere områder lever ikke op til kravene for antal indholdselementer.',
+ invalidMemberGroupName: 'Invalid member group name',
+ invalidUserGroupName: 'Invalid user group name',
+ invalidToken: 'Invalid token',
+ invalidUsername: 'Invalid username',
+ duplicateEmail: "Email '%0%' is already taken",
+ duplicateUserGroupName: "User group name '%0%' is already taken",
+ duplicateMemberGroupName: "Member group name '%0%' is already taken",
+ duplicateUsername: "Username '%0%' is already taken",
+ },
+ redirectUrls: {
+ disableUrlTracker: 'Slå URL tracker fra',
+ enableUrlTracker: 'Slå URL tracker til',
+ culture: 'Kultur',
+ originalUrl: 'Original URL',
+ redirectedTo: 'Viderestillet til',
+ redirectUrlManagement: 'Viderestil URL håndtering',
+ panelInformation: 'De følgende URLs viderestiller til dette indholds element',
+ noRedirects: 'Der er ikke lavet nogen viderestillinger',
+ noRedirectsDescription:
+ 'Når en udgivet side bliver omdøbt eller flyttet, vil en viderestilling\n automatisk blive lavet til den nye side.\n ',
+ redirectRemoved: 'Viderestillings URL fjernet.',
+ redirectRemoveError: 'Fejl under fjernelse af viderestillings URL.',
+ redirectRemoveWarning: 'Dette vil fjerne viderestillingen',
+ confirmDisable: 'Er du sikker på at du vil slå URL trackeren fra?',
+ disabledConfirm: 'URL tracker er nu slået fra.',
+ disableError:
+ 'Der opstod en fejl under forsøget på at slå URL trackeren fra, der findes mere information\n i logfilen.\n ',
+ enabledConfirm: 'URL tracker er nu slået fra.',
+ enableError:
+ 'Der opstod en fejl under forsøget på at slå URL trackeren til, der findes mere information\n i logfilen.\n ',
+ },
+ emptyStates: {
+ emptyDictionaryTree: 'Ingen ordbog elementer at vælge imellem',
+ },
+ textbox: {
+ characters_left: '%0% tegn tilbage.',
+ characters_exceed: 'Maksimum %0% tegn, %1% for mange.',
+ },
+ recycleBin: {
+ contentTrashed: 'Slettet indhold med Id: {0} Relateret til original "parent" med id: {1}',
+ mediaTrashed: 'Slettet medie med Id: {0} relateret til original "parent" / mappe med id: {1}',
+ itemCannotBeRestored: 'Kan ikke automatisk genoprette dette element',
+ itemCannotBeRestoredHelpText:
+ 'Der er ikke nogen placering hvor dette element automatisk kan genoprettes.\n Du kan flytte elementet manuelt i træet nedenfor.\n ',
+ wasRestored: 'blev genoprettet under',
+ },
+ relationType: {
+ direction: 'Retning',
+ parentToChild: 'Forælder til barn',
+ bidirectional: 'Tovejs',
+ parent: 'Forælder',
+ child: 'Barn',
+ count: 'Antal',
+ relations: 'Relationer',
+ created: 'Oprettet',
+ comment: 'Kommentar',
+ name: 'Navn',
+ noRelations: 'Der er ingen relationer for denne relationstype.',
+ tabRelationType: 'Relationstype',
+ tabRelations: 'Relationer',
+ relation: 'Relation',
+ isDependency: 'Is Dependency',
+ dependency: 'Yes',
+ noDependency: 'No',
+ },
+ dashboardTabs: {
+ contentIntro: 'Kom godt i gang',
+ contentRedirectManager: 'Redirects håndtering',
+ mediaFolderBrowser: 'Indhold',
+ settingsWelcome: 'Velkommen',
+ settingsExamine: 'Examine Management',
+ settingsPublishedStatus: 'Published Cache',
+ settingsModelsBuilder: 'Models Builder',
+ settingsHealthCheck: 'Health Check',
+ settingsProfiler: 'Profiling',
+ memberIntro: 'Kom godt i gang',
+ formsInstall: 'Installer Umbraco Forms',
+ deploy: 'Arbejdsområder',
+ settingsAnalytics: 'Telemetry data',
+ deployManagement: 'Deploy',
+ },
+ visuallyHiddenTexts: {
+ goBack: 'GÃ¥ tilbage',
+ activeListLayout: 'Aktivt layout:',
+ jumpTo: 'GÃ¥ til',
+ group: 'gruppe',
+ passed: 'bestået',
+ warning: 'advarsel',
+ failed: 'fejlet',
+ suggestion: 'forslag',
+ checkPassed: 'Test bestået',
+ checkFailed: 'Test fejlet',
+ openBackofficeSearch: 'Åben backoffice søgning',
+ openCloseBackofficeHelp: 'Åben/Luk backoffice hjælp',
+ openCloseBackofficeProfileOptions: 'Ã…ben/Luk dine profil indstillinger',
+ assignDomainDescription: 'Tilføj domæne på %0%',
+ createDescription: 'Opret ny node under %0%',
+ protectDescription: 'Opsæt offentlig adgang på %0%',
+ rightsDescription: 'Opsæt rettigheder på %0%',
+ sortDescription: 'Juster soterings rækkefølgen for %0%',
+ createblueprintDescription: 'Opret indholds skabelon baseret på %0%',
+ openContextMenu: 'Ã…ben kontext menu for',
+ currentLanguage: 'Aktivt sprog',
+ switchLanguage: 'Skift sprog til',
+ createNewFolder: 'Opret ny mappe',
+ newPartialView: 'Delvist View',
+ newPartialViewMacro: 'Delvist View Macro',
+ newMember: 'Medlem',
+ newDataType: 'Data type',
+ redirectDashboardSearchLabel: 'Søg i viderestillings dashboardet',
+ userGroupSearchLabel: 'Søg i brugergruppe sektionen',
+ userSearchLabel: 'Søg i bruger sektionen',
+ createItem: 'Opret element',
+ create: 'Opret',
+ edit: 'Rediger',
+ name: 'Navn',
+ addNewRow: 'Tilføj ny række',
+ tabExpand: 'Vis flere muligheder',
+ searchOverlayTitle: 'Søg i Umbraco backoffice',
+ searchOverlayDescription: 'Søg efter indholdsnoder, medienoder osv. i backoffice',
+ searchInputDescription:
+ 'Når autoudfyldnings resultaterne er klar, tryk op og ned pilene, eller benyt tab\n knappen og brug enter knappen til at vælge.\n ',
+ path: 'Vej',
+ foundIn: 'Fundet i',
+ hasTranslation: 'Har oversættelse',
+ noTranslation: 'Mangler oversættelse',
+ dictionaryListCaption: 'Ordbogs elementer',
+ contextMenuDescription: 'Udfør handling %0% på %1% noden',
+ addImageCaption: 'Tilføj billede overskrift',
+ searchContentTree: 'Søg i indholdstræet',
+ maxAmount: 'Maximum antal',
+ contextDialogDescription: 'Perform action %0% on the %1% node',
+ },
+ references: {
+ tabName: 'Referencer',
+ DataTypeNoReferences: 'Denne Data Type har ingen referencer.',
+ labelUsedByMediaTypes: 'Brugt i Medie Typer',
+ labelUsedByMemberTypes: 'Brugt i Medlems Typer',
+ usedByProperties: 'Brugt af',
+ labelUsedByDocuments: 'Brugt i Dokumenter',
+ labelUsedByMembers: 'Brugt i Medlemmer',
+ labelUsedByMedia: 'Brugt i Medier',
+ itemHasNoReferences: 'This item has no references.',
+ labelUsedByDocumentTypes: 'Referenced by the following Document Types',
+ labelUsedByItems: 'Referenced by the following items',
+ labelDependsOnThis: 'The following items depend on this',
+ labelUsedItems: 'The following items are referenced',
+ labelUsedDescendants: 'The following descendant items have dependencies',
+ labelDependentDescendants: 'The following descending items have dependencies',
+ deleteWarning:
+ 'This item or its descendants is being referenced. Deletion can lead to broken links on your website.',
+ unpublishWarning:
+ 'This item or its descendants is being referenced. Unpublishing can lead to broken links on your website. Please take the appropriate actions.',
+ deleteDisabledWarning: 'This item or its descendants is being referenced. Therefore, deletion has been disabled.',
+ listViewDialogWarning: 'The following items you are trying to %0% are referenced by other content.',
+ },
+ logViewer: {
+ deleteSavedSearch: 'Slet gemte søgning',
+ logLevels: 'Log type',
+ selectAllLogLevelFilters: 'Vælg alle',
+ deselectAllLogLevelFilters: 'Fravælg alle',
+ savedSearches: 'Gemte søgninger',
+ saveSearch: 'Gem søgning',
+ saveSearchDescription: 'Indtast et navn for din søgebetingelse',
+ filterSearch: 'Filter søgning',
+ totalItems: 'Samlet resultat',
+ timestamp: 'Dato',
+ level: 'Type',
+ machine: 'Maskine',
+ message: 'Besked',
+ exception: 'Exception',
+ properties: 'Egenskaber',
+ searchWithGoogle: 'Søg med Google',
+ searchThisMessageWithGoogle: 'Søg efter denne besked på Google',
+ searchWithBing: 'Søg med Bing',
+ searchThisMessageWithBing: 'Søg efter denne besked på Bing',
+ searchOurUmbraco: 'Søg på Our Umbraco',
+ searchThisMessageOnOurUmbracoForumsAndDocs:
+ 'Søg efter denne besked på Our Umbraco forum og\n dokumentation\n ',
+ searchOurUmbracoWithGoogle: 'Søg på Our Umbraco med Google',
+ searchOurUmbracoForumsUsingGoogle: 'Søg på Our Umbraco forum med Google',
+ searchUmbracoSource: 'Søg i Umbraco kildekoden',
+ searchWithinUmbracoSourceCodeOnGithub: 'Søg i Umbraco kildekoden på Github',
+ searchUmbracoIssues: 'Søg i Umbraco issues',
+ searchUmbracoIssuesOnGithub: 'Søg i Umbraco issues på Github',
+ deleteThisSearch: 'Slet denne søgning',
+ findLogsWithRequestId: 'Find logs med request Id',
+ findLogsWithNamespace: 'Find logs med Namespace',
+ findLogsWithMachineName: 'Find logs med maskin navn',
+ open: 'Ã…ben',
+ polling: 'Henter',
+ every2: 'Hver 2 sekunder',
+ every5: 'Hver 5 sekunder',
+ every10: 'Hver 10 sekunder',
+ every20: 'Hver 20 sekunder',
+ every30: 'Hver 30 sekunder',
+ pollingEvery2: 'Henter hver 2s',
+ pollingEvery5: 'Henter hver 5s',
+ pollingEvery10: 'Henter hver 10s',
+ pollingEvery20: 'Henter hver 20s',
+ pollingEvery30: 'Henter hver 30s',
+ },
+ clipboard: {
+ labelForCopyAllEntries: 'Kopier %0%',
+ labelForArrayOfItemsFrom: '%0% fra %1%',
+ labelForArrayOfItems: 'Samling af %0%',
+ labelForRemoveAllEntries: 'Fjern alle elementer',
+ labelForClearClipboard: 'Ryd udklipsholder',
+ },
+ propertyActions: {
+ tooltipForPropertyActionsMenu: 'Ã…ben egenskabshandlinger',
+ tooltipForPropertyActionsMenuClose: 'Luk egenskabshandlinger',
+ },
+ blockEditor: {
+ headlineCreateBlock: 'Vælg elementtype',
+ headlineAddSettingsElementType: 'Tilføj en indstillings elementtype',
+ headlineAddCustomView: 'Tilføj visning',
+ headlineAddCustomStylesheet: 'Tilføj stylesheet',
+ headlineAddThumbnail: 'Vælg billede',
+ labelcreateNewElementType: 'Opret ny elementtype',
+ labelCustomStylesheet: 'Overskriv stylesheet',
+ addCustomStylesheet: 'Tilføj stylesheet',
+ headlineEditorAppearance: 'Redigerings udseende',
+ headlineDataModels: 'Data modeller',
+ headlineCatalogueAppearance: 'katalog udseende',
+ labelBackgroundColor: 'Baggrunds farve',
+ labelIconColor: 'Ikon farve',
+ labelContentElementType: 'Indholds model',
+ labelLabelTemplate: 'Label',
+ labelCustomView: 'Speciel visning',
+ labelCustomViewInfoTitle: 'Vis speciel visning beskrivelsen',
+ labelCustomViewDescription:
+ 'Overskrift hvordan denne block præsenteres i backoffice interfacet. Vælg en\n .html fil der indeholder din præsensation.\n ',
+ labelSettingsElementType: 'Indstillings model',
+ labelEditorSize: 'Rederings lagets størrelse',
+ addCustomView: 'Tilføj speciel visning',
+ addSettingsElementType: 'Tilføj instillinger',
+ confirmDeleteBlockMessage: 'Er du sikker på at du vil slette indholdet %0% ?',
+ confirmDeleteBlockTypeMessage: 'Er du sikker på at du vil slette konfigurationen %0% ?',
+ confirmDeleteBlockTypeNotice:
+ 'Indholdet vil stadigt eksistere, men redigering af dette indhold vil ikke\n være muligt. Indholdet vil blive vist som ikke understøttet indhold.\n ',
+ confirmDeleteBlockGroupMessage:
+ 'Er du sikker på at du vil slette gruppen %0% og blok konfigurationer?',
+ confirmDeleteBlockGroupNotice:
+ 'Indholdet af gruppens blokke vil stadigt eksistere, men redigering af dette indhold vil ikke\n være muligt. Indholdet vil blive vist som ikke understøttet indhold.\n ',
+ blockConfigurationOverlayTitle: "Konfiguration af '%0%'",
+ elementTypeDoesNotExist: 'Kan ikke redigeres fordi elementtypen ikke eksisterer.',
+ thumbnail: 'Billede',
+ addThumbnail: 'Tilføj billede',
+ tabCreateEmpty: 'Opret ny',
+ tabClipboard: 'Udklipsholder',
+ tabBlockSettings: 'Indstillinger',
+ headlineAdvanced: 'Avanceret',
+ forceHideContentEditor: 'Skjul indholdseditoren',
+ forceHideContentEditorHelp: 'Skjul indholds redigerings knappen samt indholdseditoren i Blok Redigerings vinduet',
+ girdInlineEditing: 'Direkte redigering',
+ girdInlineEditingHelp:
+ 'Tilføjer direkte redigering a det første felt. Yderligere felter optræder kun i redigerings vinduet.',
+ blockHasChanges: 'Du har lavet ændringer til dette indhold. Er du sikker på at du vil kassere dem?',
+ confirmCancelBlockCreationHeadline: 'Annuller oprettelse?',
+ confirmCancelBlockCreationMessage: 'Er du sikker på at du vil annullere oprettelsen.',
+ elementTypeDoesNotExistHeadline: 'Fejl!',
+ elementTypeDoesNotExistDescription: 'Elementtypen for denne blok eksisterer ikke længere',
+ addBlock: 'Tilføj indhold',
+ addThis: 'Tilføj %0%',
+ propertyEditorNotSupported: 'Feltet %0% bruger editor %1% som ikke er supporteret for blokke.',
+ focusParentBlock: 'Fokusér på den ydre blok',
+ areaIdentification: 'Identifikation',
+ areaValidation: 'Validering',
+ areaValidationEntriesShort: '%0% skal tilføjes minimum %2% gang(e).',
+ areaValidationEntriesExceed: '%0% må maksimalt tilføjes %3% gang(e).',
+ areaNumberOfBlocks: 'Antal blokke',
+ areaDisallowAllBlocks: 'Tillad kun specifikke blok-typer',
+ areaAllowedBlocks: 'Tilladte blok-typer',
+ areaAllowedBlocksHelp:
+ 'Vælg de blok-typer, der er tilladt i dette område, og evt. også hvor mange af hver type, redaktørerne skal tilføje til området.',
+ areaAllowedBlocksEmpty: 'Når denne er tom er alle block-typer tilladt for områder tilladt.',
+ confirmDeleteBlockAreaMessage: 'Er du sikker på, at du vil slette dette område?',
+ confirmDeleteBlockAreaNotice: 'Alle blokke, der er oprettet i dette område, vil blive slettet.',
+ layoutOptions: 'Layout-opsætning',
+ structuralOptions: 'Struktur',
+ sizeOptions: 'Størrelses opsætning',
+ allowedBlockColumns: 'Tilgængelige kolonne-størrelser',
+ allowedBlockColumnsHelp:
+ 'Vælg de forskellige antal kolonner denne blok må optage i layoutet. Dette forhindre ikke blokken i at optræde i et mindre område.',
+ allowedBlockRows: 'TIlgængelige række-størrelser',
+ allowedBlockRowsHelp: 'Vælg hvor mange rækker denne blok på optage i layoutet.',
+ allowBlockInRoot: 'Tillad på rodniveau',
+ allowBlockInRootHelp:
+ 'Gør denne blok tilgængelig i layoutets rodniveau. Hvis dette ikke er valgt, kan denne blok kun bruges inden for andre blokkes definerede områder.',
+ areas: 'Blok-områder',
+ areasLayoutColumns: 'Layout-kolonner',
+ areasLayoutColumnsHelp:
+ 'Vælg hvor mange layout-kolonnner der skal være tilgængelig for blokkens områder. Hvis der ikke er valgt noget her, benyttes det antal layout-kolonner der er valgt for hele layoutet.',
+ areasConfigurations: 'Opsætning af områder',
+ areasConfigurationsHelp:
+ 'Hvis det skal være muligt at indsætte nye blokke indeni denne blok, skal der oprettes ét eller flere områder til at indsætte de nye blokke i.',
+ invalidDropPosition: 'Ikke tilladt placering.',
+ defaultLayoutStylesheet: 'Standardlayout stylesheet',
+ confirmPasteDisallowedNestedBlockHeadline: 'Ikke tilladt indhold blev afvist',
+ confirmPasteDisallowedNestedBlockMessage:
+ 'Det indsatte indhold bestod af ikke tilladt del-indhold, disse dele er blevet afvist. Vil du beholde det resterene alligevel?',
+ areaAliasHelp:
+ 'Dette alias skrives ud via GetBlockGridHTML(), brug aliaset til at fange det element der repræsentere dette område. F.eks.. .umb-block-grid__area[data-area-alias="MitOmraadeAlias"] { ... }',
+ scaleHandlerButtonTitle: 'Træk for at skalere',
+ areaCreateLabelTitle: 'Tilføj indhold label',
+ areaCreateLabelHelp: 'Overskriv labellen for tilføj indholds knappen i dette område.',
+ showSizeOptions: 'Tilføj skalerings muligheder',
+ addBlockType: 'Tilføj Blok',
+ addBlockGroup: 'Tilføj gruppe',
+ pickSpecificAllowance: 'Tilføj gruppe eller Blok',
+ allowanceMinimum: 'Sæt minimum krav',
+ allowanceMaximum: 'Sæt maksimum krav',
+ block: 'Blok',
+ tabBlock: 'Blok',
+ tabBlockTypeSettings: 'Indstillinger',
+ tabAreas: 'Områder',
+ tabAdvanced: 'Avanceret',
+ headlineAllowance: 'Tilladelser',
+ getSampleHeadline: 'Installer demo konfiguration',
+ getSampleDescription:
+ 'Dette tilføjer basale og hjælper dig til at komme igang med Block Grid Editor. Dette indeholder Blokke for Overskrift, Beriget-Tekst, Billede og To-Koloners-Layout.',
+ getSampleButton: 'Installer',
+ actionEnterSortMode: 'Sortings tilstand',
+ actionExitSortMode: 'Afslut sortings tilstand',
+ areaAliasIsNotUnique: 'Dette område alias skal være unikt sammenlignet med andre områder af denne Blok.',
+ configureArea: 'Konfigurer område',
+ deleteArea: 'Slet område',
+ addColumnSpanOption: 'Tilføj mulighed for %0% koloner',
+ sizeOptionsHelp: 'Define one or more size options, this enables resizing of the Block',
+ allowBlockInAreas: 'Allow in areas',
+ allowBlockInAreasHelp:
+ 'Make this block available by default within the areas of other Blocks (unless explicit permissions are set for these areas).',
+ },
+ contentTemplatesDashboard: {
+ whatHeadline: 'Hvad er Indholdsskabeloner?',
+ whatDescription:
+ 'Indholdsskabeloner er foruddefineret indhold der kan vælges når der oprettes nye\n indholdselementer.\n ',
+ createHeadline: 'Hvordan opretter jeg en Indholdsskabelon?',
+ createDescription:
+ '\n Der er to måder at oprette Indholdsskabeloner på:
\n \n Højreklik på en indholdsnode og vælg "Opret indholdsskabelon" for at oprette en ny Indholdsskabelon. \n Højreklik på Indholdsskabeloner i sektionen Indstillinger og vælg den dokumenttype du vil oprette en Indholdsskabelon for. \n \n Når indholdsskabelonen har fået et navn, kan redaktører begynde at bruge indholdsskabelonen som udgangspunkt for deres nye side.
\n ',
+ manageHeadline: 'Hvordan vedligeholder jeg Indholdsskabeloner?',
+ manageDescription:
+ 'Du kan redigere og slette Indholdsskabeloner fra "Indholdsskabeloner" i sektionen\n Indstillinger. Fold dokumenttypen som Indholdsskabelonen er baseret på ud og klik på den for at redigere eller\n slette den.\n ',
+ },
+ preview: {
+ endLabel: 'Afslut',
+ endTitle: 'Afslut forhåndsvisning',
+ openWebsiteLabel: 'Vis i nyt vindue',
+ openWebsiteTitle: 'Åben forhåndsvisning i nyt vindue',
+ returnToPreviewHeadline: 'Forhåndsvisning af indholdet?',
+ returnToPreviewDescription:
+ 'Du har afslutet forhåndsvisning, vil du starte forhåndsvisning igen for at\n se seneste gemte version af indholdet?\n ',
+ returnToPreviewDeclineButton: 'Se udgivet indhold',
+ viewPublishedContentHeadline: 'Se udgivet indhold?',
+ viewPublishedContentDescription:
+ 'Du er i forhåndsvisning, vil du afslutte for at se den udgivet\n version?\n ',
+ viewPublishedContentAcceptButton: 'Se udgivet version',
+ viewPublishedContentDeclineButton: 'Forbliv i forhåndsvisning',
+ returnToPreviewAcceptButton: 'Preview latest version',
+ },
+ permissions: {
+ FolderCreation: 'Mappeoprettelse',
+ FileWritingForPackages: 'Filskrivning for pakker',
+ FileWriting: 'Filskrivning',
+ MediaFolderCreation: 'Medie mappeoprettelse',
+ },
+ treeSearch: {
+ searchResult: 'resultat',
+ searchResults: 'resultater',
+ },
+ dialogs: {
+ deployTransferNowTitle: 'Overfør nu',
+ deployTransferNowHeadline: 'Overfør %0% til %1% ',
+ deployTransferNowDescription:
+ 'Du er ved at igangsætte overførsel af %0% direkte til %1%, uden at tilføje til køen.
',
+ deployAddToQueueHeadline: 'Sæt %0% i køen for overførsel til %1% ',
+ deployAddToQueueDescription:
+ 'Denne handling sætter %0% i køen til næste overførsel, intet vil blive overført endnu.
',
+ deployAddToQueueChildPageDescription:
+ 'Skal alle underliggende sider af %0% inkluderes i denne overførsel?
',
+ deployIncludeChildPages: 'Inkluder underliggende sider',
+ deployAddToQueueDone:
+ 'Ændringer er lagt i køen Når du er klar til at overfører gå til arbejdsområde siden for at starte overførselen.
',
+ deployRestoreFrom: 'Fra',
+ deployRestoreWorkspace: 'arbejdsområde',
+ deployRestoreThis: 'Genskab',
+ deployRestoreIncludingDescendants: 'Inklusiv alle underliggende sider',
+ deployRestoreNotIncludingDescendants: 'Uden underliggende sider',
+ deployRestoreDescription:
+ '\n Dette inkludere rettelser til alt referred indhold og medier.
\n Bemærk: Genskabning af store mængder indhold kan tage langtid af udføre, undervejs bør du ikke ændre eller overfører indhold.
\n ',
+ deployRestorePickFrom: 'Eller vælg indhold fra',
+ deployFullRestoreFrom: 'Genskab dette arbejdsområde fra',
+ deployFullRestoreDescription:
+ '\n Denne handling vil overfører rettelser fra %0% til dette arbejdsmiljø. Dette inkludere rettelser til referred indhold og medier.
\n \n Bemærk: Genskabning af store mængder indhold kan tage langtid af udføre, undervejs bør du ikke ændre eller overfører indhold.\n
\n ',
+ deployFullRestoreAction: 'Genskab fra',
+ deployGoToTransferQueue: 'Åben overførselskøen',
+ deployAddToQueueCultureDescription: 'Select language to include in transfer:
',
+ deployAddToQueueReleaseDateDescription:
+ 'The published or unpublished status will be transferred along with the content. To schedule the update for publishing in the future, please set a date:
',
+ deployVariantQueueForTransferNotAllowed: 'Transfer is not allowed',
+ deployTreeRestoreFrom: 'Restore this tree from',
+ deployTreeRestoreDescription:
+ '\n This will transfer changes from %0% and apply them to the selected tree in this workspace. This will include changes to any referenced content, media or other items.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ',
+ deployCompareTitle: 'Compare',
+ },
+ formPicker: {
+ selectFromFolder: 'Vælg fra mappe',
+ selectFromList: 'Vælg fra listen over alle formularer',
+ },
+ formsDashboard: {
+ yourForms: 'Dine formularer',
+ showMore: 'Vis mere',
+ entries: 'Besvarelser',
+ newVersion: 'Der er en ny version tilgængelig',
+ installOverlayTitle: 'Tillykke',
+ installOverlayDescription: 'Du har installeret Umbraco Forms - Lad os oprette din første formular',
+ emptyOverlayTitle: 'Opret formular',
+ emptyOverlayDescription: 'Du har ikke klargjort nogle formularer endnu, vil du starte på en nu?',
+ createAForm: 'Opret formular',
+ newVersionTitle: 'Der er en ny version tilgængelig',
+ newVersionDescription: 'Nu kan du installere Umbraco Forms',
+ upgradeNow: 'Opgrader nu',
+ downloading: 'Henter og opgraderer Forms...',
+ invalidLicense: 'Ugyldig licens',
+ invalidLicenseValidFor: 'Din nuværende Forms licens udløber snart:',
+ reconfigure: 'Omkonfigurer din licens nedenfor.',
+ trialTitle: 'Tak fordi du afprøver Umbraco Forms',
+ trialDescription:
+ 'For at fortsætte med at bruge Umbraco Forms, skal du enten købe en licens eller bruge en eksisterende',
+ configureLicense: 'Konfigurer eksisterende licens',
+ buyLicense: 'Køb licens',
+ buyLicenseTitle: 'Køb en licens',
+ buyLicenseCopy:
+ '\n \n Det tager kun et par minutter at købe en licens til Umbraco Forms og din licens bliver leveret øjeblikkeligt .\n
\n \n Du skal bare:\n
\n Klikke på køb-knappen nedenfor \n Checkout med Kreditkort (eller faktura) \n Konfigurere licensen inde fra Umbraco Forms og så er du klar \n \n \n ',
+ buyLink: 'Køb Umbraco Forms',
+ buyLicenseFAQs:
+ '\n FAQ: \n Hvad koster det? \n Priserne starter ved €209 og det er en engangsudgift (intet abonnement nødvendigt).
\n Hvad dækker en license over? \n En licens dækker over et enkelt domæne og vil også virke på alle subdomæner. Det inkluderer desuden to yderligere development domæner.
\n Kan jeg tilføje yderligere domæner til licensen? \n Ja, der kan godt tilføjes yderligere domæner. Du kan tilkøbe flere domæner til din licens fra din konto på Umbraco.com.
\n Har du flere spørgsmål? \n \n Bare rolig, der er flere detaljer i dokumentationen og du er velkommen til at kontakte os . Vi svarer typisk i løbet af et par timer.\n
\n ',
+ configureLicenseTitle: 'Konfigurer en Umbraco Forms licens',
+ configureLicenseCopy:
+ '\n Hvis du allerede har købt Umbraco Forms, kan du automatisk hente og konfigurere din licens her. Du skal bare angive dine brugeroplysninger herunder og vi\n finder din licens.\n ',
+ configureLicenseFAQs:
+ '\n FAQ: \n Jeg ved ikke hvad mine brugeroplysninger er? \n \n Det er en kombination af din e-mail og kodeord fra da du lavede din bestilling. Du kan altid nulstille dit kodeord her .\n
\n Hvordan køber jeg en licens? \n \n Hvis du ikke har en licens, kan du få fat i en herfra og det tager kun et øjeblik .\n
\n ',
+ findLicenses: 'Find Licenser',
+ invalidEmail: 'Forkert email eller kodeord',
+ noLicensesAvailable: 'Der er ingen Umbraco Forms licenser tilgængelige på denne konto',
+ availableLicensesTitle: 'Tilgængelige Licenser',
+ foundLicenses: 'Fundede',
+ foundLicensesAccount: 'på kontoen',
+ noDomainsAssigned: 'Har ikke tilknyttet et domæne',
+ setDomain: 'Tilknyt venligst et domæne til denne licens',
+ configureAndInstall: 'Konfigurer og installer',
+ installLicense: 'Installer denne licens',
+ validDomains: 'Gyldige domæner',
+ licenseValidOnDomain: 'Denne licens er gyldig til det nuværende domæne',
+ licenseNotValidOnDomain: 'Denne licens er ikke gyldig til det nuværende domæne',
+ plainTextPasswordWarning:
+ '\n Advarsel: indstillingerne for kodeord er sat til klar tekst i din konfiguration! \n Når du benytter et felt til kodeord på en formular, bliver det data som dine besøgende udfylder feltet med, gemt som klar tekst. Dette er et sikkerhedsmæssigt problem og bør undgås.
\n For at udbedre problemet kan du i din ~/App_Plugins/UmbracoForms/UmbracoForms.config fil sætte nøglen SavePlainTextPasswords til False .
\n Efter opdateringen af denne indstilling skal du sikre dig at sitets application pool bliver recycled så den nye indstilling træder i kraft.
\n Bemærk: kodeordsværdier vil stadig blive sendt videre til arbejdsgange, uanset indstillingen i UmbracoForms.config
\n ',
+ currentVersion: 'Nuværende installerede version af Umbraco Forms:',
+ licenseConfiguredNotificationTitle: 'Licens er konfigureret',
+ licenseConfiguredNotificationMessage: 'Umbraco Forms er blevet konfigureret til brug med dette website.',
+ insufficientPermissionsError: 'Manglende tilladelser',
+ insufficientPermissionsMessage: 'Du har ikke tilladelse til at oprette og varetage formularer.',
+ insufficientPermissionsUpgradeMessage: 'Kun admin-brugere kan opgradere Umbraco Forms.',
+ licensedDomains: 'Licenserede domæner',
+ formsHeadline: 'Umbraco Forms',
+ formsDescription:
+ 'Create forms using an intuitive drag and drop interface. From simple contact forms\n that sends e-mails to advanced questionaires that integrate with CRM systems. Your clients will love it!\n ',
+ },
+ formCopy: {
+ title: "Kopierer formular '%0%'",
+ enterName: 'Angiv et navn til den kopierede formular',
+ alsoCopyWorkflows: 'Skal arbejdsgange også kopieres?',
+ copyToNewFolder: 'Kopier til en anden mappe?',
+ selectLocation: 'Vælg placering til den kopierede formular',
+ },
+ formCreate: {
+ title: 'Opret en ny formular eller mappe',
+ emptyForm: 'Tom formular',
+ emptyFormDescription: 'Start fra bunden',
+ folder: 'Mappe',
+ folderDescription: 'Bruges til at organisere formularer',
+ enterFolderName: 'Angiv et navn til mappen',
+ },
+ formExport: {
+ formExportedSuccess: 'Formularen blev eksporteret til en fil.',
+ },
+ formImport: {
+ importInstruction1:
+ "\n For at importere en formular skal du finde den eksporterede .json-fil på din computer ved at klikke på knappen 'Importer' (du bliver bedt om bekræftelse på næste skærmbillede).\n ",
+ importInstruction2:
+ "\n Hvis der allerede findes en formular med id'et for den valgte fil, vil den blive opdateret og flyttet til den valgte placering.\n Hvis der ikke findes en eksisterende formular, oprettes en ny på det valgte sted.\n ",
+ },
+ formPermissions: {
+ accessDeniedTitle: 'Ingen adgang',
+ },
+ formMessages: {
+ saveErrorMessage: 'Undersøg venligst om dine indstillinger er gyldige.',
+ },
+ formEdit: {
+ addQuestion: 'Tilføj spørgsmål',
+ groupIsEmpty: 'Gruppen er tom',
+ dropQuestionHere: 'Smid et spørgsmål her...',
+ letGo: 'Yaay.. så går det løs',
+ pageIsEmpty: 'Siden er tom',
+ dropGroupHere: 'Smid en gruppe her...',
+ addGroup: 'Tilføj en ny gruppe',
+ addPage: 'Tilføj en ny side',
+ pageTitlePlaceholder: 'Side uden titel (valgfri)',
+ groupTitlePlaceholder: 'Gruppe uden titel (valgfri)',
+ saveFieldFailedTitle: 'Felt kunne ikke gemmes',
+ accessDeniedMessage: 'Du har ikke rettigheder til at rette på denne formular.',
+ formSaved: 'Formular gemt',
+ unableToLoadForm: 'Kan ikke indlæse formular',
+ helpText: 'Hjælpetekst',
+ editPage: 'Ret Side',
+ editGroup: 'Ret Gruppe',
+ editQuestion: 'Ret spørgsmål',
+ workflows: 'Arbejdsgange',
+ magicStringsForFieldsNote:
+ '\n Mange feltindstillinger understøtter brugen af ​​magiske strenge .\n Når formularen vises, kan disse strenge erstattes med værdier fra forskellige kilder, herunder ordbogsværdier, sessions- eller cookiedata og Umbraco-sidefelter.\n Læs mere .',
+ magicStringsForWorkflowsNote:
+ '\n Mange workflow-indstillinger understøtter brugen af ​​magiske strenge .\n Når arbejdsgangen behandles, kan disse strenge erstattes med værdier fra forskellige kilder, herunder registreringsdata og ordbogsværdier.\n Læs mere .',
+ fieldTypeNotAvailable: 'Felttypen, der er konfigureret til dette felt, er ikke længere tilgængelig.',
+ fieldTypeRichTextNotAvailable:
+ 'Den rige tekst kan ikke formateres, da der ikke er konfigureret en gyldig datatype.',
+ fieldTypeRichTextNotAvailableLinkText: 'Læs, hvordan du konfigurerer en datatype.',
+ },
+ formFileUpload: {
+ allowAllFiles: 'Tillad alle filer',
+ allowOnlySpecifiedFiles: 'Tillad kun specifikke filer',
+ predefinedAllowedFileTypes: 'Foruddefinerede tilladte filtyper',
+ userDefinedAllowedFileTypes: 'Brugerdefinerede tilladte filtyper',
+ deleteAllowedFileTypeConfirmationTitle: 'Bekræftelse',
+ deleteAllowedFileTypeConfirmationDescription: 'Er du sikker på at du vil slette denne?',
+ duplicateFileTypeErrorTitle: 'Filtypefejl',
+ duplicateFileTypeErrorMessage: 'Kan ikke tilføje filtype fordi typen allerede eksisterer.',
+ pickFile: 'Vælg fil',
+ uploading: 'Uploader',
+ currentFile: 'Nuværende fil',
+ },
+ formPrevalues: {
+ newValue: 'Ny værdi',
+ newCaption: 'Ny billedtekst',
+ caption: 'Billedtekst',
+ duplicateErrorTitle: 'Fejl på foruddefineret værdi',
+ duplicateAddErrorMessage: 'Kan ikke tilføje værdi da værdien allerede eksisterer.',
+ duplicateEditErrorMessage: 'Kan ikke ændre værdi da værdien allerede eksisterer.',
+ },
+ formDelete: {
+ title: "Er du sikker på at du vil slette %0% '%1%'?",
+ timingNote: 'Bemærk at dette kan tage lang tid alt afhængig af antallet af besvarelser.',
+ recordDeleteNote: 'Sletning af formularen vil også slette de tilknyttede poster.',
+ recordDetail: 'Der er %0% poster, med den seneste indsendt på %1%.',
+ cannotDeleteFolder: 'Den valgte mappe kan ikke slettes da den ikke er tom.',
+ successMessageForForm: 'Sletning af formular er gennemført.',
+ failedMessageForForm: 'Sletning af formular mislykkedes.',
+ successMessageForFolder: 'Sletning af mappe er gennemført.',
+ failedMessageForFolder: 'Sletning af mappe mislykkedes.',
+ noRecordDetail: 'There are 0 records.',
+ },
+ formEntries: {
+ title: '%0% besvarelser',
+ filterEntries: 'Filtrer besvarelser...',
+ selectedRowsDescription: '%0% af %1% er valgt',
+ export: 'Eksporter',
+ chooseExportFormat: 'Vælg et format som du til eksportere besvarelserne til',
+ entriesNotStored: 'For nuværende bliver besvarelser ikke gemt i databasen.',
+ enableStoreEntries:
+ 'For at aktivere dette, skal du gå til indstillinger og aktivere indstillingen "Gem fortegnelser".',
+ noEntriesInRange: 'Der findes endnu ingen besvarelser inden for valgte datoer.',
+ noEntriesInRangeDetail:
+ 'Vi kan ikke finde nogen besvarelser, er du sikker på at du har udgivet formularen? eller prøv at udvidde datointervalet.',
+ noEntriesMatchingSearch: 'Vi kan ikke finde nogle besvarelser der matcher din søgning.',
+ noEntriesMatchingSearchDetail: 'Prøv at søge efter noget andet, måske er du heldig næste gang.',
+ selectedEntryPaging: 'Besvarelse %0% af %1%',
+ previousEntry: 'Forrige besvarelse',
+ nextEntry: 'Næste besvarelse',
+ accessDeniedMessage: 'Du har ikke adgang til at se denne formulars besvarelser.',
+ executeCompleteTitle: 'Udfør handling',
+ executeSuccessMessage: 'Handling %0% er gennemført',
+ executeErrorMessage: 'Handling %0% mislykkedes på grund af fejlen: %1%.',
+ entryDetails: 'Besvarelse',
+ closeDetails: 'Luk detaljer',
+ submittedOn: 'Indsendt',
+ updatedOn: 'Opdateret',
+ fromPage: 'Forside',
+ member: 'Medlem',
+ state: 'Tilstand',
+ uniqueId: 'Unikt ID',
+ auditTrail: 'Revisionsspor',
+ showAuditTrail: 'Vis revisionsspor',
+ hideAuditTrail: 'Skjul revisionsspor',
+ updatedBy: 'Opdateret af',
+ updateRecordSuccess: 'Rekord opdateret',
+ updateRecordError: 'Record kunne ikke opdateres',
+ workflowAudit: 'Workflow revision',
+ workflowAuditName: 'Navn',
+ workflowAuditType: 'Type',
+ workflowAuditExecutedOn: 'Udført den',
+ workflowAuditExecutionStage: 'Fase',
+ workflowAuditResult: 'Resultat',
+ workflowAuditTitleFormatSingular: '%0% af %1% arbejdsgang lykkedes',
+ workflowAuditTitleFormatPlural: '%0% af %1% arbejdsgange lykkedes',
+ workflowAuditRetry: 'Prøve igen',
+ workflowAuditRunAgain: 'Udfør igen',
+ workflowAuditRunAnyway: 'Udfør alligevel',
+ workflowAuditRetryConfirmTitle: 'Bekræftelse',
+ workflowAuditRetryConfirmMessage: 'Er du sikker på, at du vil køre den valgte arbejdsgang igen?',
+ workflowAuditRetrySuccessMessage:
+ 'Workflow-udførelsen afsluttet (se revisionsspor for status og konsulter logfiler for et mislykket resultat)',
+ workflowAuditRetryFailedMessage: 'Udførelsen af ​​arbejdsgangen mislykkedes',
+ workflowAuditRetryFailedMessageDetailWorkflowNotFound: 'Arbejdsgangen er ikke længere knyttet til formularen.',
+ workflowExecutionStageSubmitted: 'Indsendt',
+ workflowExecutionStageApproved: 'Godkendt',
+ workflowExecutionStatusCompleted: 'Færdiggjort',
+ workflowExecutionStatusFailed: 'Mislykkedes',
+ workflowExecutionStatusNotConfigured: 'Ikke konfigureret',
+ workflowExecutionStatusCancelled: 'Annulleret',
+ workflowExecutionStatusSkippedDueToConditions: 'Ignoreret af betingelser',
+ },
+ formMove: {
+ title: 'Vælg den mappe du vil flytte %0% til i træstrukturen nedenfor.',
+ successMessage: '%0% blev flyttet indunder %1% .',
+ successNotificationHeader: 'Flyttet',
+ successNotificationDescriptionForForm: 'Formularen blev flyttet til den valgte placering.',
+ successNotificationDescriptionForFolder: 'Mappen blev flyttet til den valgte placering.',
+ },
+ formRename: {
+ enterNewName: 'Angiv et nyt navn',
+ successNotificationHeader: 'Omdøbt',
+ successNotificationDescriptionForFolder: 'Mappen er blevet omdøbt.',
+ },
+ formConditions: {
+ title: 'Betingelser',
+ enableConditions: 'Aktiver betingelser',
+ actionTypeShow: 'Vis',
+ actionTypeHide: 'Skjul',
+ workflowactionTypeShow: 'Kør',
+ workflowactionTypeHide: 'Ignorer',
+ logicTypeAll: 'alle',
+ logicTypeAny: 'hvilken som helst',
+ operatorIs: 'er',
+ operatorIsNot: 'er ikke',
+ operatorGreaterThen: 'er større end',
+ operatorLessThen: 'er mindre end',
+ operatorContains: 'indeholder',
+ operatorStartsWith: 'starter med',
+ operatorEndsWith: 'slutter med',
+ thisFieldSetIf: 'dette fieldset hvis',
+ thisFieldIf: 'dette felt hvis',
+ buttonsForThisPageIf: 'knapper til denne side hvis',
+ thisWorkflowIf: 'denne arbejdsgang hvis',
+ ofTheFollowingMatch: 'af det følgende matcher',
+ selectField: 'Vælg felt',
+ addCondition: 'Tilføj betingelse',
+ pageConditionsDescription: 'Definer betingelserne for at vise "Indsend" eller "Næste" knappen for siden (valgfri).',
+ pageButtonConditionStatus: ' %0% knapperne for denne side hvis %1% er af det følgende match:',
+ fieldsetConditionStatus: ' %0% denne gruppe hvis %1% er af det følgende match:',
+ fieldConditionStatus: ' %0% Dette spørgsmål hvis %1% er af det følgende match:',
+ empty: 'empty',
+ },
+ formThemes: {
+ noThemesAvailable: 'Der er ingen tilgængelige temaer. Tilføj temaer til /views/partials/forms/themes',
+ },
+ formWorkflows: {
+ workflowNameLabel: 'Navn på arbejdsgang',
+ workflowNameDescription: 'Angiv et beskrivende navn til din arbejdsgang',
+ activeLabel: 'Aktiv',
+ activeDescription: 'Aktiver eller deaktiver arbejdsgangen',
+ includeSensitiveDataLabel: 'Inkluder følsomme data',
+ includeSensitiveDataDescription: 'Skal følsomme data inkluderes når denne arbejdsgang udføres?',
+ submitMessage: 'Send besked / GÃ¥ til side',
+ approve: 'Godkend',
+ automatic: 'automatisk',
+ noWorkflowsAdded: 'Ingen arbejdsgange er tilføjet',
+ configureWorkflow: 'Konfigurer arbejdsgang',
+ saveFailedTitle: 'Lagring af arbejdsgang mislykkedes',
+ closeConfirmationTitle: 'Bekræftelse',
+ closeConfirmationMessage: 'Der er ændringer som ikke er blevet gemt. Er du sikker på at du vil lukke?',
+ chooseWorkflow: 'Vælg arbejdsgang',
+ on: 'Ved',
+ onSubmit: 'Ved indsendelse',
+ onSubmitDescription: 'Vi sørger for at udføre disse arbejdsgange for dig når formularen bliver afsendt',
+ onApprove: 'Ved godkendelse',
+ onApproveDescription: 'Disse arbejdsgange bliver udført når en besvarelse bliver godkendt',
+ onApproveAutomaticDescription:
+ 'Dette sker automatisk efter indsendelses-eventet med de nuværende formularindstillinger',
+ defaultWorkflowName: 'Send besked / GÃ¥ til side',
+ defaultWorkflowDescription: 'Vis en besked når formularen bliver indsendt eller gå til en Umbraco-side',
+ addWorkflow: 'Tilføj arbejdsgang',
+ messageOnSubmit: 'Besked ved indsendelse',
+ messageOnSubmitDescription: 'Vis en besked når formularen er blevet indsendt',
+ messageOnSubmitIsHtmlToggleTextOn: 'Formater besked i rig tekst',
+ messageOnSubmitIsHtmlToggleTextOff: 'Formater besked i almindelig tekst',
+ goToPage: 'GÃ¥ til side',
+ goToPageDescription: 'Gå til en Umbraco-side når formularen er blevet indsendt',
+ },
+ fieldSetColumns: {
+ title: 'Kolonner',
+ setNumber: 'Angiv hvor mange kolonner du ønsker at have i din gruppe.',
+ columnNumberDescription: 'Lige nu har denne gruppe %0%.',
+ addColumn: 'Tilføj kolonne',
+ },
+ fieldSettings: {
+ namePlaceholder: 'Angiv spørgsmål...',
+ descriptionPlaceholder: 'Angiv hjælpetekst...',
+ requiredLabel: 'Krævet etiket',
+ chooseAnswerType: 'Vælg svartype',
+ sensitiveData: 'Følsomme data',
+ sensitiveDataDescription:
+ 'Forhinder data fra at blive tilgået eller eksporteret hvis en bruger ikke har tilstrækkelige tilladelser.',
+ sensitiveDataLabel: 'Ja, dette felt indeholder følsomme data',
+ allowedFileUploadTypes: 'Tilladte filuploadtyper',
+ prevalues: 'Foruddefinerede værdier',
+ prevaluesProvideWithSources:
+ 'Du skal enten angive en liste af værdier (foruddefinerede værdier) specifikt til dette felt, eller vælge en kilde til foruddefinerede værdier.',
+ prevaluesProvide: 'Angiv en liste af værdier (foruddefinerede værdier) til dette felt.',
+ prevaluesItems: 'Værdier',
+ prevaluesSource: 'Kilde til foruddefinerede værdier',
+ pressEnterToAdd: 'Tryk på enter for at tilføje en værdi',
+ settings: 'Indstillinger',
+ mandatory: 'Obligatorisk',
+ enterRegex: 'Angiv et regulært udtryk',
+ invalidPlaceholder: 'Skriv en besked for et ugyldigt felt...',
+ allowMultipleFileUploads: 'Tillad upload af flere filer',
+ multipleFilesToggleTextOn: 'Flere filer er tilladt',
+ multipleFilesToggleTextOff: 'Kun en fil',
+ },
+ formSettings: {
+ storeRecords: 'Gem besvarelser',
+ storeRecordsDescription:
+ '\n Afkryds denne boks for at gemme besvarelser i databasen.\n Dette vil give dig mulighed for at gennemgå og eksportere besvarelser via oversigten.\n Hvis du ikke vil gemme data (på grund af regler i din organisation), så skal du lade boksen være uafkrydset.\n ',
+ storeRecordsConfirm: 'Ja, gem besvarelser i databasen så de kan gennemgås og blive eksporteret senere.',
+ captions: 'Etiketter',
+ captionsDescription: 'Ændr knappernes etiketter for Send, Næste og Forrige.',
+ captionSubmitButton: "'Send' knappens etiket",
+ captionNextButton: "'Næste' knappens etiket",
+ captionPreviousButton: "'Forrige' knappens etiket",
+ styling: 'Fremtoning',
+ stylingDescription:
+ 'Tilføj en eller flere klasser for at indhylle din formular hvilket muliggør brugerdefineret styling, deaktivere standard styling og indlæse aktiver med klient afhængigheder.',
+ formCssClass: 'Formular CSS klasse',
+ disableDefaultStylesheet: 'Deaktiver standard stylesheet',
+ loadWithClientDependency: 'Indlæs aktiver med klient afhængigheder',
+ validation: 'Validering',
+ validationDescription:
+ 'Skriv bedre valideringsbeskeder, fjern valideringsetiketter og ændr eller deaktiver etiketten for krævet/obligatorisk.',
+ mandatoryErrorMessage: 'Fejlbesked ved obligatorisk',
+ mandatoryErrorMessageDescription: 'Besked som vises når et obligatorisk felt ikke er blevet udfyldt',
+ invalidErrorMessage: 'Fejlbesked ved ugyldig',
+ invalidErrorMessageDescription: 'Besked som vises når et felt ikke er udfyldt korrekt',
+ showValidationSummary: 'Vis valideringsresume',
+ hideFieldValidationLabels: 'Skjul felt valideringsetiketter',
+ markFields: 'Marker felter',
+ markFieldsNoIndicator: 'Ingen indikator',
+ markMandatoryFields: 'Marker obligatoriske felter',
+ markOptionalFields: 'Marker valgfri felter',
+ indicator: 'Indikator',
+ changeIndicatorSymbol: 'Ændr indikator-symbolet for obligatoriske felter',
+ autocomplete: 'Autocomplete',
+ autocompleteDescription: 'Tilføj en attribut til at styre formularens overordnede autocomplete opførsel.',
+ autocompleteNone: 'Ingen',
+ autocompleteOn: 'Tændt',
+ autocompleteOff: 'Slukket',
+ moderation: 'Moderation',
+ moderationDescription:
+ 'Tillad at besvarelser kan blive ændres efter indsendelse. Dette bruges oftes for besvarelser som er offentlige tilgængelige, såsom kommentarer til blog posteringer eller indsendelser til en social kompagne.',
+ enablePostModeration: 'Tillad moderation efter indsendelse',
+ fieldsDisplayed: 'Felter vises',
+ fieldsDisplayedDescription: 'Vælg, hvilke felter der skal vises på listen over formularposter.',
+ displayDefaultFields: 'Vis standardfelter',
+ displayDefaultFieldsDescription:
+ 'Som standard vises værdierne for de første tre felter i formularen sammen med nogle systemfelter.',
+ formFields: 'Formularfelter',
+ systemFields: 'System felter',
+ noSelectedDisplayFields: 'Der er ikke valgt nogen felter til visning.',
+ resetDisplayDefaultFieldsMessage:
+ 'Er du sikker på, at du vil vende tilbage til standardfeltet for visning? De brugerdefinerede felter, du har valgt, vil blive fjernet, når formularen er gemt.',
+ dataRetention: 'Opbevaring af data',
+ dataRetentionDescription: 'Definer, hvor længe formularindsendelser skal opbevares, før de automatisk slettes.',
+ dataRetentionForSubmittedRecords: 'Antal dage til at opbevare indsendte optegnelser',
+ dataRetentionForApprovedRecords: 'Antal dage til at opbevare godkendte optegnelser',
+ dataRetentionRetainSubmittedRecords: 'Behold indsendte optegnelser for evigt',
+ dataRetentionRetainApprovedRecords: 'Behold godkendte optegnelser for evigt',
+ scheduledRecordDeletionNotEnabled:
+ 'Den planlagte sletningstjeneste kører ikke i øjeblikket. Disse indstillinger træder ikke i kraft, før tjenesten er aktiveret i konfigurationen.',
+ },
+ formSecurity: {
+ saveSuccessTitle: 'Bruger formularsikkerhed gemt',
+ saveErrorTitle: 'Bruger formularsikkerhed mislykkedes med at gemme',
+ manageFormsLabel: 'Administrer formularer',
+ manageFormsDescription: 'Tillad eller afvis adgang til at administrere formularer',
+ manageWorkflowsLabel: 'Administrer arbejdsgange',
+ manageWorkflowsDescription: 'Tillad eller afvis adgang til at administrere arbejdsgange for alle formularer',
+ manageDatasourcesLabel: 'Administrer datakilder',
+ manageDatasourcesDescription: 'Tillad eller afvis adgang til at administrere datakilder for alle formularer',
+ managePrevalueSourcesLabel: 'Administrer kilde til foruddefinerede værdier',
+ managePrevalueSourcesDescription:
+ 'Tillad eller afvis adgang til at administrere kilder til foruddefinerede værdier for alle formularer',
+ manageIndividualFormsLabel: 'Formular sikkerhed',
+ manageIndividualFormsDescription: 'Tillad eller afvis adgang til individuelle formularer',
+ startFolders: 'Start mapper',
+ startFoldersDescription: 'Definer rodmappen eller mapperne for brugeren',
+ selectNewStartFolders: 'Select Start Folders',
+ formName: 'Formularnavn',
+ hasAccess: 'Har adgang',
+ viewEntriesLabel: 'Se indlæg',
+ viewEntriesDescription: 'Giv eller nægt adgang til visning af indsendte bidrag',
+ editEntriesLabel: 'Rediger poster',
+ editEntriesDescription: 'Giv eller nægt adgang til redigering af indsendte indlæg',
+ deleteTitle: 'Slet brugersikkerhed: %0%',
+ deleteUserRecordNote:
+ 'Ved at slette brugersikkerhedsposten vil brugerens tilladelser blive afledt fra de brugergrupper, som de er medlemmer af.',
+ deleteSuccessMessage: 'Brugersikkerhedspost slettet.',
+ deleteFailedMessage: 'Brugersikkerhedsposten kunne ikke slettes.',
+ createTitle: 'Skab brugersikkerhed',
+ createUserRecordNote:
+ 'Når en brugerpost oprettes, vil den have forrang frem for eventuelle tilladelser, der er tildelt på brugergruppeniveau.',
+ selectUser: 'Vælg bruger',
+ allUsersHaveRecords: 'Alle brugere har allerede oprettet sikkerhedsregistreringer.',
+ groupPermissions: 'Gruppetilladelser',
+ userPermissions: 'Brugertilladelser',
+ },
+ formDataSources: {
+ typeDescription: 'Vælg datakildetype',
+ createForm: 'Skab formular',
+ formName: 'Formular navn',
+ selectFields: 'Vælg felter',
+ selectFieldsDescription: 'Felter fra datakilden som du ønsker at inkludere på formularen.',
+ setupForeignKeys: 'Indstil fremmednøgler',
+ setupForeignKeysDescription: 'Vælg værdikolonnen til fremmednøgle-felter.',
+ selectType: 'Vælg type',
+ selectTypeDescription: 'Felttype du ønsker at bruge til de inkluderede felter (eller default værdi).',
+ defaultValue: 'Default værdi',
+ deleteConfirm: 'Er du sikker på at du vil slette datakilden %0%?',
+ saveSuccessTitle: 'Datakilde gemt',
+ saveErrorTitle: 'Lagring af datakilde mislykkedes',
+ accessDeniedMessage: 'Du har ikke adgang til at redigere datakilder',
+ },
+ formPrevalueSources: {
+ typeDescription: 'Vælg typen af kilden for foruddefinerede værdier',
+ deleteConfirm: 'ER du sikker på at du vil slette kilden for foruddefinerede værdier %0%?',
+ saveSuccessTitle: 'Kilde til foruddefinerede værdier gemt',
+ saveErrorTitle: 'Lagring af kilde til foruddefinerede værdier mislykkedes',
+ accessDeniedMessage: 'Du har ikke adgang til at redigere datakilder for foruddefinerede værdier',
+ },
+ formProviderFieldTypes: {
+ checkboxName: 'Afkrydsningsfelt',
+ checkboxDescription: 'Gengiver et afkrydsningsfelt.',
+ checkboxDefaultValueLabel: 'Standard værdi',
+ checkboxDefaultValueDescription: 'Angiv en standard værdi.',
+ multipleChoiceName: 'Flere svarmuligheder',
+ multipleChoiceDescription:
+ 'Gengiver en samling af afkrydsningsfelter hvor det er muligt at vælge flere svarmuligheder.',
+ multipleChoiceDefaultValueLabel: 'Standard værdi',
+ multipleChoiceDefaultValueDescription: 'Angiv en standard værdi.',
+ multipleChoiceShowLabelLabel: 'Vis etiket',
+ multipleChoiceShowLabelDescription: 'Angiver om et felts etiket skal vises når formularen bliver gengivet.',
+ dataConsentName: 'Data samtykke',
+ dataConsentDescription: 'Gengiver et felt der spørger om brugeren samtykke til at indsamle data.',
+ dataConsentAcceptCopyLabel: 'Accept kopi',
+ dataConsentAcceptCopyDescription: 'Teksten der benyttes til at bekræfte samtykket.',
+ dataConsentShowLabelLabel: 'Vis etiket',
+ dataConsentShowLabelDescription: 'Angiver om et felts etiket skal vises når formularen bliver gengivet.',
+ dateName: 'Dato',
+ dateDescription: 'Gengiver en datovælger.',
+ datePlaceholderLabel: 'Stedfortrædende værdi',
+ datePlaceholderDescription: 'Angiv en stedfortrædende værdi.',
+ dropdownName: 'Dropdown-menu',
+ dropdownDescription: 'Gengiver en liste af værdier i en dropdown-menu',
+ dropdownDefaultValueLabel: 'Standard værdi',
+ dropdownDefaultValueDescription: 'Angiv en standard værdi',
+ dropdownAllowMultipleSelectionsLabel: 'Tillad flere svarmuligheder',
+ dropdownAllowMultipleSelectionsDescription: 'Angiver om det er tilladt at vælge flere svar fra listen.',
+ dropdownShowLabelLabel: 'Vis etiket',
+ dropdownShowLabelDescription: 'Angiver om et felts etiket skal vises når formularen bliver gengivet.',
+ dropdownAutocompleteAttributeLabel: 'Autocomplete attribut',
+ dropdownAutocompleteAttributeDescription: 'Angiv en valgfri værdi til autocomplete attributten.',
+ dropdownSelectPromptLabel: 'Spørg om valg',
+ dropdownSelectPromptDescription: 'Angiv eventuelt en prompt for brugerens valg.',
+ fileUploadName: 'Fil upload',
+ fileUploadDescription: 'Gengiver et felt til fil-upload, som tillader at filer kan uploades.',
+ hiddenName: 'Skjult felt',
+ hiddenDescription: 'Gengiver et skjult felt.',
+ hiddenDefaultValueLabel: 'Standard værdi',
+ hiddenDefaultValueDescription: 'Angiv en standard værdi',
+ passwordName: 'Kodeord',
+ passwordDescription: 'Gengiver et felt til kodeord.',
+ passwordPlaceholderLabel: 'Stedfortrædende værdi',
+ passwordPlaceholderDescription: 'Angiv en stedfortrædende værdi.',
+ singleChoiceName: 'Enkelt valg',
+ singleChoiceDescription: 'Gengiver en liste af radio knapper som kun tillader at vælge en enkelt værdi.',
+ singleChoiceDefaultValueLabel: 'Standard værdi',
+ singleChoiceDefaultValueDescription: 'Angiv en standard værdi',
+ singleChoiceShowLabelLabel: 'Vis etiket',
+ singleChoiceShowLabelDescription: 'Angiver om et felts etiket skal vises når formularen bliver gengivet.',
+ recaptcha2Name: 'reCAPTCHA v2',
+ recaptcha2Description: 'Google reCAPTCHA v2.',
+ recaptcha2ThemeLabel: 'Tema',
+ recaptcha2ThemeDescription: 'reCAPTCHA v2 tema.',
+ recaptcha2SizeLabel: 'Størrelse',
+ recaptcha2SizeDescription: 'reCAPTCHA v2 størrelse.',
+ recaptcha2ErrorMessageLabel: 'Fejlbesked',
+ recaptcha2ErrorMessageDescription: 'Den fejlbesked der vises når brugeren ikke består reCAPTCHA-kontrollen.',
+ reCAPTCHAV3WithScoreName: 'reCAPTCHA v3 med point',
+ reCAPTCHAV3WithScoreDescription: 'Google reCAPTCHA v3 med point grænseværdi',
+ reCAPTCHAV3WithScoreScoreThresholdLabel: 'Point grænseværdi',
+ reCAPTCHAV3WithScoreScoreThresholdDescription:
+ 'En fastlagt reCAPTCHA v3 pointsætning mellem 0 og 1, hvor besvarelser der scorer over vil blive accepteret. En højere score fanger flere spam-besvarelser, men øger også risikoen for at afvise gyldige besvarelser. For de fleste sites er 0.5 et fornuftigt valg.',
+ reCAPTCHAV3WithScoreScoreErrorMessageLabel: 'Fejlbesked',
+ reCAPTCHAV3WithScoreScoreErrorMessageDescription:
+ 'Den fejlbesked der vises når brugeren ikke består reCAPTCHA-kontrollen.',
+ reCAPTCHAV3WithScoreScoreSaveScoreLabel: 'Gem score',
+ reCAPTCHAV3WithScoreScoreSaveScoreDescription: 'Gem den beregnede score med formularen.',
+ richTextName: 'Formatteret tekst',
+ richTextDescription: 'Giv noget beskrivende tekst med formatering.',
+ richTextHtmlLabel: 'Formatteret tekst',
+ richTextHtmlDescription: 'Indtast din formaterede tekst',
+ titleAndDescriptionName: 'Titel og beskrivelse',
+ titleAndDescriptionDescription: 'Dette er brugt til at angive noget beskrivende tekst.',
+ titleAndDescriptionCaptionLabel: 'Overskrift',
+ titleAndDescriptionCaptionDescription: 'Angiv en overskrift.',
+ titleAndDescriptionBodyTextLabel: 'Brødtekst',
+ titleAndDescriptionBodyTextDescription: 'Angiv en brødtekst.',
+ titleAndDescriptionCaptionTagLabel: 'Titel HTML-element',
+ titleAndDescriptionCaptionTagDescription: 'Vælg det HTML-element, der skal bruges ved gengivelse af overskriften.',
+ titleAndDescriptionShowLabelLabel: 'Vis etiket',
+ titleAndDescriptionShowLabelDescription: 'Angiver om et felts etiket skal vises når formularen bliver gengivet.',
+ longAnswerName: 'Langt svar',
+ longAnswerDescription: 'Gengiver et textarea, beregnet til længere svar.',
+ longAnswerDefaultValueLabel: 'Standard værdi',
+ longAnswerDefaultValueDescription: 'Angiv en standard værdi',
+ longAnswerPlaceholderLabel: 'Stedfortrædende værdi',
+ longAnswerPlaceholderDescription: 'Angiv en stedfortrædende værdi.',
+ longAnswerShowLabelLabel: 'Vis etiket',
+ longAnswerShowLabelDescription: 'Angiver om et felts etiket skal vises når formularen bliver gengivet.',
+ longAnswerAutocompleteAttributeLabel: 'Autocomplete attribut',
+ longAnswerAutocompleteAttributeDescription: 'Angiv en valgfri værdi til autocomplete attributten.',
+ longAnswerNumberOfRowsLabel: 'Antal af rækker',
+ longAnswerNumberOfRowsDescription: 'Angiv antallet af rækker der vises for en besvarelse.',
+ longAnswerMaximumLengthLabel: 'Maksimal længde',
+ longAnswerMaximumLengthDescription: 'Indtast det maksimale antal tegn, der accepteres.',
+ shortAnswerName: 'Kort svar',
+ shortAnswerDescription: 'Gengiver et tekst input felt, til korte svar.',
+ shortAnswerDefaultValueLabel: 'Standard værdi',
+ shortAnswerDefaultValueDescription: 'Angiv en standard værdi',
+ shortAnswerPlaceholderLabel: 'Stedfortrædende værdi',
+ shortAnswerPlaceholderDescription: 'Angiv en stedfortrædende værdi.',
+ shortAnswerShowLabelLabel: 'Vis etiket',
+ shortAnswerShowLabelDescription: 'Angiver om et felts etiket skal vises når formularen bliver gengivet.',
+ shortAnswerMaximumLengthLabel: 'Maksimal længde',
+ shortAnswerMaximumLengthDescription: 'Indtast det maksimale antal tegn, der accepteres.',
+ shortAnswerFieldTypeLabel: 'Felttype',
+ shortAnswerFieldTypeDescription: 'Vælg den forventede type information.',
+ shortAnswerAutocompleteAttributeLabel: 'Autocomplete attribut',
+ shortAnswerAutocompleteAttributeDescription: 'Angiv en valgfri værdi til autocomplete attributten.',
+ },
+ formProviderWorkflows: {
+ changeRecordStateName: 'Ændr på besvarelse',
+ changeRecordStateDescription: 'Ændrer på en besvarelse underbearbejdelse når der matches på et/flere ord.',
+ changeRecordStateWordsLabel: 'Ord',
+ changeRecordStateWordsDescription: 'Kommasepareret liste af ord der sammenlignes imod.',
+ changeRecordStateActionLabel: 'Handling',
+ changeRecordStateActionDescription: 'Hvad der sker hvis der er et match.',
+ postAsXMLName: 'Send som XML',
+ postAsXMLDescription: 'Sender formularen som XML til en URL.',
+ postAsXMLUrlLabel: 'URL',
+ postAsXMLUrlDescription: "Angiv URL'en der skal sendes til.",
+ postAsXMLMethodLabel: 'Metode',
+ postAsXMLMethodDescription: 'POST eller GET.',
+ postAsXMLXsltFileLabel: 'XSLT-fil',
+ postAsXMLXsltFileDescription: 'Transformer XML før afsendelse.',
+ postAsXMLFieldsLabel: 'Felter',
+ postAsXMLFieldsDescription: 'Kortlæg de nødvendige felter.',
+ postAsXMLUsernameLabel: 'Bruger',
+ postAsXMLUsernameDescription: '(valgfri)',
+ postAsXMLPasswordLabel: 'Kodeord',
+ postAsXMLPasswordDescription: '(valgfri)',
+ sendFormToURLName: 'Send formular til URL',
+ sendFormToURLDescription: 'Sender formularen til en URL, enten via HTTP POST eller GET.',
+ sendFormToURLUrlLabel: 'URL',
+ sendFormToURLUrlDescription: "Angiv URL'en der skal sendes til.",
+ sendFormToURLMethodLabel: 'Metode',
+ sendFormToURLMethodDescription: 'POST eller GET.',
+ sendFormToURLStandardFieldsLabel: 'Standard Felter',
+ sendFormToURLStandardFieldsDescription: 'Kortlæg hvilkensomhelst standard formular information til afsendelse.',
+ sendFormToURLFieldsLabel: 'Felter',
+ sendFormToURLFieldsDescription: 'Kortlæg de nødvendige felter.',
+ sendFormToURLUsernameLabel: 'Bruger',
+ sendFormToURLUsernameDescription: '(valgfri)',
+ sendFormToURLPasswordLabel: 'Kodeord',
+ sendFormToURLPasswordDescription: '(valgfri)',
+ saveAsAnXMLFileName: 'Gem som en XML-fil',
+ saveAsAnXMLFileDescription: 'Gemmer besvarelsen af formularen som en XML-fil via XSLT.',
+ saveAsAnXMLFilePathLabel: 'Sti',
+ saveAsAnXMLFilePathDescription: 'Angiver stien til placeringen af filen.',
+ saveAsAnXMLFileExtensionLabel: 'Endelse',
+ saveAsAnXMLFileExtensionDescription: 'Filendelsen.',
+ saveAsAnXMLFileXsltFileLabel: 'XSLT-fil',
+ saveAsAnXMLFileXsltFileDescription: 'Transformer XML før den gemmes.',
+ saveAsUmbracoContentNodeName: 'Gem som Umbraco inholdsnode',
+ saveAsUmbracoContentNodeDescription:
+ 'Gemmer formularværdierne som indholdsnoder ved hjælp af en specifik dokumenttype.',
+ saveAsUmbracoContentNodeFieldsLabel: 'Dokumenttype',
+ saveAsUmbracoContentNodeFieldsDescription: 'Kortlæg dokumenttype.',
+ saveAsUmbracoContentNodePublishLabel: 'Udgiv',
+ saveAsUmbracoContentNodePublishDescription: 'Udgiv noden øjeblikkeligt.',
+ saveAsUmbracoContentNodeRootNodeLabel: 'Gem placering',
+ saveAsUmbracoContentNodeRootNodeDescription: 'Vælg hvor den oprettede inholdsnode skal gemmes til.',
+ sendEmailName: 'Send email',
+ sendEmailDescription: 'Sender resultatet af en formular til en emailadresse.',
+ sendEmailEmailLabel: 'Modtager email',
+ sendEmailEmailDescription: 'Angiv modtagerens emailadresse(r).',
+ sendEmailCcEmailLabel: 'CC Email',
+ sendEmailCcEmailDescription: 'Angiv CC email addresser (hvis den er nødvendig).',
+ sendEmailBccEmailLabel: 'BCC Email',
+ sendEmailBccEmailDescription: 'Angiv BCC email addresser (hvis den er nødvendig).',
+ sendEmailSenderEmailLabel: 'Afsenderemail',
+ sendEmailSenderEmailDescription:
+ 'Angiv afsenderemail (hvis feltet er blank benyttes indstillingen fra konfiguration).',
+ sendEmailReplyToEmailLabel: 'Svar-Emailadresse',
+ sendEmailReplyToEmailDescription: 'Angiv den emailadresse som der bruges som svaradresse (hvis nødvendigt).',
+ sendEmailSubjectLabel: 'Emne',
+ sendEmailSubjectDescription: 'Angiv emnet.',
+ sendEmailMessageLabel: 'Besked',
+ sendEmailMessageDescription: 'Angiv en introduktion.',
+ sendEmailAttachmentLabel: 'Vedhæftning',
+ sendEmailAttachmentDescription: 'Vedhæft en filupload til emailen.',
+ sendEmailWithTemplateRazorName: 'Send email med skabelon (Razor)',
+ sendEmailWithTemplateRazorDescription:
+ 'Send formularens besvarelse til en/flere emailadresse/r ved hjælp af en Razor .cshtml skabelon.',
+ sendEmailWithTemplateRazorEmailLabel: 'Modtager email',
+ sendEmailWithTemplateRazorEmailDescription: 'Angiv modtagerens emailadresse(r).',
+ sendEmailWithTemplateRazorCcEmailLabel: 'CC Email',
+ sendEmailWithTemplateRazorCcEmailDescription: 'Angiv CC email addresser (hvis den er nødvendig).',
+ sendEmailWithTemplateRazorBccEmailLabel: 'BCC Email',
+ sendEmailWithTemplateRazorBccEmailDescription: 'Angiv BCC email addresser (hvis den er nødvendig).',
+ sendEmailWithTemplateRazorSenderEmailLabel: 'Afsenderemail',
+ sendEmailWithTemplateRazorSenderEmailDescription:
+ 'Angiv afsenderemail (hvis feltet er blank benyttes indstillingen fra konfiguration).',
+ sendEmailWithTemplateRazorReplyToEmailLabel: 'Svar-Emailadresse',
+ sendEmailWithTemplateRazorReplyToEmailDescription:
+ 'Angiv den emailadresse som der bruges som svaradresse (hvis nødvendigt).',
+ sendEmailWithTemplateRazorSubjectLabel: 'Emne',
+ sendEmailWithTemplateRazorSubjectDescription: 'Angiv emnet',
+ sendEmailWithTemplateRazorRazorViewFilePathLabel: 'Email Skabelon',
+ sendEmailWithTemplateRazorRazorViewFilePathDescription:
+ 'Stien til det Razor view som du vil bruge til at generere emailen. Emailskabeloner er gemt under /views/partials/forms/emails.',
+ sendEmailWithTemplateRazorHeaderHtmlLabel: 'Formateret overskriftstekst',
+ sendEmailWithTemplateRazorHeaderHtmlDescription: 'Indtast formateret tekst, der skal gengives, i e-mail-headeren.',
+ sendEmailWithTemplateRazorFooterHtmlLabel: 'Formateret sidefodstekst',
+ sendEmailWithTemplateRazorFooterHtmlDescription: 'Indtast formateret tekst, der skal gengives, i e-mail-sidefoden.',
+ sendEmailWithTemplateRazorAttachmentLabel: 'Vedhæftning',
+ sendEmailWithTemplateRazorAttachmentDescription: 'Vedhæft en filupload til emailen.',
+ sendXSLTTransformedEmailName: 'Send XSLT transformed email',
+ sendXSLTTransformedEmailDescription: 'Send den resultatet af formularen til en emailadresse.',
+ sendXSLTTransformedEmailEmailLabel: 'Modtager email',
+ sendXSLTTransformedEmailEmailDescription: 'Angiv modtagerens emailadresse(r).',
+ sendXSLTTransformedEmailCcEmailLabel: 'CC Email',
+ sendXSLTTransformedEmailCcEmailDescription: 'Angiv CC email addresser (hvis den er nødvendig).',
+ sendXSLTTransformedEmailBccEmailLabel: 'BCC Email',
+ sendXSLTTransformedEmailBccEmailDescription: 'Angiv BCC email addresser (hvis den er nødvendig).',
+ sendXSLTTransformedEmailSenderEmailLabel: 'Afsenderemail',
+ sendXSLTTransformedEmailSenderEmailDescription:
+ 'Angiv afsenderemail (hvis feltet er blank benyttes indstillingen fra konfiguration).',
+ sendXSLTTransformedEmailReplyToEmailLabel: 'Svar-Emailadresse',
+ sendXSLTTransformedEmailReplyToEmailDescription:
+ 'Angiv den emailadresse som der bruges som svaradresse (hvis nødvendigt).',
+ sendXSLTTransformedEmailSubjectLabel: 'Emne',
+ sendXSLTTransformedEmailSubjectDescription: 'Angiv emnet',
+ sendXSLTTransformedEmailXsltFileLabel: 'XSLT-fil',
+ sendXSLTTransformedEmailXsltFileDescription: 'Transformer XML før emailen sendes.',
+ slackLegacyName: 'Slack (Legacy)',
+ slackLegacyDescription: 'Sender formularens data til en specifik kanal på slack ved hjælp af legacy tokens',
+ slackLegacyTokenLabel: 'API Token',
+ slackLegacyTokenDescription: 'Slack API token.',
+ slackLegacyChannelLabel: 'Kanal',
+ slackLegacyChannelDescription: 'Slack-kanal der skal sendes til.',
+ slackLegacyUsernameLabel: 'Brugernavn',
+ slackLegacyUsernameDescription: 'Det brugernavn eller bot som er afsender.',
+ slackLegacyAvatarUrlLabel: 'Avatar URL',
+ slackLegacyAvatarUrlDescription: 'Den fulde URL (inklusiv http/https) til avatar-billedet.',
+ slackName: 'Slack',
+ slackDescription: 'Sender formularens data til en specifik kanal på slack ved hjælp af webhook.',
+ slackWebhookUrlLabel: 'Webhook URL',
+ slackWebhookUrlDescription: 'Slack Webhook URL.',
+ },
+ formProviderDataSources: {
+ sQLDatabaseName: 'SQL Database',
+ sQLDatabaseDescription:
+ 'Forbind til hvilken som helst databasetabel der understøtter OLEDB og konstruer en datakilde på baggrund af den.',
+ sQLDatabaseConnectionLabel: 'Forbindelsesstreng',
+ sQLDatabaseConnectionDescription: 'OleDB kompatibel forbindelsesstreng.',
+ sQLDatabaseTableLabel: 'Tabelnavn',
+ sQLDatabaseTableDescription: 'Databasens tabelnavn.',
+ },
+ formProviderPrevalueSources: {
+ dataSourceName: 'Datakilde',
+ dataSourceDescription: 'Gemmer på foruddefinerede værdier i tabellen til foruddefinerede værdier.',
+ getValuesFromTextfileName: 'Få værdier fra en tekstfil',
+ getValuesFromTextfileDescription: 'Upload en tekstfil der indeholder foruddefinerede værdier.',
+ getValuesFromTextfileTextFileLabel: 'Tekstfil',
+ getValuesFromTextfileTextFileDescription: 'Fil der indeholder de foruddefinerede værdier (Opdelt ved linjeskift).',
+ umbracoDocumentsName: 'Umbracodokumenter',
+ umbracoDocumentsDescription: 'Bruger noder fra en specifik kilde som foruddefinerede værdier.',
+ umbracoDocumentsRootNodeLabel: 'Rodnode',
+ umbracoDocumentsRootNodeDescription: 'Kilde der hentes noder fra.',
+ umbracoDocumentsUseCurrentPageLabel: 'Brug den nuværende side som rod',
+ umbracoDocumentsUseCurrentPageDescription: 'Virker ikke i forhåndsvisning.',
+ umbracoDocumentsDocTypeLabel: 'Dokumenttype',
+ umbracoDocumentsDocTypeDescription: 'Typen af noder du vil bruge.',
+ umbracoDocumentsValueFieldLabel: 'Værdi felt',
+ umbracoDocumentsValueFieldDescription: 'Vælg hvilket felt der skal bruges til værdien af ​​præværdien.',
+ umbracoDocumentsListGrandChildrenLabel: 'Vis alle undersider',
+ umbracoDocumentsListGrandChildrenDescription: 'Begræns ikke til underelementer, men inkludér yderligere niveauer.',
+ umbracoDocumentsOrderByLabel: 'Sortér efter',
+ umbracoDocumentsOrderByDescription: 'Vælg hvordan listen med foruddefinerede værdier skal sorteres.',
+ sQLDatabaseName: 'SQL Database',
+ sQLDatabaseDescription:
+ 'Forbinder til en OLEDB-kompatibel databasetabel og skaber en kilde af foruddefinerede værdier derfra.',
+ sQLDatabaseConnectionLabel: 'Forbindelsesstreng',
+ sQLDatabaseConnectionDescription: 'OleDB kompatibel forbindelsesstreng.',
+ sQLDatabaseConnectionStringLabel: 'Forbindelsesstreng fra web.config',
+ sQLDatabaseConnectionStringDescription: 'Vælg forbindelsesstreng (den skal være OleDB-kompatibel).',
+ sQLDatabaseTableNameLabel: 'Tabelnavn',
+ sQLDatabaseTableNameDescription: '',
+ sQLDatabaseKeyColumnLabel: 'Nøgle-kolonne',
+ sQLDatabaseKeyColumnDescription: 'Kolonne der indeholder nøglerne.',
+ sQLDatabaseValueColumnLabel: 'Værdi-kolonne',
+ sQLDatabaseValueColumnDescription: 'Kolonne der indeholder værdierne.',
+ sQLDatabaseCaptionColumnLabel: 'Værdi-billedtekst',
+ sQLDatabaseCaptionColumnDescription: 'Kolonne der indeholder billedtekster.',
+ umbracoDataTypePreValueName: 'Umbraco datatype foruddefinerede værdier',
+ umbracoDataTypePreValueDescription: 'Forbinder til en Umbraco datatype og dens samling af foruddefinerede værdier.',
+ umbracoDataTypePreValuesDataTypeIdLabel: 'Datatype',
+ umbracoDataTypePreValuesDataTypeIdDescription: 'Datatype der skal bruges.',
+ },
+ formProviderExportTypes: {
+ excelFileName: 'Excel-fil (indsendte værdier)',
+ excelFileDescription:
+ 'Eksporterer alle indsendte værdier for formularen til Excel i et format, der er nyttigt til integration med andre systemer.',
+ excelFileDisplayValuesName: 'Excel-fil (værdier til visning)',
+ excelFileDisplayValuesDescription:
+ 'Eksporterer alle værdier for formularen til Excel i et format, der er nyttigt til at gennemgå dataene eller oprette en rapport. Billedtekster bruges til forudgående data, hvor de er tilgængelige.',
+ excelFileNameOsx: 'Excel/Numbers-fil (indsendte værdier)',
+ excelFileDescriptionOsx:
+ 'Eksporterer alle indsendte værdier for formularen til Excel/Numbers i et format, der er nyttigt til integration med andre systemer.',
+ excelFileDisplayValuesNameOsx: 'Excel/Numbers-fil (værdier til visning)',
+ excelFileDisplayValuesDescriptionOsx:
+ 'Eksporterer alle værdier for formularen til Excel/Numbers i et format, der er nyttigt til at gennemgå dataene eller oprette en rapport. Billedtekster bruges til forudgående data, hvor de er tilgængelige.',
+ saveAllUploadedFilesInDiskStructureName: 'Gem alle uploadede filer (in disk structure)',
+ saveAllUploadedFilesInDiskStructureDescription:
+ 'Eksporterer alle filer uploaded via formular til et zip-arkiv, hvor filerne er organiseret som filerne er gemt på disken.',
+ saveAllUploadedFilesByEntryName: 'Gem alle uploadede filer (efter besvarelse)',
+ saveAllUploadedFilesByEntryDescription:
+ 'Eksporterer alle filer uploaded via formular til et zip-arkiv, hvor filerne er organiseret per besvarelse i en undermappe.',
+ },
+ formRecordSetActions: {
+ deleteConfirm: 'Er du sikker på at du vil slette disse besvarelser?',
+ },
+ propertyEditorPicker: {
+ title: 'Select Property Editor',
+ openPropertyEditorPicker: 'Select Property Editor',
+ },
+ healthcheck: {
+ checkSuccessMessage: "Value is set to the recommended value: '%0%'.",
+ checkErrorMessageDifferentExpectedValue:
+ "Expected value '%1%' for '%2%' in configuration file '%3%', but\n found '%0%'.\n ",
+ checkErrorMessageUnexpectedValue: "Found unexpected value '%0%' for '%2%' in configuration file '%3%'.\n ",
+ macroErrorModeCheckSuccessMessage: "MacroErrors are set to '%0%'.",
+ macroErrorModeCheckErrorMessage:
+ "MacroErrors are set to '%0%' which will prevent some or all pages in\n your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'.\n ",
+ httpsCheckValidCertificate: "Your website's certificate is valid.",
+ httpsCheckInvalidCertificate: "Certificate validation error: '%0%'",
+ httpsCheckExpiredCertificate: "Your website's SSL certificate has expired.",
+ httpsCheckExpiringCertificate: "Your website's SSL certificate is expiring in %0% days.",
+ healthCheckInvalidUrl: "Error pinging the URL %0% - '%1%'",
+ httpsCheckIsCurrentSchemeHttps: 'You are currently %0% viewing the site using the HTTPS scheme.',
+ httpsCheckConfigurationRectifyNotPossible:
+ "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to 'false' in\n your appSettings.json file. Once you access this site using the HTTPS scheme, that should be set to 'true'.\n ",
+ httpsCheckConfigurationCheckResult:
+ "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to '%0%' in your\n appSettings.json file, your cookies are %1% marked as secure.\n ",
+ compilationDebugCheckSuccessMessage: 'Debug compilation mode is disabled.',
+ compilationDebugCheckErrorMessage:
+ 'Debug compilation mode is currently enabled. It is recommended to\n disable this setting before go live.\n ',
+ umbracoApplicationUrlCheckResultTrue:
+ "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is set to %0% .",
+ umbracoApplicationUrlCheckResultFalse: "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is not set.",
+ clickJackingCheckHeaderFound:
+ 'The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was found.',
+ clickJackingCheckHeaderNotFound:
+ 'The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.',
+ noSniffCheckHeaderFound:
+ 'The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was found.',
+ noSniffCheckHeaderNotFound:
+ 'The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was not found.',
+ hSTSCheckHeaderFound:
+ 'The header Strict-Transport-Security , also known as the HSTS-header, was found.',
+ hSTSCheckHeaderNotFound: 'The header Strict-Transport-Security was not found.',
+ hSTSCheckHeaderFoundOnLocalhost:
+ 'The header Strict-Transport-Security , also known as the HSTS-header, was found. This header should not be present on localhost. ',
+ hSTSCheckHeaderNotFoundOnLocalhost:
+ 'The header Strict-Transport-Security was not found. This header should not be present on localhost.',
+ xssProtectionCheckHeaderFound:
+ 'The header X-XSS-Protection was found. It is recommended not to add this header to your website . \n You can read about this on the Mozilla website ',
+ xssProtectionCheckHeaderNotFound: 'The header X-XSS-Protection was not found.',
+ excessiveHeadersFound:
+ 'The following headers revealing information about the website technology were found: %0% .',
+ excessiveHeadersNotFound: 'No headers revealing information about the website technology were found.\n ',
+ smtpMailSettingsNotFound: "The 'Umbraco:CMS:Global:Smtp' configuration could not be found.",
+ smtpMailSettingsHostNotConfigured:
+ "The 'Umbraco:CMS:Global:Smtp:Host' configuration could not be\n found.\n ",
+ smtpMailSettingsConnectionSuccess:
+ 'SMTP settings are configured correctly and the service is operating\n as expected.\n ',
+ smtpMailSettingsConnectionFail:
+ "The SMTP server configured with host '%0%' and port '%1%' could not be\n reached. Please check to ensure the SMTP settings in the configuration 'Umbraco:CMS:Global:Smtp' are correct.\n ",
+ notificationEmailsCheckSuccessMessage: 'Notification email has been set to %0% .',
+ notificationEmailsCheckErrorMessage:
+ 'Notification email is still set to the default value of %0% .',
+ checkGroup: 'Check group',
+ helpText:
+ '\n The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button.\n You can add your own health checks, have a look at the documentation for more information about custom health checks.
\n ',
+ },
+ nuCache: {
+ refreshStatus: 'Refresh status',
+ memoryCache: 'Memory Cache',
+ memoryCacheDescription:
+ '\n This button lets you reload the in-memory cache, by entirely reloading it from the database\n cache (but it does not rebuild that database cache). This is relatively fast.\n Use it when you think that the memory cache has not been properly refreshed, after some events\n triggered—which would indicate a minor Umbraco issue.\n (note: triggers the reload on all servers in an LB environment).\n ',
+ reload: 'Reload',
+ databaseCache: 'Database Cache',
+ databaseCacheDescription:
+ '\n This button lets you rebuild the database cache, ie the content of the cmsContentNu table.\n Rebuilding can be expensive. \n Use it when reloading is not enough, and you think that the database cache has not been\n properly generated—which would indicate some critical Umbraco issue.\n ',
+ rebuild: 'Rebuild',
+ internals: 'Internals',
+ internalsDescription:
+ '\n This button lets you trigger a NuCache snapshots collection (after running a fullCLR GC).\n Unless you know what that means, you probably do not need to use it.\n ',
+ collect: 'Collect',
+ publishedCacheStatus: 'Published Cache Status',
+ caches: 'Caches',
+ },
+ profiling: {
+ performanceProfiling: 'Performance profiling',
+ performanceProfilingDescription:
+ "\n \n Umbraco currently runs in debug mode. This means you can use the built-in performance profiler to assess the performance when rendering pages.\n
\n \n If you want to activate the profiler for a specific page rendering, simply add umbDebug=true to the querystring when requesting the page.\n
\n \n If you want the profiler to be activated by default for all page renderings, you can use the toggle below.\n It will set a cookie in your browser, which then activates the profiler automatically.\n In other words, the profiler will only be active by default in your browser - not everyone else's.\n
\n ",
+ activateByDefault: 'Activate the profiler by default',
+ reminder: 'Friendly reminder',
+ reminderDescription:
+ '\n \n You should never let a production site run in debug mode. Debug mode is turned off by setting Umbraco:CMS:Hosting:Debug to false in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n ',
+ profilerEnabledDescription:
+ "\n \n Umbraco currently does not run in debug mode, so you can't use the built-in profiler. This is how it should be for a production site.\n
\n \n Debug mode is turned on by setting Umbraco:CMS:Hosting:Debug to true in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n ",
+ },
+ settingsDashboardVideos: {
+ trainingHeadline: 'Hours of Umbraco training videos are only a click away',
+ trainingDescription:
+ '\n Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos
\n ',
+ getStarted: 'To get you started',
+ },
+ settingsDashboard: {
+ start: 'Start here',
+ startDescription:
+ 'This section contains the building blocks for your Umbraco site. Follow the below\n links to find out more about working with the items in the Settings section\n ',
+ more: 'Find out more',
+ bulletPointOne:
+ '\n Read more about working with the items in Settings in the Documentation section of Our Umbraco\n ',
+ bulletPointTwo:
+ '\n Ask a question in the Community Forum \n ',
+ bulletPointTutorials:
+ '\n Watch our free tutorial videos on the Umbraco Learning Base \n ',
+ bulletPointFour:
+ '\n Find out about our productivity boosting tools and commercial support \n ',
+ bulletPointFive:
+ '\n Find out about real-life training and certification opportunities\n ',
+ },
+ startupDashboard: {
+ fallbackHeadline: 'Welcome to The Friendly CMS',
+ fallbackDescription:
+ "Thank you for choosing Umbraco - we think this could be the beginning of something\n beautiful. While it may feel overwhelming at first, we've done a lot to make the learning curve as smooth and fast\n as possible.\n ",
+ },
+ analytics: {
+ consentForAnalytics: 'Consent for telemetry data',
+ analyticsLevelSavedSuccess: 'Telemetry level saved!',
+ analyticsDescription:
+ '\n In order to improve Umbraco and add new functionality based on as relevant information as possible,\n we would like to collect system- and usage information from your installation.\n Aggregate data will be shared on a regular basis as well as learnings from these metrics.\n Hopefully, you will help us collect some valuable data.\n \n We WILL NOT collect any personal data such as content, code, user information, and all data will be fully anonymized.\n ',
+ minimalLevelDescription: 'We will only send an anonymized site ID to let us know that the site exists.',
+ basicLevelDescription: 'We will send an anonymized site ID, Umbraco version, and packages installed',
+ detailedLevelDescription:
+ '\n We will send:\n \n Anonymized site ID, Umbraco version, and packages installed. \n Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use. \n System information: Webserver, server OS, server framework, server OS language, and database provider. \n Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode. \n \n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n By choosing "Detailed" you agree to current and future anonymized information being collected. \n ',
+ },
+ umbId: {
+ editProfile: 'Edit your Umbraco ID profile',
+ changePassword: 'Change your Umbraco ID password',
+ },
+ deployManagementDashboard: {
+ refreshStatus: 'Refresh Status',
+ deployStatus: 'Deploy Status',
+ deployOperations: 'Deploy Operations',
+ triggerOperation: 'Trigger Operation',
+ version: 'Version',
+ status: 'Status',
+ operationTime: 'Last operation time',
+ schemaComparison: 'Schema Comparison',
+ configurationDetails: 'Configuration Details',
+ updateUmbracoSchemaFromDataFiles: 'Update Umbraco Schema From Data Files',
+ updateUmbracoSchemaFromDataFilesDescription:
+ 'Update the Umbraco schema based on the information contained in the .uda files on disk.',
+ schemaDeployment: 'Update Umbraco Schema',
+ exportSchemaToDataFiles: 'Export Schema To Data Files',
+ exportSchemaToDataFilesDescription: 'Extract the schema from Umbraco and output it to the .uda files on disk.',
+ exportSchema: 'Export Schema',
+ clearCachedSignatures: 'Clear Cached Signatures',
+ clearCachedSignaturesDescription:
+ '\n Clear the cached artifact signatures from the Umbraco environment.\n This should not be necessary in normal use. This may solve reports of schema mismatches when transferring content between environments that have been aligned.\n ',
+ clearSignatures: 'Clear Signatures',
+ setCachedSignatures: 'Set Cached Signatures',
+ setCachedSignaturesDescription:
+ '\n Sets the cached artifact signatures for all entities within the Umbraco environment.\n This can be used when signatures have been cleared and you want to ensure they are pre-generated before attempting a potentially long-running restore or transfer operation.\n ',
+ setSignatures: 'Set Signatures',
+ },
+} as UmbTranslationsDictionary;
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.js b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.js
deleted file mode 100644
index e3f12458f4..0000000000
--- a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.js
+++ /dev/null
@@ -1,2966 +0,0 @@
-export default {
- "actions": {
- "assigndomain": "Culture and Hostnames",
- "auditTrail": "Audit Trail",
- "browse": "Browse Node",
- "changeDocType": "Change Document Type",
- "changeDataType": "Change Data Type",
- "copy": "Copy",
- "create": "Create",
- "export": "Export",
- "createPackage": "Create Package",
- "createGroup": "Create group",
- "delete": "Delete",
- "disable": "Disable",
- "editContent": "Edit content",
- "editSettings": "Edit settings",
- "emptyrecyclebin": "Empty recycle bin",
- "enable": "Enable",
- "exportDocumentType": "Export Document Type",
- "importdocumenttype": "Import Document Type",
- "importPackage": "Import Package",
- "liveEdit": "Edit in Canvas",
- "logout": "Exit",
- "move": "Move",
- "notify": "Notifications",
- "protect": "Restrict Public Access",
- "publish": "Publish",
- "unpublish": "Unpublish",
- "refreshNode": "Reload",
- "republish": "Republish entire site",
- "remove": "Remove",
- "rename": "Rename",
- "restore": "Restore",
- "chooseWhereToCopy": "Choose where to copy",
- "chooseWhereToMove": "Choose where to move",
- "chooseWhereToImport": "Choose where to import",
- "toInTheTreeStructureBelow": "to in the tree structure below",
- "infiniteEditorChooseWhereToCopy": "Choose where to copy the selected item(s)",
- "infiniteEditorChooseWhereToMove": "Choose where to move the selected item(s)",
- "wasMovedTo": "was moved to",
- "wasCopiedTo": "was copied to",
- "wasDeleted": "was deleted",
- "rights": "Permissions",
- "rollback": "Rollback",
- "sendtopublish": "Send To Publish",
- "sendToTranslate": "Send To Translation",
- "setGroup": "Set group",
- "sort": "Sort",
- "translate": "Translate",
- "update": "Update",
- "setPermissions": "Set permissions",
- "unlock": "Unlock",
- "createblueprint": "Create Content Template",
- "resendInvite": "Resend Invitation",
- "deployQueueForTransfer": "Queue for transfer",
- "deployRestore": "Workspace restore",
- "deployTreeRestore": "Tree restore",
- "deployPartialRestore": "Partial restore",
- "deployTransferNow": "Transfer now",
- "deployCompare": "Compare"
- },
- "actionCategories": {
- "content": "Content",
- "administration": "Administration",
- "structure": "Structure",
- "other": "Other"
- },
- "actionDescriptions": {
- "assignDomain": "Allow access to assign culture and hostnames",
- "auditTrail": "Allow access to view a node's history log",
- "browse": "Allow access to view a node",
- "changeDocType": "Allow access to change Document Type for a node",
- "copy": "Allow access to copy a node",
- "create": "Allow access to create nodes",
- "delete": "Allow access to delete nodes",
- "move": "Allow access to move a node",
- "protect": "Allow access to set and change access restrictions for a node",
- "publish": "Allow access to publish a node",
- "unpublish": "Allow access to unpublish a node",
- "rights": "Allow access to change permissions for a node",
- "rollback": "Allow access to roll back a node to a previous state",
- "sendtopublish": "Allow access to send a node for approval before publishing",
- "sendToTranslate": "Allow access to send a node for translation",
- "sort": "Allow access to change the sort order for nodes",
- "translate": "Allow access to translate a node",
- "update": "Allow access to save a node",
- "createblueprint": "Allow access to create a Content Template",
- "notify": "Allow access to setup notifications for content nodes",
- "deployQueueForTransfer": "Allow the user to queue item(s)",
- "deployRestore": "Allow the user to restore items for the whole workspace",
- "deployTreeRestore": "Allow the user to restore items for a tree",
- "deployPartialRestore": "Allow the user to partial restore items",
- "deployCompare": "Allow the user to compare items between workspaces"
- },
- "apps": {
- "umbContent": "Content",
- "umbInfo": "Info"
- },
- "assignDomain": {
- "permissionDenied": "Permission denied.",
- "addNew": "Add new domain",
- "addCurrent": "Add current domain",
- "remove": "remove",
- "invalidNode": "Invalid node.",
- "invalidDomain": "One or more domains have an invalid format.",
- "duplicateDomain": "Domain has already been assigned.",
- "language": "Language",
- "domain": "Domain",
- "domainCreated": "New domain '%0%' has been created",
- "domainDeleted": "Domain '%0%' is deleted",
- "domainExists": "Domain '%0%' has already been assigned",
- "domainUpdated": "Domain '%0%' has been updated",
- "orEdit": "Edit Current Domains",
- "domainHelpWithVariants": "Valid domain names are: \"example.com\", \"www.example.com\", \"example.com:8080\", or \"https://www.example.com/\".\n Furthermore also one-level paths in domains are supported, eg. \"example.com/en\" or \"/en\".",
- "inherit": "Inherit",
- "setLanguage": "Culture",
- "setLanguageHelp": "Set the culture for nodes below the current node, or inherit culture from parent nodes. Will also apply \n to the current node, unless a domain below applies too.",
- "setDomains": "Domains"
- },
- "buttons": {
- "clearSelection": "Clear selection",
- "select": "Select",
- "somethingElse": "Do something else",
- "bold": "Bold",
- "deindent": "Cancel Paragraph Indent",
- "formFieldInsert": "Insert form field",
- "graphicHeadline": "Insert graphic headline",
- "htmlEdit": "Edit Html",
- "indent": "Indent Paragraph",
- "italic": "Italic",
- "justifyCenter": "Center",
- "justifyLeft": "Justify Left",
- "justifyRight": "Justify Right",
- "linkInsert": "Insert Link",
- "linkLocal": "Insert local link (anchor)",
- "listBullet": "Bullet List",
- "listNumeric": "Numeric List",
- "macroInsert": "Insert macro",
- "pictureInsert": "Insert picture",
- "publishAndClose": "Publish and close",
- "publishDescendants": "Publish with descendants",
- "relations": "Edit relations",
- "returnToList": "Return to list",
- "save": "Save",
- "saveAndClose": "Save and close",
- "saveAndPublish": "Save and publish",
- "saveToPublish": "Send for approval",
- "saveListView": "Save list view",
- "schedulePublish": "Schedule",
- "saveAndPreview": "Save and preview",
- "showPageDisabled": "Preview is disabled because there's no template assigned",
- "styleChoose": "Choose style",
- "styleShow": "Show styles",
- "tableInsert": "Insert table",
- "generateModelsAndClose": "Generate models and close",
- "saveAndGenerateModels": "Save and generate models",
- "undo": "Undo",
- "redo": "Redo",
- "deleteTag": "Delete tag",
- "confirmActionCancel": "Cancel",
- "confirmActionConfirm": "Confirm",
- "morePublishingOptions": "More publishing options",
- "submitChanges": "Submit"
- },
- "auditTrails": {
- "atViewingFor": "Viewing for",
- "delete": "Content deleted",
- "unpublish": "Content unpublished",
- "unpublishvariant": "Content unpublished for languages: %0%",
- "publish": "Content published",
- "publishvariant": "Content published for languages: %0%",
- "save": "Content saved",
- "savevariant": "Content saved for languages: %0%",
- "move": "Content moved",
- "copy": "Content copied",
- "rollback": "Content rolled back",
- "sendtopublish": "Content sent for publishing",
- "sendtopublishvariant": "Content sent for publishing for languages: %0%",
- "sort": "Sort child items performed by user",
- "custom": "%0%",
- "contentversionpreventcleanup": "Cleanup disabled for version: %0%",
- "contentversionenablecleanup": "Cleanup enabled for version: %0%",
- "smallCopy": "Copy",
- "smallPublish": "Publish",
- "smallPublishVariant": "Publish",
- "smallMove": "Move",
- "smallSave": "Save",
- "smallSaveVariant": "Save",
- "smallDelete": "Delete",
- "smallUnpublish": "Unpublish",
- "smallUnpublishVariant": "Unpublish",
- "smallRollBack": "Rollback",
- "smallSendToPublish": "Send To Publish",
- "smallSendToPublishVariant": "Send To Publish",
- "smallSort": "Sort",
- "smallCustom": "Custom",
- "smallContentVersionPreventCleanup": "Save",
- "smallContentVersionEnableCleanup": "Save",
- "historyIncludingVariants": "History (all variants)"
- },
- "codefile": {
- "createFolderIllegalChars": "The folder name cannot contain illegal characters.",
- "deleteItemFailed": "Failed to delete item: %0%"
- },
- "content": {
- "isPublished": "Is Published",
- "about": "About this page",
- "alias": "Alias",
- "alternativeTextHelp": "(how would you describe the picture over the phone)",
- "alternativeUrls": "Alternative Links",
- "clickToEdit": "Click to edit this item",
- "createBy": "Created by",
- "createByDesc": "Original author",
- "updatedBy": "Updated by",
- "createDate": "Created",
- "createDateDesc": "Date/time this document was created",
- "documentType": "Document Type",
- "editing": "Editing",
- "expireDate": "Remove at",
- "itemChanged": "This item has been changed after publication",
- "itemNotPublished": "This item is not published",
- "lastPublished": "Last published",
- "noItemsToShow": "There are no items to show",
- "listViewNoItems": "There are no items to show in the list.",
- "listViewNoContent": "No child items have been added",
- "listViewNoMembers": "No members have been added",
- "mediatype": "Media Type",
- "mediaLinks": "Link to media item(s)",
- "membergroup": "Member Group",
- "memberrole": "Role",
- "membertype": "Member Type",
- "noChanges": "No changes have been made",
- "noDate": "No date chosen",
- "nodeName": "Page title",
- "noMediaLink": "This media item has no link",
- "noProperties": "No content can be added for this item",
- "otherElements": "Properties",
- "parentNotPublished": "This document is published but is not visible because the parent '%0%' is\n unpublished\n ",
- "parentCultureNotPublished": "This culture is published but is not visible because it is unpublished on\n parent '%0%'\n ",
- "parentNotPublishedAnomaly": "This document is published but is not in the cache",
- "getUrlException": "Could not get the URL",
- "routeError": "This document is published but its URL would collide with content %0%",
- "routeErrorCannotRoute": "This document is published but its URL cannot be routed",
- "publish": "Publish",
- "published": "Published",
- "publishedPendingChanges": "Published (pending changes)",
- "publishStatus": "Publication Status",
- "publishDescendantsHelp": "Publish %0% and all content items underneath and thereby making their content publicly available.",
- "publishDescendantsWithVariantsHelp": "Publish variants and variants of same type underneath and thereby making their content publicly available.",
- "releaseDate": "Publish at",
- "unpublishDate": "Unpublish at",
- "removeDate": "Clear Date",
- "setDate": "Set date",
- "sortDone": "Sortorder is updated",
- "sortHelp": "To sort the nodes, simply drag the nodes or click one of the column headers. You can select\n multiple nodes by holding the \"shift\" or \"control\" key while selecting\n ",
- "statistics": "Statistics",
- "titleOptional": "Title (optional)",
- "altTextOptional": "Alternative text (optional)",
- "captionTextOptional": "Caption (optional)",
- "type": "Type",
- "unpublish": "Unpublish",
- "unpublished": "Unpublished",
- "notCreated": "Not created",
- "updateDate": "Last edited",
- "updateDateDesc": "Date/time this document was edited",
- "uploadClear": "Remove file(s)",
- "uploadClearImageContext": "Click here to remove the image from the media item",
- "uploadClearFileContext": "Click here to remove the file from the media item",
- "urls": "Link to document",
- "memberof": "Member of group(s)",
- "notmemberof": "Not a member of group(s)",
- "childItems": "Child items",
- "target": "Target",
- "scheduledPublishServerTime": "This translates to the following time on the server:",
- "scheduledPublishDocumentation": "What does this mean? ",
- "nestedContentDeleteItem": "Are you sure you want to delete this item?",
- "nestedContentDeleteAllItems": "Are you sure you want to delete all items?",
- "nestedContentEditorNotSupported": "Property %0% uses editor %1% which is not supported by Nested\n Content.\n ",
- "nestedContentNoContentTypes": "No Content Types are configured for this property.",
- "nestedContentAddElementType": "Add Element Type",
- "nestedContentSelectElementTypeModalTitle": "Select Element Type",
- "nestedContentGroupHelpText": "Select the group whose properties should be displayed. If left blank, the\n first group on the Element Type will be used.\n ",
- "nestedContentTemplateHelpTextPart1": "Enter an angular expression to evaluate against each item for its\n name. Use\n ",
- "nestedContentTemplateHelpTextPart2": "to display the item index",
- "nestedContentNoGroups": "The selected element type does not contain any supported groups (tabs are not supported by this editor, either change them to groups or use the Block List editor).",
- "addTextBox": "Add another text box",
- "removeTextBox": "Remove this text box",
- "contentRoot": "Content root",
- "includeUnpublished": "Include unpublished content items.",
- "isSensitiveValue": "This value is hidden. If you need access to view this value please contact your\n website administrator.\n ",
- "isSensitiveValue_short": "This value is hidden.",
- "languagesToPublish": "What languages would you like to publish?",
- "languagesToSendForApproval": "What languages would you like to send for approval?",
- "languagesToSchedule": "What languages would you like to schedule?",
- "languagesToUnpublish": "Select the languages to unpublish. Unpublishing a mandatory language will\n unpublish all languages.\n ",
- "variantsWillBeSaved": "All new variants will be saved.",
- "variantsToPublish": "Which variants would you like to publish?",
- "variantsToSave": "Choose which variants to be saved.",
- "publishRequiresVariants": "The following variants is required for publishing to take place:",
- "notReadyToPublish": "We are not ready to Publish",
- "readyToPublish": "Ready to publish?",
- "readyToSave": "Ready to Save?",
- "resetFocalPoint": "Reset focal point",
- "sendForApproval": "Send for approval",
- "schedulePublishHelp": "Select the date and time to publish and/or unpublish the content item.",
- "createEmpty": "Create new",
- "createFromClipboard": "Paste from clipboard",
- "nodeIsInTrash": "This item is in the Recycle Bin",
- "variantSaveNotAllowed": "Save is not allowed",
- "variantPublishNotAllowed": "Publish is not allowed",
- "variantSendForApprovalNotAllowed": "Send for approval is not allowed",
- "variantScheduleNotAllowed": "Schedule is not allowed",
- "variantUnpublishNotAllowed": "Unpublish is not allowed"
- },
- "blueprints": {
- "createBlueprintFrom": "Create a new Content Template from %0% ",
- "blankBlueprint": "Blank",
- "selectBlueprint": "Select a Content Template",
- "createdBlueprintHeading": "Content Template created",
- "createdBlueprintMessage": "A Content Template was created from '%0%'",
- "duplicateBlueprintMessage": "Another Content Template with the same name already exists",
- "blueprintDescription": "A Content Template is predefined content that an editor can select to use as the\n basis for creating new content\n "
- },
- "media": {
- "clickToUpload": "Click to upload",
- "orClickHereToUpload": "or click here to choose files",
- "disallowedFileType": "Cannot upload this file, it does not have an approved file type",
- "disallowedMediaType": "Cannot upload this file, the media type with alias '%0%' is not allowed here",
- "invalidFileName": "Cannot upload this file, it does not have a valid file name",
- "maxFileSize": "Max file size is",
- "mediaRoot": "Media root",
- "moveToSameFolderFailed": "Parent and destination folders cannot be the same",
- "createFolderFailed": "Failed to create a folder under parent id %0%",
- "renameFolderFailed": "Failed to rename the folder with id %0%",
- "dragAndDropYourFilesIntoTheArea": "Drag and drop your file(s) into the area",
- "uploadNotAllowed": "Upload is not allowed in this location."
- },
- "member": {
- "createNewMember": "Create a new member",
- "allMembers": "All Members",
- "duplicateMemberLogin": "A member with this login already exists",
- "memberGroupNoProperties": "Member groups have no additional properties for editing.",
- "memberHasGroup": "The member is already in group '%0%'",
- "memberHasPassword": "The member already has a password set",
- "memberLockoutNotEnabled": "Lockout is not enabled for this member",
- "memberNotInGroup": "The member is not in group '%0%'",
- "2fa": "Two-Factor Authentication"
- },
- "contentType": {
- "copyFailed": "Failed to copy content type",
- "moveFailed": "Failed to move content type"
- },
- "mediaType": {
- "copyFailed": "Failed to copy media type",
- "moveFailed": "Failed to move media type",
- "autoPickMediaType": "Auto pick"
- },
- "memberType": {
- "copyFailed": "Failed to copy member type"
- },
- "create": {
- "chooseNode": "Where do you want to create the new %0%",
- "createUnder": "Create an item under",
- "createContentBlueprint": "Select the Document Type you want to make a content template for",
- "enterFolderName": "Enter a folder name",
- "updateData": "Choose a type and a title",
- "noDocumentTypes": "There are no allowed Document Types available for creating content here. You must enable these in Document Types within the Settings section, by editing the Allowed child node types under Permissions .",
- "noDocumentTypesAtRoot": "There are no Document Types available for creating content here. You must create these in Document Types within the Settings section.",
- "noDocumentTypesWithNoSettingsAccess": "The selected page in the content tree doesn't allow for any pages\n to be created below it.\n ",
- "noDocumentTypesEditPermissions": "Edit permissions for this Document Type",
- "noDocumentTypesCreateNew": "Create a new Document Type",
- "noDocumentTypesAllowedAtRoot": "There are no allowed Document Types available for creating content here. You must enable these in Document Types within the Settings section, by changing the Allow as root option under Permissions .",
- "noMediaTypes": "There are no allowed Media Types available for creating media here. You must enable these in Media Types Types within the Settings section, by editing the Allowed child node types under Permissions .",
- "noMediaTypesWithNoSettingsAccess": "The selected media in the tree doesn't allow for any other media to be\n created below it.\n ",
- "noMediaTypesEditPermissions": "Edit permissions for this Media Type",
- "documentTypeWithoutTemplate": "Document Type without a template",
- "documentTypeWithTemplate": "Document Type with Template",
- "documentTypeWithTemplateDescription": "The data definition for a content page that can be created by\n editors in the content tree and is directly accessible via a URL.\n ",
- "documentType": "Document Type",
- "documentTypeDescription": "The data definition for a content component that can be created by editors in\n the content tree and be picked on other pages but has no direct URL.\n ",
- "elementType": "Element Type",
- "elementTypeDescription": "Defines the schema for a repeating set of properties, for example, in a 'Block\n List' or 'Block Grid' property editor.\n ",
- "composition": "Composition",
- "compositionDescription": "Defines a re-usable set of properties that can be included in the definition of\n multiple other Document Types. For example, a set of 'Common Page Settings'.\n ",
- "folder": "Folder",
- "folderDescription": "Used to organise the Document Types, Compositions and Element Types created in this\n Document Type tree.\n ",
- "newFolder": "New folder",
- "newDataType": "New Data Type",
- "newJavascriptFile": "New JavaScript file",
- "newEmptyPartialView": "New empty partial view",
- "newPartialViewMacro": "New partial view macro",
- "newPartialViewFromSnippet": "New partial view from snippet",
- "newPartialViewMacroFromSnippet": "New partial view macro from snippet",
- "newPartialViewMacroNoMacro": "New partial view macro (without macro)",
- "newStyleSheetFile": "New style sheet file",
- "newRteStyleSheetFile": "New Rich Text Editor style sheet file"
- },
- "dashboard": {
- "browser": "Browse your website",
- "dontShowAgain": "- Hide",
- "nothinghappens": "If Umbraco isn't opening, you might need to allow popups from this site",
- "openinnew": "has opened in a new window",
- "restart": "Restart",
- "visit": "Visit",
- "welcome": "Welcome"
- },
- "prompt": {
- "stay": "Stay",
- "discardChanges": "Discard changes",
- "unsavedChanges": "You have unsaved changes",
- "unsavedChangesWarning": "Are you sure you want to navigate away from this page? - you have unsaved\n changes\n ",
- "confirmListViewPublish": "Publishing will make the selected items visible on the site.",
- "confirmListViewUnpublish": "Unpublishing will remove the selected items and all their descendants from the\n site.\n ",
- "confirmUnpublish": "Unpublishing will remove this page and all its descendants from the site.",
- "doctypeChangeWarning": "You have unsaved changes. Making changes to the Document Type will discard the\n changes.\n "
- },
- "bulk": {
- "done": "Done",
- "deletedItem": "Deleted %0% item",
- "deletedItems": "Deleted %0% items",
- "deletedItemOfItem": "Deleted %0% out of %1% item",
- "deletedItemOfItems": "Deleted %0% out of %1% items",
- "publishedItem": "Published %0% item",
- "publishedItems": "Published %0% items",
- "publishedItemOfItem": "Published %0% out of %1% item",
- "publishedItemOfItems": "Published %0% out of %1% items",
- "unpublishedItem": "Unpublished %0% item",
- "unpublishedItems": "Unpublished %0% items",
- "unpublishedItemOfItem": "Unpublished %0% out of %1% item",
- "unpublishedItemOfItems": "Unpublished %0% out of %1% items",
- "movedItem": "Moved %0% item",
- "movedItems": "Moved %0% items",
- "movedItemOfItem": "Moved %0% out of %1% item",
- "movedItemOfItems": "Moved %0% out of %1% items",
- "copiedItem": "Copied %0% item",
- "copiedItems": "Copied %0% items",
- "copiedItemOfItem": "Copied %0% out of %1% item",
- "copiedItemOfItems": "Copied %0% out of %1% items"
- },
- "defaultdialogs": {
- "nodeNameLinkPicker": "Link title",
- "urlLinkPicker": "Link",
- "anchorLinkPicker": "Anchor / querystring",
- "anchorInsert": "Name",
- "closeThisWindow": "Close this window",
- "confirmdelete": "Are you sure you want to delete",
- "confirmdeleteNumberOfItems": "Are you sure you want to delete %0% of %1% items",
- "confirmdisable": "Are you sure you want to disable",
- "confirmremove": "Are you sure you want to remove",
- "confirmremoveusageof": "Are you sure you want to remove the usage of %0% ",
- "confirmlogout": "Are you sure?",
- "confirmSure": "Are you sure?",
- "cut": "Cut",
- "editdictionary": "Edit Dictionary Item",
- "editlanguage": "Edit Language",
- "editSelectedMedia": "Edit selected media",
- "insertAnchor": "Insert local link",
- "insertCharacter": "Insert character",
- "insertgraphicheadline": "Insert graphic headline",
- "insertimage": "Insert picture",
- "insertlink": "Insert link",
- "insertMacro": "Click to add a Macro",
- "inserttable": "Insert table",
- "languagedeletewarning": "This will delete the language",
- "languageChangeWarning": "Changing the culture for a language may be an expensive operation and will result\n in the content cache and indexes being rebuilt\n ",
- "lastEdited": "Last Edited",
- "link": "Link",
- "linkinternal": "Internal link:",
- "linklocaltip": "When using local links, insert \"#\" in front of link",
- "linknewwindow": "Open in new window?",
- "macroDoesNotHaveProperties": "This macro does not contain any properties you can edit",
- "paste": "Paste",
- "permissionsEdit": "Edit permissions for",
- "permissionsSet": "Set permissions for",
- "permissionsSetForGroup": "Set permissions for %0% for user group %1%",
- "permissionsHelp": "Select the users groups you want to set permissions for",
- "recycleBinDeleting": "The items in the recycle bin are now being deleted. Please do not close this window\n while this operation takes place\n ",
- "recycleBinIsEmpty": "The recycle bin is now empty",
- "recycleBinWarning": "When items are deleted from the recycle bin, they will be gone forever",
- "regexSearchError": "regexlib.com 's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.",
- "regexSearchHelp": "Search for a regular expression to add validation to a form field. Example: 'email,\n 'zip-code', 'URL'.\n ",
- "removeMacro": "Remove Macro",
- "requiredField": "Required Field",
- "sitereindexed": "Site is reindexed",
- "siterepublished": "The website cache has been refreshed. All publish content is now up to date. While all\n unpublished content is still unpublished\n ",
- "siterepublishHelp": "The website cache will be refreshed. All published content will be updated, while\n unpublished content will stay unpublished.\n ",
- "tableColumns": "Number of columns",
- "tableRows": "Number of rows",
- "thumbnailimageclickfororiginal": "Click on the image to see full size",
- "treepicker": "Pick item",
- "viewCacheItem": "View Cache Item",
- "relateToOriginalLabel": "Relate to original",
- "includeDescendants": "Include descendants",
- "theFriendliestCommunity": "The friendliest community",
- "linkToPage": "Link to page",
- "openInNewWindow": "Opens the linked document in a new window or tab",
- "linkToMedia": "Link to media",
- "selectContentStartNode": "Select content start node",
- "selectMedia": "Select media",
- "selectMediaType": "Select media type",
- "selectIcon": "Select icon",
- "selectItem": "Select item",
- "selectLink": "Select link",
- "selectMacro": "Select macro",
- "selectContent": "Select content",
- "selectContentType": "Select content type",
- "selectMediaStartNode": "Select media start node",
- "selectMember": "Select member",
- "selectMemberGroup": "Select member group",
- "selectMemberType": "Select member type",
- "selectNode": "Select node",
- "selectLanguages": "Select languages",
- "selectSections": "Select sections",
- "selectUser": "Select user",
- "selectUsers": "Select users",
- "noIconsFound": "No icons were found",
- "noMacroParams": "There are no parameters for this macro",
- "noMacros": "There are no macros available to insert",
- "externalLoginProviders": "External login providers",
- "exceptionDetail": "Exception Details",
- "stacktrace": "Stacktrace",
- "innerException": "Inner Exception",
- "linkYour": "Link your",
- "unLinkYour": "Un-link your",
- "account": "account",
- "selectEditor": "Select editor",
- "selectEditorConfiguration": "Select configuration",
- "selectSnippet": "Select snippet",
- "variantdeletewarning": "This will delete the node and all its languages. If you only want to delete one\n language, you should unpublish the node in that language instead.\n ",
- "propertyuserpickerremovewarning": "This will remove the user %0% .",
- "userremovewarning": "This will remove the user %0% from the %1% group",
- "yesRemove": "Yes, remove",
- "deleteLayout": "You are deleting the layout",
- "deletingALayout": "Modifying layout will result in loss of data for any existing content that is based on this configuration."
- },
- "dictionary": {
- "importDictionaryItemHelp": "\n To import a dictionary item, find the \".udt\" file on your computer by clicking the\n \"Import\" button (you'll be asked for confirmation on the next screen)\n ",
- "itemDoesNotExists": "Dictionary item does not exist.",
- "parentDoesNotExists": "Parent item does not exist.",
- "noItems": "There are no dictionary items.",
- "noItemsInFile": "There are no dictionary items in this file.",
- "noItemsFound": "There were no dictionary items found.",
- "createNew": "Create dictionary item"
- },
- "dictionaryItem": {
- "description": "\n Edit the different language versions for the dictionary item '%0% ' below\n ",
- "displayName": "Culture Name",
- "changeKeyError": "\n The key '%0%' already exists.\n ",
- "overviewTitle": "Dictionary overview"
- },
- "examineManagement": {
- "configuredSearchers": "Configured Searchers",
- "configuredSearchersDescription": "Shows properties and tools for any configured Searcher (i.e. such as a\n multi-index searcher)\n ",
- "fieldValues": "Field values",
- "healthStatus": "Health status",
- "healthStatusDescription": "The health status of the index and if it can be read",
- "indexers": "Indexers",
- "indexInfo": "Index info",
- "contentInIndex": "Content in index",
- "indexInfoDescription": "Lists the properties of the index",
- "manageIndexes": "Manage Examine's indexes",
- "manageIndexesDescription": "Allows you to view the details of each index and provides some tools for\n managing the indexes\n ",
- "rebuildIndex": "Rebuild index",
- "rebuildIndexWarning": "\n This will cause the index to be rebuilt. \n Depending on how much content there is in your site this could take a while. \n It is not recommended to rebuild an index during times of high website traffic or when editors are editing content.\n ",
- "searchers": "Searchers",
- "searchDescription": "Search the index and view the results",
- "tools": "Tools",
- "toolsDescription": "Tools to manage the index",
- "fields": "fields",
- "indexCannotRead": "The index cannot be read and will need to be rebuilt",
- "processIsTakingLonger": "The process is taking longer than expected, check the Umbraco log to see if there\n have been any errors during this operation\n ",
- "indexCannotRebuild": "This index cannot be rebuilt because it has no assigned",
- "iIndexPopulator": "IIndexPopulator"
- },
- "placeholders": {
- "username": "Enter your username",
- "password": "Enter your password",
- "confirmPassword": "Confirm your password",
- "nameentity": "Name the %0%...",
- "entername": "Enter a name...",
- "enteremail": "Enter an email...",
- "enterusername": "Enter a username...",
- "label": "Label...",
- "enterDescription": "Enter a description...",
- "search": "Type to search...",
- "filter": "Type to filter...",
- "enterTags": "Type to add tags (press enter after each tag)...",
- "email": "Enter your email",
- "enterMessage": "Enter a message...",
- "usernameHint": "Your username is usually your email",
- "anchor": "#value or ?key=value",
- "enterAlias": "Enter alias...",
- "generatingAlias": "Generating alias...",
- "a11yCreateItem": "Create item",
- "a11yEdit": "Edit",
- "a11yName": "Name"
- },
- "editcontenttype": {
- "createListView": "Create custom list view",
- "removeListView": "Remove custom list view",
- "aliasAlreadyExists": "A Content Type, Media Type or Member Type with this alias already exists"
- },
- "renamecontainer": {
- "renamed": "Renamed",
- "enterNewFolderName": "Enter a new folder name here",
- "folderWasRenamed": "%0% was renamed to %1%"
- },
- "editdatatype": {
- "canChangePropertyEditorHelp": "Changing a property editor on a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json.",
- "addPrevalue": "Add prevalue",
- "dataBaseDatatype": "Database datatype",
- "guid": "Property editor GUID",
- "renderControl": "Property editor",
- "rteButtons": "Buttons",
- "rteEnableAdvancedSettings": "Enable advanced settings for",
- "rteEnableContextMenu": "Enable context menu",
- "rteMaximumDefaultImgSize": "Maximum default size of inserted images",
- "rteRelatedStylesheets": "Related stylesheets",
- "rteShowLabel": "Show label",
- "rteWidthAndHeight": "Width and height",
- "selectFolder": "Select the folder to move",
- "inTheTree": "to in the tree structure below",
- "wasMoved": "was moved underneath",
- "hasReferencesDeleteConsequence": "Deleting %0% will delete the properties and their data from the following items",
- "acceptDeleteConsequence": "I understand this action will delete the properties and data based on this Data\n Type\n "
- },
- "errorHandling": {
- "errorButDataWasSaved": "Your data has been saved, but before you can publish this page there are some\n errors you need to fix first:\n ",
- "errorChangingProviderPassword": "The current membership provider does not support changing password\n (EnablePasswordRetrieval need to be true)\n ",
- "errorExistsWithoutTab": "%0% already exists",
- "errorHeader": "There were errors:",
- "errorHeaderWithoutTab": "There were errors:",
- "errorInPasswordFormat": "The password should be a minimum of %0% characters long and contain at least %1%\n non-alpha numeric character(s)\n ",
- "errorIntegerWithoutTab": "%0% must be an integer",
- "errorMandatory": "The %0% field in the %1% tab is mandatory",
- "errorMandatoryWithoutTab": "%0% is a mandatory field",
- "errorRegExp": "%0% at %1% is not in a correct format",
- "errorRegExpWithoutTab": "%0% is not in a correct format"
- },
- "errors": {
- "defaultError": "An unknown failure has occurred",
- "concurrencyError": "Optimistic concurrency failure, object has been modified",
- "receivedErrorFromServer": "Received an error from the server",
- "dissallowedMediaType": "The specified file type has been disallowed by the administrator",
- "codemirroriewarning": "NOTE! Even though CodeMirror is enabled by configuration, it is disabled in\n Internet Explorer because it's not stable enough.\n ",
- "contentTypeAliasAndNameNotNull": "Please fill both alias and name on the new property type!",
- "filePermissionsError": "There is a problem with read/write access to a specific file or folder",
- "macroErrorLoadingPartialView": "Error loading Partial View script (file: %0%)",
- "missingTitle": "Please enter a title",
- "missingType": "Please choose a type",
- "pictureResizeBiggerThanOrg": "You're about to make the picture larger than the original size. Are you sure\n that you want to proceed?\n ",
- "startNodeDoesNotExists": "Startnode deleted, please contact your administrator",
- "stylesMustMarkBeforeSelect": "Please mark content before changing style",
- "stylesNoStylesOnPage": "No active styles available",
- "tableColMergeLeft": "Please place cursor at the left of the two cells you wish to merge",
- "tableSplitNotSplittable": "You cannot split a cell that hasn't been merged.",
- "propertyHasErrors": "This property is invalid"
- },
- "general": {
- "options": "Options",
- "about": "About",
- "action": "Action",
- "actions": "Actions",
- "add": "Add",
- "alias": "Alias",
- "all": "All",
- "areyousure": "Are you sure?",
- "back": "Back",
- "backToOverview": "Back to overview",
- "border": "Border",
- "by": "by",
- "cancel": "Cancel",
- "cellMargin": "Cell margin",
- "choose": "Choose",
- "clear": "Clear",
- "close": "Close",
- "closewindow": "Close Window",
- "closepane": "Close Pane",
- "comment": "Comment",
- "confirm": "Confirm",
- "constrain": "Constrain",
- "constrainProportions": "Constrain proportions",
- "content": "Content",
- "continue": "Continue",
- "copy": "Copy",
- "create": "Create",
- "cropSection": "Crop section",
- "database": "Database",
- "date": "Date",
- "default": "Default",
- "delete": "Delete",
- "deleted": "Deleted",
- "deleting": "Deleting...",
- "design": "Design",
- "dictionary": "Dictionary",
- "dimensions": "Dimensions",
- "discard": "Discard",
- "down": "Down",
- "download": "Download",
- "edit": "Edit",
- "edited": "Edited",
- "elements": "Elements",
- "email": "Email",
- "error": "Error",
- "field": "Field",
- "findDocument": "Find",
- "first": "First",
- "focalPoint": "Focal point",
- "general": "General",
- "generic": "Generic",
- "groups": "Groups",
- "group": "Group",
- "height": "Height",
- "help": "Help",
- "hide": "Hide",
- "history": "History",
- "icon": "Icon",
- "id": "Id",
- "import": "Import",
- "excludeFromSubFolders": "Search only this folder",
- "info": "Info",
- "innerMargin": "Inner margin",
- "insert": "Insert",
- "install": "Install",
- "invalid": "Invalid",
- "justify": "Justify",
- "label": "Label",
- "language": "Language",
- "last": "Last",
- "layout": "Layout",
- "links": "Links",
- "loading": "Loading",
- "locked": "Locked",
- "login": "Login",
- "logoff": "Log off",
- "logout": "Logout",
- "macro": "Macro",
- "mandatory": "Mandatory",
- "media": "Media",
- "message": "Message",
- "move": "Move",
- "name": "Name",
- "new": "New",
- "next": "Next",
- "no": "No",
- "nodeName": "Node Name",
- "of": "of",
- "off": "Off",
- "ok": "OK",
- "open": "Open",
- "on": "On",
- "or": "or",
- "orderBy": "Order by",
- "password": "Password",
- "path": "Path",
- "pleasewait": "One moment please...",
- "previous": "Previous",
- "properties": "Properties",
- "readMore": "Read more",
- "rebuild": "Rebuild",
- "reciept": "Email to receive form data",
- "recycleBin": "Recycle Bin",
- "recycleBinEmpty": "Your recycle bin is empty",
- "reload": "Reload",
- "revert": "Revert",
- "remaining": "Remaining",
- "remove": "Remove",
- "rename": "Rename",
- "renew": "Renew",
- "required": "Required",
- "retrieve": "Retrieve",
- "retry": "Retry",
- "rights": "Permissions",
- "scheduledPublishing": "Scheduled Publishing",
- "umbracoInfo": "Umbraco info",
- "search": "Search",
- "searchNoResult": "Sorry, we can not find what you are looking for.",
- "noItemsInList": "No items have been added",
- "server": "Server",
- "settings": "Settings",
- "shared": "Shared",
- "show": "Show",
- "showPageOnSend": "Show page on Send",
- "size": "Size",
- "sort": "Sort",
- "status": "Status",
- "submit": "Submit",
- "success": "Success",
- "type": "Type",
- "typeName": "Type Name",
- "typeToSearch": "Type to search...",
- "under": "under",
- "up": "Up",
- "update": "Update",
- "upgrade": "Upgrade",
- "upload": "Upload",
- "url": "URL",
- "user": "User",
- "username": "Username",
- "validate": "Validate",
- "value": "Value",
- "view": "View",
- "welcome": "Welcome...",
- "width": "Width",
- "yes": "Yes",
- "folder": "Folder",
- "searchResults": "Search results",
- "reorder": "Reorder",
- "reorderDone": "I am done reordering",
- "preview": "Preview",
- "changePassword": "Change password",
- "to": "to",
- "listView": "List view",
- "saving": "Saving...",
- "current": "current",
- "embed": "Embed",
- "selected": "selected",
- "other": "Other",
- "articles": "Articles",
- "videos": "Videos",
- "avatar": "Avatar for",
- "header": "Header",
- "systemField": "system field",
- "lastUpdated": "Last Updated",
- "skipToMenu": "Skip to menu",
- "skipToContent": "Skip to content",
- "Deploy": "Deploy",
- "restore": "Restore"
- },
- "colors": {
- "blue": "Blue"
- },
- "shortcuts": {
- "addTab": "Add tab",
- "addGroup": "Add group",
- "addProperty": "Add property",
- "addEditor": "Add editor",
- "addTemplate": "Add template",
- "addChildNode": "Add child node",
- "addChild": "Add child",
- "editDataType": "Edit data type",
- "navigateSections": "Navigate sections",
- "shortcut": "Shortcuts",
- "showShortcuts": "show shortcuts",
- "toggleListView": "Toggle list view",
- "toggleAllowAsRoot": "Toggle allow as root",
- "commentLine": "Comment/Uncomment lines",
- "removeLine": "Remove line",
- "copyLineUp": "Copy Lines Up",
- "copyLineDown": "Copy Lines Down",
- "moveLineUp": "Move Lines Up",
- "moveLineDown": "Move Lines Down",
- "generalHeader": "General",
- "editorHeader": "Editor",
- "toggleAllowCultureVariants": "Toggle allow culture variants"
- },
- "graphicheadline": {
- "backgroundcolor": "Background color",
- "bold": "Bold",
- "color": "Text color",
- "font": "Font",
- "text": "Text"
- },
- "headers": {
- "page": "Page"
- },
- "installer": {
- "databaseErrorCannotConnect": "The installer cannot connect to the database.",
- "databaseErrorWebConfig": "Could not save the web.config file. Please modify the connection string\n manually.\n ",
- "databaseFound": "Your database has been found and is identified as",
- "databaseHeader": "Database configuration",
- "databaseInstall": "\n Press the install button to install the Umbraco %0% database\n ",
- "databaseInstallDone": "Umbraco %0% has now been copied to your database. Press Next to proceed.",
- "databaseNotFound": "Database not found! Please check that the information in the \"connection string\" of the \"web.config\" file is correct.
\n To proceed, please edit the \"web.config\" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named \"UmbracoDbDSN\" and save the file.
\n \n Click the retry button when\n done.\n\t\t\t More information on editing web.config here .
",
- "databaseText": "To complete this step, you must know some information regarding your database server (\"connection string\"). \n Please contact your ISP if necessary.\n If you're installing on a local machine or server you might need information from your system administrator.",
- "databaseUpgrade": "\n \n Press the upgrade button to upgrade your database to Umbraco %0%
\n \n Don't worry - no content will be deleted and everything will continue working afterwards!\n
\n ",
- "databaseUpgradeDone": "Your database has been upgraded to the final version %0%. Press Next to\n proceed. ",
- "databaseUpToDate": "Your current database is up-to-date!. Click next to continue the configuration wizard",
- "defaultUserChangePass": "The Default users' password needs to be changed! ",
- "defaultUserDisabled": "The Default user has been disabled or has no access to Umbraco! No further actions needs to be taken. Click Next to proceed.",
- "defaultUserPassChanged": "The Default user's password has been successfully changed since the installation!
No further actions needs to be taken. Click Next to proceed.",
- "defaultUserPasswordChanged": "The password is changed!",
- "greatStart": "Get a great start, watch our introduction videos",
- "licenseText": "By clicking the next button (or modifying the umbracoConfigurationStatus in web.config),\n you accept the license for this software as specified in the box below. Notice that this Umbraco distribution\n consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license\n that covers the UI.\n ",
- "None": "Not installed yet.",
- "permissionsAffectedFolders": "Affected files and folders",
- "permissionsAffectedFoldersMoreInfo": "More information on setting up permissions for Umbraco here",
- "permissionsAffectedFoldersText": "You need to grant ASP.NET modify permissions to the following\n files/folders\n ",
- "permissionsAlmostPerfect": "Your permission settings are almost perfect! \n You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.",
- "permissionsHowtoResolve": "How to Resolve",
- "permissionsHowtoResolveLink": "Click here to read the text version",
- "permissionsHowtoResolveText": "Watch our video tutorial on setting up folder permissions for Umbraco or read the text version.",
- "permissionsMaybeAnIssue": "Your permission settings might be an issue! \n \n You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.",
- "permissionsNotReady": "Your permission settings are not ready for Umbraco! \n \n In order to run Umbraco, you'll need to update your permission settings.",
- "permissionsPerfect": "Your permission settings are perfect! \n You are ready to run Umbraco and install packages!",
- "permissionsResolveFolderIssues": "Resolving folder issue",
- "permissionsResolveFolderIssuesLink": "Follow this link for more information on problems with ASP.NET and\n creating folders\n ",
- "permissionsSettingUpPermissions": "Setting up folder permissions",
- "permissionsText": "\n Umbraco needs write/modify access to certain directories in order to store files like pictures and PDF's.\n It also stores temporary data (aka: cache) for enhancing the performance of your website.\n ",
- "runwayFromScratch": "I want to start from scratch",
- "runwayFromScratchText": "\n Your website is completely empty at the moment, so that's perfect if you want to start from scratch and create your own Document Types and templates.\n (learn how )\n You can still choose to install Runway later on. Please go to the Developer section and choose Packages.\n ",
- "runwayHeader": "You've just set up a clean Umbraco platform. What do you want to do next?",
- "runwayInstalled": "Runway is installed",
- "runwayInstalledText": "\n You have the foundation in place. Select what modules you wish to install on top of it. \n This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules \n ",
- "runwayOnlyProUsers": "Only recommended for experienced users",
- "runwaySimpleSite": "I want to start with a simple website",
- "runwaySimpleSiteText": "\n
\n \"Runway\" is a simple website providing some basic Document Types and templates. The installer can set up Runway for you automatically,\n but you can easily edit, extend or remove it. It's not necessary and you can perfectly use Umbraco without it. However,\n Runway offers an easy foundation based on best practices to get you started faster than ever.\n If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.\n
\n \n Included with Runway: Home page, Getting Started page, Installing Modules page. \n Optional Modules: Top Navigation, Sitemap, Contact, Gallery.\n \n ",
- "runwayWhatIsRunway": "What is Runway",
- "step1": "Step 1/5 Accept license",
- "step2": "Step 2/5: Database configuration",
- "step3": "Step 3/5: Validating File Permissions",
- "step4": "Step 4/5: Check Umbraco security",
- "step5": "Step 5/5: Umbraco is ready to get you started",
- "thankYou": "Thank you for choosing Umbraco",
- "theEndBrowseSite": "Browse your new site \nYou installed Runway, so why not see how your new website looks.",
- "theEndFurtherHelp": "Further help and information \nGet help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology",
- "theEndHeader": "Umbraco %0% is installed and ready for use",
- "theEndInstallFailed": "To finish the installation, you'll need to\n manually edit the /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%' .",
- "theEndInstallSuccess": "You can get started instantly by clicking the \"Launch Umbraco\" button below. If you are new to Umbraco ,\nyou can find plenty of resources on our getting started pages.",
- "theEndOpenUmbraco": "Launch Umbraco \nTo manage your website, simply open the Umbraco backoffice and start adding content, updating the templates and stylesheets or add new functionality",
- "Unavailable": "Connection to database failed.",
- "Version3": "Umbraco Version 3",
- "Version4": "Umbraco Version 4",
- "watch": "Watch",
- "welcomeIntro": "This wizard will guide you through the process of configuring Umbraco %0% for a fresh install or upgrading from version 3.0.\n \n Press \"next\" to start the wizard."
- },
- "language": {
- "cultureCode": "Culture Code",
- "displayName": "Culture Name"
- },
- "lockout": {
- "lockoutWillOccur": "You've been idle and logout will automatically occur in",
- "renewSession": "Renew now to save your work"
- },
- "main": {
- "dashboard": "Dashboard",
- "sections": "Sections",
- "tree": "Content"
- },
- "moveOrCopy": {
- "choose": "Choose page above...",
- "copyDone": "%0% has been copied to %1%",
- "copyTo": "Select where the document %0% should be copied to below",
- "moveDone": "%0% has been moved to %1%",
- "moveTo": "Select where the document %0% should be moved to below",
- "nodeSelected": "has been selected as the root of your new content, click 'ok' below.",
- "noNodeSelected": "No node selected yet, please select a node in the list above before clicking 'ok'",
- "notAllowedByContentType": "The current node is not allowed under the chosen node because of its type",
- "notAllowedByPath": "The current node cannot be moved to one of its subpages neither can the parent and destination be the same",
- "notAllowedAtRoot": "The current node cannot exist at the root",
- "notValid": "The action isn't allowed since you have insufficient permissions on 1 or more child\n documents.\n ",
- "relateToOriginal": "Relate copied items to original"
- },
- "notifications": {
- "editNotifications": "Select your notification for %0% ",
- "notificationsSavedFor": "Notification settings saved for",
- "notifications": "Notifications"
- },
- "packager": {
- "actions": "Actions",
- "created": "Created",
- "createPackage": "Create package",
- "chooseLocalPackageText": "\n Choose Package from your machine, by clicking the Browse \n button and locating the package. Umbraco packages usually have a \".umb\" or \".zip\" extension.\n ",
- "deletewarning": "This will delete the package",
- "includeAllChildNodes": "Include all child nodes",
- "installed": "Installed",
- "installedPackages": "Installed packages",
- "installInstructions": "Install instructions",
- "noConfigurationView": "This package has no configuration view",
- "noPackagesCreated": "No packages have been created yet",
- "noPackages": "No packages have been installed",
- "noPackagesDescription": "Browse through the available packages using the 'Packages' icon in the top right of your screen",
- "packageContent": "Package Content",
- "packageLicense": "License",
- "packageSearch": "Search for packages",
- "packageSearchResults": "Results for",
- "packageNoResults": "We couldn’t find anything for",
- "packageNoResultsDescription": "Please try searching for another package or browse through the categories\n ",
- "packagesPopular": "Popular",
- "packagesPromoted": "Promoted",
- "packagesNew": "New releases",
- "packageHas": "has",
- "packageKarmaPoints": "karma points",
- "packageInfo": "Information",
- "packageOwner": "Owner",
- "packageContrib": "Contributors",
- "packageCreated": "Created",
- "packageCurrentVersion": "Current version",
- "packageNetVersion": ".NET version",
- "packageDownloads": "Downloads",
- "packageLikes": "Likes",
- "packageCompatibility": "Compatibility",
- "packageCompatibilityDescription": "This package is compatible with the following versions of Umbraco, as\n reported by community members. Full compatability cannot be guaranteed for versions reported below 100%\n ",
- "packageExternalSources": "External sources",
- "packageAuthor": "Author",
- "packageDocumentation": "Documentation",
- "packageMetaData": "Package meta data",
- "packageName": "Package name",
- "packageNoItemsHeader": "Package doesn't contain any items",
- "packageNoItemsText": "This package file doesn't contain any items to uninstall. \n You can safely remove this from the system by clicking \"uninstall package\" below.",
- "packageOptions": "Package options",
- "packageMigrationsRun": "Run pending package migrations",
- "packageMigrationsComplete": "Package migrations have successfully completed.",
- "packageMigrationsNonePending": "All package migrations have successfully completed.",
- "packageReadme": "Package readme",
- "packageRepository": "Package repository",
- "packageUninstallConfirm": "Confirm package uninstall",
- "packageUninstalledHeader": "Package was uninstalled",
- "packageUninstalledText": "The package was successfully uninstalled",
- "packageUninstallHeader": "Uninstall package",
- "packageUninstallText": "You can unselect items you do not wish to remove, at this time, below. When you click \"confirm uninstall\" all checked-off items will be removed. \n Notice: any documents, media etc depending on the items you remove, will stop working, and could lead to system instability,\n so uninstall with caution. If in doubt, contact the package author.",
- "packageVersion": "Package version",
- "verifiedToWorkOnUmbracoCloud": "Verified to work on Umbraco Cloud"
- },
- "paste": {
- "doNothing": "Paste with full formatting (Not recommended)",
- "errorMessage": "The text you're trying to paste contains special characters or formatting. This could be\n caused by copying text from Microsoft Word. Umbraco can remove special characters or formatting automatically, so\n the pasted content will be more suitable for the web.\n ",
- "removeAll": "Paste as raw text without any formatting at all",
- "removeSpecialFormattering": "Paste, but remove formatting (Recommended)"
- },
- "publicAccess": {
- "paGroups": "Group based protection",
- "paGroupsHelp": "If you want to grant access to all members of specific member groups",
- "paGroupsNoGroups": "You need to create a member group before you can use group based authentication",
- "paErrorPage": "Error Page",
- "paErrorPageHelp": "Used when people are logged on, but do not have access",
- "paHowWould": "Choose how to restrict access to the page %0% ",
- "paIsProtected": "%0% is now protected",
- "paIsRemoved": "Protection removed from %0% ",
- "paLoginPage": "Login Page",
- "paLoginPageHelp": "Choose the page that contains the login form",
- "paRemoveProtection": "Remove protection...",
- "paRemoveProtectionConfirm": "Are you sure you want to remove the protection from the page %0% ?",
- "paSelectPages": "Select the pages that contain login form and error messages",
- "paSelectGroups": "Select the groups who have access to the page %0% ",
- "paSelectMembers": "Select the members who have access to the page %0% ",
- "paMembers": "Specific members protection",
- "paMembersHelp": "If you wish to grant access to specific members"
- },
- "publish": {
- "invalidPublishBranchPermissions": "Insufficient user permissions to publish all descendant documents",
- "contentPublishedFailedIsTrashed": "\n %0% could not be published because the item is in the recycle bin.\n ",
- "contentPublishedFailedAwaitingRelease": "\n %0% could not be published because the item is scheduled for release.\n ",
- "contentPublishedFailedExpired": "\n %0% could not be published because the item has expired.\n ",
- "contentPublishedFailedInvalid": "\n %0% could not be published because some properties did not pass validation rules.\n ",
- "contentPublishedFailedByEvent": "\n %0% could not be published, a 3rd party add-in cancelled the action.\n ",
- "contentPublishedFailedByParent": "\n %0% can not be published, because a parent page is not published.\n ",
- "contentPublishedFailedByMissingName": "%0% can not be published, because its missing a name.",
- "contentPublishedFailedReqCultureValidationError": "Validation failed for required language '%0%'. This\n language was saved but not published.\n ",
- "inProgress": "Publishing in progress - please wait...",
- "inProgressCounter": "%0% out of %1% pages have been published...",
- "nodePublish": "%0% has been published",
- "nodePublishAll": "%0% and subpages have been published",
- "publishAll": "Publish %0% and all its subpages",
- "publishHelp": "Click Publish to publish %0% and thereby making its content publicly available. \n You can publish this page and all its subpages by checking Include unpublished subpages below.\n "
- },
- "colorpicker": {
- "noColors": "You have not configured any approved colors"
- },
- "contentPicker": {
- "allowedItemTypes": "You can only select items of type(s): %0%",
- "pickedTrashedItem": "You have picked a content item currently deleted or in the recycle bin",
- "pickedTrashedItems": "You have picked content items currently deleted or in the recycle bin"
- },
- "mediaPicker": {
- "deletedItem": "Deleted item",
- "pickedTrashedItem": "You have picked a media item currently deleted or in the recycle bin",
- "pickedTrashedItems": "You have picked media items currently deleted or in the recycle bin",
- "trashed": "Trashed",
- "openMedia": "Open in Media Library",
- "changeMedia": "Change Media Item",
- "editMediaEntryLabel": "Edit %0% on %1%",
- "confirmCancelMediaEntryCreationHeadline": "Discard creation?",
- "confirmCancelMediaEntryCreationMessage": "Are you sure you want to cancel the creation.",
- "confirmCancelMediaEntryHasChanges": "You have made changes to this content. Are you sure you want to\n discard them?\n ",
- "confirmRemoveAllMediaEntryMessage": "Remove all medias?",
- "tabClipboard": "Clipboard",
- "notAllowed": "Not allowed",
- "openMediaPicker": "Open media picker"
- },
- "propertyEditorPicker": {
- "title": "Select Property Editor",
- "openPropertyEditorPicker": "Select Property Editor"
- },
- "relatedlinks": {
- "enterExternal": "enter external link",
- "chooseInternal": "choose internal page",
- "caption": "Caption",
- "link": "Link",
- "newWindow": "Open in new window",
- "captionPlaceholder": "enter the display caption",
- "externalLinkPlaceholder": "Enter the link"
- },
- "imagecropper": {
- "reset": "Reset crop",
- "updateEditCrop": "Done",
- "undoEditCrop": "Undo edits",
- "customCrop": "User defined"
- },
- "rollback": {
- "changes": "Changes",
- "created": "Created",
- "headline": "Select a version to compare with the current version",
- "currentVersion": "Current version",
- "diffHelp": "This shows the differences between the current (draft) version and the selected versionRed text will be removed in the selected version, green text will be added",
- "noDiff": "There are no differences between the current (draft) version and the selected version",
- "documentRolledBack": "Document has been rolled back",
- "htmlHelp": "This displays the selected version as HTML, if you wish to see the difference between 2\n versions at the same time, use the diff view\n ",
- "rollbackTo": "Rollback to",
- "selectVersion": "Select version",
- "view": "View",
- "pagination": "Showing version %0% to %1% of %2% versions",
- "versions": "Versions",
- "currentDraftVersion": "Current draft version",
- "currentPublishedVersion": "Current published version"
- },
- "scripts": {
- "editscript": "Edit script file"
- },
- "sections": {
- "content": "Content",
- "forms": "Forms",
- "media": "Media",
- "member": "Members",
- "packages": "Packages",
- "marketplace": "Marketplace",
- "settings": "Settings",
- "translation": "Translation",
- "users": "Users",
- "deploy": "Deploy",
- "deployOpenPortal": "Deploy",
- "deployHelpAndDocumentation": "Help and documentation",
- "deployOpenQueue": "Open transfer queue",
- "deployGettingStarted": "Getting Started",
- "deploySetupProject": "Set up a Project",
- "deployDeployment": "Deployment",
- "deployTroubleshooting": "Troubleshooting"
- },
- "help": {
- "tours": "Tours",
- "theBestUmbracoVideoTutorials": "The best Umbraco video tutorials",
- "umbracoForum": "Visit our.umbraco.com",
- "umbracoTv": "Visit umbraco.tv",
- "umbracoLearningBase": "Watch our free tutorial videos",
- "umbracoLearningBaseDescription": "on the Umbraco Learning Base"
- },
- "settings": {
- "defaulttemplate": "Default template",
- "importDocumentTypeHelp": "To import a Document Type, find the \".udt\" file on your computer by clicking the\n \"Import\" button (you'll be asked for confirmation on the next screen)\n ",
- "newtabname": "New Tab Title",
- "nodetype": "Node type",
- "objecttype": "Type",
- "stylesheet": "Stylesheet",
- "script": "Script",
- "tab": "Tab",
- "tabname": "Tab Title",
- "tabs": "Tabs",
- "contentTypeEnabled": "Master Content Type enabled",
- "contentTypeUses": "This Content Type uses",
- "noPropertiesDefinedOnTab": "No properties defined on this tab. Click on the \"add a new property\" link at\n the top to create a new property.\n ",
- "createMatchingTemplate": "Create matching template",
- "addIcon": "Add icon"
- },
- "sort": {
- "sortOrder": "Sort order",
- "sortCreationDate": "Creation date",
- "sortDone": "Sorting complete.",
- "sortHelp": "Drag the different items up or down below to set how they should be arranged. Or click the\n column headers to sort the entire collection of items\n ",
- "sortPleaseWait": "Please wait. Items are being sorted, this can take a while.",
- "sortEmptyState": "This node has no child nodes to sort"
- },
- "speechBubbles": {
- "validationFailedHeader": "Validation",
- "validationFailedMessage": "Validation errors must be fixed before the item can be saved",
- "operationFailedHeader": "Failed",
- "operationSavedHeader": "Saved",
- "operationSavedHeaderReloadUser": "Saved. To view the changes please reload your browser",
- "invalidUserPermissionsText": "Insufficient user permissions, could not complete the operation",
- "operationCancelledHeader": "Cancelled",
- "operationCancelledText": "Operation was cancelled by a 3rd party add-in",
- "folderUploadNotAllowed": "This file is being uploaded as part of a folder, but creating a new folder is not allowed here",
- "folderCreationNotAllowed": "Creating a new folder is not allowed here",
- "contentTypeDublicatePropertyType": "Property type already exists",
- "contentTypePropertyTypeCreated": "Property type created",
- "contentTypePropertyTypeCreatedText": "Name: %0% DataType: %1%",
- "contentTypePropertyTypeDeleted": "Propertytype deleted",
- "contentTypeSavedHeader": "Document Type saved",
- "contentTypeTabCreated": "Tab created",
- "contentTypeTabDeleted": "Tab deleted",
- "contentTypeTabDeletedText": "Tab with id: %0% deleted",
- "cssErrorHeader": "Stylesheet not saved",
- "cssSavedHeader": "Stylesheet saved",
- "cssSavedText": "Stylesheet saved without any errors",
- "dataTypeSaved": "Datatype saved",
- "dictionaryItemSaved": "Dictionary item saved",
- "editContentPublishedHeader": "Content published",
- "editContentPublishedText": "and is visible on the website",
- "editMultiContentPublishedText": "%0% documents published and visible on the website",
- "editVariantPublishedText": "%0% published and visible on the website",
- "editMultiVariantPublishedText": "%0% documents published for languages %1% and visible on the website",
- "editBlueprintSavedHeader": "Content Template saved",
- "editBlueprintSavedText": "Changes have been successfully saved",
- "editContentSavedHeader": "Content saved",
- "editContentSavedText": "Remember to publish to make changes visible",
- "editContentScheduledSavedText": "A schedule for publishing has been updated",
- "editVariantSavedText": "%0% saved",
- "editContentSendToPublish": "Sent For Approval",
- "editContentSendToPublishText": "Changes have been sent for approval",
- "editVariantSendToPublishText": "%0% changes have been sent for approval",
- "editMediaSaved": "Media saved",
- "editMediaSavedText": "Media saved without any errors",
- "editMemberSaved": "Member saved",
- "editStylesheetPropertySaved": "Stylesheet Property Saved",
- "editStylesheetSaved": "Stylesheet saved",
- "editTemplateSaved": "Template saved",
- "editUserError": "Error saving user (check log)",
- "editUserSaved": "User Saved",
- "editUserTypeSaved": "User type saved",
- "editUserGroupSaved": "User group saved",
- "editCulturesAndHostnamesSaved": "Cultures and hostnames saved",
- "editCulturesAndHostnamesError": "Error saving cultures and hostnames",
- "fileErrorHeader": "File not saved",
- "fileErrorText": "file could not be saved. Please check file permissions",
- "fileSavedHeader": "File saved",
- "fileSavedText": "File saved without any errors",
- "languageSaved": "Language saved",
- "mediaTypeSavedHeader": "Media Type saved",
- "memberTypeSavedHeader": "Member Type saved",
- "memberGroupSavedHeader": "Member Group saved",
- "memberGroupNameDuplicate": "Another Member Group with the same name already exists",
- "templateErrorHeader": "Template not saved",
- "templateErrorText": "Please make sure that you do not have 2 templates with the same alias",
- "templateSavedHeader": "Template saved",
- "templateSavedText": "Template saved without any errors!",
- "contentUnpublished": "Content unpublished",
- "contentCultureUnpublished": "Content variation %0% unpublished",
- "contentMandatoryCultureUnpublished": "The mandatory language '%0%' was unpublished. All languages for this\n content item are now unpublished.\n ",
- "partialViewSavedHeader": "Partial view saved",
- "partialViewSavedText": "Partial view saved without any errors!",
- "partialViewErrorHeader": "Partial view not saved",
- "partialViewErrorText": "An error occurred saving the file.",
- "permissionsSavedFor": "Permissions saved for",
- "deleteUserGroupsSuccess": "Deleted %0% user groups",
- "deleteUserGroupSuccess": "%0% was deleted",
- "enableUsersSuccess": "Enabled %0% users",
- "disableUsersSuccess": "Disabled %0% users",
- "enableUserSuccess": "%0% is now enabled",
- "disableUserSuccess": "%0% is now disabled",
- "setUserGroupOnUsersSuccess": "User groups have been set",
- "unlockUsersSuccess": "Unlocked %0% users",
- "unlockUserSuccess": "%0% is now unlocked",
- "memberExportedSuccess": "Member was exported to file",
- "memberExportedError": "An error occurred while exporting the member",
- "deleteUserSuccess": "User %0% was deleted",
- "resendInviteHeader": "Invite user",
- "resendInviteSuccess": "Invitation has been re-sent to %0%",
- "contentReqCulturePublishError": "Cannot publish the document since the required '%0%' is not published\n ",
- "contentCultureValidationError": "Validation failed for language '%0%'",
- "documentTypeExportedSuccess": "Document Type was exported to file",
- "documentTypeExportedError": "An error occurred while exporting the Document Type",
- "dictionaryItemExportedSuccess": "Dictionary item(s) was exported to file",
- "dictionaryItemExportedError": "An error occurred while exporting the dictionary item(s)",
- "dictionaryItemImported": "The following dictionary item(s) has been imported!",
- "scheduleErrReleaseDate1": "The release date cannot be in the past",
- "scheduleErrReleaseDate2": "Cannot schedule the document for publishing since the required '%0%' is not\n published\n ",
- "scheduleErrReleaseDate3": "Cannot schedule the document for publishing since the required '%0%' has a\n publish date later than a non mandatory language\n ",
- "scheduleErrExpireDate1": "The expire date cannot be in the past",
- "scheduleErrExpireDate2": "The expire date cannot be before the release date",
- "publishWithNoDomains": "Domains are not configured for multilingual site, please contact an administrator,\n see log for more information\n ",
- "publishWithMissingDomain": "There is no domain configured for %0%, please contact an administrator, see\n log for more information\n ",
- "preventCleanupEnableError": "An error occurred while enabling version cleanup for %0%",
- "preventCleanupDisableError": "An error occurred while disabling version cleanup for %0%",
- "copySuccessMessage": "Your system information has successfully been copied to the clipboard",
- "cannotCopyInformation": "Could not copy your system information to the clipboard"
- },
- "stylesheet": {
- "addRule": "Add style",
- "editRule": "Edit style",
- "editorRules": "Rich text editor styles",
- "editorRulesHelp": "Define the styles that should be available in the rich text editor for this\n stylesheet\n ",
- "editstylesheet": "Edit stylesheet",
- "editstylesheetproperty": "Edit stylesheet property",
- "nameHelp": "The name displayed in the editor style selector",
- "preview": "Preview",
- "previewHelp": "How the text will look like in the rich text editor.",
- "selector": "Selector",
- "selectorHelp": "Uses CSS syntax, e.g. \"h1\" or \".redHeader\"",
- "styles": "Styles",
- "stylesHelp": "The CSS that should be applied in the rich text editor, e.g. \"color:red;\"",
- "tabCode": "Code",
- "tabRules": "Rich Text Editor"
- },
- "template": {
- "runtimeModeProduction": "Content is not editable when using runtime mode Production.",
- "deleteByIdFailed": "Failed to delete template with ID %0%",
- "edittemplate": "Edit template",
- "insertSections": "Sections",
- "insertContentArea": "Insert content area",
- "insertContentAreaPlaceHolder": "Insert content area placeholder",
- "insert": "Insert",
- "insertDesc": "Choose what to insert into your template",
- "insertDictionaryItem": "Dictionary item",
- "insertDictionaryItemDesc": "A dictionary item is a placeholder for a translatable piece of text, which\n makes it easy to create designs for multilingual websites.\n ",
- "insertMacro": "Macro",
- "insertMacroDesc": "\n A Macro is a configurable component which is great for\n reusable parts of your design, where you need the option to provide parameters,\n such as galleries, forms and lists.\n ",
- "insertPageField": "Value",
- "insertPageFieldDesc": "Displays the value of a named field from the current page, with options to modify\n the value or fallback to alternative values.\n ",
- "insertPartialView": "Partial view",
- "insertPartialViewDesc": "\n A partial view is a separate template file which can be rendered inside another\n template, it's great for reusing markup or for separating complex templates into separate files.\n ",
- "mastertemplate": "Master template",
- "noMaster": "No master",
- "renderBody": "Render child template",
- "renderBodyDesc": "\n Renders the contents of a child template, by inserting a\n @RenderBody() placeholder.\n ",
- "defineSection": "Define a named section",
- "defineSectionDesc": "\n Defines a part of your template as a named section by wrapping it in\n @section { ... }. This can be rendered in a\n specific area of the parent of this template, by using @RenderSection.\n ",
- "renderSection": "Render a named section",
- "renderSectionDesc": "\n Renders a named area of a child template, by inserting a @RenderSection(name) placeholder.\n This renders an area of a child template which is wrapped in a corresponding @section [name]{ ... } definition.\n ",
- "sectionName": "Section Name",
- "sectionMandatory": "Section is mandatory",
- "sectionMandatoryDesc": "\n If mandatory, the child template must contain a @section definition, otherwise an error is shown.\n ",
- "queryBuilder": "Query builder",
- "itemsReturned": "items returned, in",
- "iWant": "I want",
- "allContent": "all content",
- "contentOfType": "content of type \"%0%\"",
- "from": "from",
- "websiteRoot": "my website",
- "where": "where",
- "and": "and",
- "is": "is",
- "isNot": "is not",
- "before": "before",
- "beforeIncDate": "before (including selected date)",
- "after": "after",
- "afterIncDate": "after (including selected date)",
- "equals": "equals",
- "doesNotEqual": "does not equal",
- "contains": "contains",
- "doesNotContain": "does not contain",
- "greaterThan": "greater than",
- "greaterThanEqual": "greater than or equal to",
- "lessThan": "less than",
- "lessThanEqual": "less than or equal to",
- "id": "Id",
- "name": "Name",
- "createdDate": "Created Date",
- "lastUpdatedDate": "Last Updated Date",
- "orderBy": "order by",
- "ascending": "ascending",
- "descending": "descending",
- "template": "Template"
- },
- "grid": {
- "media": "Image",
- "macro": "Macro",
- "insertControl": "Choose type of content",
- "chooseLayout": "Choose a layout",
- "addRows": "Add a row",
- "addElement": "Add content",
- "dropElement": "Drop content",
- "settingsApplied": "Settings applied",
- "contentNotAllowed": "This content is not allowed here",
- "contentAllowed": "This content is allowed here",
- "clickToEmbed": "Click to embed",
- "clickToInsertImage": "Click to insert image",
- "clickToInsertMacro": "Click to insert macro",
- "placeholderWriteHere": "Write here...",
- "gridLayouts": "Grid Layouts",
- "gridLayoutsDetail": "Layouts are the overall work area for the grid editor, usually you only need one or\n two different layouts\n ",
- "addGridLayout": "Add Grid Layout",
- "editGridLayout": "Edit Grid Layout",
- "addGridLayoutDetail": "Adjust the layout by setting column widths and adding additional sections",
- "rowConfigurations": "Row configurations",
- "rowConfigurationsDetail": "Rows are predefined cells arranged horizontally",
- "addRowConfiguration": "Add row configuration",
- "editRowConfiguration": "Edit row configuration",
- "addRowConfigurationDetail": "Adjust the row by setting cell widths and adding additional cells",
- "noConfiguration": "No further configuration available",
- "columns": "Columns",
- "columnsDetails": "Total combined number of columns in the grid layout",
- "settings": "Settings",
- "settingsDetails": "Configure what settings editors can change",
- "styles": "Styles",
- "stylesDetails": "Configure what styling editors can change",
- "allowAllEditors": "Allow all editors",
- "allowAllRowConfigurations": "Allow all row configurations",
- "maxItems": "Maximum items",
- "maxItemsDescription": "Leave blank or set to 0 for unlimited",
- "setAsDefault": "Set as default",
- "chooseExtra": "Choose extra",
- "chooseDefault": "Choose default",
- "areAdded": "are added",
- "warning": "Warning",
- "warningText": "Modifying a row configuration name will result in loss of data for any existing content that is based on this configuration.
Modifying only the label will not result in data loss.
",
- "youAreDeleting": "You are deleting the row configuration",
- "deletingARow": "\n Deleting a row configuration name will result in loss of data for any existing content that is based on this\n configuration.\n ",
- "deleteLayout": "You are deleting the layout",
- "deletingALayout": "Modifying a layout will result in loss of data for any existing content that is based\n on this configuration.\n "
- },
- "contentTypeEditor": {
- "compositions": "Compositions",
- "group": "Group",
- "groupReorderSameAliasError": "You can't move the group %0% to this tab because the group will get the same\n alias as a tab: \"%1%\". Rename the group to continue.\n ",
- "noGroups": "You have not added any groups",
- "addGroup": "Add group",
- "inheritedFrom": "Inherited from",
- "addProperty": "Add property",
- "requiredLabel": "Required label",
- "enableListViewHeading": "Enable list view",
- "enableListViewDescription": "Configures the content item to show a sortable and searchable list of its\n children, the children will not be shown in the tree\n ",
- "allowedTemplatesHeading": "Allowed Templates",
- "allowedTemplatesDescription": "Choose which templates editors are allowed to use on content of this type\n ",
- "allowAsRootHeading": "Allow as root",
- "allowAsRootDescription": "Allow editors to create content of this type in the root of the content tree.\n ",
- "childNodesHeading": "Allowed child node types",
- "childNodesDescription": "Allow content of the specified types to be created underneath content of this\n type.\n ",
- "chooseChildNode": "Choose child node",
- "compositionsDescription": "Inherit tabs and properties from an existing Document Type. New tabs will be\n added to the current Document Type or merged if a tab with an identical name exists.\n ",
- "compositionInUse": "This Content Type is used in a composition, and therefore cannot be composed itself.\n ",
- "noAvailableCompositions": "There are no Content Types available to use as a composition.",
- "compositionRemoveWarning": "Removing a composition will delete all the associated property data. Once you\n save the Document Type there's no way back.\n ",
- "availableEditors": "Create new",
- "reuse": "Use existing",
- "editorSettings": "Editor settings",
- "searchResultSettings": "Available configurations",
- "searchResultEditors": "Create a new configuration",
- "configuration": "Configuration",
- "yesDelete": "Yes, delete",
- "movedUnderneath": "was moved underneath",
- "copiedUnderneath": "was copied underneath",
- "folderToMove": "Select the folder to move",
- "folderToCopy": "Select the folder to copy",
- "structureBelow": "to in the tree structure below",
- "allDocumentTypes": "All Document Types",
- "allDocuments": "All Documents",
- "allMediaItems": "All media items",
- "usingThisDocument": "using this Document Type will be deleted permanently, please confirm you want to\n delete these as well.\n ",
- "usingThisMedia": "using this Media Type will be deleted permanently, please confirm you want to delete\n these as well.\n ",
- "usingThisMember": "using this Member Type will be deleted permanently, please confirm you want to delete\n these as well\n ",
- "andAllDocuments": "and all documents using this type",
- "andAllMediaItems": "and all media items using this type",
- "andAllMembers": "and all members using this type",
- "memberCanEdit": "Member can edit",
- "memberCanEditDescription": "Allow this property value to be edited by the member on their profile page\n ",
- "isSensitiveData": "Is sensitive data",
- "isSensitiveDataDescription": "Hide this property value from content editors that don't have access to view\n sensitive information\n ",
- "showOnMemberProfile": "Show on member profile",
- "showOnMemberProfileDescription": "Allow this property value to be displayed on the member profile page\n ",
- "tabHasNoSortOrder": "tab has no sort order",
- "compositionUsageHeading": "Where is this composition used?",
- "compositionUsageSpecification": "This composition is currently used in the composition of the following\n Content Types:\n ",
- "variantsHeading": "Allow variations",
- "cultureVariantHeading": "Allow vary by culture",
- "segmentVariantHeading": "Allow segmentation",
- "cultureVariantLabel": "Vary by culture",
- "segmentVariantLabel": "Vary by segments",
- "variantsDescription": "Allow editors to create content of this type in different languages.",
- "cultureVariantDescription": "Allow editors to create content of different languages.",
- "segmentVariantDescription": "Allow editors to create segments of this content.",
- "allowVaryByCulture": "Allow varying by culture",
- "allowVaryBySegment": "Allow segmentation",
- "elementType": "Element Type",
- "elementHeading": "Is an Element Type",
- "elementDescription": "An Element Type is meant to be used within other Document Types, and not in the Content\n tree.\n ",
- "elementCannotToggle": "A Document Type cannot be changed to an Element Type once it has been used to\n create one or more content items.\n ",
- "elementDoesNotSupport": "This is not applicable for an Element Type",
- "propertyHasChanges": "You have made changes to this property. Are you sure you want to discard them?",
- "displaySettingsHeadline": "Appearance",
- "displaySettingsLabelOnTop": "Label above (full-width)",
- "confirmDeleteTabMessage": "Are you sure you want to delete the tab %0% ?",
- "confirmDeleteGroupMessage": "Are you sure you want to delete the group %0% ?",
- "confirmDeletePropertyMessage": "Are you sure you want to delete the property %0% ?",
- "confirmDeleteTabNotice": "This will also delete all items below this tab.",
- "confirmDeleteGroupNotice": "This will also delete all items below this group.",
- "addTab": "Add tab",
- "convertToTab": "Convert to tab",
- "tabDirectPropertiesDropZone": "Drag properties here to place directly on the tab",
- "removeChildNode": "You are removing the child node",
- "removeChildNodeWarning": "Removing a child node will limit the editors options to create different content\n types beneath a node.\n ",
- "usingEditor": "using this editor will get updated with the new settings.",
- "historyCleanupHeading": "History cleanup",
- "historyCleanupDescription": "Allow overriding the global history cleanup settings.",
- "historyCleanupKeepAllVersionsNewerThanDays": "Keep all versions newer than days",
- "historyCleanupKeepLatestVersionPerDayForDays": "Keep latest version per day for days",
- "historyCleanupPreventCleanup": "Prevent cleanup",
- "historyCleanupEnableCleanup": "Enable cleanup",
- "historyCleanupGloballyDisabled": "NOTE! The cleanup of historically content versions are disabled globally. These settings will not take effect before it is enabled.",
- "changeDataTypeHelpText": "Changing a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json."
- },
- "languages": {
- "addLanguage": "Add language",
- "culture": "ISO code",
- "mandatoryLanguage": "Mandatory language",
- "mandatoryLanguageHelp": "Properties on this language have to be filled out before the node can be\n published.\n ",
- "defaultLanguage": "Default language",
- "defaultLanguageHelp": "An Umbraco site can only have one default language set.",
- "changingDefaultLanguageWarning": "Switching default language may result in default content missing.",
- "fallsbackToLabel": "Falls back to",
- "noFallbackLanguageOption": "No fall back language",
- "fallbackLanguageDescription": "To allow multi-lingual content to fall back to another language if not\n present in the requested language, select it here.\n ",
- "fallbackLanguage": "Fall back language",
- "none": "none",
- "invariantPropertyUnlockHelp": "%0% is shared across languages and segments.",
- "invariantCulturePropertyUnlockHelp": "%0% is shared across all languages.",
- "invariantSegmentPropertyUnlockHelp": "%0% is shared across all segments.",
- "invariantLanguageProperty": "Shared: Languages",
- "invariantSegmentProperty": "Shared: Segments"
- },
- "macro": {
- "addParameter": "Add parameter",
- "editParameter": "Edit parameter",
- "enterMacroName": "Enter macro name",
- "parameters": "Parameters",
- "parametersDescription": "Define the parameters that should be available when using this macro.",
- "selectViewFile": "Select partial view macro file"
- },
- "modelsBuilder": {
- "buildingModels": "Building models",
- "waitingMessage": "this can take a bit of time, don't worry",
- "modelsGenerated": "Models generated",
- "modelsGeneratedError": "Models could not be generated",
- "modelsExceptionInUlog": "Models generation has failed, see exception in U log"
- },
- "templateEditor": {
- "addDefaultValue": "Add default value",
- "defaultValue": "Default value",
- "alternativeField": "Fallback field",
- "alternativeText": "Default value",
- "casing": "Casing",
- "encoding": "Encoding",
- "chooseField": "Choose field",
- "convertLineBreaks": "Convert line breaks",
- "convertLineBreaksHelp": "Replaces line breaks with 'br' html tag",
- "customFields": "Custom Fields",
- "dateOnly": "Date only",
- "formatAsDate": "Format as date",
- "htmlEncode": "HTML encode",
- "htmlEncodeHelp": "Will replace special characters by their HTML equivalent.",
- "insertedAfter": "Will be inserted after the field value",
- "insertedBefore": "Will be inserted before the field value",
- "lowercase": "Lowercase",
- "none": "None",
- "outputSample": "Output sample",
- "postContent": "Insert after field",
- "preContent": "Insert before field",
- "recursive": "Recursive",
- "recursiveDescr": "Yes, make it recursive",
- "standardFields": "Standard Fields",
- "uppercase": "Uppercase",
- "urlEncode": "URL encode",
- "urlEncodeHelp": "Will format special characters in URLs",
- "usedIfAllEmpty": "Will only be used when the field values above are empty",
- "usedIfEmpty": "This field will only be used if the primary field is empty",
- "withTime": "Date and time"
- },
- "translation": {
- "details": "Translation details",
- "DownloadXmlDTD": "Download XML DTD",
- "fields": "Fields",
- "includeSubpages": "Include subpages",
- "noTranslators": "No translator users found. Please create a translator user before you start sending\n content to translation\n ",
- "pageHasBeenSendToTranslation": "The page '%0%' has been send to translation",
- "sendToTranslate": "Send the page '%0%' to translation",
- "totalWords": "Total words",
- "translateTo": "Translate to",
- "translationDone": "Translation completed.",
- "translationDoneHelp": "You can preview the pages, you've just translated, by clicking below. If the\n original page is found, you will get a comparison of the 2 pages.\n ",
- "translationFailed": "Translation failed, the XML file might be corrupt",
- "translationOptions": "Translation options",
- "translator": "Translator",
- "uploadTranslationXml": "Upload translation XML"
- },
- "treeHeaders": {
- "content": "Content",
- "contentBlueprints": "Content Templates",
- "media": "Media",
- "cacheBrowser": "Cache Browser",
- "contentRecycleBin": "Recycle Bin",
- "createdPackages": "Created packages",
- "dataTypes": "Data Types",
- "dictionary": "Dictionary",
- "installedPackages": "Installed packages",
- "installSkin": "Install skin",
- "installStarterKit": "Install starter kit",
- "languages": "Languages",
- "localPackage": "Install local package",
- "macros": "Macros",
- "mediaTypes": "Media Types",
- "member": "Members",
- "memberGroups": "Member Groups",
- "memberRoles": "Member Roles",
- "memberTypes": "Member Types",
- "documentTypes": "Document Types",
- "relationTypes": "Relation Types",
- "packager": "Packages",
- "packages": "Packages",
- "partialViews": "Partial Views",
- "partialViewMacros": "Partial View Macro Files",
- "repositories": "Install from repository",
- "runway": "Install Runway",
- "runwayModules": "Runway modules",
- "scripting": "Scripting Files",
- "scripts": "Scripts",
- "stylesheets": "Stylesheets",
- "templates": "Templates",
- "logViewer": "Log Viewer",
- "users": "Users",
- "settingsGroup": "Settings",
- "templatingGroup": "Templating",
- "thirdPartyGroup": "Third Party"
- },
- "update": {
- "updateAvailable": "New update ready",
- "updateDownloadText": "%0% is ready, click here for download",
- "updateNoServer": "No connection to server",
- "updateNoServerError": "Error checking for update. Please review trace-stack for further information"
- },
- "user": {
- "access": "Access",
- "accessHelp": "Based on the assigned groups and start nodes, the user has access to the following nodes\n ",
- "assignAccess": "Assign access",
- "administrators": "Administrator",
- "categoryField": "Category field",
- "createDate": "User created",
- "changePassword": "Change your password",
- "changePhoto": "Change photo",
- "emailRequired": "Required - enter an email address for this user",
- "newPassword": "New password",
- "newPasswordFormatLengthTip": "Minimum %0% character(s) to go!",
- "newPasswordFormatNonAlphaTip": "There should be at least %0% special character(s) in there.",
- "noLockouts": "hasn't been locked out",
- "noPasswordChange": "The password hasn't been changed",
- "confirmNewPassword": "Confirm new password",
- "changePasswordDescription": "You can change your password for accessing the Umbraco backoffice by filling\n out the form below and click the 'Change Password' button\n ",
- "contentChannel": "Content Channel",
- "createAnotherUser": "Create another user",
- "createUserHelp": "Create new users to give them access to Umbraco. When a new user is created a password\n will be generated that you can share with the user.\n ",
- "descriptionField": "Description field",
- "disabled": "Disable User",
- "documentType": "Document Type",
- "duplicateLogin": "A user with this login already exists",
- "editors": "Editor",
- "excerptField": "Excerpt field",
- "failedPasswordAttempts": "Failed login attempts",
- "goToProfile": "Go to user profile",
- "groupsHelp": "Add groups to assign access and permissions",
- "inviteAnotherUser": "Invite another user",
- "inviteUserHelp": "Invite new users to give them access to Umbraco. An invite email will be sent to the\n user with information on how to log in to Umbraco. Invites last for 72 hours.\n ",
- "language": "Language",
- "languageHelp": "Set the language you will see in menus and dialogs",
- "lastLockoutDate": "Last lockout date",
- "lastLogin": "Last login",
- "lastPasswordChangeDate": "Password last changed",
- "loginname": "Username",
- "mediastartnode": "Media start node",
- "mediastartnodehelp": "Limit the media library to a specific start node",
- "mediastartnodes": "Media start nodes",
- "mediastartnodeshelp": "Limit the media library to specific start nodes",
- "modules": "Sections",
- "nameRequired": "Required - enter a name for this user",
- "noConsole": "Disable Umbraco Access",
- "noLogin": "has not logged in yet",
- "oldPassword": "Old password",
- "password": "Password",
- "resetPassword": "Reset password",
- "passwordChanged": "Your password has been changed!",
- "passwordChangedGeneric": "Password changed",
- "passwordConfirm": "Please confirm the new password",
- "passwordEnterNew": "Enter your new password",
- "passwordIsBlank": "Your new password cannot be blank!",
- "passwordCurrent": "Current password",
- "passwordInvalid": "Invalid current password",
- "passwordIsDifferent": "There was a difference between the new password and the confirmed password. Please\n try again!\n ",
- "passwordMismatch": "The confirmed password doesn't match the new password!",
- "passwordRequiresDigit": "The password must have at least one digit ('0'-'9')",
- "passwordRequiresLower": "The password must have at least one lowercase ('a'-'z')",
- "passwordRequiresNonAlphanumeric": "The password must have at least one non alphanumeric character",
- "passwordRequiresUniqueChars": "The password must use at least %0% different characters",
- "passwordRequiresUpper": "The password must have at least one uppercase ('A'-'Z')",
- "passwordTooShort": "The password must be at least %0% characters long",
- "permissionReplaceChildren": "Replace child node permissions",
- "permissionSelectedPages": "You are currently modifying permissions for the pages:",
- "permissionSelectPages": "Select pages to modify their permissions",
- "removePhoto": "Remove photo",
- "permissionsDefault": "Default permissions",
- "permissionsGranular": "Granular permissions",
- "permissionsGranularHelp": "Set permissions for specific nodes",
- "profile": "Profile",
- "searchAllChildren": "Search all children",
- "languagesHelp": "Limit the languages users have access to edit",
- "allowAccessToAllLanguages": "Allow access to all languages",
- "sectionsHelp": "Add sections to give users access",
- "selectUserGroups": "Select user groups",
- "noStartNode": "No start node selected",
- "noStartNodes": "No start nodes selected",
- "startnode": "Content start node",
- "startnodehelp": "Limit the content tree to a specific start node",
- "startnodes": "Content start nodes",
- "startnodeshelp": "Limit the content tree to specific start nodes",
- "updateDate": "User last updated",
- "userCreated": "has been created",
- "userCreatedSuccessHelp": "The new user has successfully been created. To log in to Umbraco use the\n password below.\n ",
- "userHasPassword": "The user already has a password set",
- "userHasGroup": "The user is already in group '%0%'",
- "userLockoutNotEnabled": "Lockout is not enabled for this user",
- "userManagement": "User management",
- "username": "Name",
- "userNotInGroup": "The user is not in group '%0%'",
- "userPermissions": "User permissions",
- "usergroup": "User group",
- "userInvited": "has been invited",
- "userInvitedSuccessHelp": "An invitation has been sent to the new user with details about how to log in to\n Umbraco.\n ",
- "userinviteWelcomeMessage": "Hello there and welcome to Umbraco! In just 1 minute you’ll be good to go, we\n just need you to setup a password and add a picture for your avatar.\n ",
- "userinviteExpiredMessage": "Welcome to Umbraco! Unfortunately your invite has expired. Please contact your\n administrator and ask them to resend it.\n ",
- "userinviteAvatarMessage": "Uploading a photo of yourself will make it easy for other users to recognize\n you. Click the circle above to upload your photo.\n ",
- "writer": "Writer",
- "configureTwoFactor": "Configure Two-Factor",
- "change": "Change",
- "yourProfile": "Your profile",
- "yourHistory": "Your recent history",
- "sessionExpires": "Session expires in",
- "inviteUser": "Invite user",
- "createUser": "Create user",
- "sendInvite": "Send invite",
- "backToUsers": "Back to users",
- "defaultInvitationMessage": "Resending invitation...",
- "deleteUser": "Delete User",
- "deleteUserConfirmation": "Are you sure you wish to delete this user account?",
- "stateAll": "All",
- "stateActive": "Active",
- "stateDisabled": "Disabled",
- "stateLockedOut": "Locked out",
- "stateApproved": "Approved",
- "stateInvited": "Invited",
- "stateInactive": "Inactive",
- "sortNameAscending": "Name (A-Z)",
- "sortNameDescending": "Name (Z-A)",
- "sortCreateDateAscending": "Newest",
- "sortCreateDateDescending": "Oldest",
- "sortLastLoginDateDescending": "Last login",
- "noUserGroupsAdded": "No user groups have been added",
- "2faDisableText": "If you wish to disable this two-factor provider, then you must enter the code shown on your authentication device:",
- "2faProviderIsEnabled": "This two-factor provider is enabled",
- "2faProviderIsDisabledMsg": "This two-factor provider is now disabled",
- "2faProviderIsNotDisabledMsg": "Something went wrong with trying to disable this two-factor provider",
- "2faDisableForUser": "Do you want to disable this two-factor provider for this user?"
- },
- "validation": {
- "validation": "Validation",
- "validateAsEmail": "Validate as an email address",
- "validateAsNumber": "Validate as a number",
- "validateAsUrl": "Validate as a URL",
- "enterCustomValidation": "...or enter a custom validation",
- "fieldIsMandatory": "Field is mandatory",
- "mandatoryMessage": "Enter a custom validation error message (optional)",
- "validationRegExp": "Enter a regular expression",
- "validationRegExpMessage": "Enter a custom validation error message (optional)",
- "minCount": "You need to add at least",
- "maxCount": "You can only have",
- "addUpTo": "Add up to",
- "items": "items",
- "urls": "URL(s)",
- "urlsSelected": "URL(s) selected",
- "itemsSelected": "items selected",
- "invalidDate": "Invalid date",
- "invalidNumber": "Not a number",
- "invalidNumberStepSize": "Not a valid numeric step size",
- "invalidEmail": "Invalid email",
- "invalidNull": "Value cannot be null",
- "invalidEmpty": "Value cannot be empty",
- "invalidPattern": "Value is invalid, it does not match the correct pattern",
- "invalidMemberGroupName": "Invalid member group name",
- "invalidUserGroupName": "Invalid user group name",
- "invalidToken": "Invalid token",
- "invalidUsername": "Invalid username",
- "duplicateEmail": "Email '%0%' is already taken",
- "duplicateUserGroupName": "User group name '%0%' is already taken",
- "duplicateMemberGroupName": "Member group name '%0%' is already taken",
- "duplicateUsername": "Username '%0%' is already taken",
- "customValidation": "Custom validation",
- "entriesShort": "Minimum %0% entries, requires %1% more.",
- "entriesExceed": "Maximum %0% entries, %1% too many.",
- "entriesAreasMismatch": "The content amount requirements are not met for one or more areas."
- },
- "healthcheck": {
- "checkSuccessMessage": "Value is set to the recommended value: '%0%'.",
- "checkErrorMessageDifferentExpectedValue": "Expected value '%1%' for '%2%' in configuration file '%3%', but\n found '%0%'.\n ",
- "checkErrorMessageUnexpectedValue": "Found unexpected value '%0%' for '%2%' in configuration file '%3%'.\n ",
- "macroErrorModeCheckSuccessMessage": "MacroErrors are set to '%0%'.",
- "macroErrorModeCheckErrorMessage": "MacroErrors are set to '%0%' which will prevent some or all pages in\n your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'.\n ",
- "httpsCheckValidCertificate": "Your website's certificate is valid.",
- "httpsCheckInvalidCertificate": "Certificate validation error: '%0%'",
- "httpsCheckExpiredCertificate": "Your website's SSL certificate has expired.",
- "httpsCheckExpiringCertificate": "Your website's SSL certificate is expiring in %0% days.",
- "healthCheckInvalidUrl": "Error pinging the URL %0% - '%1%'",
- "httpsCheckIsCurrentSchemeHttps": "You are currently %0% viewing the site using the HTTPS scheme.",
- "httpsCheckConfigurationRectifyNotPossible": "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to 'false' in\n your appSettings.json file. Once you access this site using the HTTPS scheme, that should be set to 'true'.\n ",
- "httpsCheckConfigurationCheckResult": "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to '%0%' in your\n appSettings.json file, your cookies are %1% marked as secure.\n ",
- "compilationDebugCheckSuccessMessage": "Debug compilation mode is disabled.",
- "compilationDebugCheckErrorMessage": "Debug compilation mode is currently enabled. It is recommended to\n disable this setting before go live.\n ",
- "umbracoApplicationUrlCheckResultTrue": "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is set to %0% .",
- "umbracoApplicationUrlCheckResultFalse": "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is not set.",
- "clickJackingCheckHeaderFound": "The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was found.",
- "clickJackingCheckHeaderNotFound": "The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.",
- "noSniffCheckHeaderFound": "The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was found.",
- "noSniffCheckHeaderNotFound": "The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was not found.",
- "hSTSCheckHeaderFound": "The header Strict-Transport-Security , also known as the HSTS-header, was found.",
- "hSTSCheckHeaderNotFound": "The header Strict-Transport-Security was not found.",
- "hSTSCheckHeaderFoundOnLocalhost": "The header Strict-Transport-Security , also known as the HSTS-header, was found. This header should not be present on localhost. ",
- "hSTSCheckHeaderNotFoundOnLocalhost": "The header Strict-Transport-Security was not found. This header should not be present on localhost.",
- "xssProtectionCheckHeaderFound": "The header X-XSS-Protection was found. It is recommended not to add this header to your website . \n You can read about this on the Mozilla website ",
- "xssProtectionCheckHeaderNotFound": "The header X-XSS-Protection was not found.",
- "excessiveHeadersFound": "The following headers revealing information about the website technology were found: %0% .",
- "excessiveHeadersNotFound": "No headers revealing information about the website technology were found.\n ",
- "smtpMailSettingsNotFound": "The 'Umbraco:CMS:Global:Smtp' configuration could not be found.",
- "smtpMailSettingsHostNotConfigured": "The 'Umbraco:CMS:Global:Smtp:Host' configuration could not be\n found.\n ",
- "smtpMailSettingsConnectionSuccess": "SMTP settings are configured correctly and the service is operating\n as expected.\n ",
- "smtpMailSettingsConnectionFail": "The SMTP server configured with host '%0%' and port '%1%' could not be\n reached. Please check to ensure the SMTP settings in the configuration 'Umbraco:CMS:Global:Smtp' are correct.\n ",
- "notificationEmailsCheckSuccessMessage": "Notification email has been set to %0% .",
- "notificationEmailsCheckErrorMessage": "Notification email is still set to the default value of %0% .",
- "checkGroup": "Check group",
- "helpText": "\n The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button.\n You can add your own health checks, have a look at the documentation for more information about custom health checks.
\n "
- },
- "redirectUrls": {
- "disableUrlTracker": "Disable URL tracker",
- "enableUrlTracker": "Enable URL tracker",
- "culture": "Culture",
- "originalUrl": "Original URL",
- "redirectedTo": "Redirected To",
- "redirectUrlManagement": "Redirect URL Management",
- "panelInformation": "The following URLs redirect to this content item:",
- "noRedirects": "No redirects have been made",
- "noRedirectsDescription": "When a published page gets renamed or moved a redirect will automatically be\n made to the new page.\n ",
- "redirectRemoved": "Redirect URL removed.",
- "redirectRemoveError": "Error removing redirect URL.",
- "redirectRemoveWarning": "This will remove the redirect",
- "confirmDisable": "Are you sure you want to disable the URL tracker?",
- "disabledConfirm": "URL tracker has now been disabled.",
- "disableError": "Error disabling the URL tracker, more information can be found in your log file.",
- "enabledConfirm": "URL tracker has now been enabled.",
- "enableError": "Error enabling the URL tracker, more information can be found in your log file."
- },
- "emptyStates": {
- "emptyDictionaryTree": "No Dictionary items to choose from"
- },
- "textbox": {
- "characters_left": "%0% characters left.",
- "characters_exceed": "Maximum %0% characters, %1% too many."
- },
- "recycleBin": {
- "contentTrashed": "Trashed content with Id: {0} related to original parent content with Id: {1}",
- "mediaTrashed": "Trashed media with Id: {0} related to original parent media item with Id: {1}",
- "itemCannotBeRestored": "Cannot automatically restore this item",
- "itemCannotBeRestoredHelpText": "There is no location where this item can be automatically restored. You\n can move the item manually using the tree below.\n ",
- "wasRestored": "was restored under"
- },
- "relationType": {
- "direction": "Direction",
- "parentToChild": "Parent to child",
- "bidirectional": "Bidirectional",
- "parent": "Parent",
- "child": "Child",
- "count": "Count",
- "relation": "Relation",
- "relations": "Relations",
- "created": "Created",
- "comment": "Comment",
- "name": "Name",
- "noRelations": "No relations for this Relation Type",
- "tabRelationType": "Relation Type",
- "tabRelations": "Relations",
- "isDependency": "Is Dependency",
- "dependency": "Yes",
- "noDependency": "No"
- },
- "dashboardTabs": {
- "contentIntro": "Getting Started",
- "contentRedirectManager": "Redirect URL Management",
- "mediaFolderBrowser": "Content",
- "settingsWelcome": "Welcome",
- "settingsExamine": "Examine Management",
- "settingsPublishedStatus": "Published Status",
- "settingsModelsBuilder": "Models Builder",
- "settingsHealthCheck": "Health Check",
- "settingsAnalytics": "Telemetry data",
- "settingsProfiler": "Profiling",
- "memberIntro": "Getting Started",
- "formsInstall": "Install Umbraco Forms",
- "deploy": "Workspaces",
- "deployManagement": "Deploy"
- },
- "visuallyHiddenTexts": {
- "goBack": "Go back",
- "activeListLayout": "Active layout:",
- "jumpTo": "Jump to",
- "group": "group",
- "passed": "passed",
- "warning": "warning",
- "failed": "failed",
- "suggestion": "suggestion",
- "checkPassed": "Check passed",
- "checkFailed": "Check failed",
- "openBackofficeSearch": "Open backoffice search",
- "openCloseBackofficeHelp": "Open/Close backoffice help",
- "openCloseBackofficeProfileOptions": "Open/Close your profile options",
- "assignDomainDescription": "Setup Culture and Hostnames for %0%",
- "createDescription": "Create new node under %0%",
- "protectDescription": "Setup access restrictions on %0%",
- "rightsDescription": "Setup Permissions on %0%",
- "sortDescription": "Change sort order for %0%",
- "createblueprintDescription": "Create Content Template based on %0%",
- "openContextMenu": "Open context menu for",
- "currentLanguage": "Current language",
- "switchLanguage": "Switch language to",
- "createNewFolder": "Create new folder",
- "newPartialView": "Partial View",
- "newPartialViewMacro": "Partial View Macro",
- "newMember": "Member",
- "newDataType": "Data Type",
- "redirectDashboardSearchLabel": "Search the redirect dashboard",
- "userGroupSearchLabel": "Search the user group section",
- "userSearchLabel": "Search the users section",
- "createItem": "Create item",
- "create": "Create",
- "edit": "Edit",
- "name": "Name",
- "addNewRow": "Add new row",
- "tabExpand": "View more options",
- "searchOverlayTitle": "Search the Umbraco backoffice",
- "searchOverlayDescription": "Search for content nodes, media nodes etc. across the backoffice.",
- "searchInputDescription": "When autocomplete results are available, press up and down arrows, or use the\n tab key and use the enter key to select.\n ",
- "path": "Path:",
- "foundIn": "Found in",
- "hasTranslation": "Has translation",
- "noTranslation": "Missing translation",
- "dictionaryListCaption": "Dictionary items",
- "contextMenuDescription": "Select one of the options to edit the node.",
- "contextDialogDescription": "Perform action %0% on the %1% node",
- "addImageCaption": "Add image caption",
- "searchContentTree": "Search content tree",
- "maxAmount": "Maximum amount"
- },
- "references": {
- "tabName": "References",
- "DataTypeNoReferences": "This Data Type has no references.",
- "itemHasNoReferences": "This item has no references.",
- "labelUsedByDocumentTypes": "Referenced by the following Document Types",
- "labelUsedByMediaTypes": "Referenced by the following Media Types",
- "labelUsedByMemberTypes": "Referenced by the following Member Types",
- "usedByProperties": "Referenced by",
- "labelUsedByItems": "Referenced by the following items",
- "labelDependsOnThis": "The following items depend on this",
- "labelUsedItems": "The following items are referenced",
- "labelUsedDescendants": "The following descendant items have dependencies",
- "labelDependentDescendants": "The following descending items have dependencies",
- "deleteWarning": "This item or its descendants is being referenced. Deletion can lead to broken links on your website.",
- "unpublishWarning": "This item or its descendants is being referenced. Unpublishing can lead to broken links on your website. Please take the appropriate actions.",
- "deleteDisabledWarning": "This item or its descendants is being referenced. Therefore, deletion has been disabled.",
- "listViewDialogWarning": "The following items you are trying to %0% are referenced by other content."
- },
- "logViewer": {
- "deleteSavedSearch": "Delete Saved Search",
- "logLevels": "Log Levels",
- "selectAllLogLevelFilters": "Select all",
- "deselectAllLogLevelFilters": "Deselect all",
- "savedSearches": "Saved Searches",
- "saveSearch": "Save Search",
- "saveSearchDescription": "Enter a friendly name for your search query",
- "filterSearch": "Filter Search",
- "totalItems": "Total Items",
- "timestamp": "Timestamp",
- "level": "Level",
- "machine": "Machine",
- "message": "Message",
- "exception": "Exception",
- "properties": "Properties",
- "searchWithGoogle": "Search With Google",
- "searchThisMessageWithGoogle": "Search this message with Google",
- "searchWithBing": "Search With Bing",
- "searchThisMessageWithBing": "Search this message with Bing",
- "searchOurUmbraco": "Search Our Umbraco",
- "searchThisMessageOnOurUmbracoForumsAndDocs": "Search this message on Our Umbraco forums and docs",
- "searchOurUmbracoWithGoogle": "Search Our Umbraco with Google",
- "searchOurUmbracoForumsUsingGoogle": "Search Our Umbraco forums using Google",
- "searchUmbracoSource": "Search Umbraco Source",
- "searchWithinUmbracoSourceCodeOnGithub": "Search within Umbraco source code on Github",
- "searchUmbracoIssues": "Search Umbraco Issues",
- "searchUmbracoIssuesOnGithub": "Search Umbraco Issues on Github",
- "deleteThisSearch": "Delete this search",
- "findLogsWithRequestId": "Find Logs with Request ID",
- "findLogsWithNamespace": "Find Logs with Namespace",
- "findLogsWithMachineName": "Find Logs with Machine Name",
- "open": "Open",
- "polling": "Polling",
- "every2": "Every 2 seconds",
- "every5": "Every 5 seconds",
- "every10": "Every 10 seconds",
- "every20": "Every 20 seconds",
- "every30": "Every 30 seconds",
- "pollingEvery2": "Polling every 2s",
- "pollingEvery5": "Polling every 5s",
- "pollingEvery10": "Polling every 10s",
- "pollingEvery20": "Polling every 20s",
- "pollingEvery30": "Polling every 30s"
- },
- "clipboard": {
- "labelForCopyAllEntries": "Copy %0%",
- "labelForArrayOfItemsFrom": "%0% from %1%",
- "labelForArrayOfItems": "Collection of %0%",
- "labelForRemoveAllEntries": "Remove all items",
- "labelForClearClipboard": "Clear clipboard"
- },
- "propertyActions": {
- "tooltipForPropertyActionsMenu": "Open Property Actions",
- "tooltipForPropertyActionsMenuClose": "Close Property Actions"
- },
- "nuCache": {
- "refreshStatus": "Refresh status",
- "memoryCache": "Memory Cache",
- "memoryCacheDescription": "\n This button lets you reload the in-memory cache, by entirely reloading it from the database\n cache (but it does not rebuild that database cache). This is relatively fast.\n Use it when you think that the memory cache has not been properly refreshed, after some events\n triggered—which would indicate a minor Umbraco issue.\n (note: triggers the reload on all servers in an LB environment).\n ",
- "reload": "Reload",
- "databaseCache": "Database Cache",
- "databaseCacheDescription": "\n This button lets you rebuild the database cache, ie the content of the cmsContentNu table.\n Rebuilding can be expensive. \n Use it when reloading is not enough, and you think that the database cache has not been\n properly generated—which would indicate some critical Umbraco issue.\n ",
- "rebuild": "Rebuild",
- "internals": "Internals",
- "internalsDescription": "\n This button lets you trigger a NuCache snapshots collection (after running a fullCLR GC).\n Unless you know what that means, you probably do not need to use it.\n ",
- "collect": "Collect",
- "publishedCacheStatus": "Published Cache Status",
- "caches": "Caches"
- },
- "profiling": {
- "performanceProfiling": "Performance profiling",
- "performanceProfilingDescription": "\n \n Umbraco currently runs in debug mode. This means you can use the built-in performance profiler to assess the performance when rendering pages.\n
\n \n If you want to activate the profiler for a specific page rendering, simply add umbDebug=true to the querystring when requesting the page.\n
\n \n If you want the profiler to be activated by default for all page renderings, you can use the toggle below.\n It will set a cookie in your browser, which then activates the profiler automatically.\n In other words, the profiler will only be active by default in your browser - not everyone else's.\n
\n ",
- "activateByDefault": "Activate the profiler by default",
- "reminder": "Friendly reminder",
- "reminderDescription": "\n \n You should never let a production site run in debug mode. Debug mode is turned off by setting Umbraco:CMS:Hosting:Debug to false in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n ",
- "profilerEnabledDescription": "\n \n Umbraco currently does not run in debug mode, so you can't use the built-in profiler. This is how it should be for a production site.\n
\n \n Debug mode is turned on by setting Umbraco:CMS:Hosting:Debug to true in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n "
- },
- "settingsDashboardVideos": {
- "trainingHeadline": "Hours of Umbraco training videos are only a click away",
- "trainingDescription": "\n Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos
\n ",
- "getStarted": "To get you started"
- },
- "settingsDashboard": {
- "start": "Start here",
- "startDescription": "This section contains the building blocks for your Umbraco site. Follow the below\n links to find out more about working with the items in the Settings section\n ",
- "more": "Find out more",
- "bulletPointOne": "\n Read more about working with the items in Settings in the Documentation section of Our Umbraco\n ",
- "bulletPointTwo": "\n Ask a question in the Community Forum \n ",
- "bulletPointTutorials": "\n Watch our free tutorial videos on the Umbraco Learning Base \n ",
- "bulletPointFour": "\n Find out about our productivity boosting tools and commercial support \n ",
- "bulletPointFive": "\n Find out about real-life training and certification opportunities\n "
- },
- "startupDashboard": {
- "fallbackHeadline": "Welcome to The Friendly CMS",
- "fallbackDescription": "Thank you for choosing Umbraco - we think this could be the beginning of something\n beautiful. While it may feel overwhelming at first, we've done a lot to make the learning curve as smooth and fast\n as possible.\n "
- },
- "formsDashboard": {
- "formsHeadline": "Umbraco Forms",
- "formsDescription": "Create forms using an intuitive drag and drop interface. From simple contact forms\n that sends e-mails to advanced questionaires that integrate with CRM systems. Your clients will love it!\n ",
- "yourForms": "Your forms",
- "showMore": "Show more",
- "entries": "Entries",
- "newVersion": "There is a new version available",
- "installOverlayTitle": "Congratulations",
- "installOverlayDescription": "You've just installed Umbraco Forms - Let's create your first form",
- "emptyOverlayTitle": "Create a form",
- "emptyOverlayDescription": "You do not have any forms setup yet, how about creating one now?",
- "createAForm": "Create a form",
- "newVersionTitle": "There is a new version available",
- "newVersionDescription": "You can now install Umbraco Forms",
- "upgradeNow": "Upgrade now",
- "downloading": "Downloading and upgrading forms...",
- "invalidLicense": "Invalid license",
- "invalidLicenseValidFor": "Your current Forms license is only valid for:",
- "reconfigure": "Please re-configure your license below.",
- "trialTitle": "Thank you for trying out Umbraco Forms",
- "trialDescription": "To continue using Umbraco Forms, you must purchase a license, or use an existing license",
- "configureLicense": "Configure existing license",
- "buyLicense": "Buy license",
- "buyLicenseTitle": "Buying a license",
- "buyLicenseCopy": "\n \n It only takes a few minutes to buy a license for Umbraco Forms and your license is instantly delivered .\n
\n \n The steps are:\n
\n Click the buy button below \n Checkout with Credit Card (or invoice) \n Configure the license inside Umbraco Forms and you're up and running \n \n \n ",
- "buyLink": "Buy Umbraco Forms",
- "buyLicenseFAQs": "\n FAQ: \n What does it cost? \n Pricing starts at €209 and is a one time fee (no subscription).
\n What does a license cover? \n A license covers a single domain and will also work on all subdomains. It also includes two additional development domains.
\n Can I add additional domains to the license? \n Yes, additional domains can be added. You can purchase additional domains to your license from your account on Umbraco.com.
\n More questions? \n \n Don't worry, there's more details in the documentation and you're also more than welcome to get in touch with us . We usually respond within a couple of hours.\n
\n ",
- "configureLicenseTitle": "Configure an Umbraco Forms license",
- "configureLicenseCopy": "\n If you've already bought Umbraco Forms, you can automatically retrieve and configure your license here. Simply enter your umbraco.com credentials below and we'll\n find your license.\n ",
- "configureLicenseFAQs": "\n FAQ: \n I don't know what my credentials are? \n \n It's a combination of your e-mail and password from when you placed your order. You can always reset your password here .\n
\n How do I buy a license? \n \n If you don't have a license, you can get one from here and only takes a few minutes .\n
\n ",
- "findLicenses": "Find Licenses",
- "invalidEmail": "Invalid email or password",
- "noLicensesAvailable": "No Umbraco Forms licenses available on this account",
- "availableLicensesTitle": "Available Licenses",
- "foundLicenses": "Found",
- "foundLicensesAccount": "on the account",
- "noDomainsAssigned": "Has no domains assigned",
- "setDomain": "Please set a domain on this license",
- "configureAndInstall": "Configure and Install",
- "installLicense": "Install this license",
- "validDomains": "Valid domains",
- "licenseValidOnDomain": "This license is valid on the current domain",
- "licenseNotValidOnDomain": "This license is not valid on the current domain",
- "plainTextPasswordWarning": "\n Warning: your configuration settings are set to save plain text passwords! \n When you use a password field on any of your forms, the data your visitors will enter in that field will be stored in plain text. This is a security issue and should be avoided.
\n To fix this issue, you can go in to your Umbraco:Forms:Security:SavePlainTextPasswords file and set the key SavePlainTextPasswords to False .
\n After updating this setting, make sure to recycle the application pool for the site for the new setting to become active.
\n Note: password values will still be passed on to workflows, regardless of the setting in configuration.
\n ",
- "currentVersion": "Current installed version of Umbraco Forms:",
- "licenseConfiguredNotificationTitle": "License configured",
- "licenseConfiguredNotificationMessage": "Umbraco Forms has been configured for use on this website.",
- "insufficientPermissionsError": "Insufficient Permissions",
- "insufficientPermissionsMessage": "You do not have permissions to create and manage forms.",
- "insufficientPermissionsUpgradeMessage": "Only Admin users have the ability to upgrade Umbraco Forms.",
- "licensedDomains": "Licensed domains"
- },
- "blockEditor": {
- "headlineCreateBlock": "Pick Element Type",
- "headlineAddSettingsElementType": "Attach a settings Element Type",
- "headlineAddCustomView": "Select view",
- "headlineAddCustomStylesheet": "Select stylesheet",
- "headlineAddThumbnail": "Choose thumbnail",
- "labelcreateNewElementType": "Create new Element Type",
- "labelCustomStylesheet": "Custom stylesheet",
- "addCustomStylesheet": "Add stylesheet",
- "headlineEditorAppearance": "Block appearance",
- "headlineDataModels": "Data models",
- "headlineCatalogueAppearance": "Catalogue appearance",
- "labelBackgroundColor": "Background color",
- "labelIconColor": "Icon color",
- "labelContentElementType": "Content model",
- "labelLabelTemplate": "Label",
- "labelCustomView": "Custom view",
- "labelCustomViewInfoTitle": "Show custom view description",
- "labelCustomViewDescription": "Overwrite how this block appears in the backoffice UI. Pick a .html file\n containing your presentation.\n ",
- "labelSettingsElementType": "Settings model",
- "labelEditorSize": "Overlay editor size",
- "addCustomView": "Add custom view",
- "addSettingsElementType": "Add settings",
- "confirmDeleteBlockMessage": "Are you sure you want to delete the content %0% ?",
- "confirmDeleteBlockTypeMessage": "Are you sure you want to delete the block configuration %0% ?",
- "confirmDeleteBlockTypeNotice": "The content of this block will still be present, editing of this content\n will no longer be available and will be shown as unsupported content.\n ",
- "confirmDeleteBlockGroupMessage": "Are you sure you want to delete group %0% and all the Block configurations of this?",
- "confirmDeleteBlockGroupNotice": "The content of these Blocks will still be present, editing of this content\n will no longer be available and will be shown as unsupported content.\n ",
- "blockConfigurationOverlayTitle": "Configuration of '%0%'",
- "elementTypeDoesNotExist": "Cannot be edited cause ElementType does not exist.",
- "thumbnail": "Thumbnail",
- "addThumbnail": "Add thumbnail",
- "tabCreateEmpty": "Create empty",
- "tabClipboard": "Clipboard",
- "tabBlockSettings": "Settings",
- "headlineAdvanced": "Advanced",
- "forceHideContentEditor": "Hide content editor",
- "forceHideContentEditorHelp": "Hide the content edit button and the content editor from the Block Editor overlay",
- "girdInlineEditing": "Inline editing",
- "girdInlineEditingHelp": "Enables inline editing for the first Property. Additional properties can be edited in the overlay.",
- "blockHasChanges": "You have made changes to this content. Are you sure you want to discard them?",
- "confirmCancelBlockCreationHeadline": "Discard creation?",
- "confirmCancelBlockCreationMessage": "Are you sure you want to cancel the creation.",
- "elementTypeDoesNotExistHeadline": "Error!",
- "elementTypeDoesNotExistDescription": "The ElementType of this block does not exist anymore",
- "addBlock": "Add content",
- "addThis": "Add %0%",
- "propertyEditorNotSupported": "Property '%0%' uses editor '%1%' which is not supported in blocks.",
- "focusParentBlock": "Set focus on the container block",
- "areaIdentification": "Identification",
- "areaValidation": "Validation",
- "areaValidationEntriesShort": "%0% must be present atleast %2% time(s).",
- "areaValidationEntriesExceed": "%0% must maximum be present %3% time(s).",
- "areaNumberOfBlocks": "Number of blocks",
- "areaDisallowAllBlocks": "Only allow specific block types",
- "areaAllowedBlocks": "Allowed block types",
- "areaAllowedBlocksHelp": "Define the types of blocks that are allowed in this area, and optionally how many of each type that should be present.",
- "confirmDeleteBlockAreaMessage": "Are you sure you want to delete this area?",
- "confirmDeleteBlockAreaNotice": "Any blocks currently created within this area will be deleted.",
- "layoutOptions": "Layout options",
- "structuralOptions": "Structural",
- "sizeOptions": "Size options",
- "sizeOptionsHelp": "Define one or more size options, this enables resizing of the Block",
- "allowedBlockColumns": "Available column spans",
- "allowedBlockColumnsHelp": "Define the different number of columns this block is allowed to span across. This does not prevent Blocks from being placed in Areas with a smaller column span.",
- "allowedBlockRows": "Available row spans",
- "allowedBlockRowsHelp": "Define the range of layout rows this block is allowed to span across.",
- "allowBlockInRoot": "Allow in root",
- "allowBlockInRootHelp": "Make this block available in the root of the layout.",
- "allowBlockInAreas": "Allow in areas",
- "allowBlockInAreasHelp": "Make this block available by default within the areas of other Blocks (unless explicit permissions are set for these areas).",
- "areaAllowedBlocksEmpty": "By default, all block types are allowed in an Area, Use this option to allow only selected types.",
- "areas": "Areas",
- "areasLayoutColumns": "Grid Columns for Areas",
- "areasLayoutColumnsHelp": "Define how many columns that will be available for areas. If not defined, the number of columns defined for the entire layout will be used.",
- "areasConfigurations": "Areas",
- "areasConfigurationsHelp": "To enable the nesting of blocks within this block, define one or more areas. Areas follow the layout defined by their own grid column configuration. The 'column span' and 'row span' for each area can be adjusted by using the scale-handler box in the bottom right hand corner of the selected area.",
- "invalidDropPosition": "%0% is not allowed at this spot.",
- "defaultLayoutStylesheet": "Default layout stylesheet",
- "confirmPasteDisallowedNestedBlockHeadline": "Disallowed content was rejected",
- "confirmPasteDisallowedNestedBlockMessage": "The inserted content contained disallowed content, which has not been created. Would you like to keep the rest of this content anyway?",
- "areaAliasHelp": "When using GetBlockGridHTML() to render the Block Grid, the alias will be rendered in the markup as a 'data-area-alias' attribute. Use the alias attribute to target the element for the area. Example. .umb-block-grid__area[data-area-alias=\"MyAreaAlias\"] { ... }",
- "scaleHandlerButtonTitle": "Drag to scale",
- "areaCreateLabelTitle": "Create Button Label",
- "areaCreateLabelHelp": "Override the label text for adding a new Block to this Area, Example: 'Add Widget'",
- "showSizeOptions": "Show resize options",
- "addBlockType": "Add Block",
- "addBlockGroup": "Add group",
- "pickSpecificAllowance": "Pick group or Block",
- "allowanceMinimum": "Set a minimum requirement",
- "allowanceMaximum": "Set a maximum requirement",
- "block": "Block",
- "tabBlock": "Block",
- "tabBlockTypeSettings": "Settings",
- "tabAreas": "Areas",
- "tabAdvanced": "Advanced",
- "headlineAllowance": "Permissions",
- "getSampleHeadline": "Install Sample Configuration",
- "getSampleDescription": "This will add basic Blocks and help you get started with the Block Grid Editor. You'll get Blocks for Headline, Rich Text, Image, as well as a Two Column Layout.",
- "getSampleButton": "Install",
- "actionEnterSortMode": "Sort mode",
- "actionExitSortMode": "End sort mode",
- "areaAliasIsNotUnique": "This Areas Alias must be unique compared to the other Areas of this Block.",
- "configureArea": "Configure area",
- "deleteArea": "Delete area",
- "addColumnSpanOption": "Add spanning %0% columns option"
- },
- "contentTemplatesDashboard": {
- "whatHeadline": "What are Content Templates?",
- "whatDescription": "Content Templates are pre-defined content that can be selected when creating a new\n content node.\n ",
- "createHeadline": "How do I create a Content Template?",
- "createDescription": "\n There are two ways to create a Content Template:
\n \n Right-click a content node and select \"Create Content Template\" to create a new Content Template. \n Right-click the Content Templates tree in the Settings section and select the Document Type you want to create a Content Template for. \n \n Once given a name, editors can start using the Content Template as a foundation for their new page.
\n ",
- "manageHeadline": "How do I manage Content Templates?",
- "manageDescription": "You can edit and delete Content Templates from the \"Content Templates\" tree in the\n Settings section. Expand the Document Type which the Content Template is based on and click it to edit or delete\n it.\n "
- },
- "preview": {
- "endLabel": "End",
- "endTitle": "End preview mode",
- "openWebsiteLabel": "Preview website",
- "openWebsiteTitle": "Open website in preview mode",
- "returnToPreviewHeadline": "Preview website?",
- "returnToPreviewDescription": "You have ended preview mode, do you want to enable it again to view the\n latest saved version of your website?\n ",
- "returnToPreviewAcceptButton": "Preview latest version",
- "returnToPreviewDeclineButton": "View published version",
- "viewPublishedContentHeadline": "View published version?",
- "viewPublishedContentDescription": "You are in Preview Mode, do you want exit in order to view the\n published version of your website?\n ",
- "viewPublishedContentAcceptButton": "View published version",
- "viewPublishedContentDeclineButton": "Stay in preview mode"
- },
- "permissions": {
- "FolderCreation": "Folder creation",
- "FileWritingForPackages": "File writing for packages",
- "FileWriting": "File writing",
- "MediaFolderCreation": "Media folder creation"
- },
- "treeSearch": {
- "searchResult": "item returned",
- "searchResults": "items returned"
- },
- "analytics": {
- "consentForAnalytics": "Consent for telemetry data",
- "analyticsLevelSavedSuccess": "Telemetry level saved!",
- "analyticsDescription": "\n In order to improve Umbraco and add new functionality based on as relevant information as possible,\n we would like to collect system- and usage information from your installation.\n Aggregate data will be shared on a regular basis as well as learnings from these metrics.\n Hopefully, you will help us collect some valuable data.\n \n We WILL NOT collect any personal data such as content, code, user information, and all data will be fully anonymized.\n ",
- "minimalLevelDescription": "We will only send an anonymized site ID to let us know that the site exists.",
- "basicLevelDescription": "We will send an anonymized site ID, Umbraco version, and packages installed",
- "detailedLevelDescription": "\n We will send:\n \n Anonymized site ID, Umbraco version, and packages installed. \n Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use. \n System information: Webserver, server OS, server framework, server OS language, and database provider. \n Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode. \n \n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n By choosing \"Detailed\" you agree to current and future anonymized information being collected. \n "
- },
- "umbId": {
- "editProfile": "Edit your Umbraco ID profile",
- "changePassword": "Change your Umbraco ID password"
- },
- "dialogs": {
- "deployTransferNowTitle": "Transfer now",
- "deployTransferNowHeadline": "Transfer %0% to %1% ",
- "deployTransferNowDescription": "You are about to transfer %0% directly to %1%, without adding it to the queue.
",
- "deployAddToQueueHeadline": "Queue %0% for transfer to %1% ",
- "deployAddToQueueDescription": "This will put %0% in the queue for the next transfer, nothing will be transfered yet.
",
- "deployAddToQueueCultureDescription": "Select language to include in transfer:
",
- "deployAddToQueueChildPageDescription": "Should all items below %0% be included in the transfer?
",
- "deployAddToQueueReleaseDateDescription": "The published or unpublished status will be transferred along with the content. To schedule the update for publishing in the future, please set a date:
",
- "deployIncludeChildPages": "Include all items below",
- "deployAddToQueueDone": "Changes have been queued When you are ready to transfer your full set of changes, go to the workspace dashboard to start the transfer.
",
- "deployVariantQueueForTransferNotAllowed": "Transfer is not allowed",
- "deployRestoreFrom": "From",
- "deployRestoreWorkspace": "workspace",
- "deployRestoreThis": "Restore",
- "deployRestoreIncludingDescendants": "Including all items below",
- "deployRestoreNotIncludingDescendants": "Not including items below",
- "deployRestoreDescription": "\n This includes changes to referenced content, media and other items.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ",
- "deployRestorePickFrom": "Or pick content from",
- "deployFullRestoreFrom": "Restore this workspace from",
- "deployFullRestoreDescription": "\n This will transfer changes from %0% for all items and apply them to this workspace.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ",
- "deployFullRestoreAction": "Restore from",
- "deployTreeRestoreFrom": "Restore this tree from",
- "deployTreeRestoreDescription": "\n This will transfer changes from %0% and apply them to the selected tree in this workspace. This will include changes to any referenced content, media or other items.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ",
- "deployCompareTitle": "Compare",
- "deployGoToTransferQueue": "Open transfer queue"
- },
- "deployManagementDashboard": {
- "refreshStatus": "Refresh Status",
- "deployStatus": "Deploy Status",
- "deployOperations": "Deploy Operations",
- "triggerOperation": "Trigger Operation",
- "version": "Version",
- "status": "Status",
- "operationTime": "Last operation time",
- "schemaComparison": "Schema Comparison",
- "configurationDetails": "Configuration Details",
- "updateUmbracoSchemaFromDataFiles": "Update Umbraco Schema From Data Files",
- "updateUmbracoSchemaFromDataFilesDescription": "Update the Umbraco schema based on the information contained in the .uda files on disk.",
- "schemaDeployment": "Update Umbraco Schema",
- "exportSchemaToDataFiles": "Export Schema To Data Files",
- "exportSchemaToDataFilesDescription": "Extract the schema from Umbraco and output it to the .uda files on disk.",
- "exportSchema": "Export Schema",
- "clearCachedSignatures": "Clear Cached Signatures",
- "clearCachedSignaturesDescription": "\n Clear the cached artifact signatures from the Umbraco environment.\n This should not be necessary in normal use. This may solve reports of schema mismatches when transferring content between environments that have been aligned.\n ",
- "clearSignatures": "Clear Signatures",
- "setCachedSignatures": "Set Cached Signatures",
- "setCachedSignaturesDescription": "\n Sets the cached artifact signatures for all entities within the Umbraco environment.\n This can be used when signatures have been cleared and you want to ensure they are pre-generated before attempting a potentially long-running restore or transfer operation.\n ",
- "setSignatures": "Set Signatures"
- },
- "formPicker": {
- "selectFromFolder": "Select from folder",
- "selectFromList": "Select from list of all forms"
- },
- "formCopy": {
- "title": "Copying form '%0%'",
- "enterName": "Enter a name for the copied form",
- "alsoCopyWorkflows": "Also copy workflows?",
- "copyToNewFolder": "Copy to a new folder?",
- "selectLocation": "Select the location for copied form"
- },
- "formCreate": {
- "title": "Create a new form or folder",
- "emptyForm": "Empty form",
- "emptyFormDescription": "Starting from scratch",
- "folder": "Folder",
- "folderDescription": "Used to organize forms",
- "enterFolderName": "Enter a folder name"
- },
- "formExport": {
- "formExportedSuccess": "The form was exported to a file."
- },
- "formImport": {
- "importInstruction1": "\n To import a form, find the exported .json file on your computer by clicking the 'Import' button (you'll be asked for confirmation on the next screen).\n ",
- "importInstruction2": "\n If a form already exists with the ID of the file selected, it will be updated and moved to the selected location.\n If no existing form is found, a new one will be created at the selected location.\n "
- },
- "formPermissions": {
- "accessDeniedTitle": "Access denied"
- },
- "formMessages": {
- "saveErrorMessage": "Please check if your settings are valid."
- },
- "formEdit": {
- "addQuestion": "Add question",
- "groupIsEmpty": "Group is empty",
- "dropQuestionHere": "Drop a question here...",
- "letGo": "Yaay.. let go",
- "pageIsEmpty": "Page is empty",
- "dropGroupHere": "Drop a group here...",
- "addGroup": "Add new group",
- "addPage": "Add new page",
- "pageTitlePlaceholder": "Untitled page (optional)",
- "groupTitlePlaceholder": "Untitled group (optional)",
- "saveFieldFailedTitle": "Field failed to save",
- "accessDeniedMessage": "You do not have access to edit this form.",
- "formSaved": "Form saved",
- "unableToLoadForm": "Unable to load form",
- "helpText": "Help text",
- "editPage": "Edit Page",
- "editGroup": "Edit Group",
- "editQuestion": "Edit Question",
- "workflows": "Workflows",
- "magicStringsForFieldsNote": "\n Many field settings support the use of magic strings .\n When the form is displayed, these strings can be replaced with values from various sources, including dictionary values, session or cookie data and Umbraco page fields.\n Read more .",
- "magicStringsForWorkflowsNote": "\n Many workflow settings support the use of magic strings .\n When the workflow is processed, these strings can be replaced with values from various sources, including record data and dictionary values.\n Read more .",
- "fieldTypeNotAvailable": "The field type configured for this field is no longer available.",
- "fieldTypeRichTextNotAvailable": "The rich text cannot be formatted as no valid data type has been configured.",
- "fieldTypeRichTextNotAvailableLinkText": "Read how to configure a data type."
- },
- "formFileUpload": {
- "allowAllFiles": "Allow all files",
- "allowOnlySpecifiedFiles": "Allow only specified files",
- "predefinedAllowedFileTypes": "Predefined allowed file types",
- "userDefinedAllowedFileTypes": "User defined allowed file types",
- "deleteAllowedFileTypeConfirmationTitle": "Confirmation",
- "deleteAllowedFileTypeConfirmationDescription": "Are you sure you want to delete this?",
- "duplicateFileTypeErrorTitle": "File type error",
- "duplicateFileTypeErrorMessage": "Unable to add file type as this is a duplicate.",
- "pickFile": "Pick File",
- "uploading": "Uploading",
- "currentFile": "Current file"
- },
- "formPrevalues": {
- "newValue": "New value",
- "newCaption": "New caption",
- "caption": "Caption",
- "duplicateErrorTitle": "Prevalue error",
- "duplicateAddErrorMessage": "Unable to add value as it would create a duplicate.",
- "duplicateEditErrorMessage": "Unable to edit value as it would create a duplicate."
- },
- "formDelete": {
- "title": "Are you sure you want to delete the %0% '%1%'?",
- "timingNote": "Please note this can take lots of time depending on the number of records.",
- "recordDeleteNote": "Deleting the form will also delete the associated records.",
- "recordDetail": "There are %0% records, with the most recent one submitted on %1%.",
- "noRecordDetail": "There are 0 records.",
- "cannotDeleteFolder": "The selected folder cannot be deleted as it is not empty.",
- "successMessageForForm": "Successfully deleted the form.",
- "failedMessageForForm": "Form failed to delete.",
- "successMessageForFolder": "Successfully deleted the folder.",
- "failedMessageForFolder": "Folder failed to delete."
- },
- "formEntries": {
- "title": "%0% Entries",
- "filterEntries": "Filter entries...",
- "selectedRowsDescription": "%0% of %1% selected",
- "export": "Export",
- "chooseExportFormat": "Choose a format to export form records to",
- "entriesNotStored": "Currently submissions are not stored in the database.",
- "enableStoreEntries": "To enable this, go to form settings and activate the \"Store Records\" feature.",
- "noEntriesInRange": "No submissions added yet in this date range.",
- "noEntriesInRangeDetail": "We couldn't find any submissions, are you sure you published the form? Or try expanding the date range.",
- "noEntriesMatchingSearch": "We couldn't find any submissions matching your search.",
- "noEntriesMatchingSearchDetail": "Try searching for something else, maybe you're lucky next time.",
- "selectedEntryPaging": "Entry %0% of %1%",
- "previousEntry": "Previous entry",
- "nextEntry": "Next entry",
- "accessDeniedMessage": "You do not have access to view this form's entries.",
- "executeCompleteTitle": "Executed action",
- "executeSuccessMessage": "Successfully executed action %0%",
- "executeErrorMessage": "Failed to execute action %0% due to error: %1%.",
- "entryDetails": "Entry details",
- "closeDetails": "Close details",
- "submittedOn": "Submitted on",
- "updatedOn": "Updated on",
- "fromPage": "From page",
- "member": "Member",
- "state": "State",
- "uniqueId": "Unique ID",
- "auditTrail": "Audit trail",
- "showAuditTrail": "Show audit trail",
- "hideAuditTrail": "Hide audit trail",
- "updatedBy": "Updated by",
- "updateRecordSuccess": "Record updated",
- "updateRecordError": "Record could not be updated",
- "workflowAudit": "Workflow Audit",
- "workflowAuditName": "Name",
- "workflowAuditType": "Type",
- "workflowAuditExecutedOn": "Executed On",
- "workflowAuditExecutionStage": "Stage",
- "workflowAuditResult": "Result",
- "workflowAuditTitleFormatSingular": "%0% of %1% workflow succeeded",
- "workflowAuditTitleFormatPlural": "%0% of %1% workflows succeeded",
- "workflowAuditRetry": "Retry",
- "workflowAuditRunAgain": "Run Again",
- "workflowAuditRunAnyway": "Run Anyway",
- "workflowAuditRetryConfirmTitle": "Confirmation",
- "workflowAuditRetryConfirmMessage": "Are you sure you wish to run the selected workflow?",
- "workflowAuditRetrySuccessMessage": "The workflow execution completed (see audit trail for status and consult logs for a non-successful result)",
- "workflowAuditRetryFailedMessage": "The workflow execution failed",
- "workflowAuditRetryFailedMessageDetailWorkflowNotFound": "The workflow is no longer associated with the form.",
- "workflowExecutionStageSubmitted": "Submitted",
- "workflowExecutionStageApproved": "Approved",
- "workflowExecutionStatusCompleted": "Completed",
- "workflowExecutionStatusFailed": "Failed",
- "workflowExecutionStatusNotConfigured": "Not Configured",
- "workflowExecutionStatusCancelled": "Cancelled",
- "workflowExecutionStatusSkippedDueToConditions": "Ignored By Conditions"
- },
- "formMove": {
- "title": "Select the folder to move %0% to in the tree structure below.",
- "successMessage": "%0% was moved underneath %1% .",
- "successNotificationHeader": "Moved",
- "successNotificationDescriptionForForm": "The form was moved to the selected location.",
- "successNotificationDescriptionForFolder": "The folder was moved to the selected location."
- },
- "formRename": {
- "enterNewName": "Enter the new name",
- "successNotificationHeader": "Renamed",
- "successNotificationDescriptionForFolder": "The folder was renamed."
- },
- "formConditions": {
- "title": "Conditions",
- "enableConditions": "Enable conditions",
- "actionTypeShow": "Show",
- "actionTypeHide": "Hide",
- "workflowactionTypeShow": "Run",
- "workflowactionTypeHide": "Ignore",
- "logicTypeAll": "all",
- "logicTypeAny": "any",
- "operatorIs": "is",
- "operatorIsNot": "is not",
- "operatorGreaterThen": "is greater than",
- "operatorLessThen": "is less than",
- "operatorContains": "contains",
- "operatorStartsWith": "starts with",
- "operatorEndsWith": "ends with",
- "thisFieldSetIf": "this group if",
- "thisFieldIf": "this field if",
- "buttonsForThisPageIf": "the \"next\" or \"submit\" button for this page if",
- "thisWorkflowIf": "this workflow if",
- "ofTheFollowingMatch": "of the following match",
- "selectField": "Select field",
- "addCondition": "Add condition",
- "pageConditionsDescription": "Optionally define conditions for the display of the \"Submit\" or \"Next\" button for the page.",
- "pageButtonConditionStatus": "%0% buttons for this page if %1% of the following match:",
- "fieldsetConditionStatus": "%0% this group if %1% of the following match:",
- "fieldConditionStatus": "%0% this question if %1% of the following match:",
- "empty": "empty"
- },
- "formThemes": {
- "noThemesAvailable": "No themes available. Add themes to /Views/Partials/Forms/Themes"
- },
- "formWorkflows": {
- "workflowNameLabel": "Workflow Name",
- "workflowNameDescription": "Give a descriptive name for your workflow",
- "activeLabel": "Active",
- "activeDescription": "Enable or disable the workflow",
- "includeSensitiveDataLabel": "Include Sensitive Data",
- "includeSensitiveDataDescription": "Include sensitive data when executing this workflow?",
- "submitMessage": "Submit message / Go to page",
- "approve": "Approve",
- "automatic": "automatic",
- "noWorkflowsAdded": "No workflows are added",
- "configureWorkflow": "configure workflow",
- "saveFailedTitle": "Workflow failed to save",
- "closeConfirmationTitle": "Confirmation",
- "closeConfirmationMessage": "Changes have been made which have not been saved. Are you sure you wish to close?",
- "chooseWorkflow": "Choose workflow",
- "on": "On",
- "onSubmit": "On Submit",
- "onSubmitDescription": "We will run these workflows for you when the form is submitted",
- "onApprove": "On Approve",
- "onApproveDescription": "These workflows will run when the entry is approved",
- "onApproveAutomaticDescription": "this happens automatically after the submit event with the current form settings",
- "defaultWorkflowName": "Submit message / Go to page",
- "defaultWorkflowDescription": "Show a message when the form is submitted or go to an Umbraco page",
- "addWorkflow": "Add workflow",
- "messageOnSubmit": "Message on submit",
- "messageOnSubmitDescription": "Show a message when the form is submitted",
- "messageOnSubmitIsHtmlToggleTextOn": "Format message in rich text",
- "messageOnSubmitIsHtmlToggleTextOff": "Format message in plain text",
- "goToPage": "Go to page",
- "goToPageDescription": "Go to an Umbraco page when the form is submitted"
- },
- "fieldSetColumns": {
- "title": "Columns",
- "setNumber": "Set how many columns you wish to have in your group.",
- "columnNumberDescription": "This group currently has %0%.",
- "addColumn": "Add column"
- },
- "fieldSettings": {
- "namePlaceholder": "Enter question...",
- "descriptionPlaceholder": "Enter help text...",
- "requiredLabel": "Required label",
- "chooseAnswerType": "Choose answer type",
- "sensitiveData": "Sensitive data",
- "sensitiveDataDescription": "Prevent the data from being viewed and exported if a user doesn't have sufficient permissions.",
- "sensitiveDataLabel": "Yes, this field stores sensitive data",
- "allowedFileUploadTypes": "Allowed file upload types",
- "prevalues": "Prevalues",
- "prevaluesProvideWithSources": "Either provide here a list of options (prevalues) specific for this field, or select a predefined prevalue source.",
- "prevaluesProvide": "Provides a list of options (prevalues) for the field.",
- "prevaluesItems": "Items",
- "prevaluesSource": "Prevalue source",
- "pressEnterToAdd": "Press enter to add a value",
- "settings": "Settings",
- "mandatory": "Mandatory",
- "enterRegex": "Enter a regular expression",
- "invalidPlaceholder": "Enter a field invalid message...",
- "allowMultipleFileUploads": "Allow multiple file uploads",
- "multipleFilesToggleTextOn": "Multiple files allowed",
- "multipleFilesToggleTextOff": "Single file only"
- },
- "formSettings": {
- "storeRecords": "Store Records",
- "storeRecordsDescription": "\n Check this box to save submitted records in a database.\n This will allow you to view and export them from the queries overview.\n If you don't want to store data (due to policies in your organization), leave the box un-checked.\n ",
- "storeRecordsConfirm": "Yes, keep submitted records in a database so they can be viewed and exported later.",
- "captions": "Captions",
- "captionsDescription": "Change the captions for the Submit, Next and Previous buttons.",
- "captionSubmitButton": "'Submit' button label",
- "captionNextButton": "'Next' button label",
- "captionPreviousButton": "'Previous' button label",
- "styling": "Styling",
- "stylingDescription": "Add one or more classes to wrap your form to enable custom styling, or disable default styling.",
- "formCssClass": "Form CSS class",
- "disableDefaultStylesheet": "Disable default stylesheet",
- "validation": "Validation",
- "validationDescription": "Provide better validation messages, hide validation labels and change or disable the required/mandatory marker.",
- "mandatoryErrorMessage": "Mandatory Error Message",
- "mandatoryErrorMessageDescription": "Message to display when a mandatory field was left empty",
- "invalidErrorMessage": "Invalid Error Message",
- "invalidErrorMessageDescription": "Message to display when a field is invalid",
- "showValidationSummary": "Show validation summary",
- "hideFieldValidationLabels": "Hide field validation labels",
- "markFields": "Mark fields",
- "markFieldsNoIndicator": "No Indicator",
- "markMandatoryFields": "Mark Mandatory Fields",
- "markOptionalFields": "Mark Optional Fields",
- "indicator": "Indicator",
- "changeIndicatorSymbol": "Change the mandatory indicator symbol",
- "autocomplete": "Autocomplete",
- "autocompleteDescription": "Add an attribute to control the overall form's autocompletion behaviour.",
- "autocompleteNone": "None",
- "autocompleteOn": "On",
- "autocompleteOff": "Off",
- "moderation": "Moderation",
- "moderationDescription": "Allow form submissions to be post moderated. Most use cases are for publicly shown entries such as blog post comments or submissions for a social campaign.",
- "enablePostModeration": "Enable post moderation",
- "fieldsDisplayed": "Fields displayed",
- "fieldsDisplayedDescription": "Select which fields are displayed in the list of form entries.",
- "displayDefaultFields": "Display default fields",
- "displayDefaultFieldsDescription": "By default, the values provided for the first three fields of the form are displayed, along with some system fields.",
- "formFields": "Form fields",
- "systemFields": "System fields",
- "noSelectedDisplayFields": "No fields have been selected for display.",
- "resetDisplayDefaultFieldsMessage": "Are you sure you wish to return to the default field selection for display? The custom fields you have selected will be removed when the form is saved.",
- "dataRetention": "Data retention",
- "dataRetentionDescription": "Define how long form submissions are kept for before they are automatically deleted.",
- "dataRetentionForSubmittedRecords": "Number of days to retain submitted records",
- "dataRetentionForApprovedRecords": "Number of days to retain approved records",
- "dataRetentionRetainSubmittedRecords": "Retain submitted records forever",
- "dataRetentionRetainApprovedRecords": "Retain approved records forever",
- "scheduledRecordDeletionNotEnabled": "The scheduled record deletion service is not currently enabled. These settings will not take effect until it is enabled and running."
- },
- "formSecurity": {
- "saveSuccessTitle": "User form security saved",
- "saveErrorTitle": "User form security failed to save",
- "manageFormsLabel": "Manage Forms",
- "manageFormsDescription": "Grant or deny access to managing forms",
- "manageWorkflowsLabel": "Manage Workflows",
- "manageWorkflowsDescription": "Grant or deny access to managing all forms workflow items",
- "manageDatasourcesLabel": "Manage Data Sources",
- "manageDatasourcesDescription": "Grant or deny access to managing any data sources for all forms",
- "managePrevalueSourcesLabel": "Manage Prevalue Sources",
- "managePrevalueSourcesDescription": "Grant or deny access to managing any prevalue sources for all forms",
- "manageIndividualFormsLabel": "Form Security",
- "manageIndividualFormsDescription": "Grant or deny access to individual forms",
- "startFolders": "Start folders",
- "startFoldersDescription": "Define the root folder or folders for the user",
- "selectNewStartFolders": "Select start folders",
- "formName": "Form name",
- "hasAccess": "Has Access",
- "viewEntriesLabel": "View Entries",
- "viewEntriesDescription": "Grant or deny access to viewing of submitted entries",
- "editEntriesLabel": "Edit Entries",
- "editEntriesDescription": "Grant or deny access to editing of submitted entries",
- "deleteTitle": "Delete user security: %0%",
- "deleteUserRecordNote": "By deleting the user security record the user's permissions will be derived from the user groups that they are members of.",
- "deleteSuccessMessage": "User security record deleted.",
- "deleteFailedMessage": "User security record could not be deleted.",
- "createTitle": "Create user security",
- "createUserRecordNote": "When a user record is created it will take precedence over any permissions assigned at the user group level.",
- "selectUser": "Select user",
- "allUsersHaveRecords": "All users already have security records created.",
- "groupPermissions": "Group permissions",
- "userPermissions": "User permissions"
- },
- "formDataSources": {
- "typeDescription": "Select the type of data source",
- "createForm": "Create form",
- "formName": "Form Name",
- "selectFields": "Select fields",
- "selectFieldsDescription": "Fields from the datasource you wish to include in the form.",
- "setupForeignKeys": "Setup foreign keys",
- "setupForeignKeysDescription": "Select the value column for foreign key fields.",
- "selectType": "Select type",
- "selectTypeDescription": "Field type you wish to use for the included fields (or default value).",
- "defaultValue": "Default value",
- "deleteConfirm": "Are you sure you want to delete the data source %0%?",
- "saveSuccessTitle": "Datasource saved",
- "saveErrorTitle": "Datasource failed to save",
- "accessDeniedMessage": "You do not have access to edit datasources"
- },
- "formPrevalueSources": {
- "typeDescription": "Select the type of prevalue source",
- "deleteConfirm": "Are you sure you want to delete the prevalue source %0%?",
- "saveSuccessTitle": "Prevalue source saved",
- "saveErrorTitle": "Prevalue source failed to save",
- "accessDeniedMessage": "You do not have access to edit prevalue sources"
- },
- "formProviderFieldTypes": {
- "checkboxName": "Checkbox",
- "checkboxDescription": "Renders a checkbox.",
- "checkboxDefaultValueLabel": "Default Value",
- "checkboxDefaultValueDescription": "Enter a default value.",
- "multipleChoiceName": "Multiple choice",
- "multipleChoiceDescription": "Renders a collection of checkboxes to select multiple answers.",
- "multipleChoiceDefaultValueLabel": "Default Value",
- "multipleChoiceDefaultValueDescription": "Enter a default value.",
- "multipleChoiceShowLabelLabel": "Show Label",
- "multipleChoiceShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
- "dataConsentName": "Data Consent",
- "dataConsentDescription": "Renders a field to ask for data consent.",
- "dataConsentAcceptCopyLabel": "Accept Copy",
- "dataConsentAcceptCopyDescription": "The text used to confirm consent.",
- "dataConsentShowLabelLabel": "Show Label",
- "dataConsentShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
- "dateName": "Date",
- "dateDescription": "Renders a date picker.",
- "datePlaceholderLabel": "Placeholder",
- "datePlaceholderDescription": "Enter a placeholder value.",
- "dropdownName": "Dropdown",
- "dropdownDescription": "Renders a list of values in a dropdown",
- "dropdownDefaultValueLabel": "Default Value",
- "dropdownDefaultValueDescription": "Enter a default value.",
- "dropdownAllowMultipleSelectionsLabel": "Allow multiple selections",
- "dropdownAllowMultipleSelectionsDescription": "Indicate whether multiple selections from the list are allowed.",
- "dropdownShowLabelLabel": "Show Label",
- "dropdownShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
- "dropdownAutocompleteAttributeLabel": "Autocomplete attribute",
- "dropdownAutocompleteAttributeDescription": "Optionally enter a value for the autocomplete attribute.",
- "dropdownSelectPromptLabel": "Prompt for selection",
- "dropdownSelectPromptDescription": "Optionally provide a prompt for the user's selection.",
- "fileUploadName": "File upload",
- "fileUploadDescription": "Renders an upload field, allowing files to be uploaded.",
- "hiddenName": "Hidden",
- "hiddenDescription": "Renders a hidden field.",
- "hiddenDefaultValueLabel": "Default Value",
- "hiddenDefaultValueDescription": "Enter a default value.",
- "passwordName": "Password",
- "passwordDescription": "Renders a password field.",
- "passwordPlaceholderLabel": "Placeholder",
- "passwordPlaceholderDescription": "Enter a placeholder value.",
- "singleChoiceName": "Single choice",
- "singleChoiceDescription": "Renders a radio button list to enable a single choice answer.",
- "singleChoiceDefaultValueLabel": "Default Value",
- "singleChoiceDefaultValueDescription": "Enter a default value.",
- "singleChoiceShowLabelLabel": "Show Label",
- "singleChoiceShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
- "recaptcha2Name": "reCAPTCHA v2",
- "recaptcha2Description": "Google reCAPTCHA v2.",
- "recaptcha2ThemeLabel": "Theme",
- "recaptcha2ThemeDescription": "reCAPTCHA v2 theme.",
- "recaptcha2SizeLabel": "Size",
- "recaptcha2SizeDescription": "reCAPTCHA v2 size.",
- "recaptcha2ErrorMessageLabel": "Error message",
- "recaptcha2ErrorMessageDescription": "The error message to display when the user does not pass the reCAPTCHA check.",
- "reCAPTCHAV3WithScoreName": "reCAPTCHA v3 with score",
- "reCAPTCHAV3WithScoreDescription": "Google reCAPTCHA v3 with score threshold",
- "reCAPTCHAV3WithScoreScoreThresholdLabel": "Score threshold",
- "reCAPTCHAV3WithScoreScoreThresholdDescription": "A reCAPTCHA v3 determined score between 0 and 1, above which form submissions are accepted. A higher value will catch more spam submissions, but also increase the risk of rejections of valid entries. For most sites, 0.5 is a sensible choice..",
- "reCAPTCHAV3WithScoreScoreErrorMessageLabel": "Error message",
- "reCAPTCHAV3WithScoreScoreErrorMessageDescription": "The error message to display when the user does not pass the reCAPTCHA check.",
- "reCAPTCHAV3WithScoreScoreSaveScoreLabel": "Save score",
- "reCAPTCHAV3WithScoreScoreSaveScoreDescription": "Save the calculated score with the form submission.",
- "richTextName": "Rich text",
- "richTextDescription": "Provide some some descriptive text with formatting.",
- "richTextHtmlLabel": "Rich text",
- "richTextHtmlDescription": "Enter your formatted text",
- "titleAndDescriptionName": "Title and description",
- "titleAndDescriptionDescription": "This is used to enter some descriptive text.",
- "titleAndDescriptionCaptionLabel": "Headline",
- "titleAndDescriptionCaptionDescription": "Enter a headline.",
- "titleAndDescriptionBodyTextLabel": "Body Text",
- "titleAndDescriptionBodyTextDescription": "Enter your copy text.",
- "titleAndDescriptionCaptionTagLabel": "Headline tag",
- "titleAndDescriptionCaptionTagDescription": "Select the HTML element to use when rendering the headline.",
- "titleAndDescriptionShowLabelLabel": "Show Label",
- "titleAndDescriptionShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
- "longAnswerName": "Long answer",
- "longAnswerDescription": "Renders a textarea, designed for longer answers.",
- "longAnswerDefaultValueLabel": "Default Value",
- "longAnswerDefaultValueDescription": "Enter a default value.",
- "longAnswerPlaceholderLabel": "Placeholder",
- "longAnswerPlaceholderDescription": "Enter a placeholder value.",
- "longAnswerShowLabelLabel": "Show Label",
- "longAnswerShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
- "longAnswerAutocompleteAttributeLabel": "Autocomplete attribute",
- "longAnswerAutocompleteAttributeDescription": "Optionally enter a value for the autocomplete attribute.",
- "longAnswerNumberOfRowsLabel": "Number Of Rows",
- "longAnswerNumberOfRowsDescription": "Enter the number of rows displayed for entry.",
- "longAnswerMaximumLengthLabel": "Maximum Length",
- "longAnswerMaximumLengthDescription": "Enter the maximum number of characters accepted.",
- "shortAnswerName": "Short answer",
- "shortAnswerDescription": "Renders an text input field, for short answers.",
- "shortAnswerDefaultValueLabel": "Default Value",
- "shortAnswerDefaultValueDescription": "Enter a default value.",
- "shortAnswerPlaceholderLabel": "Placeholder",
- "shortAnswerPlaceholderDescription": "Enter a placeholder value.",
- "shortAnswerShowLabelLabel": "Show Label",
- "shortAnswerShowLabelDescription": "Indicate whether the field's label should be shown when rendering the form.",
- "shortAnswerMaximumLengthLabel": "Maximum Length",
- "shortAnswerMaximumLengthDescription": "Enter the maximum number of characters accepted.",
- "shortAnswerFieldTypeLabel": "Field Type",
- "shortAnswerFieldTypeDescription": "Select the type of information expected.",
- "shortAnswerAutocompleteAttributeLabel": "Autocomplete attribute",
- "shortAnswerAutocompleteAttributeDescription": "Optionally enter a value for the autocomplete attribute."
- },
- "formProviderWorkflows": {
- "changeRecordStateName": "Change Record State",
- "changeRecordStateDescription": "Changes the state of the record being processed when it matches a word.",
- "changeRecordStateWordsLabel": "Words",
- "changeRecordStateWordsDescription": "Comma seperated list of words to match.",
- "changeRecordStateActionLabel": "Action",
- "changeRecordStateActionDescription": "What to do if it matches.",
- "postAsXMLName": "Post as XML",
- "postAsXMLDescription": "Posts the form as XML to a URL.",
- "postAsXMLUrlLabel": "URL",
- "postAsXMLUrlDescription": "Enter the URL to post to.",
- "postAsXMLMethodLabel": "Method",
- "postAsXMLMethodDescription": "POST or GET.",
- "postAsXMLXsltFileLabel": "XSLT File",
- "postAsXMLXsltFileDescription": "Transform the XML before posting it.",
- "postAsXMLFieldsLabel": "Fields",
- "postAsXMLFieldsDescription": "Map the needed fields.",
- "postAsXMLUsernameLabel": "User",
- "postAsXMLUsernameDescription": "(optional)",
- "postAsXMLPasswordLabel": "Password",
- "postAsXMLPasswordDescription": "(optional)",
- "sendFormToURLName": "Send form to URL",
- "sendFormToURLDescription": "Sends the form to a URL, either as a HTTP POST or GET.",
- "sendFormToURLUrlLabel": "URL",
- "sendFormToURLUrlDescription": "Enter the URL to post to.",
- "sendFormToURLMethodLabel": "Method",
- "sendFormToURLMethodDescription": "POST or GET.",
- "sendFormToURLStandardFieldsLabel": "Standard Fields",
- "sendFormToURLStandardFieldsDescription": "Map any standard form information to send.",
- "sendFormToURLFieldsLabel": "Fields",
- "sendFormToURLFieldsDescription": "Map the needed fields.",
- "sendFormToURLUsernameLabel": "User",
- "sendFormToURLUsernameDescription": "(optional)",
- "sendFormToURLPasswordLabel": "Password",
- "sendFormToURLPasswordDescription": "(optional)",
- "saveAsAnXMLFileName": "Save as an XML file",
- "saveAsAnXMLFileDescription": "Saves the result of the form as an XML file via XSLT.",
- "saveAsAnXMLFilePathLabel": "Path",
- "saveAsAnXMLFilePathDescription": "Path to place the file.",
- "saveAsAnXMLFileExtensionLabel": "Extension",
- "saveAsAnXMLFileExtensionDescription": "File extension.",
- "saveAsAnXMLFileXsltFileLabel": "XSLT File",
- "saveAsAnXMLFileXsltFileDescription": "Transform the XML before saving it.",
- "saveAsUmbracoContentNodeName": "Save as Umbraco content node",
- "saveAsUmbracoContentNodeDescription": "Saves the form values as an content node using a specified document type.",
- "saveAsUmbracoContentNodeFieldsLabel": "Document Type",
- "saveAsUmbracoContentNodeFieldsDescription": "Map document type.",
- "saveAsUmbracoContentNodePublishLabel": "Publish",
- "saveAsUmbracoContentNodePublishDescription": "Publish node instantly.",
- "saveAsUmbracoContentNodeRootNodeLabel": "Save location",
- "saveAsUmbracoContentNodeRootNodeDescription": "Choose the location for where to save the created content node.",
- "sendEmailName": "Send email",
- "sendEmailDescription": "Send the result of the form to an email address.",
- "sendEmailEmailLabel": "Recipient Email",
- "sendEmailEmailDescription": "Enter the recipient email address(es).",
- "sendEmailCcEmailLabel": "CC Email",
- "sendEmailCcEmailDescription": "Enter the CC email addresses (if required).",
- "sendEmailBccEmailLabel": "BCC Email",
- "sendEmailBccEmailDescription": "Enter the BCC email addresses (if required).",
- "sendEmailSenderEmailLabel": "Sender Email",
- "sendEmailSenderEmailDescription": "Enter the sender email (if blank it will use the settings from configuration).",
- "sendEmailReplyToEmailLabel": "Reply To Email",
- "sendEmailReplyToEmailDescription": "Enter the email address to be used as the reply-to address (if required).",
- "sendEmailSubjectLabel": "Subject",
- "sendEmailSubjectDescription": "Enter the subject.",
- "sendEmailMessageLabel": "Message",
- "sendEmailMessageDescription": "Enter the introductory message.",
- "sendEmailAttachmentLabel": "Attachments",
- "sendEmailAttachmentDescription": "Attach file uploads to email.",
- "sendEmailWithTemplateRazorName": "Send email with template (Razor)",
- "sendEmailWithTemplateRazorDescription": "Send the result of the form to an email address/addresses using a Razor .cshtml template.",
- "sendEmailWithTemplateRazorEmailLabel": "Recipient Email",
- "sendEmailWithTemplateRazorEmailDescription": "Enter the recipient email address(es).",
- "sendEmailWithTemplateRazorCcEmailLabel": "CC Email",
- "sendEmailWithTemplateRazorCcEmailDescription": "Enter the CC email addresses (if required).",
- "sendEmailWithTemplateRazorBccEmailLabel": "BCC Email",
- "sendEmailWithTemplateRazorBccEmailDescription": "Enter the BCC email addresses (if required).",
- "sendEmailWithTemplateRazorSenderEmailLabel": "Sender Email",
- "sendEmailWithTemplateRazorSenderEmailDescription": "Enter the sender email (if blank it will use the settings from configuration).",
- "sendEmailWithTemplateRazorReplyToEmailLabel": "Reply To Email",
- "sendEmailWithTemplateRazorReplyToEmailDescription": "Enter the email address to be used as the reply-to address (if required).",
- "sendEmailWithTemplateRazorSubjectLabel": "Subject",
- "sendEmailWithTemplateRazorSubjectDescription": "Enter the subject.",
- "sendEmailWithTemplateRazorRazorViewFilePathLabel": "Email Template",
- "sendEmailWithTemplateRazorRazorViewFilePathDescription": "The path to the Razor view that you want to use for generating the email. Email templates are stored at /Views/Partials/Forms/Emails.",
- "sendEmailWithTemplateRazorHeaderHtmlLabel": "Header text",
- "sendEmailWithTemplateRazorHeaderHtmlDescription": "Enter formatted text to be rendered in the email header.",
- "sendEmailWithTemplateRazorFooterHtmlLabel": "Footer text",
- "sendEmailWithTemplateRazorFooterHtmlDescription": "Enter formatted text to be rendered in the email footer.",
- "sendEmailWithTemplateRazorAttachmentLabel": "Attachments",
- "sendEmailWithTemplateRazorAttachmentDescription": "Attach file uploads to email.",
- "sendXSLTTransformedEmailName": "Send XSLT transformed email",
- "sendXSLTTransformedEmailDescription": "Send the result of the form to an email address.",
- "sendXSLTTransformedEmailEmailLabel": "Recipient Email",
- "sendXSLTTransformedEmailEmailDescription": "Enter the recipient email address(es).",
- "sendXSLTTransformedEmailCcEmailLabel": "CC Email",
- "sendXSLTTransformedEmailCcEmailDescription": "Enter the CC email addresses (if required).",
- "sendXSLTTransformedEmailBccEmailLabel": "BCC Email",
- "sendXSLTTransformedEmailBccEmailDescription": "Enter the BCC email addresses (if required).",
- "sendXSLTTransformedEmailSenderEmailLabel": "Sender Email",
- "sendXSLTTransformedEmailSenderEmailDescription": "Enter the sender email (if blank it will use the settings from configuration).",
- "sendXSLTTransformedEmailReplyToEmailLabel": "Reply To Email",
- "sendXSLTTransformedEmailReplyToEmailDescription": "Enter the email address to be used as the reply-to address (if required).",
- "sendXSLTTransformedEmailSubjectLabel": "Subject",
- "sendXSLTTransformedEmailSubjectDescription": "Enter the subject.",
- "sendXSLTTransformedEmailXsltFileLabel": "XSLT File",
- "sendXSLTTransformedEmailXsltFileDescription": "Transform the XML before sending the email.",
- "slackLegacyName": "Slack (Legacy)",
- "slackLegacyDescription": "Posts the form data to a specific channel on Slack using legacy tokens.",
- "slackLegacyTokenLabel": "API Token",
- "slackLegacyTokenDescription": "Slack API token.",
- "slackLegacyChannelLabel": "Channel",
- "slackLegacyChannelDescription": "Slack channel to post to.",
- "slackLegacyUsernameLabel": "Username",
- "slackLegacyUsernameDescription": "The username or bot to post as.",
- "slackLegacyAvatarUrlLabel": "Avatar URL",
- "slackLegacyAvatarUrlDescription": "The full URL (including http/https) to the avatar image.",
- "slackName": "Slack",
- "slackDescription": "Posts the form data to a specific channel on Slack using a webhook.",
- "slackWebhookUrlLabel": "Webhook URL",
- "slackWebhookUrlDescription": "Slack Webhook URL."
- },
- "formProviderDataSources": {
- "sQLDatabaseName": "SQL Database",
- "sQLDatabaseDescription": "Connects to any OLEDB supported database table and constructs a datasource from it.",
- "sQLDatabaseConnectionLabel": "Connection String",
- "sQLDatabaseConnectionDescription": "OleDB Compatible Connection string.",
- "sQLDatabaseTableLabel": "Table Name",
- "sQLDatabaseTableDescription": "Database table name."
- },
- "formProviderPrevalueSources": {
- "dataSourceName": "DataSource",
- "dataSourceDescription": "Stores prevalues in the prevalues table.",
- "getValuesFromTextfileName": "Get values from textfile",
- "getValuesFromTextfileDescription": "Upload textfile that contains the prevalues.",
- "getValuesFromTextfileTextFileLabel": "Text File",
- "getValuesFromTextfileTextFileDescription": "File containing the prevalues (separated by linebreaks).",
- "umbracoDocumentsName": "Umbraco Documents",
- "umbracoDocumentsDescription": "Uses nodes from a specific source as preValues.",
- "umbracoDocumentsRootNodeLabel": "Root node",
- "umbracoDocumentsRootNodeDescription": "Source to fetch nodes from.",
- "umbracoDocumentsUseCurrentPageLabel": "Use current page as root",
- "umbracoDocumentsUseCurrentPageDescription": "Does not work in preview mode.",
- "umbracoDocumentsDocTypeLabel": "Document type",
- "umbracoDocumentsDocTypeDescription": "The type of nodes you would like to use.",
- "umbracoDocumentsValueFieldLabel": "Value field",
- "umbracoDocumentsValueFieldDescription": "Select which field should be used for the value of the prevalue.",
- "umbracoDocumentsListGrandChildrenLabel": "List all descendants",
- "umbracoDocumentsListGrandChildrenDescription": "Don't limit to children but also include other levels.",
- "umbracoDocumentsOrderByLabel": "Order by",
- "umbracoDocumentsOrderByDescription": "Select how the prevalue list should be ordered.",
- "sQLDatabaseName": "SQL Database",
- "sQLDatabaseDescription": "Connects to a OLEDB compatible Database Table and constructs a prevalue source from it.",
- "sQLDatabaseConnectionLabel": "Connection String",
- "sQLDatabaseConnectionDescription": "OleDB compatible connection string.",
- "sQLDatabaseConnectionStringLabel": "Connection String from configuration",
- "sQLDatabaseConnectionStringDescription": "Choose connection string (needs to be OleDB compatible).",
- "sQLDatabaseTableNameLabel": "Table Name",
- "sQLDatabaseTableNameDescription": "",
- "sQLDatabaseKeyColumnLabel": "Key Column",
- "sQLDatabaseKeyColumnDescription": "Column containing the keys.",
- "sQLDatabaseValueColumnLabel": "Value Column",
- "sQLDatabaseValueColumnDescription": "Column containing the values.",
- "sQLDatabaseCaptionColumnLabel": "Caption Column",
- "sQLDatabaseCaptionColumnDescription": "Column containing the captions.",
- "umbracoDataTypePreValueName": "Umbraco data type PreValues",
- "umbracoDataTypePreValueDescription": "Connects to an Umbraco data type and uses its pre-value collection.",
- "umbracoDataTypePreValuesDataTypeIdLabel": "Data Type",
- "umbracoDataTypePreValuesDataTypeIdDescription": "Data type to use."
- },
- "formProviderExportTypes": {
- "excelFileName": "Excel File (submitted values)",
- "excelFileDescription": "Exports all submitted values for the form to Excel, in a format useful for integration with other systems.",
- "excelFileDisplayValuesName": "Excel File (display values)",
- "excelFileDisplayValuesDescription": "Exports all values for the form to Excel, in a format useful for reviewing the data or creating a report. Captions are used for prevalue data where available.",
- "excelFileNameOsx": "Excel/Numbers File (submitted values)",
- "excelFileDescriptionOsx": "Exports all submitted values for the form to Excel/Numbers, in a format useful for integration with other systems.",
- "excelFileDisplayValuesNameOsx": "Excel/Numbers File (display values)",
- "excelFileDisplayValuesDescriptionOsx": "Exports all values for the form to Excel/Numbers, in a format useful for reviewing the data or creating a report. Captions are used for prevalue data where available.",
- "saveAllUploadedFilesInDiskStructureName": "Save All Uploaded Files (in disk structure)",
- "saveAllUploadedFilesInDiskStructureDescription": "Exports all files uploading in form submissions to a zip archive, organized as the files are stored on disk.",
- "saveAllUploadedFilesByEntryName": "Save All Uploaded Files (by entry)",
- "saveAllUploadedFilesByEntryDescription": "Exports all files uploading in form submissions to a zip archive, organized in a sub-folder per entry."
- },
- "formRecordSetActions": {
- "deleteConfirm": "Are you sure you want to delete these entries?"
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts
new file mode 100644
index 0000000000..4ceff982a4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts
@@ -0,0 +1,3219 @@
+import type { UmbTranslationsDictionary } from '@umbraco-cms/backoffice/extension-registry';
+
+export default {
+ actions: {
+ assigndomain: 'Culture and Hostnames',
+ auditTrail: 'Audit Trail',
+ browse: 'Browse Node',
+ changeDocType: 'Change Document Type',
+ changeDataType: 'Change Data Type',
+ copy: 'Copy',
+ create: 'Create',
+ export: 'Export',
+ createPackage: 'Create Package',
+ createGroup: 'Create group',
+ delete: 'Delete',
+ disable: 'Disable',
+ editContent: 'Edit content',
+ editSettings: 'Edit settings',
+ emptyrecyclebin: 'Empty recycle bin',
+ enable: 'Enable',
+ exportDocumentType: 'Export Document Type',
+ importdocumenttype: 'Import Document Type',
+ importPackage: 'Import Package',
+ liveEdit: 'Edit in Canvas',
+ logout: 'Exit',
+ move: 'Move',
+ notify: 'Notifications',
+ protect: 'Restrict Public Access',
+ publish: 'Publish',
+ unpublish: 'Unpublish',
+ refreshNode: 'Reload',
+ republish: 'Republish entire site',
+ remove: 'Remove',
+ rename: 'Rename',
+ restore: 'Restore',
+ chooseWhereToCopy: 'Choose where to copy',
+ chooseWhereToMove: 'Choose where to move',
+ chooseWhereToImport: 'Choose where to import',
+ toInTheTreeStructureBelow: 'to in the tree structure below',
+ infiniteEditorChooseWhereToCopy: 'Choose where to copy the selected item(s)',
+ infiniteEditorChooseWhereToMove: 'Choose where to move the selected item(s)',
+ wasMovedTo: 'was moved to',
+ wasCopiedTo: 'was copied to',
+ wasDeleted: 'was deleted',
+ rights: 'Permissions',
+ rollback: 'Rollback',
+ sendtopublish: 'Send To Publish',
+ sendToTranslate: 'Send To Translation',
+ setGroup: 'Set group',
+ sort: 'Sort',
+ translate: 'Translate',
+ update: 'Update',
+ setPermissions: 'Set permissions',
+ unlock: 'Unlock',
+ createblueprint: 'Create Content Template',
+ resendInvite: 'Resend Invitation',
+ deployQueueForTransfer: 'Queue for transfer',
+ deployRestore: 'Workspace restore',
+ deployTreeRestore: 'Tree restore',
+ deployPartialRestore: 'Partial restore',
+ deployTransferNow: 'Transfer now',
+ deployCompare: 'Compare',
+ },
+ actionCategories: {
+ content: 'Content',
+ administration: 'Administration',
+ structure: 'Structure',
+ other: 'Other',
+ },
+ actionDescriptions: {
+ assignDomain: 'Allow access to assign culture and hostnames',
+ auditTrail: "Allow access to view a node's history log",
+ browse: 'Allow access to view a node',
+ changeDocType: 'Allow access to change Document Type for a node',
+ copy: 'Allow access to copy a node',
+ create: 'Allow access to create nodes',
+ delete: 'Allow access to delete nodes',
+ move: 'Allow access to move a node',
+ protect: 'Allow access to set and change access restrictions for a node',
+ publish: 'Allow access to publish a node',
+ unpublish: 'Allow access to unpublish a node',
+ rights: 'Allow access to change permissions for a node',
+ rollback: 'Allow access to roll back a node to a previous state',
+ sendtopublish: 'Allow access to send a node for approval before publishing',
+ sendToTranslate: 'Allow access to send a node for translation',
+ sort: 'Allow access to change the sort order for nodes',
+ translate: 'Allow access to translate a node',
+ update: 'Allow access to save a node',
+ createblueprint: 'Allow access to create a Content Template',
+ notify: 'Allow access to setup notifications for content nodes',
+ deployQueueForTransfer: 'Allow the user to queue item(s)',
+ deployRestore: 'Allow the user to restore items for the whole workspace',
+ deployTreeRestore: 'Allow the user to restore items for a tree',
+ deployPartialRestore: 'Allow the user to partial restore items',
+ deployCompare: 'Allow the user to compare items between workspaces',
+ },
+ apps: {
+ umbContent: 'Content',
+ umbInfo: 'Info',
+ },
+ assignDomain: {
+ permissionDenied: 'Permission denied.',
+ addNew: 'Add new domain',
+ addCurrent: 'Add current domain',
+ remove: 'remove',
+ invalidNode: 'Invalid node.',
+ invalidDomain: 'One or more domains have an invalid format.',
+ duplicateDomain: 'Domain has already been assigned.',
+ language: 'Language',
+ domain: 'Domain',
+ domainCreated: "New domain '%0%' has been created",
+ domainDeleted: "Domain '%0%' is deleted",
+ domainExists: "Domain '%0%' has already been assigned",
+ domainUpdated: "Domain '%0%' has been updated",
+ orEdit: 'Edit Current Domains',
+ domainHelpWithVariants:
+ 'Valid domain names are: "example.com", "www.example.com", "example.com:8080", or "https://www.example.com/".\n Furthermore also one-level paths in domains are supported, eg. "example.com/en" or "/en".',
+ inherit: 'Inherit',
+ setLanguage: 'Culture',
+ setLanguageHelp:
+ 'Set the culture for nodes below the current node, or inherit culture from parent nodes. Will also apply \n to the current node, unless a domain below applies too.',
+ setDomains: 'Domains',
+ },
+ buttons: {
+ clearSelection: 'Clear selection',
+ select: 'Select',
+ somethingElse: 'Do something else',
+ bold: 'Bold',
+ deindent: 'Cancel Paragraph Indent',
+ formFieldInsert: 'Insert form field',
+ graphicHeadline: 'Insert graphic headline',
+ htmlEdit: 'Edit Html',
+ indent: 'Indent Paragraph',
+ italic: 'Italic',
+ justifyCenter: 'Center',
+ justifyLeft: 'Justify Left',
+ justifyRight: 'Justify Right',
+ linkInsert: 'Insert Link',
+ linkLocal: 'Insert local link (anchor)',
+ listBullet: 'Bullet List',
+ listNumeric: 'Numeric List',
+ macroInsert: 'Insert macro',
+ pictureInsert: 'Insert picture',
+ publishAndClose: 'Publish and close',
+ publishDescendants: 'Publish with descendants',
+ relations: 'Edit relations',
+ returnToList: 'Return to list',
+ save: 'Save',
+ saveAndClose: 'Save and close',
+ saveAndPublish: 'Save and publish',
+ saveToPublish: 'Send for approval',
+ saveListView: 'Save list view',
+ schedulePublish: 'Schedule',
+ saveAndPreview: 'Save and preview',
+ showPageDisabled: "Preview is disabled because there's no template assigned",
+ styleChoose: 'Choose style',
+ styleShow: 'Show styles',
+ tableInsert: 'Insert table',
+ generateModelsAndClose: 'Generate models and close',
+ saveAndGenerateModels: 'Save and generate models',
+ undo: 'Undo',
+ redo: 'Redo',
+ deleteTag: 'Delete tag',
+ confirmActionCancel: 'Cancel',
+ confirmActionConfirm: 'Confirm',
+ morePublishingOptions: 'More publishing options',
+ submitChanges: 'Submit',
+ },
+ auditTrails: {
+ atViewingFor: 'Viewing for',
+ delete: 'Content deleted',
+ unpublish: 'Content unpublished',
+ unpublishvariant: 'Content unpublished for languages: %0%',
+ publish: 'Content published',
+ publishvariant: 'Content published for languages: %0%',
+ save: 'Content saved',
+ savevariant: 'Content saved for languages: %0%',
+ move: 'Content moved',
+ copy: 'Content copied',
+ rollback: 'Content rolled back',
+ sendtopublish: 'Content sent for publishing',
+ sendtopublishvariant: 'Content sent for publishing for languages: %0%',
+ sort: 'Sort child items performed by user',
+ custom: '%0%',
+ contentversionpreventcleanup: 'Cleanup disabled for version: %0%',
+ contentversionenablecleanup: 'Cleanup enabled for version: %0%',
+ smallCopy: 'Copy',
+ smallPublish: 'Publish',
+ smallPublishVariant: 'Publish',
+ smallMove: 'Move',
+ smallSave: 'Save',
+ smallSaveVariant: 'Save',
+ smallDelete: 'Delete',
+ smallUnpublish: 'Unpublish',
+ smallUnpublishVariant: 'Unpublish',
+ smallRollBack: 'Rollback',
+ smallSendToPublish: 'Send To Publish',
+ smallSendToPublishVariant: 'Send To Publish',
+ smallSort: 'Sort',
+ smallCustom: 'Custom',
+ smallContentVersionPreventCleanup: 'Save',
+ smallContentVersionEnableCleanup: 'Save',
+ historyIncludingVariants: 'History (all variants)',
+ },
+ codefile: {
+ createFolderIllegalChars: 'The folder name cannot contain illegal characters.',
+ deleteItemFailed: 'Failed to delete item: %0%',
+ },
+ content: {
+ isPublished: 'Is Published',
+ about: 'About this page',
+ alias: 'Alias',
+ alternativeTextHelp: '(how would you describe the picture over the phone)',
+ alternativeUrls: 'Alternative Links',
+ clickToEdit: 'Click to edit this item',
+ createBy: 'Created by',
+ createByDesc: 'Original author',
+ updatedBy: 'Updated by',
+ createDate: 'Created',
+ createDateDesc: 'Date/time this document was created',
+ documentType: 'Document Type',
+ editing: 'Editing',
+ expireDate: 'Remove at',
+ itemChanged: 'This item has been changed after publication',
+ itemNotPublished: 'This item is not published',
+ lastPublished: 'Last published',
+ noItemsToShow: 'There are no items to show',
+ listViewNoItems: 'There are no items to show in the list.',
+ listViewNoContent: 'No child items have been added',
+ listViewNoMembers: 'No members have been added',
+ mediatype: 'Media Type',
+ mediaLinks: 'Link to media item(s)',
+ membergroup: 'Member Group',
+ memberrole: 'Role',
+ membertype: 'Member Type',
+ noChanges: 'No changes have been made',
+ noDate: 'No date chosen',
+ nodeName: 'Page title',
+ noMediaLink: 'This media item has no link',
+ noProperties: 'No content can be added for this item',
+ otherElements: 'Properties',
+ parentNotPublished:
+ "This document is published but is not visible because the parent '%0%' is\n unpublished\n ",
+ parentCultureNotPublished:
+ "This culture is published but is not visible because it is unpublished on\n parent '%0%'\n ",
+ parentNotPublishedAnomaly: 'This document is published but is not in the cache',
+ getUrlException: 'Could not get the URL',
+ routeError: 'This document is published but its URL would collide with content %0%',
+ routeErrorCannotRoute: 'This document is published but its URL cannot be routed',
+ publish: 'Publish',
+ published: 'Published',
+ publishedPendingChanges: 'Published (pending changes)',
+ publishStatus: 'Publication Status',
+ publishDescendantsHelp:
+ 'Publish %0% and all content items underneath and thereby making their content publicly available.',
+ publishDescendantsWithVariantsHelp:
+ 'Publish variants and variants of same type underneath and thereby making their content publicly available.',
+ releaseDate: 'Publish at',
+ unpublishDate: 'Unpublish at',
+ removeDate: 'Clear Date',
+ setDate: 'Set date',
+ sortDone: 'Sortorder is updated',
+ sortHelp:
+ 'To sort the nodes, simply drag the nodes or click one of the column headers. You can select\n multiple nodes by holding the "shift" or "control" key while selecting\n ',
+ statistics: 'Statistics',
+ titleOptional: 'Title (optional)',
+ altTextOptional: 'Alternative text (optional)',
+ captionTextOptional: 'Caption (optional)',
+ type: 'Type',
+ unpublish: 'Unpublish',
+ unpublished: 'Unpublished',
+ notCreated: 'Not created',
+ updateDate: 'Last edited',
+ updateDateDesc: 'Date/time this document was edited',
+ uploadClear: 'Remove file(s)',
+ uploadClearImageContext: 'Click here to remove the image from the media item',
+ uploadClearFileContext: 'Click here to remove the file from the media item',
+ urls: 'Link to document',
+ memberof: 'Member of group(s)',
+ notmemberof: 'Not a member of group(s)',
+ childItems: 'Child items',
+ target: 'Target',
+ scheduledPublishServerTime: 'This translates to the following time on the server:',
+ scheduledPublishDocumentation:
+ 'What does this mean? ',
+ nestedContentDeleteItem: 'Are you sure you want to delete this item?',
+ nestedContentDeleteAllItems: 'Are you sure you want to delete all items?',
+ nestedContentEditorNotSupported:
+ 'Property %0% uses editor %1% which is not supported by Nested\n Content.\n ',
+ nestedContentNoContentTypes: 'No Content Types are configured for this property.',
+ nestedContentAddElementType: 'Add Element Type',
+ nestedContentSelectElementTypeModalTitle: 'Select Element Type',
+ nestedContentGroupHelpText:
+ 'Select the group whose properties should be displayed. If left blank, the\n first group on the Element Type will be used.\n ',
+ nestedContentTemplateHelpTextPart1:
+ 'Enter an angular expression to evaluate against each item for its\n name. Use\n ',
+ nestedContentTemplateHelpTextPart2: 'to display the item index',
+ nestedContentNoGroups:
+ 'The selected element type does not contain any supported groups (tabs are not supported by this editor, either change them to groups or use the Block List editor).',
+ addTextBox: 'Add another text box',
+ removeTextBox: 'Remove this text box',
+ contentRoot: 'Content root',
+ includeUnpublished: 'Include unpublished content items.',
+ isSensitiveValue:
+ 'This value is hidden. If you need access to view this value please contact your\n website administrator.\n ',
+ isSensitiveValue_short: 'This value is hidden.',
+ languagesToPublish: 'What languages would you like to publish?',
+ languagesToSendForApproval: 'What languages would you like to send for approval?',
+ languagesToSchedule: 'What languages would you like to schedule?',
+ languagesToUnpublish:
+ 'Select the languages to unpublish. Unpublishing a mandatory language will\n unpublish all languages.\n ',
+ variantsWillBeSaved: 'All new variants will be saved.',
+ variantsToPublish: 'Which variants would you like to publish?',
+ variantsToSave: 'Choose which variants to be saved.',
+ publishRequiresVariants: 'The following variants is required for publishing to take place:',
+ notReadyToPublish: 'We are not ready to Publish',
+ readyToPublish: 'Ready to publish?',
+ readyToSave: 'Ready to Save?',
+ resetFocalPoint: 'Reset focal point',
+ sendForApproval: 'Send for approval',
+ schedulePublishHelp: 'Select the date and time to publish and/or unpublish the content item.',
+ createEmpty: 'Create new',
+ createFromClipboard: 'Paste from clipboard',
+ nodeIsInTrash: 'This item is in the Recycle Bin',
+ variantSaveNotAllowed: 'Save is not allowed',
+ variantPublishNotAllowed: 'Publish is not allowed',
+ variantSendForApprovalNotAllowed: 'Send for approval is not allowed',
+ variantScheduleNotAllowed: 'Schedule is not allowed',
+ variantUnpublishNotAllowed: 'Unpublish is not allowed',
+ },
+ blueprints: {
+ createBlueprintFrom: 'Create a new Content Template from %0% ',
+ blankBlueprint: 'Blank',
+ selectBlueprint: 'Select a Content Template',
+ createdBlueprintHeading: 'Content Template created',
+ createdBlueprintMessage: "A Content Template was created from '%0%'",
+ duplicateBlueprintMessage: 'Another Content Template with the same name already exists',
+ blueprintDescription:
+ 'A Content Template is predefined content that an editor can select to use as the\n basis for creating new content\n ',
+ },
+ media: {
+ clickToUpload: 'Click to upload',
+ orClickHereToUpload: 'or click here to choose files',
+ disallowedFileType: 'Cannot upload this file, it does not have an approved file type',
+ disallowedMediaType: "Cannot upload this file, the media type with alias '%0%' is not allowed here",
+ invalidFileName: 'Cannot upload this file, it does not have a valid file name',
+ maxFileSize: 'Max file size is',
+ mediaRoot: 'Media root',
+ moveToSameFolderFailed: 'Parent and destination folders cannot be the same',
+ createFolderFailed: 'Failed to create a folder under parent id %0%',
+ renameFolderFailed: 'Failed to rename the folder with id %0%',
+ dragAndDropYourFilesIntoTheArea: 'Drag and drop your file(s) into the area',
+ uploadNotAllowed: 'Upload is not allowed in this location.',
+ },
+ member: {
+ createNewMember: 'Create a new member',
+ allMembers: 'All Members',
+ duplicateMemberLogin: 'A member with this login already exists',
+ memberGroupNoProperties: 'Member groups have no additional properties for editing.',
+ memberHasGroup: "The member is already in group '%0%'",
+ memberHasPassword: 'The member already has a password set',
+ memberLockoutNotEnabled: 'Lockout is not enabled for this member',
+ memberNotInGroup: "The member is not in group '%0%'",
+ '2fa': 'Two-Factor Authentication',
+ },
+ contentType: {
+ copyFailed: 'Failed to copy content type',
+ moveFailed: 'Failed to move content type',
+ },
+ mediaType: {
+ copyFailed: 'Failed to copy media type',
+ moveFailed: 'Failed to move media type',
+ autoPickMediaType: 'Auto pick',
+ },
+ memberType: {
+ copyFailed: 'Failed to copy member type',
+ },
+ create: {
+ chooseNode: 'Where do you want to create the new %0%',
+ createUnder: 'Create an item under',
+ createContentBlueprint: 'Select the Document Type you want to make a content template for',
+ enterFolderName: 'Enter a folder name',
+ updateData: 'Choose a type and a title',
+ noDocumentTypes:
+ 'There are no allowed Document Types available for creating content here. You must enable these in Document Types within the Settings section, by editing the Allowed child node types under Permissions .',
+ noDocumentTypesAtRoot:
+ 'There are no Document Types available for creating content here. You must create these in Document Types within the Settings section.',
+ noDocumentTypesWithNoSettingsAccess:
+ "The selected page in the content tree doesn't allow for any pages\n to be created below it.\n ",
+ noDocumentTypesEditPermissions: 'Edit permissions for this Document Type',
+ noDocumentTypesCreateNew: 'Create a new Document Type',
+ noDocumentTypesAllowedAtRoot:
+ 'There are no allowed Document Types available for creating content here. You must enable these in Document Types within the Settings section, by changing the Allow as root option under Permissions .',
+ noMediaTypes:
+ 'There are no allowed Media Types available for creating media here. You must enable these in Media Types Types within the Settings section, by editing the Allowed child node types under Permissions .',
+ noMediaTypesWithNoSettingsAccess:
+ "The selected media in the tree doesn't allow for any other media to be\n created below it.\n ",
+ noMediaTypesEditPermissions: 'Edit permissions for this Media Type',
+ documentTypeWithoutTemplate: 'Document Type without a template',
+ documentTypeWithTemplate: 'Document Type with Template',
+ documentTypeWithTemplateDescription:
+ 'The data definition for a content page that can be created by\n editors in the content tree and is directly accessible via a URL.\n ',
+ documentType: 'Document Type',
+ documentTypeDescription:
+ 'The data definition for a content component that can be created by editors in\n the content tree and be picked on other pages but has no direct URL.\n ',
+ elementType: 'Element Type',
+ elementTypeDescription:
+ "Defines the schema for a repeating set of properties, for example, in a 'Block\n List' or 'Block Grid' property editor.\n ",
+ composition: 'Composition',
+ compositionDescription:
+ "Defines a re-usable set of properties that can be included in the definition of\n multiple other Document Types. For example, a set of 'Common Page Settings'.\n ",
+ folder: 'Folder',
+ folderDescription:
+ 'Used to organise the Document Types, Compositions and Element Types created in this\n Document Type tree.\n ',
+ newFolder: 'New folder',
+ newDataType: 'New Data Type',
+ newJavascriptFile: 'New JavaScript file',
+ newEmptyPartialView: 'New empty partial view',
+ newPartialViewMacro: 'New partial view macro',
+ newPartialViewFromSnippet: 'New partial view from snippet',
+ newPartialViewMacroFromSnippet: 'New partial view macro from snippet',
+ newPartialViewMacroNoMacro: 'New partial view macro (without macro)',
+ newStyleSheetFile: 'New style sheet file',
+ newRteStyleSheetFile: 'New Rich Text Editor style sheet file',
+ },
+ dashboard: {
+ browser: 'Browse your website',
+ dontShowAgain: '- Hide',
+ nothinghappens: "If Umbraco isn't opening, you might need to allow popups from this site",
+ openinnew: 'has opened in a new window',
+ restart: 'Restart',
+ visit: 'Visit',
+ welcome: 'Welcome',
+ },
+ prompt: {
+ stay: 'Stay',
+ discardChanges: 'Discard changes',
+ unsavedChanges: 'You have unsaved changes',
+ unsavedChangesWarning:
+ 'Are you sure you want to navigate away from this page? - you have unsaved\n changes\n ',
+ confirmListViewPublish: 'Publishing will make the selected items visible on the site.',
+ confirmListViewUnpublish:
+ 'Unpublishing will remove the selected items and all their descendants from the\n site.\n ',
+ confirmUnpublish: 'Unpublishing will remove this page and all its descendants from the site.',
+ doctypeChangeWarning:
+ 'You have unsaved changes. Making changes to the Document Type will discard the\n changes.\n ',
+ },
+ bulk: {
+ done: 'Done',
+ deletedItem: 'Deleted %0% item',
+ deletedItems: 'Deleted %0% items',
+ deletedItemOfItem: 'Deleted %0% out of %1% item',
+ deletedItemOfItems: 'Deleted %0% out of %1% items',
+ publishedItem: 'Published %0% item',
+ publishedItems: 'Published %0% items',
+ publishedItemOfItem: 'Published %0% out of %1% item',
+ publishedItemOfItems: 'Published %0% out of %1% items',
+ unpublishedItem: 'Unpublished %0% item',
+ unpublishedItems: 'Unpublished %0% items',
+ unpublishedItemOfItem: 'Unpublished %0% out of %1% item',
+ unpublishedItemOfItems: 'Unpublished %0% out of %1% items',
+ movedItem: 'Moved %0% item',
+ movedItems: 'Moved %0% items',
+ movedItemOfItem: 'Moved %0% out of %1% item',
+ movedItemOfItems: 'Moved %0% out of %1% items',
+ copiedItem: 'Copied %0% item',
+ copiedItems: 'Copied %0% items',
+ copiedItemOfItem: 'Copied %0% out of %1% item',
+ copiedItemOfItems: 'Copied %0% out of %1% items',
+ },
+ defaultdialogs: {
+ nodeNameLinkPicker: 'Link title',
+ urlLinkPicker: 'Link',
+ anchorLinkPicker: 'Anchor / querystring',
+ anchorInsert: 'Name',
+ closeThisWindow: 'Close this window',
+ confirmdelete: 'Are you sure you want to delete',
+ confirmdeleteNumberOfItems: 'Are you sure you want to delete %0% of %1% items',
+ confirmdisable: 'Are you sure you want to disable',
+ confirmremove: 'Are you sure you want to remove',
+ confirmremoveusageof: 'Are you sure you want to remove the usage of %0% ',
+ confirmlogout: 'Are you sure?',
+ confirmSure: 'Are you sure?',
+ cut: 'Cut',
+ editdictionary: 'Edit Dictionary Item',
+ editlanguage: 'Edit Language',
+ editSelectedMedia: 'Edit selected media',
+ insertAnchor: 'Insert local link',
+ insertCharacter: 'Insert character',
+ insertgraphicheadline: 'Insert graphic headline',
+ insertimage: 'Insert picture',
+ insertlink: 'Insert link',
+ insertMacro: 'Click to add a Macro',
+ inserttable: 'Insert table',
+ languagedeletewarning: 'This will delete the language',
+ languageChangeWarning:
+ 'Changing the culture for a language may be an expensive operation and will result\n in the content cache and indexes being rebuilt\n ',
+ lastEdited: 'Last Edited',
+ link: 'Link',
+ linkinternal: 'Internal link:',
+ linklocaltip: 'When using local links, insert "#" in front of link',
+ linknewwindow: 'Open in new window?',
+ macroDoesNotHaveProperties: 'This macro does not contain any properties you can edit',
+ paste: 'Paste',
+ permissionsEdit: 'Edit permissions for',
+ permissionsSet: 'Set permissions for',
+ permissionsSetForGroup: 'Set permissions for %0% for user group %1%',
+ permissionsHelp: 'Select the users groups you want to set permissions for',
+ recycleBinDeleting:
+ 'The items in the recycle bin are now being deleted. Please do not close this window\n while this operation takes place\n ',
+ recycleBinIsEmpty: 'The recycle bin is now empty',
+ recycleBinWarning: 'When items are deleted from the recycle bin, they will be gone forever',
+ regexSearchError:
+ "regexlib.com 's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.",
+ regexSearchHelp:
+ "Search for a regular expression to add validation to a form field. Example: 'email,\n 'zip-code', 'URL'.\n ",
+ removeMacro: 'Remove Macro',
+ requiredField: 'Required Field',
+ sitereindexed: 'Site is reindexed',
+ siterepublished:
+ 'The website cache has been refreshed. All publish content is now up to date. While all\n unpublished content is still unpublished\n ',
+ siterepublishHelp:
+ 'The website cache will be refreshed. All published content will be updated, while\n unpublished content will stay unpublished.\n ',
+ tableColumns: 'Number of columns',
+ tableRows: 'Number of rows',
+ thumbnailimageclickfororiginal: 'Click on the image to see full size',
+ treepicker: 'Pick item',
+ viewCacheItem: 'View Cache Item',
+ relateToOriginalLabel: 'Relate to original',
+ includeDescendants: 'Include descendants',
+ theFriendliestCommunity: 'The friendliest community',
+ linkToPage: 'Link to page',
+ openInNewWindow: 'Opens the linked document in a new window or tab',
+ linkToMedia: 'Link to media',
+ selectContentStartNode: 'Select content start node',
+ selectMedia: 'Select media',
+ selectMediaType: 'Select media type',
+ selectIcon: 'Select icon',
+ selectItem: 'Select item',
+ selectLink: 'Select link',
+ selectMacro: 'Select macro',
+ selectContent: 'Select content',
+ selectContentType: 'Select content type',
+ selectMediaStartNode: 'Select media start node',
+ selectMember: 'Select member',
+ selectMemberGroup: 'Select member group',
+ selectMemberType: 'Select member type',
+ selectNode: 'Select node',
+ selectLanguages: 'Select languages',
+ selectSections: 'Select sections',
+ selectUser: 'Select user',
+ selectUsers: 'Select users',
+ noIconsFound: 'No icons were found',
+ noMacroParams: 'There are no parameters for this macro',
+ noMacros: 'There are no macros available to insert',
+ externalLoginProviders: 'External login providers',
+ exceptionDetail: 'Exception Details',
+ stacktrace: 'Stacktrace',
+ innerException: 'Inner Exception',
+ linkYour: 'Link your',
+ unLinkYour: 'Un-link your',
+ account: 'account',
+ selectEditor: 'Select editor',
+ selectEditorConfiguration: 'Select configuration',
+ selectSnippet: 'Select snippet',
+ variantdeletewarning:
+ 'This will delete the node and all its languages. If you only want to delete one\n language, you should unpublish the node in that language instead.\n ',
+ propertyuserpickerremovewarning: 'This will remove the user %0% .',
+ userremovewarning: 'This will remove the user %0% from the %1% group',
+ yesRemove: 'Yes, remove',
+ deleteLayout: 'You are deleting the layout',
+ deletingALayout:
+ 'Modifying layout will result in loss of data for any existing content that is based on this configuration.',
+ },
+ dictionary: {
+ importDictionaryItemHelp:
+ '\n To import a dictionary item, find the ".udt" file on your computer by clicking the\n "Import" button (you\'ll be asked for confirmation on the next screen)\n ',
+ itemDoesNotExists: 'Dictionary item does not exist.',
+ parentDoesNotExists: 'Parent item does not exist.',
+ noItems: 'There are no dictionary items.',
+ noItemsInFile: 'There are no dictionary items in this file.',
+ noItemsFound: 'There were no dictionary items found.',
+ createNew: 'Create dictionary item',
+ },
+ dictionaryItem: {
+ description: "\n Edit the different language versions for the dictionary item '%0% ' below\n ",
+ displayName: 'Culture Name',
+ changeKeyError: "\n The key '%0%' already exists.\n ",
+ overviewTitle: 'Dictionary overview',
+ },
+ examineManagement: {
+ configuredSearchers: 'Configured Searchers',
+ configuredSearchersDescription:
+ 'Shows properties and tools for any configured Searcher (i.e. such as a\n multi-index searcher)\n ',
+ fieldValues: 'Field values',
+ healthStatus: 'Health status',
+ healthStatusDescription: 'The health status of the index and if it can be read',
+ indexers: 'Indexers',
+ indexInfo: 'Index info',
+ contentInIndex: 'Content in index',
+ indexInfoDescription: 'Lists the properties of the index',
+ manageIndexes: "Manage Examine's indexes",
+ manageIndexesDescription:
+ 'Allows you to view the details of each index and provides some tools for\n managing the indexes\n ',
+ rebuildIndex: 'Rebuild index',
+ rebuildIndexWarning:
+ '\n This will cause the index to be rebuilt. \n Depending on how much content there is in your site this could take a while. \n It is not recommended to rebuild an index during times of high website traffic or when editors are editing content.\n ',
+ searchers: 'Searchers',
+ searchDescription: 'Search the index and view the results',
+ tools: 'Tools',
+ toolsDescription: 'Tools to manage the index',
+ fields: 'fields',
+ indexCannotRead: 'The index cannot be read and will need to be rebuilt',
+ processIsTakingLonger:
+ 'The process is taking longer than expected, check the Umbraco log to see if there\n have been any errors during this operation\n ',
+ indexCannotRebuild: 'This index cannot be rebuilt because it has no assigned',
+ iIndexPopulator: 'IIndexPopulator',
+ },
+ placeholders: {
+ username: 'Enter your username',
+ password: 'Enter your password',
+ confirmPassword: 'Confirm your password',
+ nameentity: 'Name the %0%...',
+ entername: 'Enter a name...',
+ enteremail: 'Enter an email...',
+ enterusername: 'Enter a username...',
+ label: 'Label...',
+ enterDescription: 'Enter a description...',
+ search: 'Type to search...',
+ filter: 'Type to filter...',
+ enterTags: 'Type to add tags (press enter after each tag)...',
+ email: 'Enter your email',
+ enterMessage: 'Enter a message...',
+ usernameHint: 'Your username is usually your email',
+ anchor: '#value or ?key=value',
+ enterAlias: 'Enter alias...',
+ generatingAlias: 'Generating alias...',
+ a11yCreateItem: 'Create item',
+ a11yEdit: 'Edit',
+ a11yName: 'Name',
+ },
+ editcontenttype: {
+ createListView: 'Create custom list view',
+ removeListView: 'Remove custom list view',
+ aliasAlreadyExists: 'A Content Type, Media Type or Member Type with this alias already exists',
+ },
+ renamecontainer: {
+ renamed: 'Renamed',
+ enterNewFolderName: 'Enter a new folder name here',
+ folderWasRenamed: '%0% was renamed to %1%',
+ },
+ editdatatype: {
+ canChangePropertyEditorHelp:
+ 'Changing a property editor on a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json.',
+ addPrevalue: 'Add prevalue',
+ dataBaseDatatype: 'Database datatype',
+ guid: 'Property editor GUID',
+ renderControl: 'Property editor',
+ rteButtons: 'Buttons',
+ rteEnableAdvancedSettings: 'Enable advanced settings for',
+ rteEnableContextMenu: 'Enable context menu',
+ rteMaximumDefaultImgSize: 'Maximum default size of inserted images',
+ rteRelatedStylesheets: 'Related stylesheets',
+ rteShowLabel: 'Show label',
+ rteWidthAndHeight: 'Width and height',
+ selectFolder: 'Select the folder to move',
+ inTheTree: 'to in the tree structure below',
+ wasMoved: 'was moved underneath',
+ hasReferencesDeleteConsequence:
+ 'Deleting %0% will delete the properties and their data from the following items',
+ acceptDeleteConsequence:
+ 'I understand this action will delete the properties and data based on this Data\n Type\n ',
+ },
+ errorHandling: {
+ errorButDataWasSaved:
+ 'Your data has been saved, but before you can publish this page there are some\n errors you need to fix first:\n ',
+ errorChangingProviderPassword:
+ 'The current membership provider does not support changing password\n (EnablePasswordRetrieval need to be true)\n ',
+ errorExistsWithoutTab: '%0% already exists',
+ errorHeader: 'There were errors:',
+ errorHeaderWithoutTab: 'There were errors:',
+ errorInPasswordFormat:
+ 'The password should be a minimum of %0% characters long and contain at least %1%\n non-alpha numeric character(s)\n ',
+ errorIntegerWithoutTab: '%0% must be an integer',
+ errorMandatory: 'The %0% field in the %1% tab is mandatory',
+ errorMandatoryWithoutTab: '%0% is a mandatory field',
+ errorRegExp: '%0% at %1% is not in a correct format',
+ errorRegExpWithoutTab: '%0% is not in a correct format',
+ },
+ errors: {
+ defaultError: 'An unknown failure has occurred',
+ concurrencyError: 'Optimistic concurrency failure, object has been modified',
+ receivedErrorFromServer: 'Received an error from the server',
+ dissallowedMediaType: 'The specified file type has been disallowed by the administrator',
+ codemirroriewarning:
+ "NOTE! Even though CodeMirror is enabled by configuration, it is disabled in\n Internet Explorer because it's not stable enough.\n ",
+ contentTypeAliasAndNameNotNull: 'Please fill both alias and name on the new property type!',
+ filePermissionsError: 'There is a problem with read/write access to a specific file or folder',
+ macroErrorLoadingPartialView: 'Error loading Partial View script (file: %0%)',
+ missingTitle: 'Please enter a title',
+ missingType: 'Please choose a type',
+ pictureResizeBiggerThanOrg:
+ "You're about to make the picture larger than the original size. Are you sure\n that you want to proceed?\n ",
+ startNodeDoesNotExists: 'Startnode deleted, please contact your administrator',
+ stylesMustMarkBeforeSelect: 'Please mark content before changing style',
+ stylesNoStylesOnPage: 'No active styles available',
+ tableColMergeLeft: 'Please place cursor at the left of the two cells you wish to merge',
+ tableSplitNotSplittable: "You cannot split a cell that hasn't been merged.",
+ propertyHasErrors: 'This property is invalid',
+ },
+ general: {
+ options: 'Options',
+ about: 'About',
+ action: 'Action',
+ actions: 'Actions',
+ add: 'Add',
+ alias: 'Alias',
+ all: 'All',
+ areyousure: 'Are you sure?',
+ back: 'Back',
+ backToOverview: 'Back to overview',
+ border: 'Border',
+ by: 'by',
+ cancel: 'Cancel',
+ cellMargin: 'Cell margin',
+ choose: 'Choose',
+ clear: 'Clear',
+ close: 'Close',
+ closewindow: 'Close Window',
+ closepane: 'Close Pane',
+ comment: 'Comment',
+ confirm: 'Confirm',
+ constrain: 'Constrain',
+ constrainProportions: 'Constrain proportions',
+ content: 'Content',
+ continue: 'Continue',
+ copy: 'Copy',
+ create: 'Create',
+ cropSection: 'Crop section',
+ database: 'Database',
+ date: 'Date',
+ default: 'Default',
+ delete: 'Delete',
+ deleted: 'Deleted',
+ deleting: 'Deleting...',
+ design: 'Design',
+ dictionary: 'Dictionary',
+ dimensions: 'Dimensions',
+ discard: 'Discard',
+ down: 'Down',
+ download: 'Download',
+ edit: 'Edit',
+ edited: 'Edited',
+ elements: 'Elements',
+ email: 'Email',
+ error: 'Error',
+ field: 'Field',
+ findDocument: 'Find',
+ first: 'First',
+ focalPoint: 'Focal point',
+ general: 'General',
+ generic: 'Generic',
+ groups: 'Groups',
+ group: 'Group',
+ height: 'Height',
+ help: 'Help',
+ hide: 'Hide',
+ history: 'History',
+ icon: 'Icon',
+ id: 'Id',
+ import: 'Import',
+ excludeFromSubFolders: 'Search only this folder',
+ info: 'Info',
+ innerMargin: 'Inner margin',
+ insert: 'Insert',
+ install: 'Install',
+ invalid: 'Invalid',
+ justify: 'Justify',
+ label: 'Label',
+ language: 'Language',
+ last: 'Last',
+ layout: 'Layout',
+ links: 'Links',
+ loading: 'Loading',
+ locked: 'Locked',
+ login: 'Login',
+ logoff: 'Log off',
+ logout: 'Logout',
+ macro: 'Macro',
+ mandatory: 'Mandatory',
+ media: 'Media',
+ message: 'Message',
+ move: 'Move',
+ name: 'Name',
+ new: 'New',
+ next: 'Next',
+ no: 'No',
+ nodeName: 'Node Name',
+ of: 'of',
+ off: 'Off',
+ ok: 'OK',
+ open: 'Open',
+ on: 'On',
+ or: 'or',
+ orderBy: 'Order by',
+ password: 'Password',
+ path: 'Path',
+ pleasewait: 'One moment please...',
+ previous: 'Previous',
+ properties: 'Properties',
+ readMore: 'Read more',
+ rebuild: 'Rebuild',
+ reciept: 'Email to receive form data',
+ recycleBin: 'Recycle Bin',
+ recycleBinEmpty: 'Your recycle bin is empty',
+ reload: 'Reload',
+ revert: 'Revert',
+ remaining: 'Remaining',
+ remove: 'Remove',
+ rename: 'Rename',
+ renew: 'Renew',
+ required: 'Required',
+ retrieve: 'Retrieve',
+ retry: 'Retry',
+ rights: 'Permissions',
+ scheduledPublishing: 'Scheduled Publishing',
+ umbracoInfo: 'Umbraco info',
+ search: 'Search',
+ searchNoResult: 'Sorry, we can not find what you are looking for.',
+ noItemsInList: 'No items have been added',
+ server: 'Server',
+ settings: 'Settings',
+ shared: 'Shared',
+ show: 'Show',
+ showPageOnSend: 'Show page on Send',
+ size: 'Size',
+ sort: 'Sort',
+ status: 'Status',
+ submit: 'Submit',
+ success: 'Success',
+ type: 'Type',
+ typeName: 'Type Name',
+ typeToSearch: 'Type to search...',
+ under: 'under',
+ up: 'Up',
+ update: 'Update',
+ upgrade: 'Upgrade',
+ upload: 'Upload',
+ url: 'URL',
+ user: 'User',
+ username: 'Username',
+ validate: 'Validate',
+ value: 'Value',
+ view: 'View',
+ welcome: 'Welcome...',
+ width: 'Width',
+ yes: 'Yes',
+ folder: 'Folder',
+ searchResults: 'Search results',
+ reorder: 'Reorder',
+ reorderDone: 'I am done reordering',
+ preview: 'Preview',
+ changePassword: 'Change password',
+ to: 'to',
+ listView: 'List view',
+ saving: 'Saving...',
+ current: 'current',
+ embed: 'Embed',
+ selected: 'selected',
+ other: 'Other',
+ articles: 'Articles',
+ videos: 'Videos',
+ avatar: 'Avatar for',
+ header: 'Header',
+ systemField: 'system field',
+ lastUpdated: 'Last Updated',
+ skipToMenu: 'Skip to menu',
+ skipToContent: 'Skip to content',
+ Deploy: 'Deploy',
+ restore: 'Restore',
+ },
+ colors: {
+ blue: 'Blue',
+ },
+ shortcuts: {
+ addTab: 'Add tab',
+ addGroup: 'Add group',
+ addProperty: 'Add property',
+ addEditor: 'Add editor',
+ addTemplate: 'Add template',
+ addChildNode: 'Add child node',
+ addChild: 'Add child',
+ editDataType: 'Edit data type',
+ navigateSections: 'Navigate sections',
+ shortcut: 'Shortcuts',
+ showShortcuts: 'show shortcuts',
+ toggleListView: 'Toggle list view',
+ toggleAllowAsRoot: 'Toggle allow as root',
+ commentLine: 'Comment/Uncomment lines',
+ removeLine: 'Remove line',
+ copyLineUp: 'Copy Lines Up',
+ copyLineDown: 'Copy Lines Down',
+ moveLineUp: 'Move Lines Up',
+ moveLineDown: 'Move Lines Down',
+ generalHeader: 'General',
+ editorHeader: 'Editor',
+ toggleAllowCultureVariants: 'Toggle allow culture variants',
+ },
+ graphicheadline: {
+ backgroundcolor: 'Background color',
+ bold: 'Bold',
+ color: 'Text color',
+ font: 'Font',
+ text: 'Text',
+ },
+ headers: {
+ page: 'Page',
+ },
+ installer: {
+ databaseErrorCannotConnect: 'The installer cannot connect to the database.',
+ databaseErrorWebConfig:
+ 'Could not save the web.config file. Please modify the connection string\n manually.\n ',
+ databaseFound: 'Your database has been found and is identified as',
+ databaseHeader: 'Database configuration',
+ databaseInstall: '\n Press the install button to install the Umbraco %0% database\n ',
+ databaseInstallDone: 'Umbraco %0% has now been copied to your database. Press Next to proceed.',
+ databaseNotFound:
+ 'Database not found! Please check that the information in the "connection string" of the "web.config" file is correct.
\n To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.
\n \n Click the retry button when\n done.\n\t\t\t More information on editing web.config here .
',
+ databaseText:
+ 'To complete this step, you must know some information regarding your database server ("connection string"). \n Please contact your ISP if necessary.\n If you\'re installing on a local machine or server you might need information from your system administrator.',
+ databaseUpgrade:
+ "\n \n Press the upgrade button to upgrade your database to Umbraco %0%
\n \n Don't worry - no content will be deleted and everything will continue working afterwards!\n
\n ",
+ databaseUpgradeDone:
+ 'Your database has been upgraded to the final version %0%. Press Next to\n proceed. ',
+ databaseUpToDate:
+ 'Your current database is up-to-date!. Click next to continue the configuration wizard',
+ defaultUserChangePass: "The Default users' password needs to be changed! ",
+ defaultUserDisabled:
+ 'The Default user has been disabled or has no access to Umbraco! No further actions needs to be taken. Click Next to proceed.',
+ defaultUserPassChanged:
+ "The Default user's password has been successfully changed since the installation!
No further actions needs to be taken. Click Next to proceed.",
+ defaultUserPasswordChanged: 'The password is changed!',
+ greatStart: 'Get a great start, watch our introduction videos',
+ licenseText:
+ 'By clicking the next button (or modifying the umbracoConfigurationStatus in web.config),\n you accept the license for this software as specified in the box below. Notice that this Umbraco distribution\n consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license\n that covers the UI.\n ',
+ None: 'Not installed yet.',
+ permissionsAffectedFolders: 'Affected files and folders',
+ permissionsAffectedFoldersMoreInfo: 'More information on setting up permissions for Umbraco here',
+ permissionsAffectedFoldersText:
+ 'You need to grant ASP.NET modify permissions to the following\n files/folders\n ',
+ permissionsAlmostPerfect:
+ 'Your permission settings are almost perfect! \n You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.',
+ permissionsHowtoResolve: 'How to Resolve',
+ permissionsHowtoResolveLink: 'Click here to read the text version',
+ permissionsHowtoResolveText:
+ 'Watch our video tutorial on setting up folder permissions for Umbraco or read the text version.',
+ permissionsMaybeAnIssue:
+ 'Your permission settings might be an issue! \n \n You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.',
+ permissionsNotReady:
+ "Your permission settings are not ready for Umbraco! \n \n In order to run Umbraco, you'll need to update your permission settings.",
+ permissionsPerfect:
+ 'Your permission settings are perfect! \n You are ready to run Umbraco and install packages!',
+ permissionsResolveFolderIssues: 'Resolving folder issue',
+ permissionsResolveFolderIssuesLink:
+ 'Follow this link for more information on problems with ASP.NET and\n creating folders\n ',
+ permissionsSettingUpPermissions: 'Setting up folder permissions',
+ permissionsText:
+ "\n Umbraco needs write/modify access to certain directories in order to store files like pictures and PDF's.\n It also stores temporary data (aka: cache) for enhancing the performance of your website.\n ",
+ runwayFromScratch: 'I want to start from scratch',
+ runwayFromScratchText:
+ '\n Your website is completely empty at the moment, so that\'s perfect if you want to start from scratch and create your own Document Types and templates.\n (learn how )\n You can still choose to install Runway later on. Please go to the Developer section and choose Packages.\n ',
+ runwayHeader: "You've just set up a clean Umbraco platform. What do you want to do next?",
+ runwayInstalled: 'Runway is installed',
+ runwayInstalledText:
+ '\n You have the foundation in place. Select what modules you wish to install on top of it. \n This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules \n ',
+ runwayOnlyProUsers: 'Only recommended for experienced users',
+ runwaySimpleSite: 'I want to start with a simple website',
+ runwaySimpleSiteText:
+ '\n
\n "Runway" is a simple website providing some basic Document Types and templates. The installer can set up Runway for you automatically,\n but you can easily edit, extend or remove it. It\'s not necessary and you can perfectly use Umbraco without it. However,\n Runway offers an easy foundation based on best practices to get you started faster than ever.\n If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.\n
\n \n Included with Runway: Home page, Getting Started page, Installing Modules page. \n Optional Modules: Top Navigation, Sitemap, Contact, Gallery.\n \n ',
+ runwayWhatIsRunway: 'What is Runway',
+ step1: 'Step 1/5 Accept license',
+ step2: 'Step 2/5: Database configuration',
+ step3: 'Step 3/5: Validating File Permissions',
+ step4: 'Step 4/5: Check Umbraco security',
+ step5: 'Step 5/5: Umbraco is ready to get you started',
+ thankYou: 'Thank you for choosing Umbraco',
+ theEndBrowseSite: 'Browse your new site \nYou installed Runway, so why not see how your new website looks.',
+ theEndFurtherHelp:
+ 'Further help and information \nGet help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology',
+ theEndHeader: 'Umbraco %0% is installed and ready for use',
+ theEndInstallFailed:
+ "To finish the installation, you'll need to\n manually edit the /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%' .",
+ theEndInstallSuccess:
+ 'You can get started instantly by clicking the "Launch Umbraco" button below. If you are new to Umbraco ,\nyou can find plenty of resources on our getting started pages.',
+ theEndOpenUmbraco:
+ 'Launch Umbraco \nTo manage your website, simply open the Umbraco backoffice and start adding content, updating the templates and stylesheets or add new functionality',
+ Unavailable: 'Connection to database failed.',
+ Version3: 'Umbraco Version 3',
+ Version4: 'Umbraco Version 4',
+ watch: 'Watch',
+ welcomeIntro:
+ 'This wizard will guide you through the process of configuring Umbraco %0% for a fresh install or upgrading from version 3.0.\n \n Press "next" to start the wizard.',
+ },
+ language: {
+ cultureCode: 'Culture Code',
+ displayName: 'Culture Name',
+ },
+ lockout: {
+ lockoutWillOccur: "You've been idle and logout will automatically occur in",
+ renewSession: 'Renew now to save your work',
+ },
+ main: {
+ dashboard: 'Dashboard',
+ sections: 'Sections',
+ tree: 'Content',
+ },
+ moveOrCopy: {
+ choose: 'Choose page above...',
+ copyDone: '%0% has been copied to %1%',
+ copyTo: 'Select where the document %0% should be copied to below',
+ moveDone: '%0% has been moved to %1%',
+ moveTo: 'Select where the document %0% should be moved to below',
+ nodeSelected: "has been selected as the root of your new content, click 'ok' below.",
+ noNodeSelected: "No node selected yet, please select a node in the list above before clicking 'ok'",
+ notAllowedByContentType: 'The current node is not allowed under the chosen node because of its type',
+ notAllowedByPath:
+ 'The current node cannot be moved to one of its subpages neither can the parent and destination be the same',
+ notAllowedAtRoot: 'The current node cannot exist at the root',
+ notValid:
+ "The action isn't allowed since you have insufficient permissions on 1 or more child\n documents.\n ",
+ relateToOriginal: 'Relate copied items to original',
+ },
+ notifications: {
+ editNotifications: 'Select your notification for %0% ',
+ notificationsSavedFor: 'Notification settings saved for',
+ notifications: 'Notifications',
+ },
+ packager: {
+ actions: 'Actions',
+ created: 'Created',
+ createPackage: 'Create package',
+ chooseLocalPackageText:
+ '\n Choose Package from your machine, by clicking the Browse \n button and locating the package. Umbraco packages usually have a ".umb" or ".zip" extension.\n ',
+ deletewarning: 'This will delete the package',
+ includeAllChildNodes: 'Include all child nodes',
+ installed: 'Installed',
+ installedPackages: 'Installed packages',
+ installInstructions: 'Install instructions',
+ noConfigurationView: 'This package has no configuration view',
+ noPackagesCreated: 'No packages have been created yet',
+ noPackages: 'No packages have been installed',
+ noPackagesDescription:
+ "Browse through the available packages using the 'Packages' icon in the top right of your screen",
+ packageContent: 'Package Content',
+ packageLicense: 'License',
+ packageSearch: 'Search for packages',
+ packageSearchResults: 'Results for',
+ packageNoResults: 'We couldn’t find anything for',
+ packageNoResultsDescription: 'Please try searching for another package or browse through the categories\n ',
+ packagesPopular: 'Popular',
+ packagesPromoted: 'Promoted',
+ packagesNew: 'New releases',
+ packageHas: 'has',
+ packageKarmaPoints: 'karma points',
+ packageInfo: 'Information',
+ packageOwner: 'Owner',
+ packageContrib: 'Contributors',
+ packageCreated: 'Created',
+ packageCurrentVersion: 'Current version',
+ packageNetVersion: '.NET version',
+ packageDownloads: 'Downloads',
+ packageLikes: 'Likes',
+ packageCompatibility: 'Compatibility',
+ packageCompatibilityDescription:
+ 'This package is compatible with the following versions of Umbraco, as\n reported by community members. Full compatability cannot be guaranteed for versions reported below 100%\n ',
+ packageExternalSources: 'External sources',
+ packageAuthor: 'Author',
+ packageDocumentation: 'Documentation',
+ packageMetaData: 'Package meta data',
+ packageName: 'Package name',
+ packageNoItemsHeader: "Package doesn't contain any items",
+ packageNoItemsText:
+ 'This package file doesn\'t contain any items to uninstall. \n You can safely remove this from the system by clicking "uninstall package" below.',
+ packageOptions: 'Package options',
+ packageMigrationsRun: 'Run pending package migrations',
+ packageMigrationsComplete: 'Package migrations have successfully completed.',
+ packageMigrationsNonePending: 'All package migrations have successfully completed.',
+ packageReadme: 'Package readme',
+ packageRepository: 'Package repository',
+ packageUninstallConfirm: 'Confirm package uninstall',
+ packageUninstalledHeader: 'Package was uninstalled',
+ packageUninstalledText: 'The package was successfully uninstalled',
+ packageUninstallHeader: 'Uninstall package',
+ packageUninstallText:
+ 'You can unselect items you do not wish to remove, at this time, below. When you click "confirm uninstall" all checked-off items will be removed. \n Notice: any documents, media etc depending on the items you remove, will stop working, and could lead to system instability,\n so uninstall with caution. If in doubt, contact the package author.',
+ packageVersion: 'Package version',
+ verifiedToWorkOnUmbracoCloud: 'Verified to work on Umbraco Cloud',
+ },
+ paste: {
+ doNothing: 'Paste with full formatting (Not recommended)',
+ errorMessage:
+ "The text you're trying to paste contains special characters or formatting. This could be\n caused by copying text from Microsoft Word. Umbraco can remove special characters or formatting automatically, so\n the pasted content will be more suitable for the web.\n ",
+ removeAll: 'Paste as raw text without any formatting at all',
+ removeSpecialFormattering: 'Paste, but remove formatting (Recommended)',
+ },
+ publicAccess: {
+ paGroups: 'Group based protection',
+ paGroupsHelp: 'If you want to grant access to all members of specific member groups',
+ paGroupsNoGroups: 'You need to create a member group before you can use group based authentication',
+ paErrorPage: 'Error Page',
+ paErrorPageHelp: 'Used when people are logged on, but do not have access',
+ paHowWould: 'Choose how to restrict access to the page %0% ',
+ paIsProtected: '%0% is now protected',
+ paIsRemoved: 'Protection removed from %0% ',
+ paLoginPage: 'Login Page',
+ paLoginPageHelp: 'Choose the page that contains the login form',
+ paRemoveProtection: 'Remove protection...',
+ paRemoveProtectionConfirm: 'Are you sure you want to remove the protection from the page %0% ?',
+ paSelectPages: 'Select the pages that contain login form and error messages',
+ paSelectGroups: 'Select the groups who have access to the page %0% ',
+ paSelectMembers: 'Select the members who have access to the page %0% ',
+ paMembers: 'Specific members protection',
+ paMembersHelp: 'If you wish to grant access to specific members',
+ },
+ publish: {
+ invalidPublishBranchPermissions: 'Insufficient user permissions to publish all descendant documents',
+ contentPublishedFailedIsTrashed: '\n %0% could not be published because the item is in the recycle bin.\n ',
+ contentPublishedFailedAwaitingRelease:
+ '\n %0% could not be published because the item is scheduled for release.\n ',
+ contentPublishedFailedExpired: '\n %0% could not be published because the item has expired.\n ',
+ contentPublishedFailedInvalid:
+ '\n %0% could not be published because some properties did not pass validation rules.\n ',
+ contentPublishedFailedByEvent: '\n %0% could not be published, a 3rd party add-in cancelled the action.\n ',
+ contentPublishedFailedByParent: '\n %0% can not be published, because a parent page is not published.\n ',
+ contentPublishedFailedByMissingName: '%0% can not be published, because its missing a name.',
+ contentPublishedFailedReqCultureValidationError:
+ "Validation failed for required language '%0%'. This\n language was saved but not published.\n ",
+ inProgress: 'Publishing in progress - please wait...',
+ inProgressCounter: '%0% out of %1% pages have been published...',
+ nodePublish: '%0% has been published',
+ nodePublishAll: '%0% and subpages have been published',
+ publishAll: 'Publish %0% and all its subpages',
+ publishHelp:
+ 'Click Publish to publish %0% and thereby making its content publicly available. \n You can publish this page and all its subpages by checking Include unpublished subpages below.\n ',
+ },
+ colorpicker: {
+ noColors: 'You have not configured any approved colors',
+ },
+ contentPicker: {
+ allowedItemTypes: 'You can only select items of type(s): %0%',
+ pickedTrashedItem: 'You have picked a content item currently deleted or in the recycle bin',
+ pickedTrashedItems: 'You have picked content items currently deleted or in the recycle bin',
+ },
+ mediaPicker: {
+ deletedItem: 'Deleted item',
+ pickedTrashedItem: 'You have picked a media item currently deleted or in the recycle bin',
+ pickedTrashedItems: 'You have picked media items currently deleted or in the recycle bin',
+ trashed: 'Trashed',
+ openMedia: 'Open in Media Library',
+ changeMedia: 'Change Media Item',
+ editMediaEntryLabel: 'Edit %0% on %1%',
+ confirmCancelMediaEntryCreationHeadline: 'Discard creation?',
+ confirmCancelMediaEntryCreationMessage: 'Are you sure you want to cancel the creation.',
+ confirmCancelMediaEntryHasChanges:
+ 'You have made changes to this content. Are you sure you want to\n discard them?\n ',
+ confirmRemoveAllMediaEntryMessage: 'Remove all medias?',
+ tabClipboard: 'Clipboard',
+ notAllowed: 'Not allowed',
+ openMediaPicker: 'Open media picker',
+ },
+ propertyEditorPicker: {
+ title: 'Select Property Editor',
+ openPropertyEditorPicker: 'Select Property Editor',
+ },
+ relatedlinks: {
+ enterExternal: 'enter external link',
+ chooseInternal: 'choose internal page',
+ caption: 'Caption',
+ link: 'Link',
+ newWindow: 'Open in new window',
+ captionPlaceholder: 'enter the display caption',
+ externalLinkPlaceholder: 'Enter the link',
+ },
+ imagecropper: {
+ reset: 'Reset crop',
+ updateEditCrop: 'Done',
+ undoEditCrop: 'Undo edits',
+ customCrop: 'User defined',
+ },
+ rollback: {
+ changes: 'Changes',
+ created: 'Created',
+ headline: 'Select a version to compare with the current version',
+ currentVersion: 'Current version',
+ diffHelp:
+ 'This shows the differences between the current (draft) version and the selected versionRed text will be removed in the selected version, green text will be added',
+ noDiff: 'There are no differences between the current (draft) version and the selected version',
+ documentRolledBack: 'Document has been rolled back',
+ htmlHelp:
+ 'This displays the selected version as HTML, if you wish to see the difference between 2\n versions at the same time, use the diff view\n ',
+ rollbackTo: 'Rollback to',
+ selectVersion: 'Select version',
+ view: 'View',
+ pagination: 'Showing version %0% to %1% of %2% versions',
+ versions: 'Versions',
+ currentDraftVersion: 'Current draft version',
+ currentPublishedVersion: 'Current published version',
+ },
+ scripts: {
+ editscript: 'Edit script file',
+ },
+ sections: {
+ content: 'Content',
+ forms: 'Forms',
+ media: 'Media',
+ member: 'Members',
+ packages: 'Packages',
+ marketplace: 'Marketplace',
+ settings: 'Settings',
+ translation: 'Translation',
+ users: 'Users',
+ deploy: 'Deploy',
+ deployOpenPortal: 'Deploy',
+ deployHelpAndDocumentation: 'Help and documentation',
+ deployOpenQueue: 'Open transfer queue',
+ deployGettingStarted: 'Getting Started',
+ deploySetupProject: 'Set up a Project',
+ deployDeployment: 'Deployment',
+ deployTroubleshooting: 'Troubleshooting',
+ },
+ help: {
+ tours: 'Tours',
+ theBestUmbracoVideoTutorials: 'The best Umbraco video tutorials',
+ umbracoForum: 'Visit our.umbraco.com',
+ umbracoTv: 'Visit umbraco.tv',
+ umbracoLearningBase: 'Watch our free tutorial videos',
+ umbracoLearningBaseDescription: 'on the Umbraco Learning Base',
+ },
+ settings: {
+ defaulttemplate: 'Default template',
+ importDocumentTypeHelp:
+ 'To import a Document Type, find the ".udt" file on your computer by clicking the\n "Import" button (you\'ll be asked for confirmation on the next screen)\n ',
+ newtabname: 'New Tab Title',
+ nodetype: 'Node type',
+ objecttype: 'Type',
+ stylesheet: 'Stylesheet',
+ script: 'Script',
+ tab: 'Tab',
+ tabname: 'Tab Title',
+ tabs: 'Tabs',
+ contentTypeEnabled: 'Master Content Type enabled',
+ contentTypeUses: 'This Content Type uses',
+ noPropertiesDefinedOnTab:
+ 'No properties defined on this tab. Click on the "add a new property" link at\n the top to create a new property.\n ',
+ createMatchingTemplate: 'Create matching template',
+ addIcon: 'Add icon',
+ },
+ sort: {
+ sortOrder: 'Sort order',
+ sortCreationDate: 'Creation date',
+ sortDone: 'Sorting complete.',
+ sortHelp:
+ 'Drag the different items up or down below to set how they should be arranged. Or click the\n column headers to sort the entire collection of items\n ',
+ sortPleaseWait: 'Please wait. Items are being sorted, this can take a while.',
+ sortEmptyState: 'This node has no child nodes to sort',
+ },
+ speechBubbles: {
+ validationFailedHeader: 'Validation',
+ validationFailedMessage: 'Validation errors must be fixed before the item can be saved',
+ operationFailedHeader: 'Failed',
+ operationSavedHeader: 'Saved',
+ operationSavedHeaderReloadUser: 'Saved. To view the changes please reload your browser',
+ invalidUserPermissionsText: 'Insufficient user permissions, could not complete the operation',
+ operationCancelledHeader: 'Cancelled',
+ operationCancelledText: 'Operation was cancelled by a 3rd party add-in',
+ folderUploadNotAllowed:
+ 'This file is being uploaded as part of a folder, but creating a new folder is not allowed here',
+ folderCreationNotAllowed: 'Creating a new folder is not allowed here',
+ contentTypeDublicatePropertyType: 'Property type already exists',
+ contentTypePropertyTypeCreated: 'Property type created',
+ contentTypePropertyTypeCreatedText: 'Name: %0% DataType: %1%',
+ contentTypePropertyTypeDeleted: 'Propertytype deleted',
+ contentTypeSavedHeader: 'Document Type saved',
+ contentTypeTabCreated: 'Tab created',
+ contentTypeTabDeleted: 'Tab deleted',
+ contentTypeTabDeletedText: 'Tab with id: %0% deleted',
+ cssErrorHeader: 'Stylesheet not saved',
+ cssSavedHeader: 'Stylesheet saved',
+ cssSavedText: 'Stylesheet saved without any errors',
+ dataTypeSaved: 'Datatype saved',
+ dictionaryItemSaved: 'Dictionary item saved',
+ editContentPublishedHeader: 'Content published',
+ editContentPublishedText: 'and is visible on the website',
+ editMultiContentPublishedText: '%0% documents published and visible on the website',
+ editVariantPublishedText: '%0% published and visible on the website',
+ editMultiVariantPublishedText: '%0% documents published for languages %1% and visible on the website',
+ editBlueprintSavedHeader: 'Content Template saved',
+ editBlueprintSavedText: 'Changes have been successfully saved',
+ editContentSavedHeader: 'Content saved',
+ editContentSavedText: 'Remember to publish to make changes visible',
+ editContentScheduledSavedText: 'A schedule for publishing has been updated',
+ editVariantSavedText: '%0% saved',
+ editContentSendToPublish: 'Sent For Approval',
+ editContentSendToPublishText: 'Changes have been sent for approval',
+ editVariantSendToPublishText: '%0% changes have been sent for approval',
+ editMediaSaved: 'Media saved',
+ editMediaSavedText: 'Media saved without any errors',
+ editMemberSaved: 'Member saved',
+ editStylesheetPropertySaved: 'Stylesheet Property Saved',
+ editStylesheetSaved: 'Stylesheet saved',
+ editTemplateSaved: 'Template saved',
+ editUserError: 'Error saving user (check log)',
+ editUserSaved: 'User Saved',
+ editUserTypeSaved: 'User type saved',
+ editUserGroupSaved: 'User group saved',
+ editCulturesAndHostnamesSaved: 'Cultures and hostnames saved',
+ editCulturesAndHostnamesError: 'Error saving cultures and hostnames',
+ fileErrorHeader: 'File not saved',
+ fileErrorText: 'file could not be saved. Please check file permissions',
+ fileSavedHeader: 'File saved',
+ fileSavedText: 'File saved without any errors',
+ languageSaved: 'Language saved',
+ mediaTypeSavedHeader: 'Media Type saved',
+ memberTypeSavedHeader: 'Member Type saved',
+ memberGroupSavedHeader: 'Member Group saved',
+ memberGroupNameDuplicate: 'Another Member Group with the same name already exists',
+ templateErrorHeader: 'Template not saved',
+ templateErrorText: 'Please make sure that you do not have 2 templates with the same alias',
+ templateSavedHeader: 'Template saved',
+ templateSavedText: 'Template saved without any errors!',
+ contentUnpublished: 'Content unpublished',
+ contentCultureUnpublished: 'Content variation %0% unpublished',
+ contentMandatoryCultureUnpublished:
+ "The mandatory language '%0%' was unpublished. All languages for this\n content item are now unpublished.\n ",
+ partialViewSavedHeader: 'Partial view saved',
+ partialViewSavedText: 'Partial view saved without any errors!',
+ partialViewErrorHeader: 'Partial view not saved',
+ partialViewErrorText: 'An error occurred saving the file.',
+ permissionsSavedFor: 'Permissions saved for',
+ deleteUserGroupsSuccess: 'Deleted %0% user groups',
+ deleteUserGroupSuccess: '%0% was deleted',
+ enableUsersSuccess: 'Enabled %0% users',
+ disableUsersSuccess: 'Disabled %0% users',
+ enableUserSuccess: '%0% is now enabled',
+ disableUserSuccess: '%0% is now disabled',
+ setUserGroupOnUsersSuccess: 'User groups have been set',
+ unlockUsersSuccess: 'Unlocked %0% users',
+ unlockUserSuccess: '%0% is now unlocked',
+ memberExportedSuccess: 'Member was exported to file',
+ memberExportedError: 'An error occurred while exporting the member',
+ deleteUserSuccess: 'User %0% was deleted',
+ resendInviteHeader: 'Invite user',
+ resendInviteSuccess: 'Invitation has been re-sent to %0%',
+ contentReqCulturePublishError: "Cannot publish the document since the required '%0%' is not published\n ",
+ contentCultureValidationError: "Validation failed for language '%0%'",
+ documentTypeExportedSuccess: 'Document Type was exported to file',
+ documentTypeExportedError: 'An error occurred while exporting the Document Type',
+ dictionaryItemExportedSuccess: 'Dictionary item(s) was exported to file',
+ dictionaryItemExportedError: 'An error occurred while exporting the dictionary item(s)',
+ dictionaryItemImported: 'The following dictionary item(s) has been imported!',
+ scheduleErrReleaseDate1: 'The release date cannot be in the past',
+ scheduleErrReleaseDate2:
+ "Cannot schedule the document for publishing since the required '%0%' is not\n published\n ",
+ scheduleErrReleaseDate3:
+ "Cannot schedule the document for publishing since the required '%0%' has a\n publish date later than a non mandatory language\n ",
+ scheduleErrExpireDate1: 'The expire date cannot be in the past',
+ scheduleErrExpireDate2: 'The expire date cannot be before the release date',
+ publishWithNoDomains:
+ 'Domains are not configured for multilingual site, please contact an administrator,\n see log for more information\n ',
+ publishWithMissingDomain:
+ 'There is no domain configured for %0%, please contact an administrator, see\n log for more information\n ',
+ preventCleanupEnableError: 'An error occurred while enabling version cleanup for %0%',
+ preventCleanupDisableError: 'An error occurred while disabling version cleanup for %0%',
+ copySuccessMessage: 'Your system information has successfully been copied to the clipboard',
+ cannotCopyInformation: 'Could not copy your system information to the clipboard',
+ },
+ stylesheet: {
+ addRule: 'Add style',
+ editRule: 'Edit style',
+ editorRules: 'Rich text editor styles',
+ editorRulesHelp:
+ 'Define the styles that should be available in the rich text editor for this\n stylesheet\n ',
+ editstylesheet: 'Edit stylesheet',
+ editstylesheetproperty: 'Edit stylesheet property',
+ nameHelp: 'The name displayed in the editor style selector',
+ preview: 'Preview',
+ previewHelp: 'How the text will look like in the rich text editor.',
+ selector: 'Selector',
+ selectorHelp: 'Uses CSS syntax, e.g. "h1" or ".redHeader"',
+ styles: 'Styles',
+ stylesHelp: 'The CSS that should be applied in the rich text editor, e.g. "color:red;"',
+ tabCode: 'Code',
+ tabRules: 'Rich Text Editor',
+ },
+ template: {
+ runtimeModeProduction: 'Content is not editable when using runtime mode Production.',
+ deleteByIdFailed: 'Failed to delete template with ID %0%',
+ edittemplate: 'Edit template',
+ insertSections: 'Sections',
+ insertContentArea: 'Insert content area',
+ insertContentAreaPlaceHolder: 'Insert content area placeholder',
+ insert: 'Insert',
+ insertDesc: 'Choose what to insert into your template',
+ insertDictionaryItem: 'Dictionary item',
+ insertDictionaryItemDesc:
+ 'A dictionary item is a placeholder for a translatable piece of text, which\n makes it easy to create designs for multilingual websites.\n ',
+ insertMacro: 'Macro',
+ insertMacroDesc:
+ '\n A Macro is a configurable component which is great for\n reusable parts of your design, where you need the option to provide parameters,\n such as galleries, forms and lists.\n ',
+ insertPageField: 'Value',
+ insertPageFieldDesc:
+ 'Displays the value of a named field from the current page, with options to modify\n the value or fallback to alternative values.\n ',
+ insertPartialView: 'Partial view',
+ insertPartialViewDesc:
+ "\n A partial view is a separate template file which can be rendered inside another\n template, it's great for reusing markup or for separating complex templates into separate files.\n ",
+ mastertemplate: 'Master template',
+ noMaster: 'No master',
+ renderBody: 'Render child template',
+ renderBodyDesc:
+ '\n Renders the contents of a child template, by inserting a\n @RenderBody() placeholder.\n ',
+ defineSection: 'Define a named section',
+ defineSectionDesc:
+ '\n Defines a part of your template as a named section by wrapping it in\n @section { ... }. This can be rendered in a\n specific area of the parent of this template, by using @RenderSection.\n ',
+ renderSection: 'Render a named section',
+ renderSectionDesc:
+ '\n Renders a named area of a child template, by inserting a @RenderSection(name) placeholder.\n This renders an area of a child template which is wrapped in a corresponding @section [name]{ ... } definition.\n ',
+ sectionName: 'Section Name',
+ sectionMandatory: 'Section is mandatory',
+ sectionMandatoryDesc:
+ '\n If mandatory, the child template must contain a @section definition, otherwise an error is shown.\n ',
+ queryBuilder: 'Query builder',
+ itemsReturned: 'items returned, in',
+ iWant: 'I want',
+ allContent: 'all content',
+ contentOfType: 'content of type "%0%"',
+ from: 'from',
+ websiteRoot: 'my website',
+ where: 'where',
+ and: 'and',
+ is: 'is',
+ isNot: 'is not',
+ before: 'before',
+ beforeIncDate: 'before (including selected date)',
+ after: 'after',
+ afterIncDate: 'after (including selected date)',
+ equals: 'equals',
+ doesNotEqual: 'does not equal',
+ contains: 'contains',
+ doesNotContain: 'does not contain',
+ greaterThan: 'greater than',
+ greaterThanEqual: 'greater than or equal to',
+ lessThan: 'less than',
+ lessThanEqual: 'less than or equal to',
+ id: 'Id',
+ name: 'Name',
+ createdDate: 'Created Date',
+ lastUpdatedDate: 'Last Updated Date',
+ orderBy: 'order by',
+ ascending: 'ascending',
+ descending: 'descending',
+ template: 'Template',
+ },
+ grid: {
+ media: 'Image',
+ macro: 'Macro',
+ insertControl: 'Choose type of content',
+ chooseLayout: 'Choose a layout',
+ addRows: 'Add a row',
+ addElement: 'Add content',
+ dropElement: 'Drop content',
+ settingsApplied: 'Settings applied',
+ contentNotAllowed: 'This content is not allowed here',
+ contentAllowed: 'This content is allowed here',
+ clickToEmbed: 'Click to embed',
+ clickToInsertImage: 'Click to insert image',
+ clickToInsertMacro: 'Click to insert macro',
+ placeholderWriteHere: 'Write here...',
+ gridLayouts: 'Grid Layouts',
+ gridLayoutsDetail:
+ 'Layouts are the overall work area for the grid editor, usually you only need one or\n two different layouts\n ',
+ addGridLayout: 'Add Grid Layout',
+ editGridLayout: 'Edit Grid Layout',
+ addGridLayoutDetail: 'Adjust the layout by setting column widths and adding additional sections',
+ rowConfigurations: 'Row configurations',
+ rowConfigurationsDetail: 'Rows are predefined cells arranged horizontally',
+ addRowConfiguration: 'Add row configuration',
+ editRowConfiguration: 'Edit row configuration',
+ addRowConfigurationDetail: 'Adjust the row by setting cell widths and adding additional cells',
+ noConfiguration: 'No further configuration available',
+ columns: 'Columns',
+ columnsDetails: 'Total combined number of columns in the grid layout',
+ settings: 'Settings',
+ settingsDetails: 'Configure what settings editors can change',
+ styles: 'Styles',
+ stylesDetails: 'Configure what styling editors can change',
+ allowAllEditors: 'Allow all editors',
+ allowAllRowConfigurations: 'Allow all row configurations',
+ maxItems: 'Maximum items',
+ maxItemsDescription: 'Leave blank or set to 0 for unlimited',
+ setAsDefault: 'Set as default',
+ chooseExtra: 'Choose extra',
+ chooseDefault: 'Choose default',
+ areAdded: 'are added',
+ warning: 'Warning',
+ warningText:
+ 'Modifying a row configuration name will result in loss of data for any existing content that is based on this configuration.
Modifying only the label will not result in data loss.
',
+ youAreDeleting: 'You are deleting the row configuration',
+ deletingARow:
+ '\n Deleting a row configuration name will result in loss of data for any existing content that is based on this\n configuration.\n ',
+ deleteLayout: 'You are deleting the layout',
+ deletingALayout:
+ 'Modifying a layout will result in loss of data for any existing content that is based\n on this configuration.\n ',
+ },
+ contentTypeEditor: {
+ compositions: 'Compositions',
+ group: 'Group',
+ groupReorderSameAliasError:
+ 'You can\'t move the group %0% to this tab because the group will get the same\n alias as a tab: "%1%". Rename the group to continue.\n ',
+ noGroups: 'You have not added any groups',
+ addGroup: 'Add group',
+ inheritedFrom: 'Inherited from',
+ addProperty: 'Add property',
+ requiredLabel: 'Required label',
+ enableListViewHeading: 'Enable list view',
+ enableListViewDescription:
+ 'Configures the content item to show a sortable and searchable list of its\n children, the children will not be shown in the tree\n ',
+ allowedTemplatesHeading: 'Allowed Templates',
+ allowedTemplatesDescription: 'Choose which templates editors are allowed to use on content of this type\n ',
+ allowAsRootHeading: 'Allow as root',
+ allowAsRootDescription: 'Allow editors to create content of this type in the root of the content tree.\n ',
+ childNodesHeading: 'Allowed child node types',
+ childNodesDescription:
+ 'Allow content of the specified types to be created underneath content of this\n type.\n ',
+ chooseChildNode: 'Choose child node',
+ compositionsDescription:
+ 'Inherit tabs and properties from an existing Document Type. New tabs will be\n added to the current Document Type or merged if a tab with an identical name exists.\n ',
+ compositionInUse: 'This Content Type is used in a composition, and therefore cannot be composed itself.\n ',
+ noAvailableCompositions: 'There are no Content Types available to use as a composition.',
+ compositionRemoveWarning:
+ "Removing a composition will delete all the associated property data. Once you\n save the Document Type there's no way back.\n ",
+ availableEditors: 'Create new',
+ reuse: 'Use existing',
+ editorSettings: 'Editor settings',
+ searchResultSettings: 'Available configurations',
+ searchResultEditors: 'Create a new configuration',
+ configuration: 'Configuration',
+ yesDelete: 'Yes, delete',
+ movedUnderneath: 'was moved underneath',
+ copiedUnderneath: 'was copied underneath',
+ folderToMove: 'Select the folder to move',
+ folderToCopy: 'Select the folder to copy',
+ structureBelow: 'to in the tree structure below',
+ allDocumentTypes: 'All Document Types',
+ allDocuments: 'All Documents',
+ allMediaItems: 'All media items',
+ usingThisDocument:
+ 'using this Document Type will be deleted permanently, please confirm you want to\n delete these as well.\n ',
+ usingThisMedia:
+ 'using this Media Type will be deleted permanently, please confirm you want to delete\n these as well.\n ',
+ usingThisMember:
+ 'using this Member Type will be deleted permanently, please confirm you want to delete\n these as well\n ',
+ andAllDocuments: 'and all documents using this type',
+ andAllMediaItems: 'and all media items using this type',
+ andAllMembers: 'and all members using this type',
+ memberCanEdit: 'Member can edit',
+ memberCanEditDescription: 'Allow this property value to be edited by the member on their profile page\n ',
+ isSensitiveData: 'Is sensitive data',
+ isSensitiveDataDescription:
+ "Hide this property value from content editors that don't have access to view\n sensitive information\n ",
+ showOnMemberProfile: 'Show on member profile',
+ showOnMemberProfileDescription: 'Allow this property value to be displayed on the member profile page\n ',
+ tabHasNoSortOrder: 'tab has no sort order',
+ compositionUsageHeading: 'Where is this composition used?',
+ compositionUsageSpecification:
+ 'This composition is currently used in the composition of the following\n Content Types:\n ',
+ variantsHeading: 'Allow variations',
+ cultureVariantHeading: 'Allow vary by culture',
+ segmentVariantHeading: 'Allow segmentation',
+ cultureVariantLabel: 'Vary by culture',
+ segmentVariantLabel: 'Vary by segments',
+ variantsDescription: 'Allow editors to create content of this type in different languages.',
+ cultureVariantDescription: 'Allow editors to create content of different languages.',
+ segmentVariantDescription: 'Allow editors to create segments of this content.',
+ allowVaryByCulture: 'Allow varying by culture',
+ allowVaryBySegment: 'Allow segmentation',
+ elementType: 'Element Type',
+ elementHeading: 'Is an Element Type',
+ elementDescription:
+ 'An Element Type is meant to be used within other Document Types, and not in the Content\n tree.\n ',
+ elementCannotToggle:
+ 'A Document Type cannot be changed to an Element Type once it has been used to\n create one or more content items.\n ',
+ elementDoesNotSupport: 'This is not applicable for an Element Type',
+ propertyHasChanges: 'You have made changes to this property. Are you sure you want to discard them?',
+ displaySettingsHeadline: 'Appearance',
+ displaySettingsLabelOnTop: 'Label above (full-width)',
+ confirmDeleteTabMessage: 'Are you sure you want to delete the tab %0% ?',
+ confirmDeleteGroupMessage: 'Are you sure you want to delete the group %0% ?',
+ confirmDeletePropertyMessage: 'Are you sure you want to delete the property %0% ?',
+ confirmDeleteTabNotice: 'This will also delete all items below this tab.',
+ confirmDeleteGroupNotice: 'This will also delete all items below this group.',
+ addTab: 'Add tab',
+ convertToTab: 'Convert to tab',
+ tabDirectPropertiesDropZone: 'Drag properties here to place directly on the tab',
+ removeChildNode: 'You are removing the child node',
+ removeChildNodeWarning:
+ 'Removing a child node will limit the editors options to create different content\n types beneath a node.\n ',
+ usingEditor: 'using this editor will get updated with the new settings.',
+ historyCleanupHeading: 'History cleanup',
+ historyCleanupDescription: 'Allow overriding the global history cleanup settings.',
+ historyCleanupKeepAllVersionsNewerThanDays: 'Keep all versions newer than days',
+ historyCleanupKeepLatestVersionPerDayForDays: 'Keep latest version per day for days',
+ historyCleanupPreventCleanup: 'Prevent cleanup',
+ historyCleanupEnableCleanup: 'Enable cleanup',
+ historyCleanupGloballyDisabled:
+ 'NOTE! The cleanup of historically content versions are disabled globally. These settings will not take effect before it is enabled.',
+ changeDataTypeHelpText:
+ 'Changing a data type with stored values is disabled. To allow this you can change the Umbraco:CMS:DataTypes:CanBeChanged setting in appsettings.json.',
+ },
+ languages: {
+ addLanguage: 'Add language',
+ culture: 'ISO code',
+ mandatoryLanguage: 'Mandatory language',
+ mandatoryLanguageHelp:
+ 'Properties on this language have to be filled out before the node can be\n published.\n ',
+ defaultLanguage: 'Default language',
+ defaultLanguageHelp: 'An Umbraco site can only have one default language set.',
+ changingDefaultLanguageWarning: 'Switching default language may result in default content missing.',
+ fallsbackToLabel: 'Falls back to',
+ noFallbackLanguageOption: 'No fall back language',
+ fallbackLanguageDescription:
+ 'To allow multi-lingual content to fall back to another language if not\n present in the requested language, select it here.\n ',
+ fallbackLanguage: 'Fall back language',
+ none: 'none',
+ invariantPropertyUnlockHelp: '%0% is shared across languages and segments.',
+ invariantCulturePropertyUnlockHelp: '%0% is shared across all languages.',
+ invariantSegmentPropertyUnlockHelp: '%0% is shared across all segments.',
+ invariantLanguageProperty: 'Shared: Languages',
+ invariantSegmentProperty: 'Shared: Segments',
+ },
+ macro: {
+ addParameter: 'Add parameter',
+ editParameter: 'Edit parameter',
+ enterMacroName: 'Enter macro name',
+ parameters: 'Parameters',
+ parametersDescription: 'Define the parameters that should be available when using this macro.',
+ selectViewFile: 'Select partial view macro file',
+ },
+ modelsBuilder: {
+ buildingModels: 'Building models',
+ waitingMessage: "this can take a bit of time, don't worry",
+ modelsGenerated: 'Models generated',
+ modelsGeneratedError: 'Models could not be generated',
+ modelsExceptionInUlog: 'Models generation has failed, see exception in U log',
+ },
+ templateEditor: {
+ addDefaultValue: 'Add default value',
+ defaultValue: 'Default value',
+ alternativeField: 'Fallback field',
+ alternativeText: 'Default value',
+ casing: 'Casing',
+ encoding: 'Encoding',
+ chooseField: 'Choose field',
+ convertLineBreaks: 'Convert line breaks',
+ convertLineBreaksHelp: "Replaces line breaks with 'br' html tag",
+ customFields: 'Custom Fields',
+ dateOnly: 'Date only',
+ formatAsDate: 'Format as date',
+ htmlEncode: 'HTML encode',
+ htmlEncodeHelp: 'Will replace special characters by their HTML equivalent.',
+ insertedAfter: 'Will be inserted after the field value',
+ insertedBefore: 'Will be inserted before the field value',
+ lowercase: 'Lowercase',
+ none: 'None',
+ outputSample: 'Output sample',
+ postContent: 'Insert after field',
+ preContent: 'Insert before field',
+ recursive: 'Recursive',
+ recursiveDescr: 'Yes, make it recursive',
+ standardFields: 'Standard Fields',
+ uppercase: 'Uppercase',
+ urlEncode: 'URL encode',
+ urlEncodeHelp: 'Will format special characters in URLs',
+ usedIfAllEmpty: 'Will only be used when the field values above are empty',
+ usedIfEmpty: 'This field will only be used if the primary field is empty',
+ withTime: 'Date and time',
+ },
+ translation: {
+ details: 'Translation details',
+ DownloadXmlDTD: 'Download XML DTD',
+ fields: 'Fields',
+ includeSubpages: 'Include subpages',
+ noTranslators:
+ 'No translator users found. Please create a translator user before you start sending\n content to translation\n ',
+ pageHasBeenSendToTranslation: "The page '%0%' has been send to translation",
+ sendToTranslate: "Send the page '%0%' to translation",
+ totalWords: 'Total words',
+ translateTo: 'Translate to',
+ translationDone: 'Translation completed.',
+ translationDoneHelp:
+ "You can preview the pages, you've just translated, by clicking below. If the\n original page is found, you will get a comparison of the 2 pages.\n ",
+ translationFailed: 'Translation failed, the XML file might be corrupt',
+ translationOptions: 'Translation options',
+ translator: 'Translator',
+ uploadTranslationXml: 'Upload translation XML',
+ },
+ treeHeaders: {
+ content: 'Content',
+ contentBlueprints: 'Content Templates',
+ media: 'Media',
+ cacheBrowser: 'Cache Browser',
+ contentRecycleBin: 'Recycle Bin',
+ createdPackages: 'Created packages',
+ dataTypes: 'Data Types',
+ dictionary: 'Dictionary',
+ installedPackages: 'Installed packages',
+ installSkin: 'Install skin',
+ installStarterKit: 'Install starter kit',
+ languages: 'Languages',
+ localPackage: 'Install local package',
+ macros: 'Macros',
+ mediaTypes: 'Media Types',
+ member: 'Members',
+ memberGroups: 'Member Groups',
+ memberRoles: 'Member Roles',
+ memberTypes: 'Member Types',
+ documentTypes: 'Document Types',
+ relationTypes: 'Relation Types',
+ packager: 'Packages',
+ packages: 'Packages',
+ partialViews: 'Partial Views',
+ partialViewMacros: 'Partial View Macro Files',
+ repositories: 'Install from repository',
+ runway: 'Install Runway',
+ runwayModules: 'Runway modules',
+ scripting: 'Scripting Files',
+ scripts: 'Scripts',
+ stylesheets: 'Stylesheets',
+ templates: 'Templates',
+ logViewer: 'Log Viewer',
+ users: 'Users',
+ settingsGroup: 'Settings',
+ templatingGroup: 'Templating',
+ thirdPartyGroup: 'Third Party',
+ },
+ update: {
+ updateAvailable: 'New update ready',
+ updateDownloadText: '%0% is ready, click here for download',
+ updateNoServer: 'No connection to server',
+ updateNoServerError: 'Error checking for update. Please review trace-stack for further information',
+ },
+ user: {
+ access: 'Access',
+ accessHelp: 'Based on the assigned groups and start nodes, the user has access to the following nodes\n ',
+ assignAccess: 'Assign access',
+ administrators: 'Administrator',
+ categoryField: 'Category field',
+ createDate: 'User created',
+ changePassword: 'Change your password',
+ changePhoto: 'Change photo',
+ emailRequired: 'Required - enter an email address for this user',
+ newPassword: 'New password',
+ newPasswordFormatLengthTip: 'Minimum %0% character(s) to go!',
+ newPasswordFormatNonAlphaTip: 'There should be at least %0% special character(s) in there.',
+ noLockouts: "hasn't been locked out",
+ noPasswordChange: "The password hasn't been changed",
+ confirmNewPassword: 'Confirm new password',
+ changePasswordDescription:
+ "You can change your password for accessing the Umbraco backoffice by filling\n out the form below and click the 'Change Password' button\n ",
+ contentChannel: 'Content Channel',
+ createAnotherUser: 'Create another user',
+ createUserHelp:
+ 'Create new users to give them access to Umbraco. When a new user is created a password\n will be generated that you can share with the user.\n ',
+ descriptionField: 'Description field',
+ disabled: 'Disable User',
+ documentType: 'Document Type',
+ duplicateLogin: 'A user with this login already exists',
+ editors: 'Editor',
+ excerptField: 'Excerpt field',
+ failedPasswordAttempts: 'Failed login attempts',
+ goToProfile: 'Go to user profile',
+ groupsHelp: 'Add groups to assign access and permissions',
+ inviteAnotherUser: 'Invite another user',
+ inviteUserHelp:
+ 'Invite new users to give them access to Umbraco. An invite email will be sent to the\n user with information on how to log in to Umbraco. Invites last for 72 hours.\n ',
+ language: 'Language',
+ languageHelp: 'Set the language you will see in menus and dialogs',
+ lastLockoutDate: 'Last lockout date',
+ lastLogin: 'Last login',
+ lastPasswordChangeDate: 'Password last changed',
+ loginname: 'Username',
+ mediastartnode: 'Media start node',
+ mediastartnodehelp: 'Limit the media library to a specific start node',
+ mediastartnodes: 'Media start nodes',
+ mediastartnodeshelp: 'Limit the media library to specific start nodes',
+ modules: 'Sections',
+ nameRequired: 'Required - enter a name for this user',
+ noConsole: 'Disable Umbraco Access',
+ noLogin: 'has not logged in yet',
+ oldPassword: 'Old password',
+ password: 'Password',
+ resetPassword: 'Reset password',
+ passwordChanged: 'Your password has been changed!',
+ passwordChangedGeneric: 'Password changed',
+ passwordConfirm: 'Please confirm the new password',
+ passwordEnterNew: 'Enter your new password',
+ passwordIsBlank: 'Your new password cannot be blank!',
+ passwordCurrent: 'Current password',
+ passwordInvalid: 'Invalid current password',
+ passwordIsDifferent:
+ 'There was a difference between the new password and the confirmed password. Please\n try again!\n ',
+ passwordMismatch: "The confirmed password doesn't match the new password!",
+ passwordRequiresDigit: "The password must have at least one digit ('0'-'9')",
+ passwordRequiresLower: "The password must have at least one lowercase ('a'-'z')",
+ passwordRequiresNonAlphanumeric: 'The password must have at least one non alphanumeric character',
+ passwordRequiresUniqueChars: 'The password must use at least %0% different characters',
+ passwordRequiresUpper: "The password must have at least one uppercase ('A'-'Z')",
+ passwordTooShort: 'The password must be at least %0% characters long',
+ permissionReplaceChildren: 'Replace child node permissions',
+ permissionSelectedPages: 'You are currently modifying permissions for the pages:',
+ permissionSelectPages: 'Select pages to modify their permissions',
+ removePhoto: 'Remove photo',
+ permissionsDefault: 'Default permissions',
+ permissionsGranular: 'Granular permissions',
+ permissionsGranularHelp: 'Set permissions for specific nodes',
+ profile: 'Profile',
+ searchAllChildren: 'Search all children',
+ languagesHelp: 'Limit the languages users have access to edit',
+ allowAccessToAllLanguages: 'Allow access to all languages',
+ sectionsHelp: 'Add sections to give users access',
+ selectUserGroups: 'Select user groups',
+ noStartNode: 'No start node selected',
+ noStartNodes: 'No start nodes selected',
+ startnode: 'Content start node',
+ startnodehelp: 'Limit the content tree to a specific start node',
+ startnodes: 'Content start nodes',
+ startnodeshelp: 'Limit the content tree to specific start nodes',
+ updateDate: 'User last updated',
+ userCreated: 'has been created',
+ userCreatedSuccessHelp:
+ 'The new user has successfully been created. To log in to Umbraco use the\n password below.\n ',
+ userHasPassword: 'The user already has a password set',
+ userHasGroup: "The user is already in group '%0%'",
+ userLockoutNotEnabled: 'Lockout is not enabled for this user',
+ userManagement: 'User management',
+ username: 'Name',
+ userNotInGroup: "The user is not in group '%0%'",
+ userPermissions: 'User permissions',
+ usergroup: 'User group',
+ userInvited: 'has been invited',
+ userInvitedSuccessHelp:
+ 'An invitation has been sent to the new user with details about how to log in to\n Umbraco.\n ',
+ userinviteWelcomeMessage:
+ 'Hello there and welcome to Umbraco! In just 1 minute you’ll be good to go, we\n just need you to setup a password and add a picture for your avatar.\n ',
+ userinviteExpiredMessage:
+ 'Welcome to Umbraco! Unfortunately your invite has expired. Please contact your\n administrator and ask them to resend it.\n ',
+ userinviteAvatarMessage:
+ 'Uploading a photo of yourself will make it easy for other users to recognize\n you. Click the circle above to upload your photo.\n ',
+ writer: 'Writer',
+ configureTwoFactor: 'Configure Two-Factor',
+ change: 'Change',
+ yourProfile: 'Your profile',
+ yourHistory: 'Your recent history',
+ sessionExpires: 'Session expires in',
+ inviteUser: 'Invite user',
+ createUser: 'Create user',
+ sendInvite: 'Send invite',
+ backToUsers: 'Back to users',
+ defaultInvitationMessage: 'Resending invitation...',
+ deleteUser: 'Delete User',
+ deleteUserConfirmation: 'Are you sure you wish to delete this user account?',
+ stateAll: 'All',
+ stateActive: 'Active',
+ stateDisabled: 'Disabled',
+ stateLockedOut: 'Locked out',
+ stateApproved: 'Approved',
+ stateInvited: 'Invited',
+ stateInactive: 'Inactive',
+ sortNameAscending: 'Name (A-Z)',
+ sortNameDescending: 'Name (Z-A)',
+ sortCreateDateAscending: 'Newest',
+ sortCreateDateDescending: 'Oldest',
+ sortLastLoginDateDescending: 'Last login',
+ noUserGroupsAdded: 'No user groups have been added',
+ '2faDisableText':
+ 'If you wish to disable this two-factor provider, then you must enter the code shown on your authentication device:',
+ '2faProviderIsEnabled': 'This two-factor provider is enabled',
+ '2faProviderIsDisabledMsg': 'This two-factor provider is now disabled',
+ '2faProviderIsNotDisabledMsg': 'Something went wrong with trying to disable this two-factor provider',
+ '2faDisableForUser': 'Do you want to disable this two-factor provider for this user?',
+ },
+ validation: {
+ validation: 'Validation',
+ validateAsEmail: 'Validate as an email address',
+ validateAsNumber: 'Validate as a number',
+ validateAsUrl: 'Validate as a URL',
+ enterCustomValidation: '...or enter a custom validation',
+ fieldIsMandatory: 'Field is mandatory',
+ mandatoryMessage: 'Enter a custom validation error message (optional)',
+ validationRegExp: 'Enter a regular expression',
+ validationRegExpMessage: 'Enter a custom validation error message (optional)',
+ minCount: 'You need to add at least',
+ maxCount: 'You can only have',
+ addUpTo: 'Add up to',
+ items: 'items',
+ urls: 'URL(s)',
+ urlsSelected: 'URL(s) selected',
+ itemsSelected: 'items selected',
+ invalidDate: 'Invalid date',
+ invalidNumber: 'Not a number',
+ invalidNumberStepSize: 'Not a valid numeric step size',
+ invalidEmail: 'Invalid email',
+ invalidNull: 'Value cannot be null',
+ invalidEmpty: 'Value cannot be empty',
+ invalidPattern: 'Value is invalid, it does not match the correct pattern',
+ invalidMemberGroupName: 'Invalid member group name',
+ invalidUserGroupName: 'Invalid user group name',
+ invalidToken: 'Invalid token',
+ invalidUsername: 'Invalid username',
+ duplicateEmail: "Email '%0%' is already taken",
+ duplicateUserGroupName: "User group name '%0%' is already taken",
+ duplicateMemberGroupName: "Member group name '%0%' is already taken",
+ duplicateUsername: "Username '%0%' is already taken",
+ customValidation: 'Custom validation',
+ entriesShort: 'Minimum %0% entries, requires %1% more.',
+ entriesExceed: 'Maximum %0% entries, %1% too many.',
+ entriesAreasMismatch: 'The content amount requirements are not met for one or more areas.',
+ },
+ healthcheck: {
+ checkSuccessMessage: "Value is set to the recommended value: '%0%'.",
+ checkErrorMessageDifferentExpectedValue:
+ "Expected value '%1%' for '%2%' in configuration file '%3%', but\n found '%0%'.\n ",
+ checkErrorMessageUnexpectedValue: "Found unexpected value '%0%' for '%2%' in configuration file '%3%'.\n ",
+ macroErrorModeCheckSuccessMessage: "MacroErrors are set to '%0%'.",
+ macroErrorModeCheckErrorMessage:
+ "MacroErrors are set to '%0%' which will prevent some or all pages in\n your site from loading completely if there are any errors in macros. Rectifying this will set the value to '%1%'.\n ",
+ httpsCheckValidCertificate: "Your website's certificate is valid.",
+ httpsCheckInvalidCertificate: "Certificate validation error: '%0%'",
+ httpsCheckExpiredCertificate: "Your website's SSL certificate has expired.",
+ httpsCheckExpiringCertificate: "Your website's SSL certificate is expiring in %0% days.",
+ healthCheckInvalidUrl: "Error pinging the URL %0% - '%1%'",
+ httpsCheckIsCurrentSchemeHttps: 'You are currently %0% viewing the site using the HTTPS scheme.',
+ httpsCheckConfigurationRectifyNotPossible:
+ "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to 'false' in\n your appSettings.json file. Once you access this site using the HTTPS scheme, that should be set to 'true'.\n ",
+ httpsCheckConfigurationCheckResult:
+ "The appSetting 'Umbraco:CMS:Global:UseHttps' is set to '%0%' in your\n appSettings.json file, your cookies are %1% marked as secure.\n ",
+ compilationDebugCheckSuccessMessage: 'Debug compilation mode is disabled.',
+ compilationDebugCheckErrorMessage:
+ 'Debug compilation mode is currently enabled. It is recommended to\n disable this setting before go live.\n ',
+ umbracoApplicationUrlCheckResultTrue:
+ "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is set to %0% .",
+ umbracoApplicationUrlCheckResultFalse: "The appSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' is not set.",
+ clickJackingCheckHeaderFound:
+ 'The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was found.',
+ clickJackingCheckHeaderNotFound:
+ 'The header or meta-tag X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.',
+ noSniffCheckHeaderFound:
+ 'The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was found.',
+ noSniffCheckHeaderNotFound:
+ 'The header or meta-tag X-Content-Type-Options used to protect against MIME sniffing vulnerabilities was not found.',
+ hSTSCheckHeaderFound:
+ 'The header Strict-Transport-Security , also known as the HSTS-header, was found.',
+ hSTSCheckHeaderNotFound: 'The header Strict-Transport-Security was not found.',
+ hSTSCheckHeaderFoundOnLocalhost:
+ 'The header Strict-Transport-Security , also known as the HSTS-header, was found. This header should not be present on localhost. ',
+ hSTSCheckHeaderNotFoundOnLocalhost:
+ 'The header Strict-Transport-Security was not found. This header should not be present on localhost.',
+ xssProtectionCheckHeaderFound:
+ 'The header X-XSS-Protection was found. It is recommended not to add this header to your website . \n You can read about this on the Mozilla website ',
+ xssProtectionCheckHeaderNotFound: 'The header X-XSS-Protection was not found.',
+ excessiveHeadersFound:
+ 'The following headers revealing information about the website technology were found: %0% .',
+ excessiveHeadersNotFound: 'No headers revealing information about the website technology were found.\n ',
+ smtpMailSettingsNotFound: "The 'Umbraco:CMS:Global:Smtp' configuration could not be found.",
+ smtpMailSettingsHostNotConfigured:
+ "The 'Umbraco:CMS:Global:Smtp:Host' configuration could not be\n found.\n ",
+ smtpMailSettingsConnectionSuccess:
+ 'SMTP settings are configured correctly and the service is operating\n as expected.\n ',
+ smtpMailSettingsConnectionFail:
+ "The SMTP server configured with host '%0%' and port '%1%' could not be\n reached. Please check to ensure the SMTP settings in the configuration 'Umbraco:CMS:Global:Smtp' are correct.\n ",
+ notificationEmailsCheckSuccessMessage: 'Notification email has been set to %0% .',
+ notificationEmailsCheckErrorMessage:
+ 'Notification email is still set to the default value of %0% .',
+ checkGroup: 'Check group',
+ helpText:
+ '\n The health checker evaluates various areas of your site for best practice settings, configuration, potential problems, etc. You can easily fix problems by pressing a button.\n You can add your own health checks, have a look at the documentation for more information about custom health checks.
\n ',
+ },
+ redirectUrls: {
+ disableUrlTracker: 'Disable URL tracker',
+ enableUrlTracker: 'Enable URL tracker',
+ culture: 'Culture',
+ originalUrl: 'Original URL',
+ redirectedTo: 'Redirected To',
+ redirectUrlManagement: 'Redirect URL Management',
+ panelInformation: 'The following URLs redirect to this content item:',
+ noRedirects: 'No redirects have been made',
+ noRedirectsDescription:
+ 'When a published page gets renamed or moved a redirect will automatically be\n made to the new page.\n ',
+ redirectRemoved: 'Redirect URL removed.',
+ redirectRemoveError: 'Error removing redirect URL.',
+ redirectRemoveWarning: 'This will remove the redirect',
+ confirmDisable: 'Are you sure you want to disable the URL tracker?',
+ disabledConfirm: 'URL tracker has now been disabled.',
+ disableError: 'Error disabling the URL tracker, more information can be found in your log file.',
+ enabledConfirm: 'URL tracker has now been enabled.',
+ enableError: 'Error enabling the URL tracker, more information can be found in your log file.',
+ },
+ emptyStates: {
+ emptyDictionaryTree: 'No Dictionary items to choose from',
+ },
+ textbox: {
+ characters_left: '%0% characters left.',
+ characters_exceed: 'Maximum %0% characters, %1% too many.',
+ },
+ recycleBin: {
+ contentTrashed: 'Trashed content with Id: {0} related to original parent content with Id: {1}',
+ mediaTrashed: 'Trashed media with Id: {0} related to original parent media item with Id: {1}',
+ itemCannotBeRestored: 'Cannot automatically restore this item',
+ itemCannotBeRestoredHelpText:
+ 'There is no location where this item can be automatically restored. You\n can move the item manually using the tree below.\n ',
+ wasRestored: 'was restored under',
+ },
+ relationType: {
+ direction: 'Direction',
+ parentToChild: 'Parent to child',
+ bidirectional: 'Bidirectional',
+ parent: 'Parent',
+ child: 'Child',
+ count: 'Count',
+ relation: 'Relation',
+ relations: 'Relations',
+ created: 'Created',
+ comment: 'Comment',
+ name: 'Name',
+ noRelations: 'No relations for this Relation Type',
+ tabRelationType: 'Relation Type',
+ tabRelations: 'Relations',
+ isDependency: 'Is Dependency',
+ dependency: 'Yes',
+ noDependency: 'No',
+ },
+ dashboardTabs: {
+ contentIntro: 'Getting Started',
+ contentRedirectManager: 'Redirect URL Management',
+ mediaFolderBrowser: 'Content',
+ settingsWelcome: 'Welcome',
+ settingsExamine: 'Examine Management',
+ settingsPublishedStatus: 'Published Status',
+ settingsModelsBuilder: 'Models Builder',
+ settingsHealthCheck: 'Health Check',
+ settingsAnalytics: 'Telemetry data',
+ settingsProfiler: 'Profiling',
+ memberIntro: 'Getting Started',
+ formsInstall: 'Install Umbraco Forms',
+ deploy: 'Workspaces',
+ deployManagement: 'Deploy',
+ },
+ visuallyHiddenTexts: {
+ goBack: 'Go back',
+ activeListLayout: 'Active layout:',
+ jumpTo: 'Jump to',
+ group: 'group',
+ passed: 'passed',
+ warning: 'warning',
+ failed: 'failed',
+ suggestion: 'suggestion',
+ checkPassed: 'Check passed',
+ checkFailed: 'Check failed',
+ openBackofficeSearch: 'Open backoffice search',
+ openCloseBackofficeHelp: 'Open/Close backoffice help',
+ openCloseBackofficeProfileOptions: 'Open/Close your profile options',
+ assignDomainDescription: 'Setup Culture and Hostnames for %0%',
+ createDescription: 'Create new node under %0%',
+ protectDescription: 'Setup access restrictions on %0%',
+ rightsDescription: 'Setup Permissions on %0%',
+ sortDescription: 'Change sort order for %0%',
+ createblueprintDescription: 'Create Content Template based on %0%',
+ openContextMenu: 'Open context menu for',
+ currentLanguage: 'Current language',
+ switchLanguage: 'Switch language to',
+ createNewFolder: 'Create new folder',
+ newPartialView: 'Partial View',
+ newPartialViewMacro: 'Partial View Macro',
+ newMember: 'Member',
+ newDataType: 'Data Type',
+ redirectDashboardSearchLabel: 'Search the redirect dashboard',
+ userGroupSearchLabel: 'Search the user group section',
+ userSearchLabel: 'Search the users section',
+ createItem: 'Create item',
+ create: 'Create',
+ edit: 'Edit',
+ name: 'Name',
+ addNewRow: 'Add new row',
+ tabExpand: 'View more options',
+ searchOverlayTitle: 'Search the Umbraco backoffice',
+ searchOverlayDescription: 'Search for content nodes, media nodes etc. across the backoffice.',
+ searchInputDescription:
+ 'When autocomplete results are available, press up and down arrows, or use the\n tab key and use the enter key to select.\n ',
+ path: 'Path:',
+ foundIn: 'Found in',
+ hasTranslation: 'Has translation',
+ noTranslation: 'Missing translation',
+ dictionaryListCaption: 'Dictionary items',
+ contextMenuDescription: 'Select one of the options to edit the node.',
+ contextDialogDescription: 'Perform action %0% on the %1% node',
+ addImageCaption: 'Add image caption',
+ searchContentTree: 'Search content tree',
+ maxAmount: 'Maximum amount',
+ },
+ references: {
+ tabName: 'References',
+ DataTypeNoReferences: 'This Data Type has no references.',
+ itemHasNoReferences: 'This item has no references.',
+ labelUsedByDocumentTypes: 'Referenced by the following Document Types',
+ labelUsedByMediaTypes: 'Referenced by the following Media Types',
+ labelUsedByMemberTypes: 'Referenced by the following Member Types',
+ usedByProperties: 'Referenced by',
+ labelUsedByItems: 'Referenced by the following items',
+ labelDependsOnThis: 'The following items depend on this',
+ labelUsedItems: 'The following items are referenced',
+ labelUsedDescendants: 'The following descendant items have dependencies',
+ labelDependentDescendants: 'The following descending items have dependencies',
+ deleteWarning:
+ 'This item or its descendants is being referenced. Deletion can lead to broken links on your website.',
+ unpublishWarning:
+ 'This item or its descendants is being referenced. Unpublishing can lead to broken links on your website. Please take the appropriate actions.',
+ deleteDisabledWarning: 'This item or its descendants is being referenced. Therefore, deletion has been disabled.',
+ listViewDialogWarning: 'The following items you are trying to %0% are referenced by other content.',
+ },
+ logViewer: {
+ deleteSavedSearch: 'Delete Saved Search',
+ logLevels: 'Log Levels',
+ selectAllLogLevelFilters: 'Select all',
+ deselectAllLogLevelFilters: 'Deselect all',
+ savedSearches: 'Saved Searches',
+ saveSearch: 'Save Search',
+ saveSearchDescription: 'Enter a friendly name for your search query',
+ filterSearch: 'Filter Search',
+ totalItems: 'Total Items',
+ timestamp: 'Timestamp',
+ level: 'Level',
+ machine: 'Machine',
+ message: 'Message',
+ exception: 'Exception',
+ properties: 'Properties',
+ searchWithGoogle: 'Search With Google',
+ searchThisMessageWithGoogle: 'Search this message with Google',
+ searchWithBing: 'Search With Bing',
+ searchThisMessageWithBing: 'Search this message with Bing',
+ searchOurUmbraco: 'Search Our Umbraco',
+ searchThisMessageOnOurUmbracoForumsAndDocs: 'Search this message on Our Umbraco forums and docs',
+ searchOurUmbracoWithGoogle: 'Search Our Umbraco with Google',
+ searchOurUmbracoForumsUsingGoogle: 'Search Our Umbraco forums using Google',
+ searchUmbracoSource: 'Search Umbraco Source',
+ searchWithinUmbracoSourceCodeOnGithub: 'Search within Umbraco source code on Github',
+ searchUmbracoIssues: 'Search Umbraco Issues',
+ searchUmbracoIssuesOnGithub: 'Search Umbraco Issues on Github',
+ deleteThisSearch: 'Delete this search',
+ findLogsWithRequestId: 'Find Logs with Request ID',
+ findLogsWithNamespace: 'Find Logs with Namespace',
+ findLogsWithMachineName: 'Find Logs with Machine Name',
+ open: 'Open',
+ polling: 'Polling',
+ every2: 'Every 2 seconds',
+ every5: 'Every 5 seconds',
+ every10: 'Every 10 seconds',
+ every20: 'Every 20 seconds',
+ every30: 'Every 30 seconds',
+ pollingEvery2: 'Polling every 2s',
+ pollingEvery5: 'Polling every 5s',
+ pollingEvery10: 'Polling every 10s',
+ pollingEvery20: 'Polling every 20s',
+ pollingEvery30: 'Polling every 30s',
+ },
+ clipboard: {
+ labelForCopyAllEntries: 'Copy %0%',
+ labelForArrayOfItemsFrom: '%0% from %1%',
+ labelForArrayOfItems: 'Collection of %0%',
+ labelForRemoveAllEntries: 'Remove all items',
+ labelForClearClipboard: 'Clear clipboard',
+ },
+ propertyActions: {
+ tooltipForPropertyActionsMenu: 'Open Property Actions',
+ tooltipForPropertyActionsMenuClose: 'Close Property Actions',
+ },
+ nuCache: {
+ refreshStatus: 'Refresh status',
+ memoryCache: 'Memory Cache',
+ memoryCacheDescription:
+ '\n This button lets you reload the in-memory cache, by entirely reloading it from the database\n cache (but it does not rebuild that database cache). This is relatively fast.\n Use it when you think that the memory cache has not been properly refreshed, after some events\n triggered—which would indicate a minor Umbraco issue.\n (note: triggers the reload on all servers in an LB environment).\n ',
+ reload: 'Reload',
+ databaseCache: 'Database Cache',
+ databaseCacheDescription:
+ '\n This button lets you rebuild the database cache, ie the content of the cmsContentNu table.\n Rebuilding can be expensive. \n Use it when reloading is not enough, and you think that the database cache has not been\n properly generated—which would indicate some critical Umbraco issue.\n ',
+ rebuild: 'Rebuild',
+ internals: 'Internals',
+ internalsDescription:
+ '\n This button lets you trigger a NuCache snapshots collection (after running a fullCLR GC).\n Unless you know what that means, you probably do not need to use it.\n ',
+ collect: 'Collect',
+ publishedCacheStatus: 'Published Cache Status',
+ caches: 'Caches',
+ },
+ profiling: {
+ performanceProfiling: 'Performance profiling',
+ performanceProfilingDescription:
+ "\n \n Umbraco currently runs in debug mode. This means you can use the built-in performance profiler to assess the performance when rendering pages.\n
\n \n If you want to activate the profiler for a specific page rendering, simply add umbDebug=true to the querystring when requesting the page.\n
\n \n If you want the profiler to be activated by default for all page renderings, you can use the toggle below.\n It will set a cookie in your browser, which then activates the profiler automatically.\n In other words, the profiler will only be active by default in your browser - not everyone else's.\n
\n ",
+ activateByDefault: 'Activate the profiler by default',
+ reminder: 'Friendly reminder',
+ reminderDescription:
+ '\n \n You should never let a production site run in debug mode. Debug mode is turned off by setting Umbraco:CMS:Hosting:Debug to false in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n ',
+ profilerEnabledDescription:
+ "\n \n Umbraco currently does not run in debug mode, so you can't use the built-in profiler. This is how it should be for a production site.\n
\n \n Debug mode is turned on by setting Umbraco:CMS:Hosting:Debug to true in appsettings.json, appsettings.{Environment}.json or via an environment variable.\n
\n ",
+ },
+ settingsDashboardVideos: {
+ trainingHeadline: 'Hours of Umbraco training videos are only a click away',
+ trainingDescription:
+ '\n Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos
\n ',
+ getStarted: 'To get you started',
+ },
+ settingsDashboard: {
+ start: 'Start here',
+ startDescription:
+ 'This section contains the building blocks for your Umbraco site. Follow the below\n links to find out more about working with the items in the Settings section\n ',
+ more: 'Find out more',
+ bulletPointOne:
+ '\n Read more about working with the items in Settings in the Documentation section of Our Umbraco\n ',
+ bulletPointTwo:
+ '\n Ask a question in the Community Forum \n ',
+ bulletPointTutorials:
+ '\n Watch our free tutorial videos on the Umbraco Learning Base \n ',
+ bulletPointFour:
+ '\n Find out about our productivity boosting tools and commercial support \n ',
+ bulletPointFive:
+ '\n Find out about real-life training and certification opportunities\n ',
+ },
+ startupDashboard: {
+ fallbackHeadline: 'Welcome to The Friendly CMS',
+ fallbackDescription:
+ "Thank you for choosing Umbraco - we think this could be the beginning of something\n beautiful. While it may feel overwhelming at first, we've done a lot to make the learning curve as smooth and fast\n as possible.\n ",
+ },
+ formsDashboard: {
+ formsHeadline: 'Umbraco Forms',
+ formsDescription:
+ 'Create forms using an intuitive drag and drop interface. From simple contact forms\n that sends e-mails to advanced questionaires that integrate with CRM systems. Your clients will love it!\n ',
+ yourForms: 'Your forms',
+ showMore: 'Show more',
+ entries: 'Entries',
+ newVersion: 'There is a new version available',
+ installOverlayTitle: 'Congratulations',
+ installOverlayDescription: "You've just installed Umbraco Forms - Let's create your first form",
+ emptyOverlayTitle: 'Create a form',
+ emptyOverlayDescription: 'You do not have any forms setup yet, how about creating one now?',
+ createAForm: 'Create a form',
+ newVersionTitle: 'There is a new version available',
+ newVersionDescription: 'You can now install Umbraco Forms',
+ upgradeNow: 'Upgrade now',
+ downloading: 'Downloading and upgrading forms...',
+ invalidLicense: 'Invalid license',
+ invalidLicenseValidFor: 'Your current Forms license is only valid for:',
+ reconfigure: 'Please re-configure your license below.',
+ trialTitle: 'Thank you for trying out Umbraco Forms',
+ trialDescription: 'To continue using Umbraco Forms, you must purchase a license, or use an existing license',
+ configureLicense: 'Configure existing license',
+ buyLicense: 'Buy license',
+ buyLicenseTitle: 'Buying a license',
+ buyLicenseCopy:
+ "\n \n It only takes a few minutes to buy a license for Umbraco Forms and your license is instantly delivered .\n
\n \n The steps are:\n
\n Click the buy button below \n Checkout with Credit Card (or invoice) \n Configure the license inside Umbraco Forms and you're up and running \n \n \n ",
+ buyLink: 'Buy Umbraco Forms',
+ buyLicenseFAQs:
+ '\n FAQ: \n What does it cost? \n Pricing starts at €209 and is a one time fee (no subscription).
\n What does a license cover? \n A license covers a single domain and will also work on all subdomains. It also includes two additional development domains.
\n Can I add additional domains to the license? \n Yes, additional domains can be added. You can purchase additional domains to your license from your account on Umbraco.com.
\n More questions? \n \n Don\'t worry, there\'s more details in the documentation and you\'re also more than welcome to get in touch with us . We usually respond within a couple of hours.\n
\n ',
+ configureLicenseTitle: 'Configure an Umbraco Forms license',
+ configureLicenseCopy:
+ "\n If you've already bought Umbraco Forms, you can automatically retrieve and configure your license here. Simply enter your umbraco.com credentials below and we'll\n find your license.\n ",
+ configureLicenseFAQs:
+ '\n FAQ: \n I don\'t know what my credentials are? \n \n It\'s a combination of your e-mail and password from when you placed your order. You can always reset your password here .\n
\n How do I buy a license? \n \n If you don\'t have a license, you can get one from here and only takes a few minutes .\n
\n ',
+ findLicenses: 'Find Licenses',
+ invalidEmail: 'Invalid email or password',
+ noLicensesAvailable: 'No Umbraco Forms licenses available on this account',
+ availableLicensesTitle: 'Available Licenses',
+ foundLicenses: 'Found',
+ foundLicensesAccount: 'on the account',
+ noDomainsAssigned: 'Has no domains assigned',
+ setDomain: 'Please set a domain on this license',
+ configureAndInstall: 'Configure and Install',
+ installLicense: 'Install this license',
+ validDomains: 'Valid domains',
+ licenseValidOnDomain: 'This license is valid on the current domain',
+ licenseNotValidOnDomain: 'This license is not valid on the current domain',
+ plainTextPasswordWarning:
+ '\n Warning: your configuration settings are set to save plain text passwords! \n When you use a password field on any of your forms, the data your visitors will enter in that field will be stored in plain text. This is a security issue and should be avoided.
\n To fix this issue, you can go in to your Umbraco:Forms:Security:SavePlainTextPasswords file and set the key SavePlainTextPasswords to False .
\n After updating this setting, make sure to recycle the application pool for the site for the new setting to become active.
\n Note: password values will still be passed on to workflows, regardless of the setting in configuration.
\n ',
+ currentVersion: 'Current installed version of Umbraco Forms:',
+ licenseConfiguredNotificationTitle: 'License configured',
+ licenseConfiguredNotificationMessage: 'Umbraco Forms has been configured for use on this website.',
+ insufficientPermissionsError: 'Insufficient Permissions',
+ insufficientPermissionsMessage: 'You do not have permissions to create and manage forms.',
+ insufficientPermissionsUpgradeMessage: 'Only Admin users have the ability to upgrade Umbraco Forms.',
+ licensedDomains: 'Licensed domains',
+ },
+ blockEditor: {
+ headlineCreateBlock: 'Pick Element Type',
+ headlineAddSettingsElementType: 'Attach a settings Element Type',
+ headlineAddCustomView: 'Select view',
+ headlineAddCustomStylesheet: 'Select stylesheet',
+ headlineAddThumbnail: 'Choose thumbnail',
+ labelcreateNewElementType: 'Create new Element Type',
+ labelCustomStylesheet: 'Custom stylesheet',
+ addCustomStylesheet: 'Add stylesheet',
+ headlineEditorAppearance: 'Block appearance',
+ headlineDataModels: 'Data models',
+ headlineCatalogueAppearance: 'Catalogue appearance',
+ labelBackgroundColor: 'Background color',
+ labelIconColor: 'Icon color',
+ labelContentElementType: 'Content model',
+ labelLabelTemplate: 'Label',
+ labelCustomView: 'Custom view',
+ labelCustomViewInfoTitle: 'Show custom view description',
+ labelCustomViewDescription:
+ 'Overwrite how this block appears in the backoffice UI. Pick a .html file\n containing your presentation.\n ',
+ labelSettingsElementType: 'Settings model',
+ labelEditorSize: 'Overlay editor size',
+ addCustomView: 'Add custom view',
+ addSettingsElementType: 'Add settings',
+ confirmDeleteBlockMessage: 'Are you sure you want to delete the content %0% ?',
+ confirmDeleteBlockTypeMessage: 'Are you sure you want to delete the block configuration %0% ?',
+ confirmDeleteBlockTypeNotice:
+ 'The content of this block will still be present, editing of this content\n will no longer be available and will be shown as unsupported content.\n ',
+ confirmDeleteBlockGroupMessage:
+ 'Are you sure you want to delete group %0% and all the Block configurations of this?',
+ confirmDeleteBlockGroupNotice:
+ 'The content of these Blocks will still be present, editing of this content\n will no longer be available and will be shown as unsupported content.\n ',
+ blockConfigurationOverlayTitle: "Configuration of '%0%'",
+ elementTypeDoesNotExist: 'Cannot be edited cause ElementType does not exist.',
+ thumbnail: 'Thumbnail',
+ addThumbnail: 'Add thumbnail',
+ tabCreateEmpty: 'Create empty',
+ tabClipboard: 'Clipboard',
+ tabBlockSettings: 'Settings',
+ headlineAdvanced: 'Advanced',
+ forceHideContentEditor: 'Hide content editor',
+ forceHideContentEditorHelp: 'Hide the content edit button and the content editor from the Block Editor overlay',
+ girdInlineEditing: 'Inline editing',
+ girdInlineEditingHelp:
+ 'Enables inline editing for the first Property. Additional properties can be edited in the overlay.',
+ blockHasChanges: 'You have made changes to this content. Are you sure you want to discard them?',
+ confirmCancelBlockCreationHeadline: 'Discard creation?',
+ confirmCancelBlockCreationMessage: 'Are you sure you want to cancel the creation.',
+ elementTypeDoesNotExistHeadline: 'Error!',
+ elementTypeDoesNotExistDescription: 'The ElementType of this block does not exist anymore',
+ addBlock: 'Add content',
+ addThis: 'Add %0%',
+ propertyEditorNotSupported: "Property '%0%' uses editor '%1%' which is not supported in blocks.",
+ focusParentBlock: 'Set focus on the container block',
+ areaIdentification: 'Identification',
+ areaValidation: 'Validation',
+ areaValidationEntriesShort: '%0% must be present atleast %2% time(s).',
+ areaValidationEntriesExceed: '%0% must maximum be present %3% time(s).',
+ areaNumberOfBlocks: 'Number of blocks',
+ areaDisallowAllBlocks: 'Only allow specific block types',
+ areaAllowedBlocks: 'Allowed block types',
+ areaAllowedBlocksHelp:
+ 'Define the types of blocks that are allowed in this area, and optionally how many of each type that should be present.',
+ confirmDeleteBlockAreaMessage: 'Are you sure you want to delete this area?',
+ confirmDeleteBlockAreaNotice: 'Any blocks currently created within this area will be deleted.',
+ layoutOptions: 'Layout options',
+ structuralOptions: 'Structural',
+ sizeOptions: 'Size options',
+ sizeOptionsHelp: 'Define one or more size options, this enables resizing of the Block',
+ allowedBlockColumns: 'Available column spans',
+ allowedBlockColumnsHelp:
+ 'Define the different number of columns this block is allowed to span across. This does not prevent Blocks from being placed in Areas with a smaller column span.',
+ allowedBlockRows: 'Available row spans',
+ allowedBlockRowsHelp: 'Define the range of layout rows this block is allowed to span across.',
+ allowBlockInRoot: 'Allow in root',
+ allowBlockInRootHelp: 'Make this block available in the root of the layout.',
+ allowBlockInAreas: 'Allow in areas',
+ allowBlockInAreasHelp:
+ 'Make this block available by default within the areas of other Blocks (unless explicit permissions are set for these areas).',
+ areaAllowedBlocksEmpty:
+ 'By default, all block types are allowed in an Area, Use this option to allow only selected types.',
+ areas: 'Areas',
+ areasLayoutColumns: 'Grid Columns for Areas',
+ areasLayoutColumnsHelp:
+ 'Define how many columns that will be available for areas. If not defined, the number of columns defined for the entire layout will be used.',
+ areasConfigurations: 'Areas',
+ areasConfigurationsHelp:
+ "To enable the nesting of blocks within this block, define one or more areas. Areas follow the layout defined by their own grid column configuration. The 'column span' and 'row span' for each area can be adjusted by using the scale-handler box in the bottom right hand corner of the selected area.",
+ invalidDropPosition: '%0% is not allowed at this spot.',
+ defaultLayoutStylesheet: 'Default layout stylesheet',
+ confirmPasteDisallowedNestedBlockHeadline: 'Disallowed content was rejected',
+ confirmPasteDisallowedNestedBlockMessage:
+ 'The inserted content contained disallowed content, which has not been created. Would you like to keep the rest of this content anyway?',
+ areaAliasHelp:
+ 'When using GetBlockGridHTML() to render the Block Grid, the alias will be rendered in the markup as a \'data-area-alias\' attribute. Use the alias attribute to target the element for the area. Example. .umb-block-grid__area[data-area-alias="MyAreaAlias"] { ... }',
+ scaleHandlerButtonTitle: 'Drag to scale',
+ areaCreateLabelTitle: 'Create Button Label',
+ areaCreateLabelHelp: "Override the label text for adding a new Block to this Area, Example: 'Add Widget'",
+ showSizeOptions: 'Show resize options',
+ addBlockType: 'Add Block',
+ addBlockGroup: 'Add group',
+ pickSpecificAllowance: 'Pick group or Block',
+ allowanceMinimum: 'Set a minimum requirement',
+ allowanceMaximum: 'Set a maximum requirement',
+ block: 'Block',
+ tabBlock: 'Block',
+ tabBlockTypeSettings: 'Settings',
+ tabAreas: 'Areas',
+ tabAdvanced: 'Advanced',
+ headlineAllowance: 'Permissions',
+ getSampleHeadline: 'Install Sample Configuration',
+ getSampleDescription:
+ "This will add basic Blocks and help you get started with the Block Grid Editor. You'll get Blocks for Headline, Rich Text, Image, as well as a Two Column Layout.",
+ getSampleButton: 'Install',
+ actionEnterSortMode: 'Sort mode',
+ actionExitSortMode: 'End sort mode',
+ areaAliasIsNotUnique: 'This Areas Alias must be unique compared to the other Areas of this Block.',
+ configureArea: 'Configure area',
+ deleteArea: 'Delete area',
+ addColumnSpanOption: 'Add spanning %0% columns option',
+ },
+ contentTemplatesDashboard: {
+ whatHeadline: 'What are Content Templates?',
+ whatDescription:
+ 'Content Templates are pre-defined content that can be selected when creating a new\n content node.\n ',
+ createHeadline: 'How do I create a Content Template?',
+ createDescription:
+ '\n There are two ways to create a Content Template:
\n \n Right-click a content node and select "Create Content Template" to create a new Content Template. \n Right-click the Content Templates tree in the Settings section and select the Document Type you want to create a Content Template for. \n \n Once given a name, editors can start using the Content Template as a foundation for their new page.
\n ',
+ manageHeadline: 'How do I manage Content Templates?',
+ manageDescription:
+ 'You can edit and delete Content Templates from the "Content Templates" tree in the\n Settings section. Expand the Document Type which the Content Template is based on and click it to edit or delete\n it.\n ',
+ },
+ preview: {
+ endLabel: 'End',
+ endTitle: 'End preview mode',
+ openWebsiteLabel: 'Preview website',
+ openWebsiteTitle: 'Open website in preview mode',
+ returnToPreviewHeadline: 'Preview website?',
+ returnToPreviewDescription:
+ 'You have ended preview mode, do you want to enable it again to view the\n latest saved version of your website?\n ',
+ returnToPreviewAcceptButton: 'Preview latest version',
+ returnToPreviewDeclineButton: 'View published version',
+ viewPublishedContentHeadline: 'View published version?',
+ viewPublishedContentDescription:
+ 'You are in Preview Mode, do you want exit in order to view the\n published version of your website?\n ',
+ viewPublishedContentAcceptButton: 'View published version',
+ viewPublishedContentDeclineButton: 'Stay in preview mode',
+ },
+ permissions: {
+ FolderCreation: 'Folder creation',
+ FileWritingForPackages: 'File writing for packages',
+ FileWriting: 'File writing',
+ MediaFolderCreation: 'Media folder creation',
+ },
+ treeSearch: {
+ searchResult: 'item returned',
+ searchResults: 'items returned',
+ },
+ analytics: {
+ consentForAnalytics: 'Consent for telemetry data',
+ analyticsLevelSavedSuccess: 'Telemetry level saved!',
+ analyticsDescription:
+ '\n In order to improve Umbraco and add new functionality based on as relevant information as possible,\n we would like to collect system- and usage information from your installation.\n Aggregate data will be shared on a regular basis as well as learnings from these metrics.\n Hopefully, you will help us collect some valuable data.\n \n We WILL NOT collect any personal data such as content, code, user information, and all data will be fully anonymized.\n ',
+ minimalLevelDescription: 'We will only send an anonymized site ID to let us know that the site exists.',
+ basicLevelDescription: 'We will send an anonymized site ID, Umbraco version, and packages installed',
+ detailedLevelDescription:
+ '\n We will send:\n \n Anonymized site ID, Umbraco version, and packages installed. \n Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use. \n System information: Webserver, server OS, server framework, server OS language, and database provider. \n Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode. \n \n We might change what we send on the Detailed level in the future. If so, it will be listed above.\n By choosing "Detailed" you agree to current and future anonymized information being collected. \n ',
+ },
+ umbId: {
+ editProfile: 'Edit your Umbraco ID profile',
+ changePassword: 'Change your Umbraco ID password',
+ },
+ dialogs: {
+ deployTransferNowTitle: 'Transfer now',
+ deployTransferNowHeadline: 'Transfer %0% to %1% ',
+ deployTransferNowDescription:
+ 'You are about to transfer %0% directly to %1%, without adding it to the queue.
',
+ deployAddToQueueHeadline: 'Queue %0% for transfer to %1% ',
+ deployAddToQueueDescription:
+ 'This will put %0% in the queue for the next transfer, nothing will be transfered yet.
',
+ deployAddToQueueCultureDescription: 'Select language to include in transfer:
',
+ deployAddToQueueChildPageDescription:
+ 'Should all items below %0% be included in the transfer?
',
+ deployAddToQueueReleaseDateDescription:
+ 'The published or unpublished status will be transferred along with the content. To schedule the update for publishing in the future, please set a date:
',
+ deployIncludeChildPages: 'Include all items below',
+ deployAddToQueueDone:
+ 'Changes have been queued When you are ready to transfer your full set of changes, go to the workspace dashboard to start the transfer.
',
+ deployVariantQueueForTransferNotAllowed: 'Transfer is not allowed',
+ deployRestoreFrom: 'From',
+ deployRestoreWorkspace: 'workspace',
+ deployRestoreThis: 'Restore',
+ deployRestoreIncludingDescendants: 'Including all items below',
+ deployRestoreNotIncludingDescendants: 'Not including items below',
+ deployRestoreDescription:
+ '\n This includes changes to referenced content, media and other items.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ',
+ deployRestorePickFrom: 'Or pick content from',
+ deployFullRestoreFrom: 'Restore this workspace from',
+ deployFullRestoreDescription:
+ '\n This will transfer changes from %0% for all items and apply them to this workspace.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ',
+ deployFullRestoreAction: 'Restore from',
+ deployTreeRestoreFrom: 'Restore this tree from',
+ deployTreeRestoreDescription:
+ '\n This will transfer changes from %0% and apply them to the selected tree in this workspace. This will include changes to any referenced content, media or other items.
\n \n Notice: \n Restoring a large number of items can take a long time to perform. Whilst this operation is proceeding you should not make changes to your Umbraco data or initiate any further deploy operations.\n
\n ',
+ deployCompareTitle: 'Compare',
+ deployGoToTransferQueue: 'Open transfer queue',
+ },
+ deployManagementDashboard: {
+ refreshStatus: 'Refresh Status',
+ deployStatus: 'Deploy Status',
+ deployOperations: 'Deploy Operations',
+ triggerOperation: 'Trigger Operation',
+ version: 'Version',
+ status: 'Status',
+ operationTime: 'Last operation time',
+ schemaComparison: 'Schema Comparison',
+ configurationDetails: 'Configuration Details',
+ updateUmbracoSchemaFromDataFiles: 'Update Umbraco Schema From Data Files',
+ updateUmbracoSchemaFromDataFilesDescription:
+ 'Update the Umbraco schema based on the information contained in the .uda files on disk.',
+ schemaDeployment: 'Update Umbraco Schema',
+ exportSchemaToDataFiles: 'Export Schema To Data Files',
+ exportSchemaToDataFilesDescription: 'Extract the schema from Umbraco and output it to the .uda files on disk.',
+ exportSchema: 'Export Schema',
+ clearCachedSignatures: 'Clear Cached Signatures',
+ clearCachedSignaturesDescription:
+ '\n Clear the cached artifact signatures from the Umbraco environment.\n This should not be necessary in normal use. This may solve reports of schema mismatches when transferring content between environments that have been aligned.\n ',
+ clearSignatures: 'Clear Signatures',
+ setCachedSignatures: 'Set Cached Signatures',
+ setCachedSignaturesDescription:
+ '\n Sets the cached artifact signatures for all entities within the Umbraco environment.\n This can be used when signatures have been cleared and you want to ensure they are pre-generated before attempting a potentially long-running restore or transfer operation.\n ',
+ setSignatures: 'Set Signatures',
+ },
+ formPicker: {
+ selectFromFolder: 'Select from folder',
+ selectFromList: 'Select from list of all forms',
+ },
+ formCopy: {
+ title: "Copying form '%0%'",
+ enterName: 'Enter a name for the copied form',
+ alsoCopyWorkflows: 'Also copy workflows?',
+ copyToNewFolder: 'Copy to a new folder?',
+ selectLocation: 'Select the location for copied form',
+ },
+ formCreate: {
+ title: 'Create a new form or folder',
+ emptyForm: 'Empty form',
+ emptyFormDescription: 'Starting from scratch',
+ folder: 'Folder',
+ folderDescription: 'Used to organize forms',
+ enterFolderName: 'Enter a folder name',
+ },
+ formExport: {
+ formExportedSuccess: 'The form was exported to a file.',
+ },
+ formImport: {
+ importInstruction1:
+ "\n To import a form, find the exported .json file on your computer by clicking the 'Import' button (you'll be asked for confirmation on the next screen).\n ",
+ importInstruction2:
+ '\n If a form already exists with the ID of the file selected, it will be updated and moved to the selected location.\n If no existing form is found, a new one will be created at the selected location.\n ',
+ },
+ formPermissions: {
+ accessDeniedTitle: 'Access denied',
+ },
+ formMessages: {
+ saveErrorMessage: 'Please check if your settings are valid.',
+ },
+ formEdit: {
+ addQuestion: 'Add question',
+ groupIsEmpty: 'Group is empty',
+ dropQuestionHere: 'Drop a question here...',
+ letGo: 'Yaay.. let go',
+ pageIsEmpty: 'Page is empty',
+ dropGroupHere: 'Drop a group here...',
+ addGroup: 'Add new group',
+ addPage: 'Add new page',
+ pageTitlePlaceholder: 'Untitled page (optional)',
+ groupTitlePlaceholder: 'Untitled group (optional)',
+ saveFieldFailedTitle: 'Field failed to save',
+ accessDeniedMessage: 'You do not have access to edit this form.',
+ formSaved: 'Form saved',
+ unableToLoadForm: 'Unable to load form',
+ helpText: 'Help text',
+ editPage: 'Edit Page',
+ editGroup: 'Edit Group',
+ editQuestion: 'Edit Question',
+ workflows: 'Workflows',
+ magicStringsForFieldsNote:
+ '\n Many field settings support the use of magic strings .\n When the form is displayed, these strings can be replaced with values from various sources, including dictionary values, session or cookie data and Umbraco page fields.\n Read more .',
+ magicStringsForWorkflowsNote:
+ '\n Many workflow settings support the use of magic strings .\n When the workflow is processed, these strings can be replaced with values from various sources, including record data and dictionary values.\n Read more .',
+ fieldTypeNotAvailable: 'The field type configured for this field is no longer available.',
+ fieldTypeRichTextNotAvailable: 'The rich text cannot be formatted as no valid data type has been configured.',
+ fieldTypeRichTextNotAvailableLinkText: 'Read how to configure a data type.',
+ },
+ formFileUpload: {
+ allowAllFiles: 'Allow all files',
+ allowOnlySpecifiedFiles: 'Allow only specified files',
+ predefinedAllowedFileTypes: 'Predefined allowed file types',
+ userDefinedAllowedFileTypes: 'User defined allowed file types',
+ deleteAllowedFileTypeConfirmationTitle: 'Confirmation',
+ deleteAllowedFileTypeConfirmationDescription: 'Are you sure you want to delete this?',
+ duplicateFileTypeErrorTitle: 'File type error',
+ duplicateFileTypeErrorMessage: 'Unable to add file type as this is a duplicate.',
+ pickFile: 'Pick File',
+ uploading: 'Uploading',
+ currentFile: 'Current file',
+ },
+ formPrevalues: {
+ newValue: 'New value',
+ newCaption: 'New caption',
+ caption: 'Caption',
+ duplicateErrorTitle: 'Prevalue error',
+ duplicateAddErrorMessage: 'Unable to add value as it would create a duplicate.',
+ duplicateEditErrorMessage: 'Unable to edit value as it would create a duplicate.',
+ },
+ formDelete: {
+ title: "Are you sure you want to delete the %0% '%1%'?",
+ timingNote: 'Please note this can take lots of time depending on the number of records.',
+ recordDeleteNote: 'Deleting the form will also delete the associated records.',
+ recordDetail: 'There are %0% records, with the most recent one submitted on %1%.',
+ noRecordDetail: 'There are 0 records.',
+ cannotDeleteFolder: 'The selected folder cannot be deleted as it is not empty.',
+ successMessageForForm: 'Successfully deleted the form.',
+ failedMessageForForm: 'Form failed to delete.',
+ successMessageForFolder: 'Successfully deleted the folder.',
+ failedMessageForFolder: 'Folder failed to delete.',
+ },
+ formEntries: {
+ title: '%0% Entries',
+ filterEntries: 'Filter entries...',
+ selectedRowsDescription: '%0% of %1% selected',
+ export: 'Export',
+ chooseExportFormat: 'Choose a format to export form records to',
+ entriesNotStored: 'Currently submissions are not stored in the database.',
+ enableStoreEntries: 'To enable this, go to form settings and activate the "Store Records" feature.',
+ noEntriesInRange: 'No submissions added yet in this date range.',
+ noEntriesInRangeDetail:
+ "We couldn't find any submissions, are you sure you published the form? Or try expanding the date range.",
+ noEntriesMatchingSearch: "We couldn't find any submissions matching your search.",
+ noEntriesMatchingSearchDetail: "Try searching for something else, maybe you're lucky next time.",
+ selectedEntryPaging: 'Entry %0% of %1%',
+ previousEntry: 'Previous entry',
+ nextEntry: 'Next entry',
+ accessDeniedMessage: "You do not have access to view this form's entries.",
+ executeCompleteTitle: 'Executed action',
+ executeSuccessMessage: 'Successfully executed action %0%',
+ executeErrorMessage: 'Failed to execute action %0% due to error: %1%.',
+ entryDetails: 'Entry details',
+ closeDetails: 'Close details',
+ submittedOn: 'Submitted on',
+ updatedOn: 'Updated on',
+ fromPage: 'From page',
+ member: 'Member',
+ state: 'State',
+ uniqueId: 'Unique ID',
+ auditTrail: 'Audit trail',
+ showAuditTrail: 'Show audit trail',
+ hideAuditTrail: 'Hide audit trail',
+ updatedBy: 'Updated by',
+ updateRecordSuccess: 'Record updated',
+ updateRecordError: 'Record could not be updated',
+ workflowAudit: 'Workflow Audit',
+ workflowAuditName: 'Name',
+ workflowAuditType: 'Type',
+ workflowAuditExecutedOn: 'Executed On',
+ workflowAuditExecutionStage: 'Stage',
+ workflowAuditResult: 'Result',
+ workflowAuditTitleFormatSingular: '%0% of %1% workflow succeeded',
+ workflowAuditTitleFormatPlural: '%0% of %1% workflows succeeded',
+ workflowAuditRetry: 'Retry',
+ workflowAuditRunAgain: 'Run Again',
+ workflowAuditRunAnyway: 'Run Anyway',
+ workflowAuditRetryConfirmTitle: 'Confirmation',
+ workflowAuditRetryConfirmMessage: 'Are you sure you wish to run the selected workflow?',
+ workflowAuditRetrySuccessMessage:
+ 'The workflow execution completed (see audit trail for status and consult logs for a non-successful result)',
+ workflowAuditRetryFailedMessage: 'The workflow execution failed',
+ workflowAuditRetryFailedMessageDetailWorkflowNotFound: 'The workflow is no longer associated with the form.',
+ workflowExecutionStageSubmitted: 'Submitted',
+ workflowExecutionStageApproved: 'Approved',
+ workflowExecutionStatusCompleted: 'Completed',
+ workflowExecutionStatusFailed: 'Failed',
+ workflowExecutionStatusNotConfigured: 'Not Configured',
+ workflowExecutionStatusCancelled: 'Cancelled',
+ workflowExecutionStatusSkippedDueToConditions: 'Ignored By Conditions',
+ },
+ formMove: {
+ title: 'Select the folder to move %0% to in the tree structure below.',
+ successMessage: '%0% was moved underneath %1% .',
+ successNotificationHeader: 'Moved',
+ successNotificationDescriptionForForm: 'The form was moved to the selected location.',
+ successNotificationDescriptionForFolder: 'The folder was moved to the selected location.',
+ },
+ formRename: {
+ enterNewName: 'Enter the new name',
+ successNotificationHeader: 'Renamed',
+ successNotificationDescriptionForFolder: 'The folder was renamed.',
+ },
+ formConditions: {
+ title: 'Conditions',
+ enableConditions: 'Enable conditions',
+ actionTypeShow: 'Show',
+ actionTypeHide: 'Hide',
+ workflowactionTypeShow: 'Run',
+ workflowactionTypeHide: 'Ignore',
+ logicTypeAll: 'all',
+ logicTypeAny: 'any',
+ operatorIs: 'is',
+ operatorIsNot: 'is not',
+ operatorGreaterThen: 'is greater than',
+ operatorLessThen: 'is less than',
+ operatorContains: 'contains',
+ operatorStartsWith: 'starts with',
+ operatorEndsWith: 'ends with',
+ thisFieldSetIf: 'this group if',
+ thisFieldIf: 'this field if',
+ buttonsForThisPageIf: 'the "next" or "submit" button for this page if',
+ thisWorkflowIf: 'this workflow if',
+ ofTheFollowingMatch: 'of the following match',
+ selectField: 'Select field',
+ addCondition: 'Add condition',
+ pageConditionsDescription:
+ 'Optionally define conditions for the display of the "Submit" or "Next" button for the page.',
+ pageButtonConditionStatus: '%0% buttons for this page if %1% of the following match:',
+ fieldsetConditionStatus: '%0% this group if %1% of the following match:',
+ fieldConditionStatus: '%0% this question if %1% of the following match:',
+ empty: 'empty',
+ },
+ formThemes: {
+ noThemesAvailable: 'No themes available. Add themes to /Views/Partials/Forms/Themes',
+ },
+ formWorkflows: {
+ workflowNameLabel: 'Workflow Name',
+ workflowNameDescription: 'Give a descriptive name for your workflow',
+ activeLabel: 'Active',
+ activeDescription: 'Enable or disable the workflow',
+ includeSensitiveDataLabel: 'Include Sensitive Data',
+ includeSensitiveDataDescription: 'Include sensitive data when executing this workflow?',
+ submitMessage: 'Submit message / Go to page',
+ approve: 'Approve',
+ automatic: 'automatic',
+ noWorkflowsAdded: 'No workflows are added',
+ configureWorkflow: 'configure workflow',
+ saveFailedTitle: 'Workflow failed to save',
+ closeConfirmationTitle: 'Confirmation',
+ closeConfirmationMessage: 'Changes have been made which have not been saved. Are you sure you wish to close?',
+ chooseWorkflow: 'Choose workflow',
+ on: 'On',
+ onSubmit: 'On Submit',
+ onSubmitDescription: 'We will run these workflows for you when the form is submitted',
+ onApprove: 'On Approve',
+ onApproveDescription: 'These workflows will run when the entry is approved',
+ onApproveAutomaticDescription: 'this happens automatically after the submit event with the current form settings',
+ defaultWorkflowName: 'Submit message / Go to page',
+ defaultWorkflowDescription: 'Show a message when the form is submitted or go to an Umbraco page',
+ addWorkflow: 'Add workflow',
+ messageOnSubmit: 'Message on submit',
+ messageOnSubmitDescription: 'Show a message when the form is submitted',
+ messageOnSubmitIsHtmlToggleTextOn: 'Format message in rich text',
+ messageOnSubmitIsHtmlToggleTextOff: 'Format message in plain text',
+ goToPage: 'Go to page',
+ goToPageDescription: 'Go to an Umbraco page when the form is submitted',
+ },
+ fieldSetColumns: {
+ title: 'Columns',
+ setNumber: 'Set how many columns you wish to have in your group.',
+ columnNumberDescription: 'This group currently has %0%.',
+ addColumn: 'Add column',
+ },
+ fieldSettings: {
+ namePlaceholder: 'Enter question...',
+ descriptionPlaceholder: 'Enter help text...',
+ requiredLabel: 'Required label',
+ chooseAnswerType: 'Choose answer type',
+ sensitiveData: 'Sensitive data',
+ sensitiveDataDescription:
+ "Prevent the data from being viewed and exported if a user doesn't have sufficient permissions.",
+ sensitiveDataLabel: 'Yes, this field stores sensitive data',
+ allowedFileUploadTypes: 'Allowed file upload types',
+ prevalues: 'Prevalues',
+ prevaluesProvideWithSources:
+ 'Either provide here a list of options (prevalues) specific for this field, or select a predefined prevalue source.',
+ prevaluesProvide: 'Provides a list of options (prevalues) for the field.',
+ prevaluesItems: 'Items',
+ prevaluesSource: 'Prevalue source',
+ pressEnterToAdd: 'Press enter to add a value',
+ settings: 'Settings',
+ mandatory: 'Mandatory',
+ enterRegex: 'Enter a regular expression',
+ invalidPlaceholder: 'Enter a field invalid message...',
+ allowMultipleFileUploads: 'Allow multiple file uploads',
+ multipleFilesToggleTextOn: 'Multiple files allowed',
+ multipleFilesToggleTextOff: 'Single file only',
+ },
+ formSettings: {
+ storeRecords: 'Store Records',
+ storeRecordsDescription:
+ "\n Check this box to save submitted records in a database.\n This will allow you to view and export them from the queries overview.\n If you don't want to store data (due to policies in your organization), leave the box un-checked.\n ",
+ storeRecordsConfirm: 'Yes, keep submitted records in a database so they can be viewed and exported later.',
+ captions: 'Captions',
+ captionsDescription: 'Change the captions for the Submit, Next and Previous buttons.',
+ captionSubmitButton: "'Submit' button label",
+ captionNextButton: "'Next' button label",
+ captionPreviousButton: "'Previous' button label",
+ styling: 'Styling',
+ stylingDescription:
+ 'Add one or more classes to wrap your form to enable custom styling, or disable default styling.',
+ formCssClass: 'Form CSS class',
+ disableDefaultStylesheet: 'Disable default stylesheet',
+ validation: 'Validation',
+ validationDescription:
+ 'Provide better validation messages, hide validation labels and change or disable the required/mandatory marker.',
+ mandatoryErrorMessage: 'Mandatory Error Message',
+ mandatoryErrorMessageDescription: 'Message to display when a mandatory field was left empty',
+ invalidErrorMessage: 'Invalid Error Message',
+ invalidErrorMessageDescription: 'Message to display when a field is invalid',
+ showValidationSummary: 'Show validation summary',
+ hideFieldValidationLabels: 'Hide field validation labels',
+ markFields: 'Mark fields',
+ markFieldsNoIndicator: 'No Indicator',
+ markMandatoryFields: 'Mark Mandatory Fields',
+ markOptionalFields: 'Mark Optional Fields',
+ indicator: 'Indicator',
+ changeIndicatorSymbol: 'Change the mandatory indicator symbol',
+ autocomplete: 'Autocomplete',
+ autocompleteDescription: "Add an attribute to control the overall form's autocompletion behaviour.",
+ autocompleteNone: 'None',
+ autocompleteOn: 'On',
+ autocompleteOff: 'Off',
+ moderation: 'Moderation',
+ moderationDescription:
+ 'Allow form submissions to be post moderated. Most use cases are for publicly shown entries such as blog post comments or submissions for a social campaign.',
+ enablePostModeration: 'Enable post moderation',
+ fieldsDisplayed: 'Fields displayed',
+ fieldsDisplayedDescription: 'Select which fields are displayed in the list of form entries.',
+ displayDefaultFields: 'Display default fields',
+ displayDefaultFieldsDescription:
+ 'By default, the values provided for the first three fields of the form are displayed, along with some system fields.',
+ formFields: 'Form fields',
+ systemFields: 'System fields',
+ noSelectedDisplayFields: 'No fields have been selected for display.',
+ resetDisplayDefaultFieldsMessage:
+ 'Are you sure you wish to return to the default field selection for display? The custom fields you have selected will be removed when the form is saved.',
+ dataRetention: 'Data retention',
+ dataRetentionDescription: 'Define how long form submissions are kept for before they are automatically deleted.',
+ dataRetentionForSubmittedRecords: 'Number of days to retain submitted records',
+ dataRetentionForApprovedRecords: 'Number of days to retain approved records',
+ dataRetentionRetainSubmittedRecords: 'Retain submitted records forever',
+ dataRetentionRetainApprovedRecords: 'Retain approved records forever',
+ scheduledRecordDeletionNotEnabled:
+ 'The scheduled record deletion service is not currently enabled. These settings will not take effect until it is enabled and running.',
+ },
+ formSecurity: {
+ saveSuccessTitle: 'User form security saved',
+ saveErrorTitle: 'User form security failed to save',
+ manageFormsLabel: 'Manage Forms',
+ manageFormsDescription: 'Grant or deny access to managing forms',
+ manageWorkflowsLabel: 'Manage Workflows',
+ manageWorkflowsDescription: 'Grant or deny access to managing all forms workflow items',
+ manageDatasourcesLabel: 'Manage Data Sources',
+ manageDatasourcesDescription: 'Grant or deny access to managing any data sources for all forms',
+ managePrevalueSourcesLabel: 'Manage Prevalue Sources',
+ managePrevalueSourcesDescription: 'Grant or deny access to managing any prevalue sources for all forms',
+ manageIndividualFormsLabel: 'Form Security',
+ manageIndividualFormsDescription: 'Grant or deny access to individual forms',
+ startFolders: 'Start folders',
+ startFoldersDescription: 'Define the root folder or folders for the user',
+ selectNewStartFolders: 'Select start folders',
+ formName: 'Form name',
+ hasAccess: 'Has Access',
+ viewEntriesLabel: 'View Entries',
+ viewEntriesDescription: 'Grant or deny access to viewing of submitted entries',
+ editEntriesLabel: 'Edit Entries',
+ editEntriesDescription: 'Grant or deny access to editing of submitted entries',
+ deleteTitle: 'Delete user security: %0%',
+ deleteUserRecordNote:
+ "By deleting the user security record the user's permissions will be derived from the user groups that they are members of.",
+ deleteSuccessMessage: 'User security record deleted.',
+ deleteFailedMessage: 'User security record could not be deleted.',
+ createTitle: 'Create user security',
+ createUserRecordNote:
+ 'When a user record is created it will take precedence over any permissions assigned at the user group level.',
+ selectUser: 'Select user',
+ allUsersHaveRecords: 'All users already have security records created.',
+ groupPermissions: 'Group permissions',
+ userPermissions: 'User permissions',
+ },
+ formDataSources: {
+ typeDescription: 'Select the type of data source',
+ createForm: 'Create form',
+ formName: 'Form Name',
+ selectFields: 'Select fields',
+ selectFieldsDescription: 'Fields from the datasource you wish to include in the form.',
+ setupForeignKeys: 'Setup foreign keys',
+ setupForeignKeysDescription: 'Select the value column for foreign key fields.',
+ selectType: 'Select type',
+ selectTypeDescription: 'Field type you wish to use for the included fields (or default value).',
+ defaultValue: 'Default value',
+ deleteConfirm: 'Are you sure you want to delete the data source %0%?',
+ saveSuccessTitle: 'Datasource saved',
+ saveErrorTitle: 'Datasource failed to save',
+ accessDeniedMessage: 'You do not have access to edit datasources',
+ },
+ formPrevalueSources: {
+ typeDescription: 'Select the type of prevalue source',
+ deleteConfirm: 'Are you sure you want to delete the prevalue source %0%?',
+ saveSuccessTitle: 'Prevalue source saved',
+ saveErrorTitle: 'Prevalue source failed to save',
+ accessDeniedMessage: 'You do not have access to edit prevalue sources',
+ },
+ formProviderFieldTypes: {
+ checkboxName: 'Checkbox',
+ checkboxDescription: 'Renders a checkbox.',
+ checkboxDefaultValueLabel: 'Default Value',
+ checkboxDefaultValueDescription: 'Enter a default value.',
+ multipleChoiceName: 'Multiple choice',
+ multipleChoiceDescription: 'Renders a collection of checkboxes to select multiple answers.',
+ multipleChoiceDefaultValueLabel: 'Default Value',
+ multipleChoiceDefaultValueDescription: 'Enter a default value.',
+ multipleChoiceShowLabelLabel: 'Show Label',
+ multipleChoiceShowLabelDescription: "Indicate whether the field's label should be shown when rendering the form.",
+ dataConsentName: 'Data Consent',
+ dataConsentDescription: 'Renders a field to ask for data consent.',
+ dataConsentAcceptCopyLabel: 'Accept Copy',
+ dataConsentAcceptCopyDescription: 'The text used to confirm consent.',
+ dataConsentShowLabelLabel: 'Show Label',
+ dataConsentShowLabelDescription: "Indicate whether the field's label should be shown when rendering the form.",
+ dateName: 'Date',
+ dateDescription: 'Renders a date picker.',
+ datePlaceholderLabel: 'Placeholder',
+ datePlaceholderDescription: 'Enter a placeholder value.',
+ dropdownName: 'Dropdown',
+ dropdownDescription: 'Renders a list of values in a dropdown',
+ dropdownDefaultValueLabel: 'Default Value',
+ dropdownDefaultValueDescription: 'Enter a default value.',
+ dropdownAllowMultipleSelectionsLabel: 'Allow multiple selections',
+ dropdownAllowMultipleSelectionsDescription: 'Indicate whether multiple selections from the list are allowed.',
+ dropdownShowLabelLabel: 'Show Label',
+ dropdownShowLabelDescription: "Indicate whether the field's label should be shown when rendering the form.",
+ dropdownAutocompleteAttributeLabel: 'Autocomplete attribute',
+ dropdownAutocompleteAttributeDescription: 'Optionally enter a value for the autocomplete attribute.',
+ dropdownSelectPromptLabel: 'Prompt for selection',
+ dropdownSelectPromptDescription: "Optionally provide a prompt for the user's selection.",
+ fileUploadName: 'File upload',
+ fileUploadDescription: 'Renders an upload field, allowing files to be uploaded.',
+ hiddenName: 'Hidden',
+ hiddenDescription: 'Renders a hidden field.',
+ hiddenDefaultValueLabel: 'Default Value',
+ hiddenDefaultValueDescription: 'Enter a default value.',
+ passwordName: 'Password',
+ passwordDescription: 'Renders a password field.',
+ passwordPlaceholderLabel: 'Placeholder',
+ passwordPlaceholderDescription: 'Enter a placeholder value.',
+ singleChoiceName: 'Single choice',
+ singleChoiceDescription: 'Renders a radio button list to enable a single choice answer.',
+ singleChoiceDefaultValueLabel: 'Default Value',
+ singleChoiceDefaultValueDescription: 'Enter a default value.',
+ singleChoiceShowLabelLabel: 'Show Label',
+ singleChoiceShowLabelDescription: "Indicate whether the field's label should be shown when rendering the form.",
+ recaptcha2Name: 'reCAPTCHA v2',
+ recaptcha2Description: 'Google reCAPTCHA v2.',
+ recaptcha2ThemeLabel: 'Theme',
+ recaptcha2ThemeDescription: 'reCAPTCHA v2 theme.',
+ recaptcha2SizeLabel: 'Size',
+ recaptcha2SizeDescription: 'reCAPTCHA v2 size.',
+ recaptcha2ErrorMessageLabel: 'Error message',
+ recaptcha2ErrorMessageDescription: 'The error message to display when the user does not pass the reCAPTCHA check.',
+ reCAPTCHAV3WithScoreName: 'reCAPTCHA v3 with score',
+ reCAPTCHAV3WithScoreDescription: 'Google reCAPTCHA v3 with score threshold',
+ reCAPTCHAV3WithScoreScoreThresholdLabel: 'Score threshold',
+ reCAPTCHAV3WithScoreScoreThresholdDescription:
+ 'A reCAPTCHA v3 determined score between 0 and 1, above which form submissions are accepted. A higher value will catch more spam submissions, but also increase the risk of rejections of valid entries. For most sites, 0.5 is a sensible choice..',
+ reCAPTCHAV3WithScoreScoreErrorMessageLabel: 'Error message',
+ reCAPTCHAV3WithScoreScoreErrorMessageDescription:
+ 'The error message to display when the user does not pass the reCAPTCHA check.',
+ reCAPTCHAV3WithScoreScoreSaveScoreLabel: 'Save score',
+ reCAPTCHAV3WithScoreScoreSaveScoreDescription: 'Save the calculated score with the form submission.',
+ richTextName: 'Rich text',
+ richTextDescription: 'Provide some some descriptive text with formatting.',
+ richTextHtmlLabel: 'Rich text',
+ richTextHtmlDescription: 'Enter your formatted text',
+ titleAndDescriptionName: 'Title and description',
+ titleAndDescriptionDescription: 'This is used to enter some descriptive text.',
+ titleAndDescriptionCaptionLabel: 'Headline',
+ titleAndDescriptionCaptionDescription: 'Enter a headline.',
+ titleAndDescriptionBodyTextLabel: 'Body Text',
+ titleAndDescriptionBodyTextDescription: 'Enter your copy text.',
+ titleAndDescriptionCaptionTagLabel: 'Headline tag',
+ titleAndDescriptionCaptionTagDescription: 'Select the HTML element to use when rendering the headline.',
+ titleAndDescriptionShowLabelLabel: 'Show Label',
+ titleAndDescriptionShowLabelDescription:
+ "Indicate whether the field's label should be shown when rendering the form.",
+ longAnswerName: 'Long answer',
+ longAnswerDescription: 'Renders a textarea, designed for longer answers.',
+ longAnswerDefaultValueLabel: 'Default Value',
+ longAnswerDefaultValueDescription: 'Enter a default value.',
+ longAnswerPlaceholderLabel: 'Placeholder',
+ longAnswerPlaceholderDescription: 'Enter a placeholder value.',
+ longAnswerShowLabelLabel: 'Show Label',
+ longAnswerShowLabelDescription: "Indicate whether the field's label should be shown when rendering the form.",
+ longAnswerAutocompleteAttributeLabel: 'Autocomplete attribute',
+ longAnswerAutocompleteAttributeDescription: 'Optionally enter a value for the autocomplete attribute.',
+ longAnswerNumberOfRowsLabel: 'Number Of Rows',
+ longAnswerNumberOfRowsDescription: 'Enter the number of rows displayed for entry.',
+ longAnswerMaximumLengthLabel: 'Maximum Length',
+ longAnswerMaximumLengthDescription: 'Enter the maximum number of characters accepted.',
+ shortAnswerName: 'Short answer',
+ shortAnswerDescription: 'Renders an text input field, for short answers.',
+ shortAnswerDefaultValueLabel: 'Default Value',
+ shortAnswerDefaultValueDescription: 'Enter a default value.',
+ shortAnswerPlaceholderLabel: 'Placeholder',
+ shortAnswerPlaceholderDescription: 'Enter a placeholder value.',
+ shortAnswerShowLabelLabel: 'Show Label',
+ shortAnswerShowLabelDescription: "Indicate whether the field's label should be shown when rendering the form.",
+ shortAnswerMaximumLengthLabel: 'Maximum Length',
+ shortAnswerMaximumLengthDescription: 'Enter the maximum number of characters accepted.',
+ shortAnswerFieldTypeLabel: 'Field Type',
+ shortAnswerFieldTypeDescription: 'Select the type of information expected.',
+ shortAnswerAutocompleteAttributeLabel: 'Autocomplete attribute',
+ shortAnswerAutocompleteAttributeDescription: 'Optionally enter a value for the autocomplete attribute.',
+ },
+ formProviderWorkflows: {
+ changeRecordStateName: 'Change Record State',
+ changeRecordStateDescription: 'Changes the state of the record being processed when it matches a word.',
+ changeRecordStateWordsLabel: 'Words',
+ changeRecordStateWordsDescription: 'Comma seperated list of words to match.',
+ changeRecordStateActionLabel: 'Action',
+ changeRecordStateActionDescription: 'What to do if it matches.',
+ postAsXMLName: 'Post as XML',
+ postAsXMLDescription: 'Posts the form as XML to a URL.',
+ postAsXMLUrlLabel: 'URL',
+ postAsXMLUrlDescription: 'Enter the URL to post to.',
+ postAsXMLMethodLabel: 'Method',
+ postAsXMLMethodDescription: 'POST or GET.',
+ postAsXMLXsltFileLabel: 'XSLT File',
+ postAsXMLXsltFileDescription: 'Transform the XML before posting it.',
+ postAsXMLFieldsLabel: 'Fields',
+ postAsXMLFieldsDescription: 'Map the needed fields.',
+ postAsXMLUsernameLabel: 'User',
+ postAsXMLUsernameDescription: '(optional)',
+ postAsXMLPasswordLabel: 'Password',
+ postAsXMLPasswordDescription: '(optional)',
+ sendFormToURLName: 'Send form to URL',
+ sendFormToURLDescription: 'Sends the form to a URL, either as a HTTP POST or GET.',
+ sendFormToURLUrlLabel: 'URL',
+ sendFormToURLUrlDescription: 'Enter the URL to post to.',
+ sendFormToURLMethodLabel: 'Method',
+ sendFormToURLMethodDescription: 'POST or GET.',
+ sendFormToURLStandardFieldsLabel: 'Standard Fields',
+ sendFormToURLStandardFieldsDescription: 'Map any standard form information to send.',
+ sendFormToURLFieldsLabel: 'Fields',
+ sendFormToURLFieldsDescription: 'Map the needed fields.',
+ sendFormToURLUsernameLabel: 'User',
+ sendFormToURLUsernameDescription: '(optional)',
+ sendFormToURLPasswordLabel: 'Password',
+ sendFormToURLPasswordDescription: '(optional)',
+ saveAsAnXMLFileName: 'Save as an XML file',
+ saveAsAnXMLFileDescription: 'Saves the result of the form as an XML file via XSLT.',
+ saveAsAnXMLFilePathLabel: 'Path',
+ saveAsAnXMLFilePathDescription: 'Path to place the file.',
+ saveAsAnXMLFileExtensionLabel: 'Extension',
+ saveAsAnXMLFileExtensionDescription: 'File extension.',
+ saveAsAnXMLFileXsltFileLabel: 'XSLT File',
+ saveAsAnXMLFileXsltFileDescription: 'Transform the XML before saving it.',
+ saveAsUmbracoContentNodeName: 'Save as Umbraco content node',
+ saveAsUmbracoContentNodeDescription: 'Saves the form values as an content node using a specified document type.',
+ saveAsUmbracoContentNodeFieldsLabel: 'Document Type',
+ saveAsUmbracoContentNodeFieldsDescription: 'Map document type.',
+ saveAsUmbracoContentNodePublishLabel: 'Publish',
+ saveAsUmbracoContentNodePublishDescription: 'Publish node instantly.',
+ saveAsUmbracoContentNodeRootNodeLabel: 'Save location',
+ saveAsUmbracoContentNodeRootNodeDescription: 'Choose the location for where to save the created content node.',
+ sendEmailName: 'Send email',
+ sendEmailDescription: 'Send the result of the form to an email address.',
+ sendEmailEmailLabel: 'Recipient Email',
+ sendEmailEmailDescription: 'Enter the recipient email address(es).',
+ sendEmailCcEmailLabel: 'CC Email',
+ sendEmailCcEmailDescription: 'Enter the CC email addresses (if required).',
+ sendEmailBccEmailLabel: 'BCC Email',
+ sendEmailBccEmailDescription: 'Enter the BCC email addresses (if required).',
+ sendEmailSenderEmailLabel: 'Sender Email',
+ sendEmailSenderEmailDescription: 'Enter the sender email (if blank it will use the settings from configuration).',
+ sendEmailReplyToEmailLabel: 'Reply To Email',
+ sendEmailReplyToEmailDescription: 'Enter the email address to be used as the reply-to address (if required).',
+ sendEmailSubjectLabel: 'Subject',
+ sendEmailSubjectDescription: 'Enter the subject.',
+ sendEmailMessageLabel: 'Message',
+ sendEmailMessageDescription: 'Enter the introductory message.',
+ sendEmailAttachmentLabel: 'Attachments',
+ sendEmailAttachmentDescription: 'Attach file uploads to email.',
+ sendEmailWithTemplateRazorName: 'Send email with template (Razor)',
+ sendEmailWithTemplateRazorDescription:
+ 'Send the result of the form to an email address/addresses using a Razor .cshtml template.',
+ sendEmailWithTemplateRazorEmailLabel: 'Recipient Email',
+ sendEmailWithTemplateRazorEmailDescription: 'Enter the recipient email address(es).',
+ sendEmailWithTemplateRazorCcEmailLabel: 'CC Email',
+ sendEmailWithTemplateRazorCcEmailDescription: 'Enter the CC email addresses (if required).',
+ sendEmailWithTemplateRazorBccEmailLabel: 'BCC Email',
+ sendEmailWithTemplateRazorBccEmailDescription: 'Enter the BCC email addresses (if required).',
+ sendEmailWithTemplateRazorSenderEmailLabel: 'Sender Email',
+ sendEmailWithTemplateRazorSenderEmailDescription:
+ 'Enter the sender email (if blank it will use the settings from configuration).',
+ sendEmailWithTemplateRazorReplyToEmailLabel: 'Reply To Email',
+ sendEmailWithTemplateRazorReplyToEmailDescription:
+ 'Enter the email address to be used as the reply-to address (if required).',
+ sendEmailWithTemplateRazorSubjectLabel: 'Subject',
+ sendEmailWithTemplateRazorSubjectDescription: 'Enter the subject.',
+ sendEmailWithTemplateRazorRazorViewFilePathLabel: 'Email Template',
+ sendEmailWithTemplateRazorRazorViewFilePathDescription:
+ 'The path to the Razor view that you want to use for generating the email. Email templates are stored at /Views/Partials/Forms/Emails.',
+ sendEmailWithTemplateRazorHeaderHtmlLabel: 'Header text',
+ sendEmailWithTemplateRazorHeaderHtmlDescription: 'Enter formatted text to be rendered in the email header.',
+ sendEmailWithTemplateRazorFooterHtmlLabel: 'Footer text',
+ sendEmailWithTemplateRazorFooterHtmlDescription: 'Enter formatted text to be rendered in the email footer.',
+ sendEmailWithTemplateRazorAttachmentLabel: 'Attachments',
+ sendEmailWithTemplateRazorAttachmentDescription: 'Attach file uploads to email.',
+ sendXSLTTransformedEmailName: 'Send XSLT transformed email',
+ sendXSLTTransformedEmailDescription: 'Send the result of the form to an email address.',
+ sendXSLTTransformedEmailEmailLabel: 'Recipient Email',
+ sendXSLTTransformedEmailEmailDescription: 'Enter the recipient email address(es).',
+ sendXSLTTransformedEmailCcEmailLabel: 'CC Email',
+ sendXSLTTransformedEmailCcEmailDescription: 'Enter the CC email addresses (if required).',
+ sendXSLTTransformedEmailBccEmailLabel: 'BCC Email',
+ sendXSLTTransformedEmailBccEmailDescription: 'Enter the BCC email addresses (if required).',
+ sendXSLTTransformedEmailSenderEmailLabel: 'Sender Email',
+ sendXSLTTransformedEmailSenderEmailDescription:
+ 'Enter the sender email (if blank it will use the settings from configuration).',
+ sendXSLTTransformedEmailReplyToEmailLabel: 'Reply To Email',
+ sendXSLTTransformedEmailReplyToEmailDescription:
+ 'Enter the email address to be used as the reply-to address (if required).',
+ sendXSLTTransformedEmailSubjectLabel: 'Subject',
+ sendXSLTTransformedEmailSubjectDescription: 'Enter the subject.',
+ sendXSLTTransformedEmailXsltFileLabel: 'XSLT File',
+ sendXSLTTransformedEmailXsltFileDescription: 'Transform the XML before sending the email.',
+ slackLegacyName: 'Slack (Legacy)',
+ slackLegacyDescription: 'Posts the form data to a specific channel on Slack using legacy tokens.',
+ slackLegacyTokenLabel: 'API Token',
+ slackLegacyTokenDescription: 'Slack API token.',
+ slackLegacyChannelLabel: 'Channel',
+ slackLegacyChannelDescription: 'Slack channel to post to.',
+ slackLegacyUsernameLabel: 'Username',
+ slackLegacyUsernameDescription: 'The username or bot to post as.',
+ slackLegacyAvatarUrlLabel: 'Avatar URL',
+ slackLegacyAvatarUrlDescription: 'The full URL (including http/https) to the avatar image.',
+ slackName: 'Slack',
+ slackDescription: 'Posts the form data to a specific channel on Slack using a webhook.',
+ slackWebhookUrlLabel: 'Webhook URL',
+ slackWebhookUrlDescription: 'Slack Webhook URL.',
+ },
+ formProviderDataSources: {
+ sQLDatabaseName: 'SQL Database',
+ sQLDatabaseDescription: 'Connects to any OLEDB supported database table and constructs a datasource from it.',
+ sQLDatabaseConnectionLabel: 'Connection String',
+ sQLDatabaseConnectionDescription: 'OleDB Compatible Connection string.',
+ sQLDatabaseTableLabel: 'Table Name',
+ sQLDatabaseTableDescription: 'Database table name.',
+ },
+ formProviderPrevalueSources: {
+ dataSourceName: 'DataSource',
+ dataSourceDescription: 'Stores prevalues in the prevalues table.',
+ getValuesFromTextfileName: 'Get values from textfile',
+ getValuesFromTextfileDescription: 'Upload textfile that contains the prevalues.',
+ getValuesFromTextfileTextFileLabel: 'Text File',
+ getValuesFromTextfileTextFileDescription: 'File containing the prevalues (separated by linebreaks).',
+ umbracoDocumentsName: 'Umbraco Documents',
+ umbracoDocumentsDescription: 'Uses nodes from a specific source as preValues.',
+ umbracoDocumentsRootNodeLabel: 'Root node',
+ umbracoDocumentsRootNodeDescription: 'Source to fetch nodes from.',
+ umbracoDocumentsUseCurrentPageLabel: 'Use current page as root',
+ umbracoDocumentsUseCurrentPageDescription: 'Does not work in preview mode.',
+ umbracoDocumentsDocTypeLabel: 'Document type',
+ umbracoDocumentsDocTypeDescription: 'The type of nodes you would like to use.',
+ umbracoDocumentsValueFieldLabel: 'Value field',
+ umbracoDocumentsValueFieldDescription: 'Select which field should be used for the value of the prevalue.',
+ umbracoDocumentsListGrandChildrenLabel: 'List all descendants',
+ umbracoDocumentsListGrandChildrenDescription: "Don't limit to children but also include other levels.",
+ umbracoDocumentsOrderByLabel: 'Order by',
+ umbracoDocumentsOrderByDescription: 'Select how the prevalue list should be ordered.',
+ sQLDatabaseName: 'SQL Database',
+ sQLDatabaseDescription: 'Connects to a OLEDB compatible Database Table and constructs a prevalue source from it.',
+ sQLDatabaseConnectionLabel: 'Connection String',
+ sQLDatabaseConnectionDescription: 'OleDB compatible connection string.',
+ sQLDatabaseConnectionStringLabel: 'Connection String from configuration',
+ sQLDatabaseConnectionStringDescription: 'Choose connection string (needs to be OleDB compatible).',
+ sQLDatabaseTableNameLabel: 'Table Name',
+ sQLDatabaseTableNameDescription: '',
+ sQLDatabaseKeyColumnLabel: 'Key Column',
+ sQLDatabaseKeyColumnDescription: 'Column containing the keys.',
+ sQLDatabaseValueColumnLabel: 'Value Column',
+ sQLDatabaseValueColumnDescription: 'Column containing the values.',
+ sQLDatabaseCaptionColumnLabel: 'Caption Column',
+ sQLDatabaseCaptionColumnDescription: 'Column containing the captions.',
+ umbracoDataTypePreValueName: 'Umbraco data type PreValues',
+ umbracoDataTypePreValueDescription: 'Connects to an Umbraco data type and uses its pre-value collection.',
+ umbracoDataTypePreValuesDataTypeIdLabel: 'Data Type',
+ umbracoDataTypePreValuesDataTypeIdDescription: 'Data type to use.',
+ },
+ formProviderExportTypes: {
+ excelFileName: 'Excel File (submitted values)',
+ excelFileDescription:
+ 'Exports all submitted values for the form to Excel, in a format useful for integration with other systems.',
+ excelFileDisplayValuesName: 'Excel File (display values)',
+ excelFileDisplayValuesDescription:
+ 'Exports all values for the form to Excel, in a format useful for reviewing the data or creating a report. Captions are used for prevalue data where available.',
+ excelFileNameOsx: 'Excel/Numbers File (submitted values)',
+ excelFileDescriptionOsx:
+ 'Exports all submitted values for the form to Excel/Numbers, in a format useful for integration with other systems.',
+ excelFileDisplayValuesNameOsx: 'Excel/Numbers File (display values)',
+ excelFileDisplayValuesDescriptionOsx:
+ 'Exports all values for the form to Excel/Numbers, in a format useful for reviewing the data or creating a report. Captions are used for prevalue data where available.',
+ saveAllUploadedFilesInDiskStructureName: 'Save All Uploaded Files (in disk structure)',
+ saveAllUploadedFilesInDiskStructureDescription:
+ 'Exports all files uploading in form submissions to a zip archive, organized as the files are stored on disk.',
+ saveAllUploadedFilesByEntryName: 'Save All Uploaded Files (by entry)',
+ saveAllUploadedFilesByEntryDescription:
+ 'Exports all files uploading in form submissions to a zip archive, organized in a sub-folder per entry.',
+ },
+ formRecordSetActions: {
+ deleteConfirm: 'Are you sure you want to delete these entries?',
+ },
+} as UmbTranslationsDictionary;
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
index d9d29fced6..29bf873007 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts
@@ -10,7 +10,7 @@ const translationManifests: Array = [
meta: {
culture: 'en-us',
},
- loader: () => import('../../../assets/lang/en-us.js' as unknown as string),
+ loader: () => import('../../../assets/lang/en-us.js'),
},
{
type: 'translations',
@@ -20,7 +20,7 @@ const translationManifests: Array = [
meta: {
culture: 'da-dk',
},
- loader: () => import('../../../assets/lang/da-dk.js' as unknown as string),
+ loader: () => import('../../../assets/lang/da-dk.js'),
},
];
From aee130add05e143b6fbbe9356d11339529f2b13a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 11:13:35 +0200
Subject: [PATCH 103/122] add code explanation
---
.../users/users/workspace/user-workspace-editor.element.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
index 02cc921e93..b99b23e898 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/users/users/workspace/user-workspace-editor.element.ts
@@ -107,6 +107,8 @@ export class UmbUserWorkspaceEditorElement extends UmbLitElement {
if (currentUserLanguage) {
currentUserLanguage.selected = true;
} else {
+ // If users language code did not fit any of the options. We will create an option that fits, named unknown.
+ // In this way the user can keep their choice though a given language was not present at this time.
this.languages.push({
value: currentUserLanguageCode ?? 'en-us',
name: currentUserLanguageCode ? `${currentUserLanguageCode} (unknown)` : 'Unknown',
From aba2fdf41486b7a9a5483ec63893e722cb11f484 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 11:17:08 +0200
Subject: [PATCH 104/122] type for translation entry method
---
.../core/extension-registry/models/translations.model.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
index 974c6ff2e2..2f0b3ac679 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
@@ -1,6 +1,6 @@
import type { ManifestWithLoaderIncludingDefaultExport } from '@umbraco-cms/backoffice/extension-api';
-export type UmbTranslationEntry = string;
+export type UmbTranslationEntry = string | ((...args: unknown[]) => string);
export type UmbTranslationsDictionary = Record>;
export interface ManifestTranslations extends ManifestWithLoaderIncludingDefaultExport {
From 0f7488d0c2f08d97e8c2c1cb62724ebb33b6553a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 11:20:55 +0200
Subject: [PATCH 105/122] correct import order
---
.../src/libs/controller-api/controller-host-element.mixin.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
index c5d873877b..89a5edd451 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
@@ -1,9 +1,9 @@
+import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
import { HTMLElementConstructor } from '../extension-api/types.js';
import { UmbControllerAlias } from './controller-alias.type.js';
import { UmbControllerHostBaseMixin } from './controller-host-base.mixin.js';
import { UmbControllerHost } from './controller-host.interface.js';
import type { UmbController } from './controller.interface.js';
-import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
export declare class UmbControllerHostElement extends HTMLElement implements UmbControllerHost {
/**
From 96ee7d1d99d311010e03f8c5d1026421a0467ad3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 11:22:32 +0200
Subject: [PATCH 106/122] more import ordering
---
.../src/libs/controller-api/controller-host-element.mixin.ts | 2 +-
.../components/insert-menu/templating-insert-menu.element.ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
index 89a5edd451..c5d873877b 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
@@ -1,9 +1,9 @@
-import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
import { HTMLElementConstructor } from '../extension-api/types.js';
import { UmbControllerAlias } from './controller-alias.type.js';
import { UmbControllerHostBaseMixin } from './controller-host-base.mixin.js';
import { UmbControllerHost } from './controller-host.interface.js';
import type { UmbController } from './controller.interface.js';
+import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
export declare class UmbControllerHostElement extends HTMLElement implements UmbControllerHost {
/**
diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts
index babb659488..19fe1076a7 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts
@@ -1,7 +1,7 @@
-import { UmbDictionaryRepository } from '@umbraco-cms/backoffice/dictionary';
import { UMB_MODAL_TEMPLATING_INSERT_CHOOSE_TYPE_SIDEBAR_ALIAS } from '../../modals/manifests.js';
import { getInsertDictionarySnippet, getInsertPartialSnippet } from '../../utils.js';
import { ChooseInsertTypeModalResult, CodeSnippetType } from '../../modals/insert-choose-type-sidebar.element.js';
+import { UmbDictionaryRepository } from '@umbraco-cms/backoffice/dictionary';
import { customElement, property, css, html } from '@umbraco-cms/backoffice/external/lit';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
import {
From 0a6b1dbec168a4ccfb1d7b4b1e338ba5a8932441 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 11:22:59 +0200
Subject: [PATCH 107/122] more sorting...
---
.../components/insert-menu/templating-insert-menu.element.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts
index 19fe1076a7..babb659488 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/templating/components/insert-menu/templating-insert-menu.element.ts
@@ -1,7 +1,7 @@
+import { UmbDictionaryRepository } from '@umbraco-cms/backoffice/dictionary';
import { UMB_MODAL_TEMPLATING_INSERT_CHOOSE_TYPE_SIDEBAR_ALIAS } from '../../modals/manifests.js';
import { getInsertDictionarySnippet, getInsertPartialSnippet } from '../../utils.js';
import { ChooseInsertTypeModalResult, CodeSnippetType } from '../../modals/insert-choose-type-sidebar.element.js';
-import { UmbDictionaryRepository } from '@umbraco-cms/backoffice/dictionary';
import { customElement, property, css, html } from '@umbraco-cms/backoffice/external/lit';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
import {
From b8731b2a4010cb49fa9b63bc97894bbe589a5169 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 11:24:33 +0200
Subject: [PATCH 108/122] note on media helper server.
---
.../src/shared/utils/media-helper.service.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Umbraco.Web.UI.Client/src/shared/utils/media-helper.service.ts b/src/Umbraco.Web.UI.Client/src/shared/utils/media-helper.service.ts
index 77a0ef6b26..1e7ea8f109 100644
--- a/src/Umbraco.Web.UI.Client/src/shared/utils/media-helper.service.ts
+++ b/src/Umbraco.Web.UI.Client/src/shared/utils/media-helper.service.ts
@@ -1,5 +1,6 @@
// TODO => this is NOT a full reimplementation of the existing media helper service, currently
// contains only functions referenced by the TinyMCE editor
+// TODO: This should not be done in this way, we need to split this into seperate defined helper methods. This is also very specific to TinyMCE, so should be named that way.
import { Editor, EditorEvent } from 'tinymce';
From 57709ed356ff28088c440b2609d2b739eaa11401 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 11:25:53 +0200
Subject: [PATCH 109/122] type imports
---
.../libs/controller-api/controller-host-element.mixin.ts | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
index c5d873877b..d91aeb1b3b 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/controller-api/controller-host-element.mixin.ts
@@ -1,9 +1,9 @@
-import { HTMLElementConstructor } from '../extension-api/types.js';
-import { UmbControllerAlias } from './controller-alias.type.js';
+import type { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
+import type { HTMLElementConstructor } from '../extension-api/types.js';
+import type { UmbControllerAlias } from './controller-alias.type.js';
import { UmbControllerHostBaseMixin } from './controller-host-base.mixin.js';
-import { UmbControllerHost } from './controller-host.interface.js';
+import type { UmbControllerHost } from './controller-host.interface.js';
import type { UmbController } from './controller.interface.js';
-import { UmbLocalizeController } from '@umbraco-cms/backoffice/localization-api';
export declare class UmbControllerHostElement extends HTMLElement implements UmbControllerHost {
/**
From a6065e8ed1d096cc6be9f3ef69776d361e6d72e5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 11:29:18 +0200
Subject: [PATCH 110/122] note
---
.../src/libs/localization-api/localize.controller.ts | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
index 8c97bd5115..169220d40c 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
@@ -63,7 +63,8 @@ export class UmbLocalizeController
Date: Wed, 2 Aug 2023 12:04:05 +0200
Subject: [PATCH 111/122] remove unused operators
---
src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts b/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts
index 8fcc8cc181..abee27205d 100644
--- a/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts
@@ -14,6 +14,4 @@ export {
of,
lastValueFrom,
firstValueFrom,
- switchMap,
- throwError,
} from 'rxjs';
From a5bee4b89a51d880d51bf462e13a7d114fd1c904 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 2 Aug 2023 12:06:47 +0200
Subject: [PATCH 112/122] add display:contents to umb-localize
---
.../src/packages/core/localization/localize.element.ts | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
index 4a964a9508..e7f870c29d 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.ts
@@ -1,4 +1,4 @@
-import { customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit';
+import { css, customElement, html, property, state } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
/**
@@ -56,6 +56,14 @@ export class UmbLocalizeElement extends UmbLitElement {
? html`${this.key} `
: html` `;
}
+
+ static styles = [
+ css`
+ :host {
+ display: contents;
+ }
+ `,
+ ];
}
declare global {
From 4e4ab39465165ee57ae9ff3e6d4ec28dc4827709 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 12:28:04 +0200
Subject: [PATCH 113/122] rename Translation types to set
---
.../src/libs/localization-api/index.ts | 2 +-
.../localization-api/localize.controller.ts | 46 +++++++++++--------
.../src/libs/localization-api/manager.ts | 16 ++++---
.../registry/translation.registry.ts | 4 +-
4 files changed, 38 insertions(+), 30 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
index ea134f4fa2..139e9726f8 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/index.ts
@@ -1,3 +1,3 @@
export * from './registry/translation.registry.js';
export * from './localize.controller.js';
-export { registerTranslation, type DefaultTranslation, type Translation } from './manager.js';
+export { registerTranslation } from './manager.js';
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
index 169220d40c..c99ddc1d58 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.ts
@@ -12,17 +12,18 @@ The above copyright notice and this permission notice shall be included in all c
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import {
- DefaultTranslation,
+ DefaultTranslationSet,
FunctionParams,
- Translation,
+ TranslationSet,
connectedElements,
documentDirection,
documentLanguage,
fallback,
translations,
} from './manager.js';
-import { UmbController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
+import { UmbController, UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
+const LocalizeControllerAlias = Symbol();
/**
* The UmbLocalizeController enables localization for your element.
*
@@ -41,31 +42,36 @@ import { UmbController, UmbControllerHostElement } from '@umbraco-cms/backoffice
* }
* ```
*/
-export class UmbLocalizeController implements UmbController {
- host;
- controllerAlias = 'localize';
+export class UmbLocalizeController
+ implements UmbController
+{
+ #host;
+ #hostEl;
+ controllerAlias = LocalizeControllerAlias;
- constructor(host: UmbControllerHostElement) {
- this.host = host;
- this.host.addController(this);
+ constructor(host: UmbControllerHost) {
+ this.#host = host;
+ this.#hostEl = host.getHostElement() as HTMLElement;
+ this.#host.addController(this);
}
hostConnected(): void {
- if (connectedElements.has(this.host)) {
+ if (connectedElements.has(this.#hostEl)) {
return;
}
- connectedElements.add(this.host);
+ connectedElements.add(this.#hostEl);
}
hostDisconnected(): void {
- connectedElements.delete(this.host);
+ connectedElements.delete(this.#hostEl);
}
destroy(): void {
// We do not need to call delete here, as hostDisconnected is called when controller is removed.
//connectedElements.delete(this.host);
- this.host.removeController(this);
+ this.#host.removeController(this);
+ this.#hostEl = undefined as any;
}
/**
@@ -73,7 +79,7 @@ export class UmbLocalizeControllertranslations.get(`${language}-${region}`);
- const secondary = translations.get(language);
+ const primary = translations.get(`${language}-${region}`);
+ const secondary = translations.get(language);
return { locale, language, region, primary, secondary };
}
/** Outputs a translated term. */
- term(key: K, ...args: FunctionParams): string {
+ term(key: K, ...args: FunctionParams): string {
const { primary, secondary } = this.getTranslationData(this.lang());
let term: any;
@@ -104,8 +110,8 @@ export class UmbLocalizeController = T extends (...args: infer U) => string ? U : [];
-export interface Translation {
+export interface TranslationSet {
$code: string; // e.g. en, en-GB
$dir: 'ltr' | 'rtl';
}
-export interface DefaultTranslation extends Translation {
- [key: string]: any;
+export interface DefaultTranslationSet extends TranslationSet {
+ [key: string]: UmbTranslationEntry;
}
export const connectedElements = new Set();
const documentElementObserver = new MutationObserver(update);
-export const translations: Map = new Map();
+export const translations: Map = new Map();
export let documentDirection = document.documentElement.dir || 'ltr';
export let documentLanguage = document.documentElement.lang || navigator.language;
-export let fallback: Translation;
+export let fallback: TranslationSet;
// Watch for changes on
documentElementObserver.observe(document.documentElement, {
@@ -38,7 +39,7 @@ documentElementObserver.observe(document.documentElement, {
});
/** Registers one or more translations */
-export function registerTranslation(...translation: Translation[]) {
+export function registerTranslation(...translation: TranslationSet[]) {
translation.map((t) => {
const code = t.$code.toLowerCase();
@@ -65,6 +66,7 @@ export function update() {
[...connectedElements.keys()].map((el) => {
if (typeof (el as LitElement).requestUpdate === 'function') {
+ // TODO: We might want to implement a specific Umbraco method for informing about this. and then make the default UmbLitElement call requestUpdate..? Cause then others can implement their own solution?
(el as LitElement).requestUpdate();
}
});
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 10b39ac3d2..96ee85528c 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -1,4 +1,4 @@
-import { Translation, registerTranslation } from '../manager.js';
+import { TranslationSet, registerTranslation } from '../manager.js';
import { hasDefaultExport, loadExtension } from '@umbraco-cms/backoffice/extension-api';
import {
UmbBackofficeExtensionRegistry,
@@ -41,7 +41,7 @@ export class UmbTranslationRegistry {
}
// Notify subscribers that the inner dictionary has changed.
- const translation: Translation = {
+ const translation: TranslationSet = {
$code: userCulture,
$dir: extension.meta.direction ?? 'ltr',
...innerDictionary,
From bd10d0492a86c464052ec3d956751536525cdbb6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20Lyngs=C3=B8?=
Date: Wed, 2 Aug 2023 14:10:28 +0200
Subject: [PATCH 114/122] fix type of translation method
---
.../src/libs/localization-api/localize.controller.test.ts | 8 ++++----
.../core/extension-registry/models/translations.model.ts | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
index 4589af4be5..c710e110a8 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
@@ -3,7 +3,7 @@ import { UmbLocalizeController } from './localize.controller.js';
import { UmbTranslationRegistry } from './registry/translation.registry.js';
import { customElement, property } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
-import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
+import { ManifestTranslations, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
@customElement('umb-localize-controller-host')
class UmbLocalizeControllerHostElement extends UmbLitElement {
@@ -12,7 +12,7 @@ class UmbLocalizeControllerHostElement extends UmbLitElement {
}
//#region Translations
-const english = {
+const english: ManifestTranslations = {
type: 'translations',
alias: 'test.en',
name: 'Test English',
@@ -35,7 +35,7 @@ const english = {
},
};
-const englishOverride = {
+const englishOverride: ManifestTranslations = {
type: 'translations',
alias: 'test.en.override',
name: 'Test English',
@@ -49,7 +49,7 @@ const englishOverride = {
},
};
-const danish = {
+const danish: ManifestTranslations = {
type: 'translations',
alias: 'test.da',
name: 'Test Danish',
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
index 2f0b3ac679..f859d35606 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/translations.model.ts
@@ -1,6 +1,6 @@
import type { ManifestWithLoaderIncludingDefaultExport } from '@umbraco-cms/backoffice/extension-api';
-export type UmbTranslationEntry = string | ((...args: unknown[]) => string);
+export type UmbTranslationEntry = string | ((...args: any[]) => string);
export type UmbTranslationsDictionary = Record>;
export interface ManifestTranslations extends ManifestWithLoaderIncludingDefaultExport {
From a5802fdce6606196bbf37029228b275cd58e7f3a Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:11:54 +0200
Subject: [PATCH 115/122] add comments and requirements for language
---
.../localization-api/registry/translation.registry.ts | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 96ee85528c..3939d556c7 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -57,8 +57,13 @@ export class UmbTranslationRegistry {
);
}
- loadLanguage(userCulture: string) {
- this.#currentLanguage.next(userCulture.toLowerCase());
+ /**
+ * Load a language from the extension registry.
+ * @param locale The locale to load.
+ */
+ loadLanguage(locale: Intl.BCP47LanguageTag | Intl.Locale) {
+ locale = new Intl.Locale(locale);
+ this.#currentLanguage.next(`${locale.language}-${locale.region}`.toLowerCase());
}
#addOrUpdateDictionary(
From 3752582ffaf9a23424500df243f7fc019aaa0053 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:13:32 +0200
Subject: [PATCH 116/122] move listener of languages to AppElement to support
other backoffice views (installer, upgrader)
---
.../src/apps/app/app.element.ts | 31 ++++++++++++++++++-
.../src/apps/backoffice/backoffice.element.ts | 15 ---------
.../registry/translation.registry.ts | 3 ++
3 files changed, 33 insertions(+), 16 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts
index 6d09ccc23a..6d06aed831 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts
@@ -10,6 +10,7 @@ import { pathWithoutBasePath } from '@umbraco-cms/backoffice/router';
import { tryExecute } from '@umbraco-cms/backoffice/resources';
import { OpenAPI, RuntimeLevelModel, ServerResource } from '@umbraco-cms/backoffice/backend-api';
import { contextData, umbDebugContextEventType } from '@umbraco-cms/backoffice/context-api';
+import { umbTranslationRegistry } from '@umbraco-cms/backoffice/localization-api';
@customElement('umb-app')
export class UmbAppElement extends UmbLitElement {
@@ -22,6 +23,17 @@ export class UmbAppElement extends UmbLitElement {
@property({ type: String })
serverUrl = window.location.origin;
+ /**
+ * The default culture to use for localization.
+ *
+ * When the current user is resolved, the culture will be set to the user's culture.
+ *
+ * @attr
+ * @remarks This is the default culture to use for localization, not the current culture.
+ */
+ @property({ type: String, attribute: 'default-culture' })
+ culture: Intl.BCP47LanguageTag | Intl.Locale = 'en-us';
+
/**
* The base path of the backoffice.
*
@@ -33,7 +45,6 @@ export class UmbAppElement extends UmbLitElement {
/**
* Bypass authentication.
- * @type {boolean}
*/
// TODO: this might not be the right solution
@property({ type: Boolean })
@@ -70,9 +81,25 @@ export class UmbAppElement extends UmbLitElement {
connectedCallback(): void {
super.connectedCallback();
+
+ this.#setLanguage();
this.#setup();
}
+ #setLanguage() {
+ umbTranslationRegistry.loadLanguage(this.culture);
+ }
+
+ #listenForLanguageChange(authContext: UmbAuthContext) {
+ this.observe(
+ authContext.languageIsoCode,
+ (currentLanguageIsoCode) => {
+ umbTranslationRegistry.loadLanguage(currentLanguageIsoCode);
+ },
+ 'languageIsoCode'
+ );
+ }
+
async #setup() {
if (this.serverUrl === undefined) throw new Error('No serverUrl provided');
@@ -165,6 +192,8 @@ export class UmbAppElement extends UmbLitElement {
OpenAPI.WITH_CREDENTIALS = true;
}
+ this.#listenForLanguageChange(authContext);
+
authContext.isLoggedIn.next(true);
}
diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
index cdb63cdbb7..0fe7e633a5 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts
@@ -1,7 +1,5 @@
import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context.js';
import { UmbExtensionInitializer } from './extension.controller.js';
-import { UmbTranslationRegistry } from '@umbraco-cms/backoffice/localization-api';
-import { UMB_AUTH } from '@umbraco-cms/backoffice/auth';
import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit';
import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui';
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
@@ -39,19 +37,6 @@ export class UmbBackofficeElement extends UmbLitElement {
const extensionInitializer = new UmbExtensionInitializer(this, umbExtensionsRegistry);
extensionInitializer.setLocalPackages(CORE_PACKAGES);
-
- const translationRegistry = new UmbTranslationRegistry(umbExtensionsRegistry);
- // Load default language
- translationRegistry.loadLanguage('en-us');
- this.consumeContext(UMB_AUTH, (auth) => {
- this.observe(
- auth.languageIsoCode,
- (currentLanguageIsoCode) => {
- translationRegistry.loadLanguage(currentLanguageIsoCode);
- },
- 'languageIsoCode'
- );
- });
}
render() {
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 3939d556c7..da1b1bd591 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -4,6 +4,7 @@ import {
UmbBackofficeExtensionRegistry,
UmbTranslationEntry,
UmbTranslationsDictionary,
+ umbExtensionsRegistry,
} from '@umbraco-cms/backoffice/extension-registry';
import { Subject, combineLatest } from '@umbraco-cms/backoffice/external/rxjs';
@@ -76,3 +77,5 @@ export class UmbTranslationRegistry {
}
}
}
+
+export const umbTranslationRegistry = new UmbTranslationRegistry(umbExtensionsRegistry);
From a0dd36a91d9d70013889f3c34f9424d57eb067ea Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:24:38 +0200
Subject: [PATCH 117/122] go back to strings to accept arbitrary culture codes
---
src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 4 +++-
.../libs/localization-api/registry/translation.registry.ts | 5 ++---
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts
index 6d06aed831..ca822d086d 100644
--- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts
@@ -30,9 +30,11 @@ export class UmbAppElement extends UmbLitElement {
*
* @attr
* @remarks This is the default culture to use for localization, not the current culture.
+ * @example "en-us"
+ * @example "en"
*/
@property({ type: String, attribute: 'default-culture' })
- culture: Intl.BCP47LanguageTag | Intl.Locale = 'en-us';
+ culture: string = 'en-us';
/**
* The base path of the backoffice.
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index da1b1bd591..1d6b35af2c 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -62,9 +62,8 @@ export class UmbTranslationRegistry {
* Load a language from the extension registry.
* @param locale The locale to load.
*/
- loadLanguage(locale: Intl.BCP47LanguageTag | Intl.Locale) {
- locale = new Intl.Locale(locale);
- this.#currentLanguage.next(`${locale.language}-${locale.region}`.toLowerCase());
+ loadLanguage(locale: string) {
+ this.#currentLanguage.next(locale.toLowerCase());
}
#addOrUpdateDictionary(
From 76fdd3a5481ca23fa16e63036103ea94b6fcef56 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:24:50 +0200
Subject: [PATCH 118/122] load english before each test
---
.../src/packages/core/localization/localize.element.test.ts | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
index 0dbe013dae..416a68a172 100644
--- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/localize.element.test.ts
@@ -56,10 +56,11 @@ describe('umb-localize', () => {
describe('localization', () => {
umbExtensionsRegistry.register(english);
umbExtensionsRegistry.register(danish);
+
const translationRegistry = new UmbTranslationRegistry(umbExtensionsRegistry);
- translationRegistry.loadLanguage(english.meta.culture);
beforeEach(async () => {
+ translationRegistry.loadLanguage(english.meta.culture);
element = await fixture(html`Fallback value `);
});
From d9bfa715978ef876e47b19b035d5ba0ba2ec64a6 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:29:30 +0200
Subject: [PATCH 119/122] check for distinct culture before initialising reload
---
.../localization-api/registry/translation.registry.ts | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 1d6b35af2c..7a73eaad49 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -6,18 +6,22 @@ import {
UmbTranslationsDictionary,
umbExtensionsRegistry,
} from '@umbraco-cms/backoffice/extension-registry';
-import { Subject, combineLatest } from '@umbraco-cms/backoffice/external/rxjs';
+import { Subject, combineLatest, map, distinctUntilChanged } from '@umbraco-cms/backoffice/external/rxjs';
export type UmbTranslationsFlatDictionary = Record;
export class UmbTranslationRegistry {
#registry;
#currentLanguage = new Subject();
+ #currentLanguageUniqueLowercase = this.#currentLanguage.pipe(
+ map((x) => x.toLowerCase()),
+ distinctUntilChanged()
+ );
constructor(extensionRegistry: UmbBackofficeExtensionRegistry) {
this.#registry = extensionRegistry;
- combineLatest([this.#currentLanguage, this.#registry.extensionsOfType('translations')]).subscribe(
+ combineLatest([this.#currentLanguageUniqueLowercase, this.#registry.extensionsOfType('translations')]).subscribe(
async ([userCulture, extensions]) => {
await Promise.all(
extensions
@@ -63,7 +67,7 @@ export class UmbTranslationRegistry {
* @param locale The locale to load.
*/
loadLanguage(locale: string) {
- this.#currentLanguage.next(locale.toLowerCase());
+ this.#currentLanguage.next(locale);
}
#addOrUpdateDictionary(
From b5e3d7dccb2774690e407f6cec3954996828d0a3 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:46:37 +0200
Subject: [PATCH 120/122] use Intl.Locale to load primary and secondary
languages
---
.../registry/translation.registry.ts | 32 ++++++++++++-------
1 file changed, 21 insertions(+), 11 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 7a73eaad49..289508a6a6 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -13,7 +13,7 @@ export type UmbTranslationsFlatDictionary = Record;
export class UmbTranslationRegistry {
#registry;
#currentLanguage = new Subject();
- #currentLanguageUniqueLowercase = this.#currentLanguage.pipe(
+ #currentLanguageUnique = this.#currentLanguage.pipe(
map((x) => x.toLowerCase()),
distinctUntilChanged()
);
@@ -21,11 +21,16 @@ export class UmbTranslationRegistry {
constructor(extensionRegistry: UmbBackofficeExtensionRegistry) {
this.#registry = extensionRegistry;
- combineLatest([this.#currentLanguageUniqueLowercase, this.#registry.extensionsOfType('translations')]).subscribe(
+ combineLatest([this.#currentLanguageUnique, this.#registry.extensionsOfType('translations')]).subscribe(
async ([userCulture, extensions]) => {
- await Promise.all(
+ const locale = new Intl.Locale(userCulture);
+ const translations = await Promise.all(
extensions
- .filter((x) => x.meta.culture.toLowerCase() === userCulture)
+ .filter(
+ (x) =>
+ x.meta.culture.toLowerCase() === locale.baseName.toLowerCase() ||
+ x.meta.culture.toLowerCase() === locale.language.toLowerCase()
+ )
.map(async (extension) => {
const innerDictionary: UmbTranslationsFlatDictionary = {};
@@ -46,18 +51,23 @@ export class UmbTranslationRegistry {
}
// Notify subscribers that the inner dictionary has changed.
- const translation: TranslationSet = {
+ return {
$code: userCulture,
$dir: extension.meta.direction ?? 'ltr',
...innerDictionary,
- };
- registerTranslation(translation);
-
- // Set the document language and direction.
- document.documentElement.lang = translation.$code;
- document.documentElement.dir = translation.$dir;
+ } satisfies TranslationSet;
})
);
+
+ if (translations.length) {
+ registerTranslation(...translations);
+
+ // Set the document language
+ document.documentElement.lang = locale.baseName;
+
+ // Set the document direction to the direction of the primary language
+ document.documentElement.dir = translations[0].$dir ?? 'ltr';
+ }
}
);
}
From 16ae6267d277f7b08409b634c0a1b7a9382cf2f2 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:48:22 +0200
Subject: [PATCH 121/122] remove extra property no longer needed
---
.../localization-api/registry/translation.registry.ts | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
index 289508a6a6..36398dd58f 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/registry/translation.registry.ts
@@ -6,22 +6,19 @@ import {
UmbTranslationsDictionary,
umbExtensionsRegistry,
} from '@umbraco-cms/backoffice/extension-registry';
-import { Subject, combineLatest, map, distinctUntilChanged } from '@umbraco-cms/backoffice/external/rxjs';
+import { Subject, combineLatest, map, distinctUntilChanged, Observable } from '@umbraco-cms/backoffice/external/rxjs';
export type UmbTranslationsFlatDictionary = Record;
export class UmbTranslationRegistry {
- #registry;
#currentLanguage = new Subject();
- #currentLanguageUnique = this.#currentLanguage.pipe(
+ #currentLanguageUnique: Observable = this.#currentLanguage.pipe(
map((x) => x.toLowerCase()),
distinctUntilChanged()
);
constructor(extensionRegistry: UmbBackofficeExtensionRegistry) {
- this.#registry = extensionRegistry;
-
- combineLatest([this.#currentLanguageUnique, this.#registry.extensionsOfType('translations')]).subscribe(
+ combineLatest([this.#currentLanguageUnique, extensionRegistry.extensionsOfType('translations')]).subscribe(
async ([userCulture, extensions]) => {
const locale = new Intl.Locale(userCulture);
const translations = await Promise.all(
From 862312794c90fea3372089025c208960c5f1caec Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 2 Aug 2023 15:58:17 +0200
Subject: [PATCH 122/122] add test for secondary language
---
.../localize.controller.test.ts | 49 ++++++++++++++-----
1 file changed, 38 insertions(+), 11 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
index c710e110a8..cf22b5fbb0 100644
--- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
+++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localize.controller.test.ts
@@ -1,6 +1,6 @@
import { aTimeout, elementUpdated, expect, fixture, html } from '@open-wc/testing';
import { UmbLocalizeController } from './localize.controller.js';
-import { UmbTranslationRegistry } from './registry/translation.registry.js';
+import { umbTranslationRegistry } from './registry/translation.registry.js';
import { customElement, property } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import { ManifestTranslations, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
@@ -54,7 +54,22 @@ const danish: ManifestTranslations = {
alias: 'test.da',
name: 'Test Danish',
meta: {
- culture: 'da-dk',
+ culture: 'da',
+ translations: {
+ general: {
+ close: 'Luk',
+ notOnRegional: 'Not on regional',
+ },
+ },
+ },
+};
+
+const danishRegional: ManifestTranslations = {
+ type: 'translations',
+ alias: 'test.da-DK',
+ name: 'Test Danish (Denmark)',
+ meta: {
+ culture: 'da-DK',
translations: {
general: {
close: 'Luk',
@@ -65,14 +80,14 @@ const danish: ManifestTranslations = {
//#endregion
describe('UmbLocalizeController', () => {
- const registry = new UmbTranslationRegistry(umbExtensionsRegistry);
umbExtensionsRegistry.register(english);
umbExtensionsRegistry.register(danish);
+ umbExtensionsRegistry.register(danishRegional);
let element: UmbLocalizeControllerHostElement;
beforeEach(async () => {
- registry.loadLanguage(english.meta.culture);
+ umbTranslationRegistry.loadLanguage(english.meta.culture);
element = await fixture(html` `);
});
@@ -94,12 +109,13 @@ describe('UmbLocalizeController', () => {
});
it('should update the term when the language changes', async () => {
- expect(element.localize.term('general_close')).to.equal('Close');
// Load Danish
- registry.loadLanguage(danish.meta.culture);
- // Switch browser to Danish
- element.lang = danish.meta.culture;
+ umbTranslationRegistry.loadLanguage(danishRegional.meta.culture);
+ await aTimeout(0);
+ expect(document.documentElement.lang).to.equal(danishRegional.meta.culture);
+ // Force an element update as well
+ element.lang = danishRegional.meta.culture;
await elementUpdated(element);
expect(element.localize.term('general_close')).to.equal('Luk');
});
@@ -111,11 +127,22 @@ describe('UmbLocalizeController', () => {
expect(element.localize.term('general_close')).to.equal('Close');
});
+ it('should provide a secondary term when the term is not found', async () => {
+ // Load Danish
+ umbTranslationRegistry.loadLanguage(danishRegional.meta.culture);
+ await aTimeout(0);
+
+ element.lang = danishRegional.meta.culture;
+ await elementUpdated(element);
+ expect(element.localize.term('general_notOnRegional')).to.equal('Not on regional');
+ });
+
it('should provide a fallback term when the term is not found', async () => {
// Load Danish
- registry.loadLanguage(danish.meta.culture);
- // Switch browser to Danish
- element.lang = danish.meta.culture;
+ umbTranslationRegistry.loadLanguage(danishRegional.meta.culture);
+ await aTimeout(0);
+
+ element.lang = danishRegional.meta.culture;
await elementUpdated(element);
expect(element.localize.term('general_close')).to.equal('Luk');
expect(element.localize.term('general_logout')).to.equal('Log out');