geonetwork-ui 2.7.0-dev.b9840dab3 → 2.7.0-dev.c5e7f06ca
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.mjs +4 -7
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +20 -20
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/metadata-url.service.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +4 -4
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +5 -5
- package/esm2022/libs/api/repository/src/index.mjs +2 -2
- package/esm2022/libs/api/repository/src/lib/gn4/auth/auth.service.mjs +5 -5
- package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +55 -12
- package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +3 -3
- package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.mjs +3 -3
- package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +3 -3
- package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +21 -21
- package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +3 -1
- package/esm2022/libs/api/repository/src/lib/metadata-language.token.mjs +3 -0
- package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +11 -1
- package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
- package/esm2022/libs/feature/catalog/src/lib/sources/sources.service.mjs +3 -3
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.mjs +55 -0
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +8 -3
- package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/index.mjs +2 -1
- package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +77 -1
- package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +3 -5
- package/esm2022/libs/feature/router/src/lib/default/state/query-params.utils.mjs +4 -3
- package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +3 -2
- package/esm2022/libs/feature/search/src/lib/state/reducer.mjs +5 -2
- package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
- package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +1 -4
- package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +7 -7
- package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +1 -6
- package/esm2022/libs/util/app-config/src/lib/app-config.mjs +3 -1
- package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -2
- package/esm2022/libs/util/app-config/src/lib/model.mjs +1 -1
- package/esm2022/libs/util/app-config/src/lib/parse-utils.mjs +5 -4
- package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +50 -9
- package/esm2022/libs/util/shared/src/lib/record/quality-score.util.mjs +9 -8
- package/esm2022/libs/util/shared/src/lib/utils/geojson.mjs +58 -1
- package/esm2022/translations/de.json +52 -20
- package/esm2022/translations/en.json +53 -21
- package/esm2022/translations/es.json +39 -7
- package/esm2022/translations/fr.json +57 -25
- package/esm2022/translations/it.json +52 -20
- package/esm2022/translations/nl.json +39 -7
- package/esm2022/translations/pt.json +39 -7
- package/esm2022/translations/sk.json +43 -11
- package/fesm2022/geonetwork-ui.mjs +3013 -2925
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +2 -2
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
- package/libs/api/repository/src/index.d.ts +1 -1
- package/libs/api/repository/src/index.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +1 -2
- package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +6 -7
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts +2 -0
- package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/metadata-language.token.d.ts +5 -0
- package/libs/api/repository/src/lib/metadata-language.token.d.ts.map +1 -0
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +5 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -0
- package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
- package/libs/feature/catalog/src/lib/sources/sources.service.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.d.ts +20 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.d.ts.map +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts +1 -0
- package/libs/feature/editor/src/lib/components/record-form/form-field/index.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/fields.config.d.ts +8 -1
- package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
- package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +2 -2
- package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
- package/libs/feature/router/src/lib/default/state/query-params.utils.d.ts.map +1 -1
- package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
- package/libs/feature/search/src/lib/state/reducer.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +0 -1
- package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -1
- package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
- package/libs/util/app-config/src/lib/model.d.ts +1 -0
- package/libs/util/app-config/src/lib/model.d.ts.map +1 -1
- package/libs/util/app-config/src/lib/parse-utils.d.ts.map +1 -1
- package/libs/util/i18n/src/lib/language-codes.d.ts +91 -31
- package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
- package/libs/util/shared/src/lib/record/quality-score.util.d.ts.map +1 -1
- package/libs/util/shared/src/lib/utils/geojson.d.ts +7 -2
- package/libs/util/shared/src/lib/utils/geojson.d.ts.map +1 -1
- package/package.json +11 -10
- package/src/libs/api/metadata-converter/src/lib/dcat-ap/read-parts.ts +3 -6
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +47 -22
- package/src/libs/api/metadata-converter/src/lib/gn4/metadata-url.service.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +3 -3
- package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +6 -6
- package/src/libs/api/repository/src/index.ts +1 -1
- package/src/libs/api/repository/src/lib/gn4/auth/auth.service.ts +4 -4
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +65 -14
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +2 -2
- package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.ts +2 -2
- package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +2 -2
- package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +22 -35
- package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +8 -0
- package/src/libs/api/repository/src/lib/metadata-language.token.ts +8 -0
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +17 -1
- package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -0
- package/src/libs/feature/catalog/src/lib/sources/sources.service.ts +2 -5
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.css +0 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.html +22 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-inspire-field/form-field-inspire-theme.component.ts +57 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +6 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +5 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/index.ts +1 -0
- package/src/libs/feature/editor/src/lib/fields.config.ts +85 -1
- package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +8 -8
- package/src/libs/feature/router/src/lib/default/state/query-params.utils.ts +5 -2
- package/src/libs/feature/router/src/lib/default/state/router.facade.ts +2 -1
- package/src/libs/feature/search/src/lib/state/reducer.ts +4 -1
- package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +4 -1
- package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +0 -4
- package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.ts +6 -6
- package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +0 -6
- package/src/libs/util/app-config/src/lib/app-config.ts +2 -0
- package/src/libs/util/app-config/src/lib/fixtures.ts +1 -1
- package/src/libs/util/app-config/src/lib/model.ts +1 -0
- package/src/libs/util/app-config/src/lib/parse-utils.ts +4 -7
- package/src/libs/util/i18n/src/lib/language-codes.ts +62 -11
- package/src/libs/util/shared/src/lib/record/quality-score.util.ts +13 -10
- package/src/libs/util/shared/src/lib/utils/geojson.ts +72 -2
- package/translations/de.json +52 -20
- package/translations/en.json +53 -21
- package/translations/es.json +39 -7
- package/translations/fr.json +57 -25
- package/translations/it.json +52 -20
- package/translations/nl.json +39 -7
- package/translations/pt.json +39 -7
- package/translations/sk.json +43 -11
- package/esm2022/libs/api/repository/src/lib/metadata-language.mjs +0 -3
- package/esm2022/libs/util/app-config/src/lib/constants.mjs +0 -439
- package/libs/api/repository/src/lib/metadata-language.d.ts +0 -3
- package/libs/api/repository/src/lib/metadata-language.d.ts.map +0 -1
- package/libs/util/app-config/src/lib/constants.d.ts +0 -2
- package/libs/util/app-config/src/lib/constants.d.ts.map +0 -1
- package/src/libs/api/repository/src/lib/metadata-language.ts +0 -3
|
@@ -14,7 +14,10 @@ export function flattenQueryParams(
|
|
|
14
14
|
Array.isArray(flattened[key]) &&
|
|
15
15
|
(flattened[key] as string[]).length > 0
|
|
16
16
|
) {
|
|
17
|
-
|
|
17
|
+
const encoded = (flattened[key] as string[]).map((value) =>
|
|
18
|
+
typeof value === 'string' ? value.replace(/,/g, '%2C') : value
|
|
19
|
+
)
|
|
20
|
+
flattened[key] = [encoded.join(',')]
|
|
18
21
|
} else if (isDateRange(flattened[key] as DateRange)) {
|
|
19
22
|
const start = (flattened[key] as DateRange).start
|
|
20
23
|
const end = (flattened[key] as DateRange).end
|
|
@@ -48,7 +51,7 @@ export function expandQueryParams(
|
|
|
48
51
|
...(end && { end: new Date(`${end}T00:00:00`) }),
|
|
49
52
|
}
|
|
50
53
|
} else {
|
|
51
|
-
expanded[key] = value.split(',')
|
|
54
|
+
expanded[key] = value.split(',').map((v) => v.replace(/%2C/g, ','))
|
|
52
55
|
}
|
|
53
56
|
}
|
|
54
57
|
}
|
|
@@ -63,7 +63,8 @@ export class RouterFacade {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
goToOrganization(organizationName: string) {
|
|
66
|
-
const
|
|
66
|
+
const safeOrgName = organizationName.replace(/\//g, '')
|
|
67
|
+
const path = `${this.routerService.getOrganizationPageRoute()}/${safeOrgName}`
|
|
67
68
|
this.go({
|
|
68
69
|
path,
|
|
69
70
|
queryParamsHandling: '',
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
SortByField,
|
|
9
9
|
} from '../../../../../../libs/common/domain/src/lib/model/search'
|
|
10
10
|
import { DEFAULT_PAGE_SIZE, FIELDS_SUMMARY } from '../constants'
|
|
11
|
+
import { getOptionalSearchConfig } from '../../../../../../libs/util/app-config/src'
|
|
11
12
|
import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
12
13
|
|
|
13
14
|
export const SEARCH_FEATURE_KEY = 'searchState'
|
|
@@ -55,7 +56,9 @@ export const initSearch = (): SearchStateSearch => {
|
|
|
55
56
|
},
|
|
56
57
|
params: {
|
|
57
58
|
filters: {},
|
|
58
|
-
pageSize:
|
|
59
|
+
pageSize: getOptionalSearchConfig()?.LIMIT
|
|
60
|
+
? getOptionalSearchConfig().LIMIT
|
|
61
|
+
: DEFAULT_PAGE_SIZE,
|
|
59
62
|
currentPage: 0,
|
|
60
63
|
favoritesOnly: false,
|
|
61
64
|
useSpatialFilter: true,
|
|
@@ -67,7 +67,10 @@
|
|
|
67
67
|
[ngClass]="{
|
|
68
68
|
'!bg-primary': currentlyActive,
|
|
69
69
|
}"
|
|
70
|
-
|
|
70
|
+
translate
|
|
71
|
+
>record.metadata.api.accessServiceProtocol.{{
|
|
72
|
+
link.accessServiceProtocol
|
|
73
|
+
}}</span
|
|
71
74
|
>
|
|
72
75
|
<span
|
|
73
76
|
*ngIf="link.accessServiceProtocol === 'GPFDL'"
|
|
@@ -74,10 +74,6 @@ export class MetadataQualityComponent implements OnChanges {
|
|
|
74
74
|
)
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
hasGetCapabilities(url: string): boolean {
|
|
78
|
-
return url.toLowerCase().includes('capabilities')
|
|
79
|
-
}
|
|
80
|
-
|
|
81
77
|
initialize() {
|
|
82
78
|
if (!this.propsToValidate) {
|
|
83
79
|
this.propsToValidate = getAllKeysValidator()
|
package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.ts
CHANGED
|
@@ -6,16 +6,16 @@ import { matCheck, matWarningAmber } from '@ng-icons/material-icons/baseline'
|
|
|
6
6
|
|
|
7
7
|
marker('record.metadata.quality.title.success')
|
|
8
8
|
marker('record.metadata.quality.title.failed')
|
|
9
|
-
marker('record.metadata.quality.
|
|
10
|
-
marker('record.metadata.quality.
|
|
11
|
-
marker('record.metadata.quality.
|
|
12
|
-
marker('record.metadata.quality.
|
|
9
|
+
marker('record.metadata.quality.abstract.success')
|
|
10
|
+
marker('record.metadata.quality.abstract.failed')
|
|
11
|
+
marker('record.metadata.quality.topics.success')
|
|
12
|
+
marker('record.metadata.quality.topics.failed')
|
|
13
13
|
marker('record.metadata.quality.keywords.success')
|
|
14
14
|
marker('record.metadata.quality.keywords.failed')
|
|
15
15
|
marker('record.metadata.quality.legalConstraints.success')
|
|
16
16
|
marker('record.metadata.quality.legalConstraints.failed')
|
|
17
|
-
marker('record.metadata.quality.
|
|
18
|
-
marker('record.metadata.quality.
|
|
17
|
+
marker('record.metadata.quality.contacts.success')
|
|
18
|
+
marker('record.metadata.quality.contacts.failed')
|
|
19
19
|
marker('record.metadata.quality.updateFrequency.success')
|
|
20
20
|
marker('record.metadata.quality.updateFrequency.failed')
|
|
21
21
|
marker('record.metadata.quality.organisation.success')
|
|
@@ -136,12 +136,6 @@ export class ServiceCapabilitiesComponent implements OnInit {
|
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
selectLayer(layer: WfsFeatureTypeFull | WmsLayerFull | WmtsLayer) {
|
|
139
|
-
if (layer === this.selectedLayer) {
|
|
140
|
-
this.selectedLayer = null
|
|
141
|
-
this.layerInformation = []
|
|
142
|
-
return
|
|
143
|
-
}
|
|
144
|
-
|
|
145
139
|
this.selectedLayer = layer
|
|
146
140
|
const filteredInfo = []
|
|
147
141
|
Object.keys(layer).map((key) => {
|
|
@@ -231,6 +231,7 @@ export function loadAppConfig() {
|
|
|
231
231
|
'filter_geometry_url',
|
|
232
232
|
'search_preset',
|
|
233
233
|
'advanced_filters',
|
|
234
|
+
'limit',
|
|
234
235
|
],
|
|
235
236
|
warnings,
|
|
236
237
|
errors
|
|
@@ -257,6 +258,7 @@ export function loadAppConfig() {
|
|
|
257
258
|
filters: param.filters,
|
|
258
259
|
})),
|
|
259
260
|
ADVANCED_FILTERS: parsedSearchSection.advanced_filters,
|
|
261
|
+
LIMIT: parsedSearchSection.limit,
|
|
260
262
|
} as SearchConfig)
|
|
261
263
|
|
|
262
264
|
const parsedMetadataQualitySection = parseConfigSection(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { toLang2 } from '../../../../../libs/util/i18n/src'
|
|
2
2
|
|
|
3
3
|
const flatten = (
|
|
4
4
|
base: string,
|
|
@@ -129,13 +129,10 @@ export function checkMetadataLanguage(
|
|
|
129
129
|
parsedConfigSection: any,
|
|
130
130
|
outWarnings: string[]
|
|
131
131
|
) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
parsedConfigSection.metadata_language.toLowerCase()
|
|
135
|
-
) === -1
|
|
136
|
-
) {
|
|
132
|
+
const lang2 = toLang2(parsedConfigSection.metadata_language.toLowerCase())
|
|
133
|
+
if (lang2?.length !== 2) {
|
|
137
134
|
outWarnings.push(
|
|
138
|
-
`In the [global] section: metadata_language = "${parsedConfigSection.metadata_language}" is not
|
|
135
|
+
`In the [global] section: metadata_language = "${parsedConfigSection.metadata_language}" is not a recognized ISO 639 language code`
|
|
139
136
|
)
|
|
140
137
|
}
|
|
141
138
|
return parsedConfigSection
|
|
@@ -1,20 +1,32 @@
|
|
|
1
1
|
import { marker } from '@biesbjerg/ngx-translate-extract-marker'
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Taken from https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes
|
|
5
|
+
* Note: some languages have multiple 3-char codes, like 'fre' and 'fra'; in that case, the one to be used
|
|
6
|
+
* in priority is the one defined last
|
|
7
|
+
*/
|
|
3
8
|
const LANG_3_TO_2_MAPPER = {
|
|
4
9
|
eng: 'en',
|
|
10
|
+
nld: 'nl', // duplicate for "dut"
|
|
5
11
|
dut: 'nl',
|
|
12
|
+
fra: 'fr', // duplicate for "fre"
|
|
6
13
|
fre: 'fr',
|
|
14
|
+
deu: 'de', // duplicate for "ger"
|
|
7
15
|
ger: 'de',
|
|
8
16
|
kor: 'ko',
|
|
9
17
|
spa: 'es',
|
|
18
|
+
ces: 'cs', // duplicate for "cze"
|
|
10
19
|
cze: 'cs',
|
|
11
20
|
cat: 'ca',
|
|
12
21
|
fin: 'fi',
|
|
22
|
+
isl: 'is', // duplicate for "ice"
|
|
13
23
|
ice: 'is',
|
|
14
24
|
ita: 'it',
|
|
15
25
|
por: 'pt',
|
|
16
26
|
rus: 'ru',
|
|
27
|
+
zho: 'zh', // duplicate for "chi"
|
|
17
28
|
chi: 'zh',
|
|
29
|
+
slk: 'sk', // duplicate for "slo"
|
|
18
30
|
slo: 'sk',
|
|
19
31
|
roh: 'rm',
|
|
20
32
|
ara: 'ar',
|
|
@@ -25,10 +37,12 @@ const LANG_3_TO_2_MAPPER = {
|
|
|
25
37
|
tur: 'tr',
|
|
26
38
|
arm: 'hy',
|
|
27
39
|
aze: 'az',
|
|
40
|
+
kat: 'ka', // duplicate for "geo"
|
|
28
41
|
geo: 'ka',
|
|
29
42
|
ukr: 'uk',
|
|
43
|
+
cym: 'cy', // duplicate for "wel"
|
|
30
44
|
wel: 'cy',
|
|
31
|
-
}
|
|
45
|
+
} as const
|
|
32
46
|
|
|
33
47
|
export const LANGUAGE_NAMES = {
|
|
34
48
|
en: 'English',
|
|
@@ -58,26 +72,63 @@ export const LANGUAGE_NAMES = {
|
|
|
58
72
|
ka: 'ქართული',
|
|
59
73
|
uk: 'українська',
|
|
60
74
|
wel: 'Cymraeg',
|
|
61
|
-
}
|
|
75
|
+
} as const
|
|
76
|
+
|
|
77
|
+
export type LanguageCode3 = keyof typeof LANG_3_TO_2_MAPPER
|
|
78
|
+
export type LanguageCode2 = (typeof LANG_3_TO_2_MAPPER)[LanguageCode3]
|
|
62
79
|
|
|
63
80
|
export const LANG_2_TO_3_MAPPER = Object.entries(LANG_3_TO_2_MAPPER).reduce(
|
|
64
81
|
(mapperObject, langEntry) => {
|
|
65
82
|
return { ...mapperObject, [langEntry[1]]: langEntry[0] }
|
|
66
83
|
},
|
|
67
84
|
{}
|
|
68
|
-
)
|
|
85
|
+
) as Record<LanguageCode2, LanguageCode3>
|
|
69
86
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
87
|
+
/**
|
|
88
|
+
* This can be:
|
|
89
|
+
* - an ISO 639-2 language code in 3 characters (e.g. 'eng', 'fre', 'ger')
|
|
90
|
+
* - an ISO 639-1 language code in 2 characters (e.g. 'en', 'fr', 'de')
|
|
91
|
+
* - a 2-character language code with locale (e.g. 'fr_FR', 'fr_CA')
|
|
92
|
+
*/
|
|
93
|
+
export type LanguageCodeLike = LanguageCode2 | LanguageCode3 | string
|
|
73
94
|
|
|
74
|
-
|
|
75
|
-
|
|
95
|
+
/**
|
|
96
|
+
* Converts a language code in any format to the ISO 639-2 format (3 characters)
|
|
97
|
+
* Returns the given string if the corresponding language code could not be recognized
|
|
98
|
+
*/
|
|
99
|
+
export function toLang3(lang: LanguageCodeLike): LanguageCode3 | string {
|
|
100
|
+
if (!lang) {
|
|
101
|
+
// also handle falsy values just in case
|
|
102
|
+
return lang
|
|
103
|
+
}
|
|
104
|
+
if (lang.length === 3) {
|
|
105
|
+
return LANG_2_TO_3_MAPPER[LANG_3_TO_2_MAPPER[lang.toLowerCase()]] ?? lang
|
|
106
|
+
}
|
|
107
|
+
const lang2 = lang.toLowerCase().substring(0, 2)
|
|
108
|
+
return LANG_2_TO_3_MAPPER[lang2] ?? lang
|
|
76
109
|
}
|
|
77
110
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
111
|
+
/**
|
|
112
|
+
* Converts a language code in any format to the ISO 639-1 format (2 characters)
|
|
113
|
+
* Returns the given string if the corresponding language code could not be recognized
|
|
114
|
+
*/
|
|
115
|
+
export function toLang2(lang: LanguageCodeLike): LanguageCode2 | string {
|
|
116
|
+
if (!lang) {
|
|
117
|
+
// also handle falsy values just in case
|
|
118
|
+
return lang
|
|
119
|
+
}
|
|
120
|
+
if (lang.length === 3) {
|
|
121
|
+
return LANG_3_TO_2_MAPPER[lang.toLowerCase()] ?? lang
|
|
122
|
+
}
|
|
123
|
+
const lang2 = lang.toLowerCase().substring(0, 2)
|
|
124
|
+
if (lang2 in LANG_2_TO_3_MAPPER) {
|
|
125
|
+
return lang2
|
|
126
|
+
}
|
|
127
|
+
if (lang.match(/[a-z]{2}_[A-Z]{2}/)) {
|
|
128
|
+
// remove locale code even if the language code is not known
|
|
129
|
+
return lang2
|
|
130
|
+
}
|
|
131
|
+
return lang
|
|
81
132
|
}
|
|
82
133
|
|
|
83
134
|
marker('language.en')
|
|
@@ -11,15 +11,18 @@ const ValidatorMapper: TValidatorMapper = {
|
|
|
11
11
|
title: (record) => !!record?.title,
|
|
12
12
|
abstract: (record) => !!record?.abstract,
|
|
13
13
|
keywords: (record) => (record?.keywords?.length ?? 0) > 0,
|
|
14
|
-
legalConstraints: (record) =>
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
legalConstraints: (record) =>
|
|
15
|
+
!!(
|
|
16
|
+
record?.legalConstraints?.length &&
|
|
17
|
+
record.legalConstraints.some((c) => c?.text?.trim().length > 0)
|
|
18
|
+
),
|
|
19
|
+
contacts: (record) =>
|
|
20
|
+
!!record?.contacts?.[0]?.email &&
|
|
21
|
+
record.contacts[0].email !== 'missing@missing.com',
|
|
22
|
+
updateFrequency: (record) =>
|
|
23
|
+
!!record?.updateFrequency && record.updateFrequency !== 'unknown',
|
|
17
24
|
topics: (record) => (record?.topics?.length ?? 0) > 0,
|
|
18
25
|
organisation: (record) => !!record?.contacts?.[0]?.organization?.name,
|
|
19
|
-
capabilities: (record) =>
|
|
20
|
-
record?.onlineResources?.some((resource) =>
|
|
21
|
-
resource?.url?.href.toLowerCase().includes('capabilities')
|
|
22
|
-
),
|
|
23
26
|
source: (record) => !!record?.extras?.sourcesIdentifiers,
|
|
24
27
|
} as const
|
|
25
28
|
|
|
@@ -40,12 +43,12 @@ function getMappersFromKind(kind: RecordKind) {
|
|
|
40
43
|
]
|
|
41
44
|
|
|
42
45
|
switch (kind) {
|
|
43
|
-
case 'service':
|
|
44
|
-
kindKeys = ['capabilities']
|
|
45
|
-
break
|
|
46
46
|
case 'reuse':
|
|
47
47
|
kindKeys = ['topics', 'organisation', 'source']
|
|
48
48
|
break
|
|
49
|
+
case 'service':
|
|
50
|
+
kindKeys = []
|
|
51
|
+
break
|
|
49
52
|
case 'dataset':
|
|
50
53
|
default:
|
|
51
54
|
kindKeys = ['updateFrequency', 'topics', 'organisation']
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { Feature, FeatureCollection, Geometry } from 'geojson'
|
|
1
|
+
import type { Feature, FeatureCollection, Geometry, Position } from 'geojson'
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* @returns The geometry if available, otherwise null.
|
|
5
|
+
*/
|
|
3
6
|
export function getGeometryFromGeoJSON(
|
|
4
7
|
data: FeatureCollection | Feature | Geometry
|
|
5
|
-
): Geometry {
|
|
8
|
+
): Geometry | null {
|
|
6
9
|
if (data.type === 'FeatureCollection') {
|
|
7
10
|
return data?.features?.[0]?.geometry || null
|
|
8
11
|
}
|
|
@@ -24,3 +27,70 @@ export function getGeometryFromGeoJSON(
|
|
|
24
27
|
}
|
|
25
28
|
return null
|
|
26
29
|
}
|
|
30
|
+
|
|
31
|
+
// FIXME: this type should be more generic across the project
|
|
32
|
+
export type BoundingBox = [number, number, number, number]
|
|
33
|
+
|
|
34
|
+
export function getGeometryBoundingBox(geometry: Geometry): BoundingBox {
|
|
35
|
+
// use the bounding box if specified in the GeoJSON object
|
|
36
|
+
if (geometry.bbox) {
|
|
37
|
+
return geometry.bbox.length > 4
|
|
38
|
+
? [geometry.bbox[0], geometry.bbox[1], geometry.bbox[3], geometry.bbox[4]]
|
|
39
|
+
: (geometry.bbox as BoundingBox)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const coordinatesReducer = (prev: BoundingBox, coords: Position) =>
|
|
43
|
+
[
|
|
44
|
+
Math.min(prev[0], coords[0]),
|
|
45
|
+
Math.min(prev[1], coords[1]),
|
|
46
|
+
Math.max(prev[2], coords[0]),
|
|
47
|
+
Math.max(prev[3], coords[1]),
|
|
48
|
+
] as BoundingBox
|
|
49
|
+
const coordinatesArrayReducer = (
|
|
50
|
+
prev: BoundingBox,
|
|
51
|
+
coordsArray: Position[]
|
|
52
|
+
) => {
|
|
53
|
+
const bbox = coordsArray.reduce(coordinatesReducer, emptyExtent)
|
|
54
|
+
return [
|
|
55
|
+
Math.min(prev[0], bbox[0]),
|
|
56
|
+
Math.min(prev[1], bbox[1]),
|
|
57
|
+
Math.max(prev[2], bbox[2]),
|
|
58
|
+
Math.max(prev[3], bbox[3]),
|
|
59
|
+
] as BoundingBox
|
|
60
|
+
}
|
|
61
|
+
const emptyExtent = [Infinity, Infinity, -Infinity, -Infinity] as BoundingBox
|
|
62
|
+
|
|
63
|
+
switch (geometry.type) {
|
|
64
|
+
case 'MultiPolygon':
|
|
65
|
+
return geometry.coordinates.reduce((prev, polygonCoords) => {
|
|
66
|
+
const bbox = polygonCoords.reduce(coordinatesArrayReducer, emptyExtent)
|
|
67
|
+
return [
|
|
68
|
+
Math.min(prev[0], bbox[0]),
|
|
69
|
+
Math.min(prev[1], bbox[1]),
|
|
70
|
+
Math.max(prev[2], bbox[2]),
|
|
71
|
+
Math.max(prev[3], bbox[3]),
|
|
72
|
+
] as BoundingBox
|
|
73
|
+
}, emptyExtent)
|
|
74
|
+
case 'GeometryCollection':
|
|
75
|
+
return geometry.geometries.reduce((prev, geom) => {
|
|
76
|
+
const bbox = getGeometryBoundingBox(geom)
|
|
77
|
+
return [
|
|
78
|
+
Math.min(prev[0], bbox[0]),
|
|
79
|
+
Math.min(prev[1], bbox[1]),
|
|
80
|
+
Math.max(prev[2], bbox[2]),
|
|
81
|
+
Math.max(prev[3], bbox[3]),
|
|
82
|
+
] as BoundingBox
|
|
83
|
+
}, emptyExtent)
|
|
84
|
+
case 'Polygon':
|
|
85
|
+
case 'MultiLineString':
|
|
86
|
+
return geometry.coordinates.reduce(coordinatesArrayReducer, emptyExtent)
|
|
87
|
+
case 'LineString':
|
|
88
|
+
case 'MultiPoint':
|
|
89
|
+
return geometry.coordinates.reduce<BoundingBox>(
|
|
90
|
+
coordinatesReducer,
|
|
91
|
+
emptyExtent
|
|
92
|
+
)
|
|
93
|
+
case 'Point':
|
|
94
|
+
return coordinatesReducer(emptyExtent, geometry.coordinates)
|
|
95
|
+
}
|
|
96
|
+
}
|
package/translations/de.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"Add Layer As": "",
|
|
4
4
|
"Enter to search": "",
|
|
5
5
|
"button.login": "",
|
|
6
|
-
"catalog.figures.datasets": "{count, plural, =0{
|
|
6
|
+
"catalog.figures.datasets": "{count, plural, =0{Ressource} one{Ressource} other{Ressourcen}}",
|
|
7
7
|
"catalog.figures.organizations": "{count, plural, =0{Organisationen} one{Organisation} other{Organisationen}}",
|
|
8
8
|
"chart.aggregation.average": "Durchschnitt",
|
|
9
9
|
"chart.aggregation.count": "Anzahl",
|
|
@@ -184,6 +184,26 @@
|
|
|
184
184
|
"editor.record.form.field.topics": "Kategorien",
|
|
185
185
|
"editor.record.form.field.uniqueIdentifier": "Eindeutige Kennung (ID)",
|
|
186
186
|
"editor.record.form.field.updateFrequency": "Aktualisierungshäufigkeit",
|
|
187
|
+
"editor.record.form.inspire.biota": "",
|
|
188
|
+
"editor.record.form.inspire.boundaries": "",
|
|
189
|
+
"editor.record.form.inspire.climatology": "",
|
|
190
|
+
"editor.record.form.inspire.economy": "",
|
|
191
|
+
"editor.record.form.inspire.elevation": "",
|
|
192
|
+
"editor.record.form.inspire.environnement": "",
|
|
193
|
+
"editor.record.form.inspire.farming": "",
|
|
194
|
+
"editor.record.form.inspire.geoscientific": "",
|
|
195
|
+
"editor.record.form.inspire.health": "",
|
|
196
|
+
"editor.record.form.inspire.imagery": "",
|
|
197
|
+
"editor.record.form.inspire.intelligence": "",
|
|
198
|
+
"editor.record.form.inspire.location": "",
|
|
199
|
+
"editor.record.form.inspire.oceans": "",
|
|
200
|
+
"editor.record.form.inspire.placeholder": "",
|
|
201
|
+
"editor.record.form.inspire.planning": "",
|
|
202
|
+
"editor.record.form.inspire.society": "",
|
|
203
|
+
"editor.record.form.inspire.structure": "",
|
|
204
|
+
"editor.record.form.inspire.transportation": "",
|
|
205
|
+
"editor.record.form.inspire.utilities": "",
|
|
206
|
+
"editor.record.form.inspire.waters": "",
|
|
187
207
|
"editor.record.form.keywords.place.placeholder": "",
|
|
188
208
|
"editor.record.form.keywords.place.withoutExtent": "",
|
|
189
209
|
"editor.record.form.keywords.placeholder": "",
|
|
@@ -219,6 +239,8 @@
|
|
|
219
239
|
"editor.record.form.section.dataManagers.description": "",
|
|
220
240
|
"editor.record.form.section.dataManagers.label": "",
|
|
221
241
|
"editor.record.form.section.geographicalCoverage.label": "",
|
|
242
|
+
"editor.record.form.section.inspire.description": "",
|
|
243
|
+
"editor.record.form.section.inspire.label": "",
|
|
222
244
|
"editor.record.form.section.metadataPointOfContact.description": "",
|
|
223
245
|
"editor.record.form.section.metadataPointOfContact.label": "",
|
|
224
246
|
"editor.record.form.section.useAndAccessConditions.label": "",
|
|
@@ -367,10 +389,10 @@
|
|
|
367
389
|
"organisations.sortBy.nameDesc": "Name Z → A",
|
|
368
390
|
"organisations.sortBy.recordCountAsc": "Veröffentlichungen 0 → 9",
|
|
369
391
|
"organisations.sortBy.recordCountDesc": "Veröffentlichungen 9 → 0",
|
|
370
|
-
"organization.details.lastPublishedDatasets": "",
|
|
392
|
+
"organization.details.lastPublishedDatasets": "Zuletzt veröffentlichte Ressourcen",
|
|
371
393
|
"organization.details.lastPublishedDatasets.searchAllButton": "",
|
|
372
394
|
"organization.details.mailContact": "",
|
|
373
|
-
"organization.header.recordCount": "{count, plural, =0{} one{} other{}}",
|
|
395
|
+
"organization.header.recordCount": "{count, plural, =0{Veröffentlichung} one{Veröffentlichung} other{Veröffentlichungen}}",
|
|
374
396
|
"pagination.nextPage": "Nächste Seite",
|
|
375
397
|
"pagination.page": "Seite",
|
|
376
398
|
"pagination.pageOf": "von",
|
|
@@ -390,6 +412,16 @@
|
|
|
390
412
|
"record.kind.service": "",
|
|
391
413
|
"record.metadata.about": "Beschreibung",
|
|
392
414
|
"record.metadata.api": "API",
|
|
415
|
+
"record.metadata.api.accessServiceProtocol.GPFDL": "",
|
|
416
|
+
"record.metadata.api.accessServiceProtocol.esriRest": "",
|
|
417
|
+
"record.metadata.api.accessServiceProtocol.maplibre-style": "",
|
|
418
|
+
"record.metadata.api.accessServiceProtocol.ogcFeatures": "",
|
|
419
|
+
"record.metadata.api.accessServiceProtocol.other": "",
|
|
420
|
+
"record.metadata.api.accessServiceProtocol.tms": "",
|
|
421
|
+
"record.metadata.api.accessServiceProtocol.wfs": "",
|
|
422
|
+
"record.metadata.api.accessServiceProtocol.wms": "",
|
|
423
|
+
"record.metadata.api.accessServiceProtocol.wmts": "",
|
|
424
|
+
"record.metadata.api.accessServiceProtocol.wps": "",
|
|
393
425
|
"record.metadata.api.form.closeButton": "Schließen",
|
|
394
426
|
"record.metadata.api.form.closeForm": "Formular schließen",
|
|
395
427
|
"record.metadata.api.form.create": "Ihre Anfrage erstellen",
|
|
@@ -451,12 +483,12 @@
|
|
|
451
483
|
"record.metadata.publication": "Veröffentlichungsdatum",
|
|
452
484
|
"record.metadata.publications": "{count, plural, =0{Veröffentlichungsdatum} one{Veröffentlichungsdatum} other{Veröffentlichungen}}",
|
|
453
485
|
"record.metadata.quality": "Metadatenqualität",
|
|
486
|
+
"record.metadata.quality.abstract.failed": "Beschreibung nicht angegeben",
|
|
487
|
+
"record.metadata.quality.abstract.success": "Beschreibung angegeben",
|
|
454
488
|
"record.metadata.quality.capabilities.failed": "",
|
|
455
|
-
"record.metadata.quality.capabilities.success": "",
|
|
456
|
-
"record.metadata.quality.
|
|
457
|
-
"record.metadata.quality.
|
|
458
|
-
"record.metadata.quality.description.failed": "Beschreibung nicht angegeben",
|
|
459
|
-
"record.metadata.quality.description.success": "Beschreibung angegeben",
|
|
489
|
+
"record.metadata.quality.capabilities.success": "Kontakt angegeben",
|
|
490
|
+
"record.metadata.quality.contacts.failed": "Kontakt nicht angegeben",
|
|
491
|
+
"record.metadata.quality.contacts.success": "",
|
|
460
492
|
"record.metadata.quality.details": "Details",
|
|
461
493
|
"record.metadata.quality.keywords.failed": "Schlagwörter nicht angegeben",
|
|
462
494
|
"record.metadata.quality.keywords.success": "Schlagwörter angegeben",
|
|
@@ -468,8 +500,8 @@
|
|
|
468
500
|
"record.metadata.quality.source.success": "",
|
|
469
501
|
"record.metadata.quality.title.failed": "Titel nicht angegeben",
|
|
470
502
|
"record.metadata.quality.title.success": "Titel angegeben",
|
|
471
|
-
"record.metadata.quality.
|
|
472
|
-
"record.metadata.quality.
|
|
503
|
+
"record.metadata.quality.topics.failed": "Thema nicht angegeben",
|
|
504
|
+
"record.metadata.quality.topics.success": "Thema angegeben",
|
|
473
505
|
"record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
|
|
474
506
|
"record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
|
|
475
507
|
"record.metadata.related": "Entdecken Sie den Katalog",
|
|
@@ -500,18 +532,18 @@
|
|
|
500
532
|
"record.tab.chart": "Diagramm",
|
|
501
533
|
"record.tab.data": "Tabelle",
|
|
502
534
|
"record.tab.map": "Karte",
|
|
503
|
-
"record.was.created.time": "erstellte diesen
|
|
535
|
+
"record.was.created.time": "erstellte diesen Ressource {time}",
|
|
504
536
|
"records": "Datensätze",
|
|
505
537
|
"results.layout.selectOne": "Layout auswählen",
|
|
506
|
-
"results.records.hits.displayedOn": "{displayed, plural, =0{Kein
|
|
538
|
+
"results.records.hits.displayedOn": "{displayed, plural, =0{Kein Ressource.} one{1 } other{{displayed} }} {hits, plural, other{von insgesamt {hits} angezeigt.}}",
|
|
507
539
|
"results.records.hits.empty.help.html": "Vorschläge: <ul class='list-disc list-inside'><li>Versuchen Sie es mit anderen Worten</li><li>Beschränken Sie die Suchwörter</li></ul>",
|
|
508
|
-
"results.records.hits.found": "{hits, plural, =0{Keine
|
|
540
|
+
"results.records.hits.found": "{hits, plural, =0{Keine Ressource entsprechen der angegebenen Suche.} one{1 Ressource gefunden.} other{{hits} Ressourcen gefunden.}}",
|
|
509
541
|
"results.records.hits.selected": "{ amount } ausgewählt",
|
|
510
542
|
"results.showMore": "Mehr Ergebnisse anzeigen...",
|
|
511
543
|
"results.sortBy.changeDate": "",
|
|
512
544
|
"results.sortBy.dateStamp": "Neueste",
|
|
513
545
|
"results.sortBy.popularity": "Beliebtheit",
|
|
514
|
-
"results.sortBy.qualityScore": "
|
|
546
|
+
"results.sortBy.qualityScore": "Fertigstellungsanzeige",
|
|
515
547
|
"results.sortBy.relevancy": "Relevanz",
|
|
516
548
|
"reuse.metadata.access": "",
|
|
517
549
|
"search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
|
|
@@ -520,7 +552,7 @@
|
|
|
520
552
|
"search.error.organizationNotFound": "",
|
|
521
553
|
"search.error.receivedError": "Ein Fehler ist aufgetreten",
|
|
522
554
|
"search.error.recordHasnolink": "",
|
|
523
|
-
"search.error.recordNotFound": "
|
|
555
|
+
"search.error.recordNotFound": "Die Ressource mit der Kennung \"{ id }\" konnte nicht gefunden werden.",
|
|
524
556
|
"search.field.any.placeholder": "Suche im katalog ...",
|
|
525
557
|
"search.field.sortBy": "Sortieren nach:",
|
|
526
558
|
"search.filter.into.feature.catalog": "",
|
|
@@ -547,10 +579,10 @@
|
|
|
547
579
|
"search.filters.license.unknown": "Unbekannt oder nicht vorhanden",
|
|
548
580
|
"search.filters.maximize": "Erweitern",
|
|
549
581
|
"search.filters.minimize": "Minimieren",
|
|
550
|
-
"search.filters.myRecords": "Nur meine
|
|
551
|
-
"search.filters.myRecordsHelp": "Wenn dies aktiviert ist, werden nur von mir erstellte
|
|
582
|
+
"search.filters.myRecords": "Nur meine Ressourcen anzeigen",
|
|
583
|
+
"search.filters.myRecordsHelp": "Wenn dies aktiviert ist, werden nur von mir erstellte Ressourcen angezeigt; Ressourcen, die von anderen erstellt wurden, werden nicht angezeigt.",
|
|
552
584
|
"search.filters.organization": "",
|
|
553
|
-
"search.filters.otherRecords": "
|
|
585
|
+
"search.filters.otherRecords": "Ressourcen von einer anderen Person anzeigen",
|
|
554
586
|
"search.filters.producerOrg": "",
|
|
555
587
|
"search.filters.publicationYear": "Veröffentlichungsjahr",
|
|
556
588
|
"search.filters.publisherOrg": "",
|
|
@@ -565,8 +597,8 @@
|
|
|
565
597
|
"search.filters.summaryLabel.user": "Geändert von: ",
|
|
566
598
|
"search.filters.title": "Ergebnisse filtern",
|
|
567
599
|
"search.filters.topic": "Themen",
|
|
568
|
-
"search.filters.useSpatialFilter": "Zuerst
|
|
569
|
-
"search.filters.useSpatialFilterHelp": "Wenn diese Option aktiviert ist, werden
|
|
600
|
+
"search.filters.useSpatialFilter": "Zuerst Ressourcen im Interessenbereich anzeigen",
|
|
601
|
+
"search.filters.useSpatialFilterHelp": "Wenn diese Option aktiviert ist, werden Ressourcen im Bereich des Katalogs zuerst angezeigt. Ressourcen außerhalb dieses Bereichs werden nicht angezeigt.",
|
|
570
602
|
"search.filters.user": "Editor",
|
|
571
603
|
"service.metadata.capabilities": "",
|
|
572
604
|
"service.metadata.capabilities.abstract": "",
|