diff --git a/components/custom-primary-details-actor.vue b/components/custom-primary-details-actor.vue new file mode 100644 index 00000000..2ac82585 --- /dev/null +++ b/components/custom-primary-details-actor.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/components/custom-primary-details-feature.vue b/components/custom-primary-details-feature.vue new file mode 100644 index 00000000..059d20f2 --- /dev/null +++ b/components/custom-primary-details-feature.vue @@ -0,0 +1,119 @@ + + + + + + + {{ previousFeature.properties.title }} + {{ t("EntitySidebar.PreviousFeature") }} + + + {{ nextFeature.properties.title }} + {{ t("EntitySidebar.NextFeature") }} + + + + + diff --git a/components/custom-primary-details-place.vue b/components/custom-primary-details-place.vue new file mode 100644 index 00000000..afc7be7c --- /dev/null +++ b/components/custom-primary-details-place.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/components/data-map-view.vue b/components/data-map-view.vue index 02f6e1eb..2cab6c7e 100644 --- a/components/data-map-view.vue +++ b/components/data-map-view.vue @@ -15,6 +15,8 @@ const router = useRouter(); const route = useRoute(); const t = useTranslations(); +const currentView = useGetCurrentView(); + const searchFiltersSchema = v.object({ category: v.fallback(v.picklist(categories), "entityName"), search: v.fallback(v.string(), ""), @@ -46,7 +48,7 @@ const { data, isPending, isPlaceholderData } = useGetSearchResults( : [], show: ["geometry", "when"], centroid: true, - system_classes: ["place"], + system_classes: ["place", "object_location"], limit: 0, }; }), @@ -188,12 +190,13 @@ watch(data, () => { + { {{ entity.properties.title }} diff --git a/components/data-network-view.vue b/components/data-network-view.vue index 2e936169..27a3194c 100644 --- a/components/data-network-view.vue +++ b/components/data-network-view.vue @@ -81,15 +81,17 @@ const systemClasses = computed(() => { - + + + +const props = defineProps<{aliases: Array<{ alias: string }>}>(); + +const aliasList = computed(() => { + return props.aliases.reduce((acc: string, a: {alias: string}) => { + if(acc.length === 0) { + return a.alias; + } else { + return `${acc}, ` + a.alias; + } + },''); +}); + + + + + + {{ aliasList }} + + diff --git a/components/entity-data-graph.vue b/components/entity-data-graph.vue index e2e3b09e..d17b05fb 100644 --- a/components/entity-data-graph.vue +++ b/components/entity-data-graph.vue @@ -17,7 +17,7 @@ const graph = new Graph(); const { entityColors } = colors; const defaultColor = project.colors.entityDefaultColor; -const legendEntities: [string | undefined] = [""]; +const legendEntities = [""]; watch( () => { diff --git a/components/entity-descriptions.vue b/components/entity-descriptions.vue index c30472dd..f4c43502 100644 --- a/components/entity-descriptions.vue +++ b/components/entity-descriptions.vue @@ -22,14 +22,23 @@ const descriptions = computed(() => { - - - {{ description }} - - - - - {{ t("EntityDescriptionsDisplay.no-descriptions") }} - + + {{ descriptions[0] }} + + + + + {{ t("EntityDescriptionsDisplay.description", descriptions.length) + ": " }} + + {{description}} + + + + + {{ description }} + + + + diff --git a/components/entity-details.vue b/components/entity-details.vue new file mode 100644 index 00000000..39f0301f --- /dev/null +++ b/components/entity-details.vue @@ -0,0 +1,84 @@ + + + + + + {{ t("EntityPage.details") }} + + + + + + {{ t(`SystemClassNames.${relationType}`) }} + + + + + + {{ relation.label }} + + {{ relation.label }} + + + + + Show more + + + + + {{ relation.label }} + + {{ relation.label }} + + + + + + + + + diff --git a/components/entity-geo-map.vue b/components/entity-geo-map.vue index 56c388b7..f80849ab 100644 --- a/components/entity-geo-map.vue +++ b/components/entity-geo-map.vue @@ -5,15 +5,16 @@ const props = defineProps<{ const features = computed(() => { return props.entities.map((entity) => { + console.log(entity); return createGeoJsonFeature(entity); }); }); - + - + diff --git a/components/entity-images.vue b/components/entity-images.vue index b2e5bce4..af7ef29a 100644 --- a/components/entity-images.vue +++ b/components/entity-images.vue @@ -4,11 +4,11 @@ import { Toggle } from "@/components/ui/toggle"; const props = defineProps<{ images: Array<{ - IIIFManifest?: string | undefined; - license?: string | undefined; - mimetype?: string | undefined; - title?: string | undefined; - url?: string | undefined; + IIIFManifest?: string; + license?: string; + mimetype?: string; + title?: string; + url?: string; }>; }>(); diff --git a/components/entity-mirador-viewer.vue b/components/entity-mirador-viewer.vue index 616cd2e3..c76f14bf 100644 --- a/components/entity-mirador-viewer.vue +++ b/components/entity-mirador-viewer.vue @@ -1,27 +1,33 @@ - + diff --git a/components/entity-preview-link.vue b/components/entity-preview-link.vue new file mode 100644 index 00000000..c2a38664 --- /dev/null +++ b/components/entity-preview-link.vue @@ -0,0 +1,47 @@ + + + + + + + + {{ label }} + + + + + + + + + + + + + + + + diff --git a/components/entity-primary-details.vue b/components/entity-primary-details.vue new file mode 100644 index 00000000..9697e408 --- /dev/null +++ b/components/entity-primary-details.vue @@ -0,0 +1,170 @@ + + + + + + {{ entity.properties.title }} + + + + + + + + + + + + + {{ place.label }} + + {{ place.id ? '' : place.label }} + + + + + + + + + + + + + + + + diff --git a/components/entity-sidebar.vue b/components/entity-sidebar.vue new file mode 100644 index 00000000..133752a1 --- /dev/null +++ b/components/entity-sidebar.vue @@ -0,0 +1,49 @@ + + + + + + + + {{ t("EntityPage.sidebar.toggle", {title: entity.properties.title}) }} + + + + + + + + + + + + + diff --git a/components/entity-timespans.vue b/components/entity-timespans.vue index d68ccc90..9a5ab5e8 100644 --- a/components/entity-timespans.vue +++ b/components/entity-timespans.vue @@ -46,7 +46,7 @@ const datespans = computed(() => { - {{ t("TimespansDisplay.no-dates") }} + diff --git a/components/geo-map.client.vue b/components/geo-map.client.vue index 02b31206..ce9217b1 100644 --- a/components/geo-map.client.vue +++ b/components/geo-map.client.vue @@ -59,7 +59,7 @@ async function create() { const map = new GeoMap({ center: [initialViewState.longitude, initialViewState.latitude], container: elementRef.value, - maxZoom: 16, + maxZoom: 24, minZoom: 1, pitch: initialViewState.pitch, style: mapStyle.value, @@ -170,6 +170,7 @@ function init() { // updateScope(); + updatePolygons(); } function dispose() { @@ -200,7 +201,7 @@ function updateScope() { }); const polygons = props.features.filter((polygon) => { - return polygon.geometry.type === "GeometryCollection"; + return polygon.geometry.type === "GeometryCollection" || "Polygon"; }); const centerpoints = props.features.filter((centerpoint) => { @@ -217,6 +218,9 @@ function updateScope() { if (geojsonPoints.features.length > 0) { const bounds = turf.bbox(geojsonPoints) as [number, number, number, number]; + map.fitBounds(bounds, { padding: 50, maxZoom: 16 }); + } else if (geojsonCenterPoints.features.length > 0) { + const bounds = turf.bbox(geojsonCenterPoints); map.fitBounds(bounds, { padding: 50 }); } } diff --git a/components/grouped-relation-collapsible.vue b/components/grouped-relation-collapsible.vue new file mode 100644 index 00000000..5b784fe3 --- /dev/null +++ b/components/grouped-relation-collapsible.vue @@ -0,0 +1,83 @@ + + + + + + + + {{ title }} {{ filteredRelations?.length && filteredRelations.length > 1 ? `(${filteredRelations.length})` : '' }} + + + + + + Toggle + + + + + + + + + + + + + + diff --git a/components/info-card.vue b/components/info-card.vue new file mode 100644 index 00000000..0142c316 --- /dev/null +++ b/components/info-card.vue @@ -0,0 +1,23 @@ + + + + + + + {{ title }} + + + + + + + + + diff --git a/components/mirador-viewer.client.vue b/components/mirador-viewer.client.vue index 90b44e2f..2cdd1276 100644 --- a/components/mirador-viewer.client.vue +++ b/components/mirador-viewer.client.vue @@ -1,45 +1,28 @@ - + diff --git a/components/network.client.vue b/components/network.client.vue index a5c14eaa..93542741 100644 --- a/components/network.client.vue +++ b/components/network.client.vue @@ -91,6 +91,8 @@ watch( { immediate: true }, ); +const currentView = useGetCurrentView(); + onMounted(async () => { layout.start(); @@ -110,7 +112,7 @@ onMounted(async () => { context.camera = context.renderer.getCamera(); context.renderer.on("clickNode", ({ node }) => { - void router.push(`/${locale.value}/entities/` + node); + void router.push(`/${locale.value}/entities/${node}/${currentView.value}`); }); context.renderer.on("enterNode", ({ node }) => { diff --git a/components/relation-collapsible.vue b/components/relation-collapsible.vue new file mode 100644 index 00000000..f5e50a67 --- /dev/null +++ b/components/relation-collapsible.vue @@ -0,0 +1,38 @@ + + + + + + + + + + {{ title }} {{ relations.length > 1 ? `(${relations.length})` : '' }} + + + + + + Toggle + + + + + + + + + + + + + diff --git a/components/relation-list-entry.vue b/components/relation-list-entry.vue new file mode 100644 index 00000000..ca7430b8 --- /dev/null +++ b/components/relation-list-entry.vue @@ -0,0 +1,24 @@ + + + + + + + + {{ relation.label }} + + + + + + diff --git a/components/search-results-table.vue b/components/search-results-table.vue index b4d80736..d58522ed 100644 --- a/components/search-results-table.vue +++ b/components/search-results-table.vue @@ -12,11 +12,11 @@ import { } from "@tanstack/vue-table"; import { ArrowUpDown } from "lucide-vue-next"; -import NavLink from "@/components/nav-link.vue"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import type { EntityFeature } from "@/composables/use-create-entity"; import { isColumn } from "@/composables/use-get-search-results"; +import NavLink from "@/components/nav-link.vue"; const emit = defineEmits({ "update:sorting"(sorting: SortingState) { diff --git a/components/simple-timespan.vue b/components/simple-timespan.vue new file mode 100644 index 00000000..1a0eb5d5 --- /dev/null +++ b/components/simple-timespan.vue @@ -0,0 +1,60 @@ + + + + + + + + + + + + {{ t("TimespansDisplay.start") }} + + {{ timespan.start }} + + + + {{ t("TimespansDisplay.end") }} + + {{ timespan.end }} + + + + + + + + + diff --git a/components/types-popover.vue b/components/types-popover.vue new file mode 100644 index 00000000..4f7adae8 --- /dev/null +++ b/components/types-popover.vue @@ -0,0 +1,104 @@ + + + + + + + + {{ type.label }} + {{ t("Global.ShowMore") }} + + + + + + + + + {{ hierarchy[0].label }} + + + {{ hierarchy[0].label }} + + + + + + + + Toggle menu + + + + + {{ hierarchyItem.label }} + + + {{ hierarchyItem.label }} + + + + + + + + {{ hiddenHierarchy[0].label }} + + + {{ hiddenHierarchy[0].label }} + + + + + + {{ type.label }} + + + {{ type.label }} + + + + + {{ type.descriptions }} + + + {{ type.value }} {{ type.unit }} + + + + + diff --git a/components/ui/breadcrumb/Breadcrumb.vue b/components/ui/breadcrumb/Breadcrumb.vue new file mode 100644 index 00000000..72ca1437 --- /dev/null +++ b/components/ui/breadcrumb/Breadcrumb.vue @@ -0,0 +1,13 @@ + + + + + + + diff --git a/components/ui/breadcrumb/BreadcrumbEllipsis.vue b/components/ui/breadcrumb/BreadcrumbEllipsis.vue new file mode 100644 index 00000000..c0453db1 --- /dev/null +++ b/components/ui/breadcrumb/BreadcrumbEllipsis.vue @@ -0,0 +1,23 @@ + + + + + + + + More + + diff --git a/components/ui/breadcrumb/BreadcrumbItem.vue b/components/ui/breadcrumb/BreadcrumbItem.vue new file mode 100644 index 00000000..af29e218 --- /dev/null +++ b/components/ui/breadcrumb/BreadcrumbItem.vue @@ -0,0 +1,16 @@ + + + + + + + diff --git a/components/ui/breadcrumb/BreadcrumbLink.vue b/components/ui/breadcrumb/BreadcrumbLink.vue new file mode 100644 index 00000000..b6c85671 --- /dev/null +++ b/components/ui/breadcrumb/BreadcrumbLink.vue @@ -0,0 +1,19 @@ + + + + + + + diff --git a/components/ui/breadcrumb/BreadcrumbList.vue b/components/ui/breadcrumb/BreadcrumbList.vue new file mode 100644 index 00000000..4bea0438 --- /dev/null +++ b/components/ui/breadcrumb/BreadcrumbList.vue @@ -0,0 +1,16 @@ + + + + + + + diff --git a/components/ui/breadcrumb/BreadcrumbPage.vue b/components/ui/breadcrumb/BreadcrumbPage.vue new file mode 100644 index 00000000..a48323d6 --- /dev/null +++ b/components/ui/breadcrumb/BreadcrumbPage.vue @@ -0,0 +1,19 @@ + + + + + + + diff --git a/components/ui/breadcrumb/BreadcrumbSeparator.vue b/components/ui/breadcrumb/BreadcrumbSeparator.vue new file mode 100644 index 00000000..6c18e3e9 --- /dev/null +++ b/components/ui/breadcrumb/BreadcrumbSeparator.vue @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/components/ui/breadcrumb/index.ts b/components/ui/breadcrumb/index.ts new file mode 100644 index 00000000..05909832 --- /dev/null +++ b/components/ui/breadcrumb/index.ts @@ -0,0 +1,7 @@ +export { default as Breadcrumb } from './Breadcrumb.vue' +export { default as BreadcrumbEllipsis } from './BreadcrumbEllipsis.vue' +export { default as BreadcrumbItem } from './BreadcrumbItem.vue' +export { default as BreadcrumbLink } from './BreadcrumbLink.vue' +export { default as BreadcrumbList } from './BreadcrumbList.vue' +export { default as BreadcrumbPage } from './BreadcrumbPage.vue' +export { default as BreadcrumbSeparator } from './BreadcrumbSeparator.vue' diff --git a/components/ui/collapsible/Collapsible.vue b/components/ui/collapsible/Collapsible.vue new file mode 100644 index 00000000..52bff5f2 --- /dev/null +++ b/components/ui/collapsible/Collapsible.vue @@ -0,0 +1,15 @@ + + + + + + + diff --git a/components/ui/collapsible/CollapsibleContent.vue b/components/ui/collapsible/CollapsibleContent.vue new file mode 100644 index 00000000..9f30898b --- /dev/null +++ b/components/ui/collapsible/CollapsibleContent.vue @@ -0,0 +1,11 @@ + + + + + + + diff --git a/components/ui/collapsible/CollapsibleTrigger.vue b/components/ui/collapsible/CollapsibleTrigger.vue new file mode 100644 index 00000000..4a434639 --- /dev/null +++ b/components/ui/collapsible/CollapsibleTrigger.vue @@ -0,0 +1,11 @@ + + + + + + + diff --git a/components/ui/collapsible/index.ts b/components/ui/collapsible/index.ts new file mode 100644 index 00000000..4930f4c6 --- /dev/null +++ b/components/ui/collapsible/index.ts @@ -0,0 +1,3 @@ +export { default as Collapsible } from './Collapsible.vue' +export { default as CollapsibleTrigger } from './CollapsibleTrigger.vue' +export { default as CollapsibleContent } from './CollapsibleContent.vue' diff --git a/composables/use-filter-relations.ts b/composables/use-filter-relations.ts new file mode 100644 index 00000000..dd1696e0 --- /dev/null +++ b/composables/use-filter-relations.ts @@ -0,0 +1,47 @@ +type Relations = Array[0]>; + +export const useFilterRelations = ( + relations: MaybeRef | undefined, + filters: MaybeRef<{ + relationType?: RelationType; + systemClass?: EntityFeature["systemClass"]; + }>, +) => { + if (!relations) return []; + + const { relationType, systemClass } = toValue(filters); + const rels = toValue(relations); + + const test = rels.reduce((acc: Relations, relation): Relations => { + if (!relation.relationType) return acc; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call + const { crmCode, inverse } = extractRelationTypeFromRelationString(relation.relationType) ?? {}; + + if ( + relationType && + !systemClass && + crmCode === relationType.crmCode && + inverse === Boolean(relationType.inverse) + ) { + return [...acc, relation]; + } + + if (systemClass && !relationType && systemClass === relation.relationSystemClass) { + return [...acc, relation]; + } + + if ( + relationType && + systemClass && + crmCode === relationType.crmCode && + inverse === Boolean(relationType.inverse) && + systemClass === relation.relationSystemClass + ) { + return [...acc, relation]; + } + + return acc; + }, []); + return test; +}; diff --git a/composables/use-get-current-view.ts b/composables/use-get-current-view.ts new file mode 100644 index 00000000..0d18b39c --- /dev/null +++ b/composables/use-get-current-view.ts @@ -0,0 +1,12 @@ +import { z } from "zod"; + +const viewSchema = z.enum(["map", "network"]).catch("map"); + +export function useGetCurrentView() { + const route = useRoute(); + + return computed(() => { + const view = viewSchema.parse(route.path.split("/").pop()); + return view; + }); +} diff --git a/composables/use-get-entity-from-route.ts b/composables/use-get-entity-from-route.ts new file mode 100644 index 00000000..6dc0a292 --- /dev/null +++ b/composables/use-get-entity-from-route.ts @@ -0,0 +1,23 @@ +export const useGetEntityFromRoute = () => { + const route = useRoute(); + + const id = computed(() => { + return Number(route.params.id as string); + }); + + const { data, isPending, isPlaceholderData } = useGetEntity( + computed(() => { + return { entityId: id.value }; + }), + ); + + const entity = computed(() => { + return data.value?.features[0]; + }); + + const isLoading = computed(() => { + return isPending.value || isPlaceholderData.value; + }); + + return { entity, isLoading }; +}; diff --git a/composables/use-get-entity.ts b/composables/use-get-entity.ts index 6cd46c9e..783e675c 100644 --- a/composables/use-get-entity.ts +++ b/composables/use-get-entity.ts @@ -22,6 +22,10 @@ export function useGetEntity(params: MaybeRef) { path: { ...params, }, + query: { + format: "lpx", + centroid: true, + }, }, signal, })) as GetEntityResponse; diff --git a/composables/use-get-system-class.ts b/composables/use-get-system-class.ts new file mode 100644 index 00000000..07ef5882 --- /dev/null +++ b/composables/use-get-system-class.ts @@ -0,0 +1,59 @@ +import { useQuery } from "@tanstack/vue-query"; + +import { useCreateEntity } from "@/composables/use-create-entity"; +import type { operations } from "@/lib/api-client/api"; +import type { LinkedPlace } from "@/types/api"; + +export interface GetSystemClassParams + extends NonNullable {} + +export type GetSystemClassQueryParams = operations["GetBySystemClass"]["parameters"]["query"]; + +export type GetBySystemClassResponse = { + pagination: { + entities: number; + entitiesPerPage: number; + index: Array<{ + page: number; + startId: number; + }>; + totalPages: number; + }; + results: Array; +}; + +export function useGetBySystemClass( + pathParams: MaybeRef, + queryParams: MaybeRef, +) { + const api = useApiClient(); + const createEntity = useCreateEntity(); + + return useQuery({ + queryKey: ["system_class", { path: pathParams, query: queryParams }] as const, + + async queryFn({ queryKey, signal }) { + const [, params] = queryKey; + + const response = (await api.GET("/system_class/{system_class}", { + params: { + path: { + ...params.path, + }, + query: { + ...params.query, + format: "lpx", + }, + }, + signal, + })) as GetBySystemClassResponse; + + const enities = []; + for (const feature of response.results) { + enities.push(createEntity(feature)); + } + + return { enities, pagination: response.pagination }; + }, + }); +} diff --git a/composables/use-relation-info.ts b/composables/use-relation-info.ts new file mode 100644 index 00000000..00e113bf --- /dev/null +++ b/composables/use-relation-info.ts @@ -0,0 +1,28 @@ +import type { Locale, Schema } from "@/config/i18n.config"; +import type { RelationType } from "@/utils/extract-crm-code"; + +export const useRelationTitle = (relation: RelationType, systemClass?: string): string => { + const { te } = useI18n(); + const t = useTranslations(); + + const key = `${relation.crmCode}.title${relation.inverse ? "Inverse" : ""}`; + const systemClassKey = `${systemClass ?? ""}.${key}`; + + if (te(systemClassKey)) { + return t(systemClassKey); + } + return t(key); +}; + +export const useRelationGroupTitle = (relation: RelationType, systemClass?: string): string => { + const { te } = useI18n(); + const t = useTranslations(); + + const key = `${relation.crmCode}.groupTitle${relation.inverse ? "Inverse" : ""}`; + const systemClassKey = `${systemClass ?? ""}.${key}`; + + if (te(systemClassKey)) { + return t(systemClassKey); + } + return t(key); +}; diff --git a/config/i18n.config.ts b/config/i18n.config.ts index f95ecc16..32c13f9b 100644 --- a/config/i18n.config.ts +++ b/config/i18n.config.ts @@ -14,8 +14,8 @@ export type Locale = (typeof locales)[number]; export const defaultLocale: Locale = project.defaultLocale; export const localesMap = { - de: { code: "de", iso: "de", files: ["de/common.json", "de/project.json"] }, - en: { code: "en", iso: "en", files: ["en/common.json", "en/project.json"] }, + de: { code: "de", iso: "de", files: ["de/common.json", "de/project.json", "de/crm.json"] }, + en: { code: "en", iso: "en", files: ["en/common.json", "en/project.json", "en/crm.json"] }, } satisfies Record; export type Messages = typeof en & typeof projectEn; diff --git a/config/mirador.config.ts b/config/mirador.config.ts index 2b36214e..3a45f1c7 100644 --- a/config/mirador.config.ts +++ b/config/mirador.config.ts @@ -1,5 +1,5 @@ -// Configuration for Mirador -export const miradorConfig = ref({ +// FIXME: why is this reactive? +export const config = ref({ layout: "1x1", mainMenuSettings: { show: false, diff --git a/layouts/default.vue b/layouts/default.vue index 1e392d66..c1c485f4 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -100,6 +100,7 @@ router.afterEach((to, from) => { const fullscreen = "--container-width: ;"; const container = "--container-width: 1536px;"; + diff --git a/layouts/visualization.vue b/layouts/visualization.vue new file mode 100644 index 00000000..62685110 --- /dev/null +++ b/layouts/visualization.vue @@ -0,0 +1,59 @@ + + + + + + + + + {{ currentView === 'network' ? t('MapPage.title') : t('NetworkPage.title') }} + + + + + + + + + + {{ t("DataPage.work-in-progress") }} + + + + + diff --git a/messages/de/common.json b/messages/de/common.json index 9ed4501c..21349cbc 100644 --- a/messages/de/common.json +++ b/messages/de/common.json @@ -1,4 +1,9 @@ { + "Actor": { + "MemberOf": "Gruppen", + "Relations": "Beziehungen", + "hasMember": "Mitglieder" + }, "AppFooter": { "links": { "imprint": "Impressum" @@ -35,14 +40,11 @@ } }, "DataMapView": { + "centerpoint": "Flächenpunkt", "end-date": "End-Datum", - "start-date": "Start-Datum", + "point": "Ortspunkt", "polygon": "Flächen anzeigen", - "centerpoint": "Flächenpunkt", - "point": "Ortspunkt" - }, - "DataView": { - "nothing-found": "Keine Einträge zu dieser Suche." + "start-date": "Start-Datum" }, "DataPage": { "meta": { @@ -52,10 +54,14 @@ "title": "Daten", "work-in-progress": "Die Datenbank ist derzeit im Aufbau." }, + "DataView": { + "nothing-found": "Keine Einträge zu dieser Suche." + }, "DefaultLayout": { "skip-to-main-content": "Zum Hauptinhalt springen" }, "EntityDescriptionsDisplay": { + "description": "Keine Beschreibung | Beschreibung | Beschreibungen", "no-descriptions": "Keine Beschreibungen verfügbar." }, "EntityPage": { @@ -63,11 +69,18 @@ "iiif": "IIIF-Ansicht", "images": "Bilder ({count})", "map": "Karte", - "network": "Netzwerk-Visualisierung", "meta": { "title": "Entität" + }, + "network": "Netzwerk-Visualisierung", + "sidebar": { + "toggle": "Details für {title} umschalten" } }, + "EntitySidebar": { + "NextFeature": "Nächste Funktion", + "PreviousFeature": "Vorheriges Feature" + }, "ErrorBoundary": { "error": "Fehler" }, @@ -78,6 +91,12 @@ "title": "Etwas ist schief gelaufen!", "try-again": "Erneut versuchen" }, + "Global": { + "Next": "Nächste", + "Previous": "Vorherige", + "ShowMore": "Mehr Anzeigen", + "TitleMissing": "Titel fehlt" + }, "ImprintPage": { "error": { "not-found": "Impressum nicht gefunden", @@ -121,6 +140,13 @@ }, "title": "Seite nicht gefunden" }, + "RelationType": { + "CurrentOrFormerResidency": "Residenz" + }, + "Relations": { + "Artifacts": "Artefakte", + "HumanRemains": "Menschliche Überreste" + }, "SearchForm": { "filter": "Filter", "filters": { diff --git a/messages/de/crm.json b/messages/de/crm.json new file mode 100644 index 00000000..89ff70ed --- /dev/null +++ b/messages/de/crm.json @@ -0,0 +1,912 @@ +{ + "person": { + "OA8": { + "title": "Geboren in", + "titleInverse": "Geburtort von" + }, + "OA9": { + "title": "Gestorben in", + "titleInverse": "Sterbeort von" + } + }, + "P107": { + "title": "hat Mitglied(er)", + "titleInverse": "Mitglied bei", + "groupTitle": "Mitglieder", + "groupTitleInverse": "Mitgliedschaften" + }, + "P74": { + "title": "Residenz", + "titleInverse": "ist derzeitiger oder früherer Sitz von", + "groupTitle": "Residenz", + "groupTitleInverse": "ist derzeitiger oder früherer Sitz von" + }, + "OA7": { + "groupTitle": "Beziehungen", + "groupTitleInverse": "Beziehungen", + "title": "hat Beziehung zu", + "titleInverse": "hat Beziehung zu" + }, + "OA8": { + "title": "Beginnt in", + "titleInverse": "ist erster Ort von", + "groupTitle": "Beginnt in", + "groupTitleInverse": "ist erster Ort von" + }, + "P53": { + "title": "Ort", + "titleInverse": "ist früherer oder derzeitiger Standort von", + "groupTitle": "Ort", + "groupTitleInverse": "ist früherer oder derzeitiger Standort von" + }, + "P43": { + "title": "hat Dimension", + "titleInverse": "ist Dimension von", + "groupTitle": "hat Dimension", + "groupTitleInverse": "ist Dimension von" + }, + "P140": { + "title": "wies Merkmal zu", + "titleInverse": "bekam Merkmal zugewiesen durch", + "groupTitle": "wies Merkmal zu", + "groupTitleInverse": "bekam Merkmal zugewiesen durch" + }, + "P99": { + "title": "löste auf", + "titleInverse": "wurde aufgelöst durch", + "groupTitle": "löste auf", + "groupTitleInverse": "wurde aufgelöst durch" + }, + "P112": { + "title": "verminderte", + "titleInverse": "wurde vermindert durch", + "groupTitle": "verminderte", + "groupTitleInverse": "wurde vermindert durch" + }, + "P113": { + "title": "entfernte", + "titleInverse": "wurde entfernt durch", + "groupTitle": "entfernte", + "groupTitleInverse": "wurde entfernt durch" + }, + "P17": { + "title": "wurde angeregt durch", + "titleInverse": "regte an", + "groupTitle": "wurde angeregt durch", + "groupTitleInverse": "regte an" + }, + "P104": { + "title": "Gegenstand von", + "titleInverse": "findet Anwendung auf", + "groupTitle": "Gegenstand von", + "groupTitleInverse": "findet Anwendung auf" + }, + "P142": { + "title": "benutzte Bestandteil", + "titleInverse": "wurde benutzt in", + "groupTitle": "benutzte Bestandteil", + "groupTitleInverse": "wurde benutzt in" + }, + "P195": { + "title": "was a presence of", + "titleInverse": "had presence", + "groupTitle": "was a presence of", + "groupTitleInverse": "had presence" + }, + "P164": { + "title": "is temporally specified by", + "titleInverse": "temporally specifies", + "groupTitle": "is temporally specified by", + "groupTitleInverse": "temporally specifies" + }, + "P129": { + "title": "handelt über", + "titleInverse": "wird behandelt in", + "groupTitle": "handelt über", + "groupTitleInverse": "wird behandelt in" + }, + "P33": { + "title": "benutzte das bestimmte Verfahren", + "titleInverse": "wurde benutzt von", + "groupTitle": "benutzte das bestimmte Verfahren", + "groupTitleInverse": "wurde benutzt von" + }, + "P42": { + "title": "wies zu", + "titleInverse": "wurde zugewiesen durch", + "groupTitle": "wies zu", + "groupTitleInverse": "wurde zugewiesen durch" + }, + "P48": { + "title": "hat bevorzugtes Kennzeichen", + "titleInverse": "ist bevorzugtes Kennzeichen für", + "groupTitle": "hat bevorzugtes Kennzeichen", + "groupTitleInverse": "ist bevorzugtes Kennzeichen für" + }, + "P37": { + "title": "wies zu", + "titleInverse": "wurde zugewiesen durch", + "groupTitle": "wies zu", + "groupTitleInverse": "wurde zugewiesen durch" + }, + "P182": { + "title": "ends before or with the start of", + "titleInverse": "starts after or with the end of", + "groupTitle": "ends before or with the start of", + "groupTitleInverse": "starts after or with the end of" + }, + "P132": { + "title": "spatiotemporally overlaps with", + "titleInverse": "spatiotemporally overlaps with", + "groupTitle": "spatiotemporally overlaps with", + "groupTitleInverse": "spatiotemporally overlaps with" + }, + "P56": { + "title": "trägt Merkmal", + "titleInverse": "wird gefunden auf", + "groupTitle": "trägt Merkmal", + "groupTitleInverse": "wird gefunden auf" + }, + "P148": { + "title": "hat Bestandteil", + "titleInverse": "ist Bestandteil von", + "groupTitle": "hat Bestandteil", + "groupTitleInverse": "ist Bestandteil von" + }, + "P150": { + "title": "defines typical parts of", + "titleInverse": "defines typical wholes for", + "groupTitle": "defines typical parts of", + "groupTitleInverse": "defines typical wholes for" + }, + "P100": { + "title": "Tod von", + "titleInverse": "starb in", + "groupTitle": "Tod von", + "groupTitleInverse": "starb in" + }, + "P180": { + "title": "has currency", + "titleInverse": "was currency of", + "groupTitle": "has currency", + "groupTitleInverse": "was currency of" + }, + "P98": { + "title": "brachte zur Welt", + "titleInverse": "wurde geboren durch", + "groupTitle": "brachte zur Welt", + "groupTitleInverse": "wurde geboren durch" + }, + "P124": { + "title": "wandelte um", + "titleInverse": "wurde umgewandelt durch", + "groupTitle": "wandelte um", + "groupTitleInverse": "wurde umgewandelt durch" + }, + "P152": { + "title": "has parent", + "titleInverse": "is parent of", + "groupTitle": "has parent", + "groupTitleInverse": "is parent of" + }, + "P20": { + "title": "hatte den bestimmten Zweck", + "titleInverse": "war Zweck von", + "groupTitle": "hatte den bestimmten Zweck", + "groupTitleInverse": "war Zweck von" + }, + "P25": { + "title": "bewegte", + "titleInverse": "wurde bewegt durch", + "groupTitle": "bewegte", + "groupTitleInverse": "wurde bewegt durch" + }, + "P144": { + "title": "verband mit", + "titleInverse": "erwarb Mitglied durch", + "groupTitle": "verband mit", + "groupTitleInverse": "erwarb Mitglied durch" + }, + "P2": { + "title": "hat den Typus", + "titleInverse": "ist Typus von", + "groupTitle": "hat den Typus", + "groupTitleInverse": "ist Typus von" + }, + "P54": { + "title": "hat derzeitigen permanenten Standort", + "titleInverse": "ist derzeitiger permanenter Standort von", + "groupTitle": "hat derzeitigen permanenten Standort", + "groupTitleInverse": "ist derzeitiger permanenter Standort von" + }, + "P97": { + "title": "gab Vaterschaft", + "titleInverse": "war Vater für", + "groupTitle": "gab Vaterschaft", + "groupTitleInverse": "war Vater für" + }, + "P34": { + "title": "betraf", + "titleInverse": "wurde beurteilt durch", + "groupTitle": "betraf", + "groupTitleInverse": "wurde beurteilt durch" + }, + "P175": { + "title": "starts before or with the start of", + "titleInverse": "starts after or with the start of", + "groupTitle": "starts before or with the start of", + "groupTitleInverse": "starts after or with the start of" + }, + "P51": { + "title": "hat früheren oder derzeitigen Besitzer", + "titleInverse": "ist früherer oder derzeitiger Besitzer von", + "groupTitle": "hat früheren oder derzeitigen Besitzer", + "groupTitleInverse": "ist früherer oder derzeitiger Besitzer von" + }, + "P123": { + "title": "ergab", + "titleInverse": "ergab sich aus", + "groupTitle": "ergab", + "groupTitleInverse": "ergab sich aus" + }, + "P55": { + "title": "hat derzeitigen Standort", + "titleInverse": "hält derzeitig", + "groupTitle": "hat derzeitigen Standort", + "groupTitleInverse": "hält derzeitig" + }, + "P70": { + "title": "belegt", + "titleInverse": "wird belegt in", + "groupTitle": "belegt", + "groupTitleInverse": "wird belegt in" + }, + "P8": { + "title": "fand statt auf oder innerhalb von", + "titleInverse": "bezeugte", + "groupTitle": "fand statt auf oder innerhalb von", + "groupTitleInverse": "bezeugte" + }, + "P11": { + "title": "hatte Teilnehmer", + "titleInverse": "nahm Teil an", + "groupTitle": "hatte Teilnehmer", + "groupTitleInverse": "nahm Teil an" + }, + "P196": { + "title": "defines", + "titleInverse": "is defined by", + "groupTitle": "defines", + "groupTitleInverse": "is defined by" + }, + "P126": { + "title": "verwendete", + "titleInverse": "wurde verwendet bei", + "groupTitle": "verwendete", + "groupTitleInverse": "wurde verwendet bei" + }, + "P105": { + "title": "Rechte stehen zu", + "titleInverse": "hat Rechte an", + "groupTitle": "Rechte stehen zu", + "groupTitleInverse": "hat Rechte an" + }, + "P44": { + "title": "hat Zustand", + "titleInverse": "ist Zustand von", + "groupTitle": "hat Zustand", + "groupTitleInverse": "ist Zustand von" + }, + "P109": { + "title": "hat derzeitigen oder früheren Kurator", + "titleInverse": "ist derzeitiger oder früherer Kurator von", + "groupTitle": "hat derzeitigen oder früheren Kurator", + "groupTitleInverse": "ist derzeitiger oder früherer Kurator von" + }, + "P12": { + "title": "fand statt im Beisein von", + "titleInverse": "war anwesend bei", + "groupTitle": "fand statt im Beisein von", + "groupTitleInverse": "war anwesend bei" + }, + "P9": { + "title": "setzt sich zusammen aus", + "titleInverse": "bildet Teil von", + "groupTitle": "setzt sich zusammen aus", + "groupTitleInverse": "bildet Teil von" + }, + "P156": { + "title": "occupies", + "titleInverse": "is occupied by", + "groupTitle": "occupies", + "groupTitleInverse": "is occupied by" + }, + "P86": { + "title": "fällt in", + "titleInverse": "enthält", + "groupTitle": "fällt in", + "groupTitleInverse": "enthält" + }, + "P111": { + "title": "fügte hinzu", + "titleInverse": "wurde hinzugefügt durch", + "groupTitle": "fügte hinzu", + "groupTitleInverse": "wurde hinzugefügt durch" + }, + "P4": { + "title": "hat Zeitspanne", + "titleInverse": "ist Zeitspanne von", + "groupTitle": "hat Zeitspanne", + "groupTitleInverse": "ist Zeitspanne von" + }, + "P197": { + "title": "covered parts of", + "titleInverse": "was partially covered by", + "groupTitle": "covered parts of", + "groupTitleInverse": "was partially covered by" + }, + "P179": { + "title": "had sales price", + "titleInverse": "was sales price of", + "groupTitle": "had sales price", + "groupTitleInverse": "was sales price of" + }, + "P128": { + "title": "trägt", + "titleInverse": "wird getragen von", + "groupTitle": "trägt", + "groupTitleInverse": "wird getragen von" + }, + "P141": { + "title": "wies zu", + "titleInverse": "wurde zugewiesen durch", + "groupTitle": "wies zu", + "groupTitleInverse": "wurde zugewiesen durch" + }, + "P19": { + "title": "war beabsichtigteter Gebrauch von", + "titleInverse": "wurde hergestellt für", + "groupTitle": "war beabsichtigteter Gebrauch von", + "groupTitleInverse": "wurde hergestellt für" + }, + "P65": { + "title": "zeigt Bildliches", + "titleInverse": "wird gezeigt durch", + "groupTitle": "zeigt Bildliches", + "groupTitleInverse": "wird gezeigt durch" + }, + "P103": { + "title": "bestimmt für", + "titleInverse": "war Bestimmung von", + "groupTitle": "bestimmt für", + "groupTitleInverse": "war Bestimmung von" + }, + "P59": { + "title": "hat Bereich", + "titleInverse": "befindet sich auf oder in", + "groupTitle": "hat Bereich", + "groupTitleInverse": "befindet sich auf oder in" + }, + "P183": { + "title": "ends before the start of", + "titleInverse": "starts after the end of", + "groupTitle": "ends before the start of", + "groupTitleInverse": "starts after the end of" + }, + "P15": { + "title": "wurde beeinflußt durch", + "titleInverse": "beeinflußte", + "groupTitle": "wurde beeinflußt durch", + "groupTitleInverse": "beeinflußte" + }, + "P89": { + "title": "fällt in", + "titleInverse": "enthält", + "groupTitle": "fällt in", + "groupTitleInverse": "enthält" + }, + "P184": { + "title": "ends before or with the end of", + "titleInverse": "ends with or after the end of", + "groupTitle": "ends before or with the end of", + "groupTitleInverse": "ends with or after the end of" + }, + "P94": { + "title": "hat erschaffen", + "titleInverse": "wurde erschaffen durch", + "groupTitle": "hat erschaffen", + "groupTitleInverse": "wurde erschaffen durch" + }, + "P92": { + "title": "brachte in Existenz", + "titleInverse": "wurde in Existenz gebracht durch", + "groupTitle": "brachte in Existenz", + "groupTitleInverse": "wurde in Existenz gebracht durch" + }, + "P110": { + "title": "erweiterte", + "titleInverse": "wurde erweitert durch", + "groupTitle": "erweiterte", + "groupTitleInverse": "wurde erweitert durch" + }, + "P16": { + "title": "benutzte das bestimmte Objekt", + "titleInverse": "wurde benutzt für", + "groupTitle": "benutzte das bestimmte Objekt", + "groupTitleInverse": "wurde benutzt für" + }, + "P130": { + "title": "zeigt Merkmale von", + "titleInverse": "Merkmale auch auf", + "groupTitle": "zeigt Merkmale von", + "groupTitleInverse": "Merkmale auch auf" + }, + "P72": { + "title": "hat Sprache", + "titleInverse": "ist Sprache von", + "groupTitle": "hat Sprache", + "groupTitleInverse": "ist Sprache von" + }, + "P1": { + "title": "wird bezeichnet als", + "titleInverse": "bezeichnet", + "groupTitle": "wird bezeichnet als", + "groupTitleInverse": "bezeichnet" + }, + "P68": { + "title": "sieht den Gebrauch vor von", + "titleInverse": "vorgesehen für Gebrauch durch defined", + "groupTitle": "sieht den Gebrauch vor von", + "groupTitleInverse": "vorgesehen für Gebrauch durch defined" + }, + "P188": { + "title": "requires production tool", + "titleInverse": "is production tool for", + "groupTitle": "requires production tool", + "groupTitleInverse": "is production tool for" + }, + "P23": { + "title": "übertrug Besitztitel von", + "titleInverse": "trat Besitztitel ab in", + "groupTitle": "übertrug Besitztitel von", + "groupTitleInverse": "trat Besitztitel ab in" + }, + "P125": { + "title": "benutzte Objekt des Typus", + "titleInverse": "Objekt des Typus ... wurde benutzt in", + "groupTitle": "benutzte Objekt des Typus", + "groupTitleInverse": "Objekt des Typus ... wurde benutzt in" + }, + "P93": { + "title": "beendete die Existenz von", + "titleInverse": "wurde seiner Existenz beraubt durch", + "groupTitle": "beendete die Existenz von", + "groupTitleInverse": "wurde seiner Existenz beraubt durch" + }, + "P160": { + "title": "has temporal projection", + "titleInverse": "is temporal projection of", + "groupTitle": "has temporal projection", + "groupTitleInverse": "is temporal projection of" + }, + "P50": { + "title": "hat derzeitigen Betreuer", + "titleInverse": "ist derzeitiger Betreuer von", + "groupTitle": "hat derzeitigen Betreuer", + "groupTitleInverse": "ist derzeitiger Betreuer von" + }, + "P95": { + "title": "hat gebildet", + "titleInverse": "wurde gebildet von", + "groupTitle": "hat gebildet", + "groupTitleInverse": "wurde gebildet von" + }, + "P40": { + "title": "beobachtete Dimension", + "titleInverse": "wurde beobachtet in", + "groupTitle": "beobachtete Dimension", + "groupTitleInverse": "wurde beobachtet in" + }, + "P62": { + "title": "bildet ab", + "titleInverse": "wird abgebildet durch", + "groupTitle": "bildet ab", + "groupTitleInverse": "wird abgebildet durch" + }, + "P198": { + "title": "holds or supports", + "titleInverse": "is held or supported by", + "groupTitle": "holds or supports", + "groupTitleInverse": "is held or supported by" + }, + "P49": { + "title": "hat früheren oder derzeitigen Betreuer", + "titleInverse": "ist früherer oder derzeitiger Betreuer von", + "groupTitle": "hat früheren oder derzeitigen Betreuer", + "groupTitleInverse": "ist früherer oder derzeitiger Betreuer von" + }, + "P145": { + "title": "entließ", + "titleInverse": "wurde entlassen durch", + "groupTitle": "entließ", + "groupTitleInverse": "wurde entlassen durch" + }, + "P139": { + "title": "hat alternative Form", + "titleInverse": "is alternative form of", + "groupTitle": "hat alternative Form", + "groupTitleInverse": "is alternative form of" + }, + "P174": { + "title": "starts before the end of", + "titleInverse": "ends after the start of", + "groupTitle": "starts before the end of", + "groupTitleInverse": "ends after the start of" + }, + "P31": { + "title": "veränderte", + "titleInverse": "wurde verändert durch", + "groupTitle": "veränderte", + "groupTitleInverse": "wurde verändert durch" + }, + "P28": { + "title": "übergab Gewahrsam an", + "titleInverse": "wurde Gewahrsam übergeben durch", + "groupTitle": "übergab Gewahrsam an", + "groupTitleInverse": "wurde Gewahrsam übergeben durch" + }, + "P177": { + "title": "assigned property of type", + "titleInverse": "is type of property assigned", + "groupTitle": "assigned property of type", + "groupTitleInverse": "is type of property assigned" + }, + "P21": { + "title": "hatte den allgemeinen Zweck", + "titleInverse": "war Zweck von", + "groupTitle": "hatte den allgemeinen Zweck", + "groupTitleInverse": "war Zweck von" + }, + "P26": { + "title": "bewegte bis zu", + "titleInverse": "war Zielort von", + "groupTitle": "bewegte bis zu", + "groupTitleInverse": "war Zielort von" + }, + "P5": { + "title": "besteht aus", + "titleInverse": "bildet Teil von", + "groupTitle": "besteht aus", + "groupTitleInverse": "bildet Teil von" + }, + "P135": { + "title": "erschuf Typus", + "titleInverse": "wurde geschaffen durch", + "groupTitle": "erschuf Typus", + "groupTitleInverse": "wurde geschaffen durch" + }, + "P22": { + "title": "übertrug Besitztitel auf", + "titleInverse": "erwarb Besitztitel durch", + "groupTitle": "übertrug Besitztitel auf", + "groupTitleInverse": "erwarb Besitztitel durch" + }, + "P14": { + "title": "wurde ausgeführt von", + "titleInverse": "führte aus", + "groupTitle": "wurde ausgeführt von", + "groupTitleInverse": "führte aus" + }, + "P136": { + "title": "stützte sich auf", + "titleInverse": "belegte", + "groupTitle": "stützte sich auf", + "groupTitleInverse": "belegte" + }, + "P189": { + "title": "approximates", + "titleInverse": "is approximated by", + "groupTitle": "approximates", + "groupTitleInverse": "is approximated by" + }, + "P137": { + "title": "erläutert", + "titleInverse": "erläutert durch Beispiel", + "groupTitle": "erläutert", + "groupTitleInverse": "erläutert durch Beispiel" + }, + "P106": { + "title": "ist zusammengesetzt aus", + "titleInverse": "bildet Teil von", + "groupTitle": "ist zusammengesetzt aus", + "groupTitleInverse": "bildet Teil von" + }, + "P166": { + "title": "was a presence of", + "titleInverse": "had presence", + "groupTitle": "was a presence of", + "groupTitleInverse": "had presence" + }, + "P69": { + "title": "ist verbunden mit", + "titleInverse": "is associated with", + "groupTitle": "ist verbunden mit", + "groupTitleInverse": "is associated with" + }, + "P27": { + "title": "bewegte weg von", + "titleInverse": "war Ausgangsort von", + "groupTitle": "bewegte weg von", + "groupTitleInverse": "war Ausgangsort von" + }, + "P101": { + "title": "hatte die allgemeine Verwendung", + "titleInverse": "war die Verwendung von", + "groupTitle": "hatte die allgemeine Verwendung", + "groupTitleInverse": "war die Verwendung von" + }, + "P38": { + "title": "hob Zuweisung auf von", + "titleInverse": "wurde aufgehoben durch", + "groupTitle": "hob Zuweisung auf von", + "groupTitleInverse": "wurde aufgehoben durch" + }, + "P35": { + "title": "hat identifiziert", + "titleInverse": "wurde identifiziert durch", + "groupTitle": "hat identifiziert", + "groupTitleInverse": "wurde identifiziert durch" + }, + "P10": { + "title": "fällt in", + "titleInverse": "enthält", + "groupTitle": "fällt in", + "groupTitleInverse": "enthält" + }, + "P143": { + "title": "verband", + "titleInverse": "wurde verbunden durch", + "groupTitle": "verband", + "groupTitleInverse": "wurde verbunden durch" + }, + "P173": { + "title": "starts before or with the end of", + "titleInverse": "ends after or with the start of", + "groupTitle": "starts before or with the end of", + "groupTitleInverse": "ends after or with the start of" + }, + "P75": { + "title": "besitzt", + "titleInverse": "sind im Besitz von", + "groupTitle": "besitzt", + "groupTitleInverse": "sind im Besitz von" + }, + "P176": { + "title": "starts before the start of", + "titleInverse": "starts after the start of", + "groupTitle": "starts before the start of", + "groupTitleInverse": "starts after the start of" + }, + "P127": { + "title": "hat den Oberbegriff", + "titleInverse": "hat den Unterbegriff", + "groupTitle": "hat den Oberbegriff", + "groupTitleInverse": "hat den Unterbegriff" + }, + "P108": { + "title": "hat hergestellt", + "titleInverse": "wurde hergestellt durch", + "groupTitle": "hat hergestellt", + "groupTitleInverse": "wurde hergestellt durch" + }, + "P76": { + "title": "hat Kontaktpunkt", + "titleInverse": "bietet Zugang zu", + "groupTitle": "hat Kontaktpunkt", + "groupTitleInverse": "bietet Zugang zu" + }, + "P91": { + "title": "hat Einheit", + "titleInverse": "ist Einheit von", + "groupTitle": "hat Einheit", + "groupTitleInverse": "ist Einheit von" + }, + "P24": { + "title": "übertrug Besitz über", + "titleInverse": "ging über in Besitz durch", + "groupTitle": "übertrug Besitz über", + "groupTitleInverse": "ging über in Besitz durch" + }, + "P73": { + "title": "hat Übersetzung", + "titleInverse": "ist Übersetzung von", + "groupTitle": "hat Übersetzung", + "groupTitleInverse": "ist Übersetzung von" + }, + "P133": { + "title": "is spatiotemporally separated from", + "titleInverse": "is spatiotemporally separated from", + "groupTitle": "is spatiotemporally separated from", + "groupTitleInverse": "is spatiotemporally separated from" + }, + "P29": { + "title": "übertrug Gewahrsam auf", + "titleInverse": "erhielt Gewahrsam durch", + "groupTitle": "übertrug Gewahrsam auf", + "groupTitleInverse": "erhielt Gewahrsam durch" + }, + "OA9": { + "title": "endet in", + "titleInverse": "ist letzter Ort von", + "groupTitle": "endet in", + "groupTitleInverse": "ist letzter Ort von" + }, + "P191": { + "title": "had duration", + "titleInverse": "was duration of", + "groupTitle": "had duration", + "groupTitleInverse": "was duration of" + }, + "P96": { + "title": "durch Mutter", + "titleInverse": "gebar", + "groupTitle": "durch Mutter", + "groupTitleInverse": "gebar" + }, + "P71": { + "title": "listet", + "titleInverse": "wird aufgelistet in", + "groupTitle": "listet", + "groupTitleInverse": "wird aufgelistet in" + }, + "P165": { + "title": "incorporates", + "titleInverse": "is incorporated in", + "groupTitle": "incorporates", + "groupTitleInverse": "is incorporated in" + }, + "P7": { + "title": "fand statt in", + "titleInverse": "bezeugte", + "groupTitle": "fand statt in", + "groupTitleInverse": "bezeugte" + }, + "P67": { + "title": "verweist auf", + "titleInverse": "wird angeführt von", + "groupTitle": "verweist auf", + "groupTitleInverse": "wird angeführt von" + }, + "P161": { + "title": "has spatial projection", + "titleInverse": "is spatial projection of", + "groupTitle": "has spatial projection", + "groupTitleInverse": "is spatial projection of" + }, + "P186": { + "title": "produced thing of product type", + "titleInverse": "is produced by", + "groupTitle": "produced thing of product type", + "groupTitleInverse": "is produced by" + }, + "P134": { + "title": "setzte sich fort in", + "titleInverse": "wurde fortgesetzt durch", + "groupTitle": "setzte sich fort in", + "groupTitleInverse": "wurde fortgesetzt durch" + }, + "P146": { + "title": "entließ von", + "titleInverse": "verlor Mitglied durch", + "groupTitle": "entließ von", + "groupTitleInverse": "verlor Mitglied durch" + }, + "P13": { + "title": "zerstörte", + "titleInverse": "wurde zerstört durch", + "groupTitle": "zerstörte", + "groupTitleInverse": "wurde zerstört durch" + }, + "P121": { + "title": "überlappt mit", + "titleInverse": "überlappt mit", + "groupTitle": "überlappt mit", + "groupTitleInverse": "überlappt mit" + }, + "P46": { + "title": "ist zusammengesetzt aus", + "titleInverse": "bildet Teil von", + "groupTitle": "ist zusammengesetzt aus", + "groupTitleInverse": "bildet Teil von" + }, + "P185": { + "title": "ends before the end of", + "titleInverse": "ends after the end of", + "groupTitle": "ends before the end of", + "groupTitleInverse": "ends after the end of" + }, + "P39": { + "title": "vermaß", + "titleInverse": "wurde vermessen durch", + "groupTitle": "vermaß", + "groupTitleInverse": "wurde vermessen durch" + }, + "P45": { + "title": "besteht aus", + "titleInverse": "ist enthalten in", + "groupTitle": "besteht aus", + "groupTitleInverse": "ist enthalten in" + }, + "P32": { + "title": "benutzte das allgemeine Verfahren", + "titleInverse": "war Verfahren von", + "groupTitle": "benutzte das allgemeine Verfahren", + "groupTitleInverse": "war Verfahren von" + }, + "P187": { + "title": "has production plan", + "titleInverse": "is production plan for", + "groupTitle": "has production plan", + "groupTitleInverse": "is production plan for" + }, + "P147": { + "title": "betreute kuratorisch", + "titleInverse": "wurde kuratorisch betreut durch", + "groupTitle": "betreute kuratorisch", + "groupTitleInverse": "wurde kuratorisch betreut durch" + }, + "P157": { + "title": "is at rest relative to", + "titleInverse": "provides reference space for", + "groupTitle": "is at rest relative to", + "groupTitleInverse": "provides reference space for" + }, + "P122": { + "title": "grenzt an", + "titleInverse": "grenzt an", + "groupTitle": "grenzt an", + "groupTitleInverse": "grenzt an" + }, + "P30": { + "title": "übertrug Gewahrsam über", + "titleInverse": "wechselte Gewahrsam durch", + "groupTitle": "übertrug Gewahrsam über", + "groupTitleInverse": "wechselte Gewahrsam durch" + }, + "P52": { + "title": "hat derzeitigen Besitzer", + "titleInverse": "ist derzeitiger Besitzer von", + "groupTitle": "hat derzeitigen Besitzer", + "groupTitleInverse": "ist derzeitiger Besitzer von" + }, + "P151": { + "title": "was formed from", + "titleInverse": "participated in", + "groupTitle": "was formed from", + "groupTitleInverse": "participated in" + }, + "P167": { + "title": "was within", + "titleInverse": "includes", + "groupTitle": "was within", + "groupTitleInverse": "includes" + }, + "P102": { + "title": "trägt den Titel", + "titleInverse": "ist der Titel von", + "groupTitle": "trägt den Titel", + "groupTitleInverse": "ist der Titel von" + }, + "P41": { + "title": "klassifizierte", + "titleInverse": "wurde klassifiziert durch", + "groupTitle": "klassifizierte", + "groupTitleInverse": "wurde klassifiziert durch" + }, + "P138": { + "title": "stellt dar", + "titleInverse": "wird dargestellt durch", + "groupTitle": "stellt dar", + "groupTitleInverse": "wird dargestellt durch" + } +} \ No newline at end of file diff --git a/messages/en/common.json b/messages/en/common.json index 490d31c7..2acf2c93 100644 --- a/messages/en/common.json +++ b/messages/en/common.json @@ -1,4 +1,9 @@ { + "Actor": { + "MemberOf": "Groups", + "Relations": "Relations", + "hasMember": "Affiliates" + }, "AppFooter": { "links": { "imprint": "Imprint" @@ -35,14 +40,11 @@ } }, "DataMapView": { + "centerpoint": "Area Point", "end-date": "End date", - "start-date": "Start date", + "point": "Location Point", "polygon": "Display Areas", - "centerpoint": "Area Point", - "point": "Location Point" - }, - "DataView": { - "nothing-found": "No entries found for this search." + "start-date": "Start date" }, "DataPage": { "meta": { @@ -52,10 +54,14 @@ "title": "Data", "work-in-progress": "The database is currently work in progress." }, + "DataView": { + "nothing-found": "No entries found for this search." + }, "DefaultLayout": { "skip-to-main-content": "Skip to main content" }, "EntityDescriptionsDisplay": { + "description": "No Description | Description | Descriptions", "no-descriptions": "No descriptions available." }, "EntityPage": { @@ -63,11 +69,18 @@ "iiif": "IIIF-Viewer", "images": "Images ({count})", "map": "Map", - "network": "Network Visualization", "meta": { "title": "Entity" + }, + "network": "Network Visualization", + "sidebar": { + "toggle": "Toggle details for {title}" } }, + "EntitySidebar": { + "NextFeature": "NextFeature", + "PreviousFeature": "Previous Feature" + }, "ErrorBoundary": { "error": "Error" }, @@ -78,6 +91,12 @@ "title": "Something went wrong!", "try-again": "Try again" }, + "Global": { + "Next": "Next", + "Previous": "Previous", + "ShowMore": "show more", + "TitleMissing": "Title Missing" + }, "ImprintPage": { "error": { "not-found": "Imprint not found", @@ -121,6 +140,13 @@ }, "title": "Page not found" }, + "RelationType": { + "CurrentOrFormerResidency": "Residency" + }, + "Relations": { + "Artifacts": "Artifacts", + "HumanRemains": "Human Remains" + }, "SearchForm": { "filter": "Filter", "filters": { diff --git a/messages/en/crm.json b/messages/en/crm.json new file mode 100644 index 00000000..8c9d2547 --- /dev/null +++ b/messages/en/crm.json @@ -0,0 +1,912 @@ +{ + "person": { + "OA8": { + "title": "Born in", + "titleInverse": "Birthplace of" + }, + "OA9": { + "title": "Died in", + "titleInverse": "Deathplace of" + } + }, + "P107": { + "title": "has Member(s)", + "titleInverse": "Member of", + "groupTitle": "Members", + "groupTitleInverse": "Memberships" + }, + "P74": { + "title": "Residence", + "titleInverse": "is current or former residence of", + "groupTitle": "Residence", + "groupTitleInverse": "is current or former residence of" + }, + "OA7": { + "groupTitle": "Relationships", + "groupTitleInverse": "Relationships", + "title": "has relationship to", + "titleInverse": "has relationship to" + }, + "P53": { + "title": "Location", + "titleInverse": "is former or current location of", + "groupTitle": "Location", + "groupTitleInverse": "is former or current location of" + }, + "P43": { + "title": "has dimension", + "titleInverse": "is dimension of", + "groupTitle": "has dimension", + "groupTitleInverse": "is dimension of" + }, + "P140": { + "title": "assigned attribute to", + "titleInverse": "was attributed by", + "groupTitle": "assigned attribute to", + "groupTitleInverse": "was attributed by" + }, + "P99": { + "title": "dissolved", + "titleInverse": "was dissolved by", + "groupTitle": "dissolved", + "groupTitleInverse": "was dissolved by" + }, + "P112": { + "title": "diminished", + "titleInverse": "was diminished by", + "groupTitle": "diminished", + "groupTitleInverse": "was diminished by" + }, + "P113": { + "title": "removed", + "titleInverse": "was removed by", + "groupTitle": "removed", + "groupTitleInverse": "was removed by" + }, + "P17": { + "title": "was motivated by", + "titleInverse": "motivated", + "groupTitle": "was motivated by", + "groupTitleInverse": "motivated" + }, + "P104": { + "title": "is subject to", + "titleInverse": "applies to", + "groupTitle": "is subject to", + "groupTitleInverse": "applies to" + }, + "P142": { + "title": "used constituent", + "titleInverse": "was used in", + "groupTitle": "used constituent", + "groupTitleInverse": "was used in" + }, + "P195": { + "title": "was a presence of", + "titleInverse": "had presence", + "groupTitle": "was a presence of", + "groupTitleInverse": "had presence" + }, + "P164": { + "title": "is temporally specified by", + "titleInverse": "temporally specifies", + "groupTitle": "is temporally specified by", + "groupTitleInverse": "temporally specifies" + }, + "P129": { + "title": "is about", + "titleInverse": "is subject of", + "groupTitle": "is about", + "groupTitleInverse": "is subject of" + }, + "P33": { + "title": "used specific technique", + "titleInverse": "was used by", + "groupTitle": "used specific technique", + "groupTitleInverse": "was used by" + }, + "P42": { + "title": "assigned", + "titleInverse": "was assigned by", + "groupTitle": "assigned", + "groupTitleInverse": "was assigned by" + }, + "P48": { + "title": "has preferred identifier", + "titleInverse": "is preferred identifier of", + "groupTitle": "has preferred identifier", + "groupTitleInverse": "is preferred identifier of" + }, + "P37": { + "title": "assigned", + "titleInverse": "was assigned by", + "groupTitle": "assigned", + "groupTitleInverse": "was assigned by" + }, + "P182": { + "title": "ends before or with the start of", + "titleInverse": "starts after or with the end of", + "groupTitle": "ends before or with the start of", + "groupTitleInverse": "starts after or with the end of" + }, + "P132": { + "title": "spatiotemporally overlaps with", + "titleInverse": "spatiotemporally overlaps with", + "groupTitle": "spatiotemporally overlaps with", + "groupTitleInverse": "spatiotemporally overlaps with" + }, + "P56": { + "title": "bears feature", + "titleInverse": "is found on", + "groupTitle": "bears feature", + "groupTitleInverse": "is found on" + }, + "P148": { + "title": "has component", + "titleInverse": "is component of", + "groupTitle": "has component", + "groupTitleInverse": "is component of" + }, + "P150": { + "title": "defines typical parts of", + "titleInverse": "defines typical wholes for", + "groupTitle": "defines typical parts of", + "groupTitleInverse": "defines typical wholes for" + }, + "P100": { + "title": "was death of", + "titleInverse": "died in", + "groupTitle": "was death of", + "groupTitleInverse": "died in" + }, + "P180": { + "title": "has currency", + "titleInverse": "was currency of", + "groupTitle": "has currency", + "groupTitleInverse": "was currency of" + }, + "P98": { + "title": "brought into life", + "titleInverse": "was born", + "groupTitle": "brought into life", + "groupTitleInverse": "was born" + }, + "P124": { + "title": "transformed", + "titleInverse": "was transformed by", + "groupTitle": "transformed", + "groupTitleInverse": "was transformed by" + }, + "P152": { + "title": "has parent", + "titleInverse": "is parent of", + "groupTitle": "has parent", + "groupTitleInverse": "is parent of" + }, + "OA8": { + "title": "begins in", + "titleInverse": "is first appearance of", + "groupTitle": "begins in", + "groupTitleInverse": "is first appearance of" + }, + "P20": { + "title": "had specific purpose", + "titleInverse": "was purpose of", + "groupTitle": "had specific purpose", + "groupTitleInverse": "was purpose of" + }, + "P25": { + "title": "moved", + "titleInverse": "moved by", + "groupTitle": "moved", + "groupTitleInverse": "moved by" + }, + "P144": { + "title": "joined with", + "titleInverse": "gained member by", + "groupTitle": "joined with", + "groupTitleInverse": "gained member by" + }, + "P2": { + "title": "has type", + "titleInverse": "is type of", + "groupTitle": "has type", + "groupTitleInverse": "is type of" + }, + "P54": { + "title": "has current permanent location", + "titleInverse": "is current permanent location of", + "groupTitle": "has current permanent location", + "groupTitleInverse": "is current permanent location of" + }, + "P97": { + "title": "from father", + "titleInverse": "was father for", + "groupTitle": "from father", + "groupTitleInverse": "was father for" + }, + "P34": { + "title": "concerned", + "titleInverse": "was assessed by", + "groupTitle": "concerned", + "groupTitleInverse": "was assessed by" + }, + "P175": { + "title": "starts before or with the start of", + "titleInverse": "starts after or with the start of", + "groupTitle": "starts before or with the start of", + "groupTitleInverse": "starts after or with the start of" + }, + "P51": { + "title": "has former or current owner", + "titleInverse": "is former or current owner of", + "groupTitle": "has former or current owner", + "groupTitleInverse": "is former or current owner of" + }, + "P123": { + "title": "resulted in", + "titleInverse": "resulted from", + "groupTitle": "resulted in", + "groupTitleInverse": "resulted from" + }, + "P55": { + "title": "has current location", + "titleInverse": "currently holds", + "groupTitle": "has current location", + "groupTitleInverse": "currently holds" + }, + "P70": { + "title": "documents", + "titleInverse": "is documented in", + "groupTitle": "documents", + "groupTitleInverse": "is documented in" + }, + "P8": { + "title": "took place on or within", + "titleInverse": "witnessed", + "groupTitle": "took place on or within", + "groupTitleInverse": "witnessed" + }, + "P11": { + "title": "had participant", + "titleInverse": "participated in", + "groupTitle": "had participant", + "groupTitleInverse": "participated in" + }, + "P196": { + "title": "defines", + "titleInverse": "is defined by", + "groupTitle": "defines", + "groupTitleInverse": "is defined by" + }, + "P126": { + "title": "employed", + "titleInverse": "was employed in", + "groupTitle": "employed", + "groupTitleInverse": "was employed in" + }, + "P105": { + "title": "right held by", + "titleInverse": "has right on", + "groupTitle": "right held by", + "groupTitleInverse": "has right on" + }, + "P44": { + "title": "has condition", + "titleInverse": "is condition of", + "groupTitle": "has condition", + "groupTitleInverse": "is condition of" + }, + "P109": { + "title": "has current or former curator", + "titleInverse": "is current or former curator of", + "groupTitle": "has current or former curator", + "groupTitleInverse": "is current or former curator of" + }, + "P12": { + "title": "occurred in the presence of", + "titleInverse": "was present at", + "groupTitle": "occurred in the presence of", + "groupTitleInverse": "was present at" + }, + "P9": { + "title": "consists of", + "titleInverse": "forms part of", + "groupTitle": "consists of", + "groupTitleInverse": "forms part of" + }, + "P156": { + "title": "occupies", + "titleInverse": "is occupied by", + "groupTitle": "occupies", + "groupTitleInverse": "is occupied by" + }, + "P86": { + "title": "falls within", + "titleInverse": "contains", + "groupTitle": "falls within", + "groupTitleInverse": "contains" + }, + "P111": { + "title": "added", + "titleInverse": "was added by", + "groupTitle": "added", + "groupTitleInverse": "was added by" + }, + "P4": { + "title": "has time-span", + "titleInverse": "is time-span of", + "groupTitle": "has time-span", + "groupTitleInverse": "is time-span of" + }, + "P197": { + "title": "covered parts of", + "titleInverse": "was partially covered by", + "groupTitle": "covered parts of", + "groupTitleInverse": "was partially covered by" + }, + "P179": { + "title": "had sales price", + "titleInverse": "was sales price of", + "groupTitle": "had sales price", + "groupTitleInverse": "was sales price of" + }, + "P128": { + "title": "carries", + "titleInverse": "is carried by", + "groupTitle": "carries", + "groupTitleInverse": "is carried by" + }, + "P141": { + "title": "assigned", + "titleInverse": "was assigned by", + "groupTitle": "assigned", + "groupTitleInverse": "was assigned by" + }, + "P19": { + "title": "was intended use of", + "titleInverse": "was made for", + "groupTitle": "was intended use of", + "groupTitleInverse": "was made for" + }, + "P65": { + "title": "shows visual item", + "titleInverse": "is shown by", + "groupTitle": "shows visual item", + "groupTitleInverse": "is shown by" + }, + "P103": { + "title": "was intended for", + "titleInverse": "was intention of", + "groupTitle": "was intended for", + "groupTitleInverse": "was intention of" + }, + "P59": { + "title": "has section", + "titleInverse": "is located on or within", + "groupTitle": "has section", + "groupTitleInverse": "is located on or within" + }, + "P183": { + "title": "ends before the start of", + "titleInverse": "starts after the end of", + "groupTitle": "ends before the start of", + "groupTitleInverse": "starts after the end of" + }, + "P15": { + "title": "was influenced by", + "titleInverse": "influenced", + "groupTitle": "was influenced by", + "groupTitleInverse": "influenced" + }, + "P89": { + "title": "falls within", + "titleInverse": "contains", + "groupTitle": "falls within", + "groupTitleInverse": "contains" + }, + "P184": { + "title": "ends before or with the end of", + "titleInverse": "ends with or after the end of", + "groupTitle": "ends before or with the end of", + "groupTitleInverse": "ends with or after the end of" + }, + "P94": { + "title": "has created", + "titleInverse": "was created by", + "groupTitle": "has created", + "groupTitleInverse": "was created by" + }, + "P92": { + "title": "brought into existence", + "titleInverse": "was brought into existence by", + "groupTitle": "brought into existence", + "groupTitleInverse": "was brought into existence by" + }, + "P110": { + "title": "augmented", + "titleInverse": "was augmented by", + "groupTitle": "augmented", + "groupTitleInverse": "was augmented by" + }, + "P16": { + "title": "used specific object", + "titleInverse": "was used for", + "groupTitle": "used specific object", + "groupTitleInverse": "was used for" + }, + "P130": { + "title": "shows features of", + "titleInverse": "features are also found on", + "groupTitle": "shows features of", + "groupTitleInverse": "features are also found on" + }, + "P72": { + "title": "has language", + "titleInverse": "is language of", + "groupTitle": "has language", + "groupTitleInverse": "is language of" + }, + "P1": { + "title": "is identified by", + "titleInverse": "identifies", + "groupTitle": "is identified by", + "groupTitleInverse": "identifies" + }, + "P68": { + "title": "foresees use of", + "titleInverse": "use foreseen by", + "groupTitle": "foresees use of", + "groupTitleInverse": "use foreseen by" + }, + "P188": { + "title": "requires production tool", + "titleInverse": "is production tool for", + "groupTitle": "requires production tool", + "groupTitleInverse": "is production tool for" + }, + "P23": { + "title": "transferred title from", + "titleInverse": "surrendered title through", + "groupTitle": "transferred title from", + "groupTitleInverse": "surrendered title through" + }, + "P125": { + "title": "used object of type", + "titleInverse": "was type of object used in", + "groupTitle": "used object of type", + "groupTitleInverse": "was type of object used in" + }, + "P93": { + "title": "took out of existence", + "titleInverse": "was taken out of existence by", + "groupTitle": "took out of existence", + "groupTitleInverse": "was taken out of existence by" + }, + "P160": { + "title": "has temporal projection", + "titleInverse": "is temporal projection of", + "groupTitle": "has temporal projection", + "groupTitleInverse": "is temporal projection of" + }, + "P50": { + "title": "has current keeper", + "titleInverse": "is current keeper of", + "groupTitle": "has current keeper", + "groupTitleInverse": "is current keeper of" + }, + "P95": { + "title": "has formed", + "titleInverse": "was formed by", + "groupTitle": "has formed", + "groupTitleInverse": "was formed by" + }, + "P40": { + "title": "observed dimension", + "titleInverse": "was observed in", + "groupTitle": "observed dimension", + "groupTitleInverse": "was observed in" + }, + "P62": { + "title": "depicts", + "titleInverse": "is depicted by", + "groupTitle": "depicts", + "groupTitleInverse": "is depicted by" + }, + "P198": { + "title": "holds or supports", + "titleInverse": "is held or supported by", + "groupTitle": "holds or supports", + "groupTitleInverse": "is held or supported by" + }, + "P49": { + "title": "has former or current keeper", + "titleInverse": "is former or current keeper of", + "groupTitle": "has former or current keeper", + "groupTitleInverse": "is former or current keeper of" + }, + "P145": { + "title": "separated", + "titleInverse": "left by", + "groupTitle": "separated", + "groupTitleInverse": "left by" + }, + "P139": { + "title": "has alternative form", + "titleInverse": "is alternative form of", + "groupTitle": "has alternative form", + "groupTitleInverse": "is alternative form of" + }, + "P174": { + "title": "starts before the end of", + "titleInverse": "ends after the start of", + "groupTitle": "starts before the end of", + "groupTitleInverse": "ends after the start of" + }, + "P31": { + "title": "has modified", + "titleInverse": "was modified by", + "groupTitle": "has modified", + "groupTitleInverse": "was modified by" + }, + "P28": { + "title": "custody surrendered by", + "titleInverse": "surrendered custody through", + "groupTitle": "custody surrendered by", + "groupTitleInverse": "surrendered custody through" + }, + "P177": { + "title": "assigned property of type", + "titleInverse": "is type of property assigned", + "groupTitle": "assigned property of type", + "groupTitleInverse": "is type of property assigned" + }, + "P21": { + "title": "had general purpose", + "titleInverse": "was purpose of", + "groupTitle": "had general purpose", + "groupTitleInverse": "was purpose of" + }, + "P26": { + "title": "moved to", + "titleInverse": "was destination of", + "groupTitle": "moved to", + "groupTitleInverse": "was destination of" + }, + "P5": { + "title": "consists of", + "titleInverse": "forms part of", + "groupTitle": "consists of", + "groupTitleInverse": "forms part of" + }, + "P135": { + "title": "created type", + "titleInverse": "was created by", + "groupTitle": "created type", + "groupTitleInverse": "was created by" + }, + "P22": { + "title": "transferred title to", + "titleInverse": "acquired title through", + "groupTitle": "transferred title to", + "groupTitleInverse": "acquired title through" + }, + "P14": { + "title": "carried out by", + "titleInverse": "performed", + "groupTitle": "carried out by", + "groupTitleInverse": "performed" + }, + "P136": { + "title": "was based on", + "titleInverse": "supported type creation", + "groupTitle": "was based on", + "groupTitleInverse": "supported type creation" + }, + "P189": { + "title": "approximates", + "titleInverse": "is approximated by", + "groupTitle": "approximates", + "groupTitleInverse": "is approximated by" + }, + "P137": { + "title": "exemplifies", + "titleInverse": "is exemplified by", + "groupTitle": "exemplifies", + "groupTitleInverse": "is exemplified by" + }, + "P106": { + "title": "is composed of", + "titleInverse": "forms part of", + "groupTitle": "is composed of", + "groupTitleInverse": "forms part of" + }, + "P166": { + "title": "was a presence of", + "titleInverse": "had presence", + "groupTitle": "was a presence of", + "groupTitleInverse": "had presence" + }, + "P69": { + "title": "has association with", + "titleInverse": "is associated with", + "groupTitle": "has association with", + "groupTitleInverse": "is associated with" + }, + "P27": { + "title": "moved from", + "titleInverse": "was origin of", + "groupTitle": "moved from", + "groupTitleInverse": "was origin of" + }, + "P101": { + "title": "had as general use", + "titleInverse": "was use of", + "groupTitle": "had as general use", + "groupTitleInverse": "was use of" + }, + "P38": { + "title": "deassigned", + "titleInverse": "was deassigned by", + "groupTitle": "deassigned", + "groupTitleInverse": "was deassigned by" + }, + "P35": { + "title": "has identified", + "titleInverse": "was identified by", + "groupTitle": "has identified", + "groupTitleInverse": "was identified by" + }, + "P10": { + "title": "falls within", + "titleInverse": "contains", + "groupTitle": "falls within", + "groupTitleInverse": "contains" + }, + "P143": { + "title": "joined", + "titleInverse": "was joined by", + "groupTitle": "joined", + "groupTitleInverse": "was joined by" + }, + "P173": { + "title": "starts before or with the end of", + "titleInverse": "ends after or with the start of", + "groupTitle": "starts before or with the end of", + "groupTitleInverse": "ends after or with the start of" + }, + "P75": { + "title": "possesses", + "titleInverse": "is possessed by", + "groupTitle": "possesses", + "groupTitleInverse": "is possessed by" + }, + "P176": { + "title": "starts before the start of", + "titleInverse": "starts after the start of", + "groupTitle": "starts before the start of", + "groupTitleInverse": "starts after the start of" + }, + "P127": { + "title": "has broader term", + "titleInverse": "has narrower term", + "groupTitle": "has broader term", + "groupTitleInverse": "has narrower term" + }, + "P108": { + "title": "has produced", + "titleInverse": "was produced by", + "groupTitle": "has produced", + "groupTitleInverse": "was produced by" + }, + "P76": { + "title": "has contact point", + "titleInverse": "provides access to", + "groupTitle": "has contact point", + "groupTitleInverse": "provides access to" + }, + "P91": { + "title": "has unit", + "titleInverse": "is unit of", + "groupTitle": "has unit", + "groupTitleInverse": "is unit of" + }, + "P24": { + "title": "transferred title of", + "titleInverse": "changed ownership through", + "groupTitle": "transferred title of", + "groupTitleInverse": "changed ownership through" + }, + "P73": { + "title": "has translation", + "titleInverse": "is translation of", + "groupTitle": "has translation", + "groupTitleInverse": "is translation of" + }, + "P133": { + "title": "is spatiotemporally separated from", + "titleInverse": "is spatiotemporally separated from", + "groupTitle": "is spatiotemporally separated from", + "groupTitleInverse": "is spatiotemporally separated from" + }, + "P29": { + "title": "custody received by", + "titleInverse": "received custody through", + "groupTitle": "custody received by", + "groupTitleInverse": "received custody through" + }, + "OA9": { + "title": "ends in", + "titleInverse": "is last appearance of", + "groupTitle": "ends in", + "groupTitleInverse": "is last appearance of" + }, + "P191": { + "title": "had duration", + "titleInverse": "was duration of", + "groupTitle": "had duration", + "groupTitleInverse": "was duration of" + }, + "P96": { + "title": "by mother", + "titleInverse": "gave birth", + "groupTitle": "by mother", + "groupTitleInverse": "gave birth" + }, + "P71": { + "title": "lists", + "titleInverse": "is listed in", + "groupTitle": "lists", + "groupTitleInverse": "is listed in" + }, + "P165": { + "title": "incorporates", + "titleInverse": "is incorporated in", + "groupTitle": "incorporates", + "groupTitleInverse": "is incorporated in" + }, + "P7": { + "title": "took place at", + "titleInverse": "witnessed", + "groupTitle": "took place at", + "groupTitleInverse": "witnessed" + }, + "P67": { + "title": "refers to", + "titleInverse": "is referred to by", + "groupTitle": "refers to", + "groupTitleInverse": "is referred to by" + }, + "P161": { + "title": "has spatial projection", + "titleInverse": "is spatial projection of", + "groupTitle": "has spatial projection", + "groupTitleInverse": "is spatial projection of" + }, + "P186": { + "title": "produced thing of product type", + "titleInverse": "is produced by", + "groupTitle": "produced thing of product type", + "groupTitleInverse": "is produced by" + }, + "P134": { + "title": "continued", + "titleInverse": "was continued by", + "groupTitle": "continued", + "groupTitleInverse": "was continued by" + }, + "P146": { + "title": "separated from", + "titleInverse": "lost member by", + "groupTitle": "separated from", + "groupTitleInverse": "lost member by" + }, + "P13": { + "title": "destroyed", + "titleInverse": "was destroyed by", + "groupTitle": "destroyed", + "groupTitleInverse": "was destroyed by" + }, + "P121": { + "title": "overlaps with", + "titleInverse": "overlaps with", + "groupTitle": "overlaps with", + "groupTitleInverse": "overlaps with" + }, + "P46": { + "title": "is composed of", + "titleInverse": "forms part of", + "groupTitle": "is composed of", + "groupTitleInverse": "forms part of" + }, + "P185": { + "title": "ends before the end of", + "titleInverse": "ends after the end of", + "groupTitle": "ends before the end of", + "groupTitleInverse": "ends after the end of" + }, + "P39": { + "title": "measured", + "titleInverse": "was measured by", + "groupTitle": "measured", + "groupTitleInverse": "was measured by" + }, + "P45": { + "title": "consists of", + "titleInverse": "is incorporated in", + "groupTitle": "consists of", + "groupTitleInverse": "is incorporated in" + }, + "P32": { + "title": "used general technique", + "titleInverse": "was technique of", + "groupTitle": "used general technique", + "groupTitleInverse": "was technique of" + }, + "P187": { + "title": "has production plan", + "titleInverse": "is production plan for", + "groupTitle": "has production plan", + "groupTitleInverse": "is production plan for" + }, + "P147": { + "title": "curated", + "titleInverse": "was curated by", + "groupTitle": "curated", + "groupTitleInverse": "was curated by" + }, + "P157": { + "title": "is at rest relative to", + "titleInverse": "provides reference space for", + "groupTitle": "is at rest relative to", + "groupTitleInverse": "provides reference space for" + }, + "P122": { + "title": "borders with", + "titleInverse": "borders with", + "groupTitle": "borders with", + "groupTitleInverse": "borders with" + }, + "P30": { + "title": "transferred custody of", + "titleInverse": "custody transferred through", + "groupTitle": "transferred custody of", + "groupTitleInverse": "custody transferred through" + }, + "P52": { + "title": "has current owner", + "titleInverse": "is current owner of", + "groupTitle": "has current owner", + "groupTitleInverse": "is current owner of" + }, + "P151": { + "title": "was formed from", + "titleInverse": "participated in", + "groupTitle": "was formed from", + "groupTitleInverse": "participated in" + }, + "P167": { + "title": "was within", + "titleInverse": "includes", + "groupTitle": "was within", + "groupTitleInverse": "includes" + }, + "P102": { + "title": "has title", + "titleInverse": "is title of", + "groupTitle": "has title", + "groupTitleInverse": "is title of" + }, + "P41": { + "title": "classified", + "titleInverse": "was classified by", + "groupTitle": "classified", + "groupTitleInverse": "was classified by" + }, + "P138": { + "title": "represents", + "titleInverse": "has representation", + "groupTitle": "represents", + "groupTitleInverse": "has representation" + } +} \ No newline at end of file diff --git a/package.json b/package.json index d4aa297f..092ea6b5 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ "dev:cms": "decap-server", "format:check": "prettier . \"!./content/**\" --cache --check --ignore-path ./.gitignore", "format:fix": "pnpm run format:check --write", + "generate:api-client": "dotenv -c -- tsx ./scripts/generate-api-client.ts", + "generate:crm-messages": "dotenv -c -- tsx ./scripts/generate-crm-locale.ts", "lint:check": "run-p --continue-on-error \"lint:*:check\"", "lint:fix": "run-p --continue-on-error \"lint:*:fix\"", "lint:code:check": "eslint . --cache --ext .js,.ts,.vue --ignore-path ./.gitignore", @@ -27,7 +29,7 @@ "lint:styles:fix": "pnpm run lint:styles:check --fix", "postinstall": "nuxt prepare", "preinstall": "npx only-allow pnpm", - "prepare": "run-s setup generate:api-client", + "prepare": "run-s setup generate:api-client generate:crm-messages", "setup": "is-ci || simple-git-hooks", "start": "nuxt preview --dotenv ./.env.local", "sync": "nuxt prepare", diff --git a/pages/entities/[id].vue b/pages/entities/[id].vue deleted file mode 100644 index 3ea176d5..00000000 --- a/pages/entities/[id].vue +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - {{ entity.properties.title }} - - - - - - - - - - - - - {{ tab.label }} - - - - - - - - - - - - - {{ t("EntityPage.details") }} - - - - - - {{ t(`SystemClassNames.${relationType}`) }} - - - - - - {{ relation.label }} - - - ({{ typesById.get(relation.relationTo)?.hierarchy }}) - - - - - - Show more - - - - - {{ relation.label }} - - - ({{ typesById.get(relation.relationTo)?.hierarchy }}) - - - - - - - - - - - - - - - - - - diff --git a/pages/entities/[id]/index.vue b/pages/entities/[id]/index.vue new file mode 100644 index 00000000..9abd76d6 --- /dev/null +++ b/pages/entities/[id]/index.vue @@ -0,0 +1,10 @@ + diff --git a/pages/entities/[id]/map.vue b/pages/entities/[id]/map.vue new file mode 100644 index 00000000..b9299e22 --- /dev/null +++ b/pages/entities/[id]/map.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/pages/entities/[id]/network.vue b/pages/entities/[id]/network.vue new file mode 100644 index 00000000..b9299e22 --- /dev/null +++ b/pages/entities/[id]/network.vue @@ -0,0 +1,21 @@ + + + + + + + diff --git a/project.config.json b/project.config.json index 779c764b..4d8ac53d 100644 --- a/project.config.json +++ b/project.config.json @@ -22,8 +22,11 @@ "geojsonPoints": "#69c0ef", "geojsonAreaCenterPoints": "#b8cf5b" }, + "map": { + "startPage": true + }, + "fullscreen": true, "defaultLocale": "en", - "fullscreen": false, "imprint": "acdh-ch", "logos": { "light": "/assets/images/logo.svg", @@ -31,8 +34,5 @@ "withTextLight": "/assets/images/logo-with-text-light.svg", "withTextDark": "/assets/images/logo-with-text-dark.svg" }, - "map": { - "startPage": false - }, "twitter": "@openatlas_eu" } diff --git a/scripts/generate-crm-locale.ts b/scripts/generate-crm-locale.ts new file mode 100644 index 00000000..8baa4a1c --- /dev/null +++ b/scripts/generate-crm-locale.ts @@ -0,0 +1,177 @@ +/** + * This script generates CRM messages for all locales specified in `i18n.config.ts`. + * It fetches CRM types as well as their translations from the API and generates a JSON file for each locale. + * To override the translations, add the custom translations to the `customDictionary` object. + * The structure of the generated JSON files is as follows: + * { + * "relationTypeCode": { + * "title": "Title", + * "titleInverse": "Inverse title", + * "groupTitle": "Group title", + * "groupTitleInverse": "Inverse group title" + * } + * + * for special cases, it's also possible to add translations specific to a system class: + * { + * "systemClassName": { + * "relationTypeCode": { + * "title": "Title", + * "titleInverse": "Inverse title", + * "groupTitle": "Group title", + * "groupTitleInverse": "Inverse group title" + * } + * } + */ + +import { mkdir, writeFile } from "node:fs/promises"; +import { join } from "node:path"; + +import { log } from "@acdh-oeaw/lib"; +import createApiClient from "@stefanprobst/openapi-client"; +import { z } from "zod"; + +import { defaultLocale, locales } from "@/config/i18n.config"; +import type { paths } from "@/lib/api-client/api"; + +const schema = z.object({ + NUXT_PUBLIC_API_BASE_URL: z.string().url(), +}); + +const result = schema.safeParse(process.env); + +if (!result.success) { + const message = "Invalid environment variables"; + log.error(`${message}:`, result.error.flatten().fieldErrors); + const error = new Error(message); + delete error.stack; + throw error; +} + +const baseUrl = result.data.NUXT_PUBLIC_API_BASE_URL; + +interface Translations { + title?: string; + titleInverse?: string; + groupTitle?: string; + groupTitleInverse?: string; +} + +const customDictionary: Record< + string, + Record> +> = { + en: { + person: { + OA8: { + title: "Born in", + titleInverse: "Birthplace of", + }, + OA9: { + title: "Died in", + titleInverse: "Deathplace of", + }, + }, + P107: { + title: "has Member(s)", + titleInverse: "Member of", + groupTitle: "Members", + groupTitleInverse: "Memberships", + }, + P74: { + title: "Residence", + }, + OA7: { + groupTitle: "Relationships", + groupTitleInverse: "Relationships", + }, + P53: { + title: "Location", + }, + }, + de: { + person: { + OA8: { + title: "Geboren in", + titleInverse: "Geburtort von", + }, + OA9: { + title: "Gestorben in", + titleInverse: "Sterbeort von", + }, + }, + P107: { + title: "hat Mitglied(er)", + titleInverse: "Mitglied bei", + groupTitle: "Mitglieder", + groupTitleInverse: "Mitgliedschaften", + }, + P74: { + title: "Residenz", + }, + OA7: { + groupTitle: "Beziehungen", + groupTitleInverse: "Beziehungen", + }, + OA8: { + title: "Beginnt in", + }, + P53: { + title: "Ort", + }, + }, +}; + +/** + * Generates CRM messages for the specified locale. + * @param locale - The locale for which to generate CRM messages. Defaults to `defaultLocale` if not provided. + * @returns A Promise that resolves when the CRM messages have been generated. + */ +async function generate(locale = defaultLocale) { + log.info(`Generating crm messages for locale: "${locale}" from url: ${baseUrl} ...`); + const apiClient = createApiClient({ baseUrl }); + + const crmTypes = await apiClient.GET("/properties/"); + + const obj: Record> = + customDictionary[locale] ?? {}; + + for (const [key, type] of Object.entries(crmTypes)) { + if (!type.code) continue; + + const title = type.i18n[locale] ?? type.i18n[defaultLocale]; + const inverseTitle = + //@ts-expect-error The type is not correct, its isn't a string + type.i18nInverse[locale] ?? + //@ts-expect-error The type is not correct, its isn't a string + type.i18nInverse[defaultLocale] ?? + title; + + const typeTranslations = obj[type.code] || {}; + if (!typeTranslations.title) typeTranslations.title = title; + if (!typeTranslations.titleInverse) typeTranslations.titleInverse = inverseTitle; + if (!typeTranslations.groupTitle) typeTranslations.groupTitle = typeTranslations.title ?? title; + if (!typeTranslations.groupTitleInverse) + typeTranslations.groupTitleInverse = typeTranslations.titleInverse ?? inverseTitle; + + obj[key] = typeTranslations; + } + + const content = JSON.stringify(obj, null, "\t"); + + const folderPath = join(process.cwd(), "messages", locale); + await mkdir(folderPath, { recursive: true }); + await writeFile(join(folderPath, `crm.json`), content, { + encoding: "utf-8", + }); +} + +for (const locale of locales) { + generate(locale) + .then(() => { + log.success(`Successfully generated crm messages for ${locale}.`); + }) + .catch((error) => { + log.error(`Failed to generate crm messages for ${locale}.\n`, String(error)); + process.exitCode = 1; + }); +} diff --git a/utils/extract-crm-code.ts b/utils/extract-crm-code.ts new file mode 100644 index 00000000..2b4effbb --- /dev/null +++ b/utils/extract-crm-code.ts @@ -0,0 +1,25 @@ +import type { components } from "@/lib/api-client/api"; + +export type CrmCode = keyof components["schemas"]["PropertiesModel"]; + +export interface RelationType { + crmCode: CrmCode; + inverse?: boolean; +} + +export function extractRelationTypeFromRelationString(relation?: string): RelationType | null { + if (!relation) return null; + let crmCode = relation.replace("crm:", ""); + crmCode = crmCode.split("_")[0] ?? crmCode; + crmCode = crmCode.split(" ")[0] ?? crmCode; + + if (!crmCode) return null; + + const inverse = crmCode.endsWith("i"); + if (inverse) crmCode = crmCode.slice(0, -1); + + /** At the moment no CRM code is longer than 4 characters. */ + if (crmCode.length > 4) return null; + + return { crmCode: crmCode as CrmCode, inverse }; +} diff --git a/utils/filter-relations.ts b/utils/filter-relations.ts new file mode 100644 index 00000000..fe72031b --- /dev/null +++ b/utils/filter-relations.ts @@ -0,0 +1,3 @@ +export default () => { + return 'Hello Util' +} diff --git a/utils/get-entity-icon.ts b/utils/get-entity-icon.ts index d9977fee..8b247341 100644 --- a/utils/get-entity-icon.ts +++ b/utils/get-entity-icon.ts @@ -1,4 +1,5 @@ import { + BoneIcon, CalendarFoldIcon, CodeSquareIcon, MapPinIcon, @@ -23,7 +24,7 @@ const icons: Record = { file: TextIcon, find: MapPinIcon, group: UserIcon, - human_remains: MapPinIcon, + human_remains: BoneIcon, move: CalendarFoldIcon, object_location: MapPinIcon, person: UserIcon,
{{ description }}
- {{ t("EntityDescriptionsDisplay.no-descriptions") }} -
{{ descriptions[0] }}
{{description}}
+ + +
{{ type.descriptions }}
+ {{ type.value }} {{ type.unit }} +