diff --git a/config/config.example.yml b/config/config.example.yml index b0112ef13a..abf74eb19c 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -174,6 +174,8 @@ browseBy: fiveYearLimit: 30 # The absolute lowest year to display in the dropdown (only used when no lowest date can be found for all items) defaultLowerLimit: 1900 + # If true, thumbnail images for items will be added to BOTH search and browse result lists. + showThumbnails: true # The number of entries in a paginated browse results list. # Rounded to the nearest size in the list of selectable sizes on the # settings menu. @@ -268,7 +270,7 @@ themes: # The default bundles that should always be displayed as suggestions when you upload a new bundle bundle: - - standardBundles: [ ORIGINAL, THUMBNAIL, LICENSE ] + standardBundles: [ ORIGINAL, THUMBNAIL, LICENSE ] # Whether to enable media viewer for image and/or video Bitstreams (i.e. Bitstreams whose MIME type starts with 'image' or 'video'). # For images, this enables a gallery viewer where you can zoom or page through images. diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/collection-search-result/collection-admin-search-result-grid-element.component.spec.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/collection-search-result/collection-admin-search-result-grid-element.component.spec.ts index 2cb0413bbc..1ea27b36b6 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/collection-search-result/collection-admin-search-result-grid-element.component.spec.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/collection-search-result/collection-admin-search-result-grid-element.component.spec.ts @@ -14,6 +14,14 @@ import { By } from '@angular/platform-browser'; import { RouterTestingModule } from '@angular/router/testing'; import { getCollectionEditRoute } from '../../../../../collection-page/collection-page-routing-paths'; import { LinkService } from '../../../../../core/cache/builders/link.service'; +import { AuthService } from '../../../../../core/auth/auth.service'; +import { AuthServiceStub } from '../../../../../shared/testing/auth-service.stub'; +import { FileService } from '../../../../../core/shared/file.service'; +import { FileServiceStub } from '../../../../../shared/testing/file-service.stub'; +import { AuthorizationDataService } from '../../../../../core/data/feature-authorization/authorization-data.service'; +import { AuthorizationDataServiceStub } from '../../../../../shared/testing/authorization-service.stub'; +import { ThemeService } from '../../../../../shared/theme-support/theme.service'; +import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock'; describe('CollectionAdminSearchResultGridElementComponent', () => { let component: CollectionAdminSearchResultGridElementComponent; @@ -45,7 +53,11 @@ describe('CollectionAdminSearchResultGridElementComponent', () => { providers: [ { provide: TruncatableService, useValue: mockTruncatableService }, { provide: BitstreamDataService, useValue: {} }, - { provide: LinkService, useValue: linkService } + { provide: LinkService, useValue: linkService }, + { provide: AuthService, useClass: AuthServiceStub }, + { provide: FileService, useClass: FileServiceStub }, + { provide: AuthorizationDataService, useClass: AuthorizationDataServiceStub }, + { provide: ThemeService, useValue: getMockThemeService() }, ] }) .compileComponents(); diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/community-search-result/community-admin-search-result-grid-element.component.spec.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/community-search-result/community-admin-search-result-grid-element.component.spec.ts index 17ce2cd7a1..996366e20a 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/community-search-result/community-admin-search-result-grid-element.component.spec.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/community-search-result/community-admin-search-result-grid-element.component.spec.ts @@ -16,6 +16,14 @@ import { CommunitySearchResult } from '../../../../../shared/object-collection/s import { Community } from '../../../../../core/shared/community.model'; import { getCommunityEditRoute } from '../../../../../community-page/community-page-routing-paths'; import { LinkService } from '../../../../../core/cache/builders/link.service'; +import { AuthService } from '../../../../../core/auth/auth.service'; +import { AuthServiceStub } from '../../../../../shared/testing/auth-service.stub'; +import { FileService } from '../../../../../core/shared/file.service'; +import { FileServiceStub } from '../../../../../shared/testing/file-service.stub'; +import { AuthorizationDataService } from '../../../../../core/data/feature-authorization/authorization-data.service'; +import { AuthorizationDataServiceStub } from '../../../../../shared/testing/authorization-service.stub'; +import { ThemeService } from '../../../../../shared/theme-support/theme.service'; +import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock'; describe('CommunityAdminSearchResultGridElementComponent', () => { let component: CommunityAdminSearchResultGridElementComponent; @@ -47,7 +55,11 @@ describe('CommunityAdminSearchResultGridElementComponent', () => { providers: [ { provide: TruncatableService, useValue: mockTruncatableService }, { provide: BitstreamDataService, useValue: {} }, - { provide: LinkService, useValue: linkService } + { provide: LinkService, useValue: linkService }, + { provide: AuthService, useClass: AuthServiceStub }, + { provide: FileService, useClass: FileServiceStub }, + { provide: AuthorizationDataService, useClass: AuthorizationDataServiceStub }, + { provide: ThemeService, useValue: getMockThemeService() }, ], schemas: [NO_ERRORS_SCHEMA] }) diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts index a6ea7e4946..e478aa3ef3 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts @@ -20,6 +20,12 @@ import { getMockThemeService } from '../../../../../shared/mocks/theme-service.m import { ThemeService } from '../../../../../shared/theme-support/theme.service'; import { AccessStatusDataService } from '../../../../../core/data/access-status-data.service'; import { AccessStatusObject } from '../../../../../shared/object-list/access-status-badge/access-status.model'; +import { AuthService } from '../../../../../core/auth/auth.service'; +import { AuthServiceStub } from '../../../../../shared/testing/auth-service.stub'; +import { FileService } from '../../../../../core/shared/file.service'; +import { FileServiceStub } from '../../../../../shared/testing/file-service.stub'; +import { AuthorizationDataService } from '../../../../../core/data/feature-authorization/authorization-data.service'; +import { AuthorizationDataServiceStub } from '../../../../../shared/testing/authorization-service.stub'; describe('ItemAdminSearchResultGridElementComponent', () => { let component: ItemAdminSearchResultGridElementComponent; @@ -64,6 +70,9 @@ describe('ItemAdminSearchResultGridElementComponent', () => { { provide: BitstreamDataService, useValue: mockBitstreamDataService }, { provide: ThemeService, useValue: mockThemeService }, { provide: AccessStatusDataService, useValue: mockAccessStatusDataService }, + { provide: AuthService, useClass: AuthServiceStub }, + { provide: FileService, useClass: FileServiceStub }, + { provide: AuthorizationDataService, useClass: AuthorizationDataServiceStub }, ], schemas: [NO_ERRORS_SCHEMA] }) diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.spec.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.spec.ts index b394caef56..8937847ff5 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.spec.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.spec.ts @@ -13,6 +13,8 @@ import { RouterTestingModule } from '@angular/router/testing'; import { getCollectionEditRoute } from '../../../../../collection-page/collection-page-routing-paths'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; +import { environment } from '../../../../../../environments/environment'; describe('CollectionAdminSearchResultListElementComponent', () => { let component: CollectionAdminSearchResultListElementComponent; @@ -36,7 +38,8 @@ describe('CollectionAdminSearchResultListElementComponent', () => { ], declarations: [CollectionAdminSearchResultListElementComponent], providers: [{ provide: TruncatableService, useValue: {} }, - { provide: DSONameService, useClass: DSONameServiceMock }], + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environment }], schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/community-search-result/community-admin-search-result-list-element.component.spec.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/community-search-result/community-admin-search-result-list-element.component.spec.ts index 155d7f7509..110d77b1e5 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/community-search-result/community-admin-search-result-list-element.component.spec.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/community-search-result/community-admin-search-result-list-element.component.spec.ts @@ -13,6 +13,8 @@ import { Community } from '../../../../../core/shared/community.model'; import { getCommunityEditRoute } from '../../../../../community-page/community-page-routing-paths'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; +import { environment } from '../../../../../../environments/environment'; describe('CommunityAdminSearchResultListElementComponent', () => { let component: CommunityAdminSearchResultListElementComponent; @@ -36,7 +38,8 @@ describe('CommunityAdminSearchResultListElementComponent', () => { ], declarations: [CommunityAdminSearchResultListElementComponent], providers: [{ provide: TruncatableService, useValue: {} }, - { provide: DSONameService, useClass: DSONameServiceMock }], + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environment }], schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component.spec.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component.spec.ts index 3774a07757..667e8edea9 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component.spec.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component.spec.ts @@ -10,6 +10,8 @@ import { ItemAdminSearchResultListElementComponent } from './item-admin-search-r import { Item } from '../../../../../core/shared/item.model'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; +import { environment } from '../../../../../../environments/environment'; describe('ItemAdminSearchResultListElementComponent', () => { let component: ItemAdminSearchResultListElementComponent; @@ -33,7 +35,8 @@ describe('ItemAdminSearchResultListElementComponent', () => { ], declarations: [ItemAdminSearchResultListElementComponent], providers: [{ provide: TruncatableService, useValue: {} }, - { provide: DSONameService, useClass: DSONameServiceMock }], + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environment }], schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.spec.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.spec.ts index a792a606e9..a489cb0e57 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.spec.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.spec.ts @@ -18,6 +18,8 @@ import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote- import { getMockLinkService } from '../../../../../shared/mocks/link-service.mock'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; +import { environment } from '../../../../../../environments/environment'; describe('WorkflowItemAdminWorkflowListElementComponent', () => { let component: WorkflowItemSearchResultAdminWorkflowListElementComponent; @@ -51,7 +53,8 @@ describe('WorkflowItemAdminWorkflowListElementComponent', () => { providers: [ { provide: TruncatableService, useValue: mockTruncatableService }, { provide: LinkService, useValue: linkService }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environment } ], schemas: [NO_ERRORS_SCHEMA] }) diff --git a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts index 3dd17faf25..3bc75de415 100644 --- a/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts +++ b/src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Inject, OnInit } from '@angular/core'; import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; import { Context } from '../../../../../core/shared/context.model'; @@ -13,6 +13,7 @@ import { SearchResultListElementComponent } from '../../../../../shared/object-l import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface'; @listableObjectComponent(WorkflowItemSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch) @Component({ @@ -32,9 +33,10 @@ export class WorkflowItemSearchResultAdminWorkflowListElementComponent extends S constructor(private linkService: LinkService, protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig ) { - super(truncatableService, dsoNameService); + super(truncatableService, dsoNameService, appConfig); } /** diff --git a/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.spec.ts b/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.spec.ts index b6ff177d3d..5c2a6d820e 100644 --- a/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.spec.ts +++ b/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.spec.ts @@ -18,13 +18,10 @@ import { BrowseEntrySearchOptions } from '../../core/browse/browse-entry-search- import { toRemoteData } from '../browse-by-metadata-page/browse-by-metadata-page.component.spec'; import { VarDirective } from '../../shared/utils/var.directive'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { PaginationService } from '../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; -import { FindListOptions } from '../../core/data/find-list-options.model'; -import { APP_CONFIG } from 'src/config/app-config.interface'; -import { environment } from 'src/environments/environment'; +import { APP_CONFIG } from '../../../config/app-config.interface'; +import { environment } from '../../../environments/environment'; describe('BrowseByDatePageComponent', () => { let comp: BrowseByDatePageComponent; diff --git a/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.ts b/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.ts index 9b031260ce..c9ee669e51 100644 --- a/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.ts +++ b/src/app/browse-by/browse-by-date-page/browse-by-date-page.component.ts @@ -1,9 +1,8 @@ import { ChangeDetectorRef, Component, Inject } from '@angular/core'; import { BrowseByMetadataPageComponent, - browseParamsToOptions + browseParamsToOptions, getBrowseSearchOptions } from '../browse-by-metadata-page/browse-by-metadata-page.component'; -import { BrowseEntrySearchOptions } from '../../core/browse/browse-entry-search-options.model'; import { combineLatest as observableCombineLatest } from 'rxjs'; import { RemoteData } from '../../core/data/remote-data'; import { Item } from '../../core/shared/item.model'; @@ -13,7 +12,6 @@ import { BrowseService } from '../../core/browse/browse.service'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; import { StartsWithType } from '../../shared/starts-with/starts-with-decorator'; import { BrowseByDataType, rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; -import { environment } from '../../../environments/environment'; import { PaginationService } from '../../core/pagination/pagination.service'; import { map } from 'rxjs/operators'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; @@ -45,14 +43,15 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent { protected router: Router, protected paginationService: PaginationService, protected cdRef: ChangeDetectorRef, - @Inject(APP_CONFIG) protected appConfig: AppConfig) { + @Inject(APP_CONFIG) public appConfig: AppConfig) { super(route, browseService, dsoService, paginationService, router, appConfig); } ngOnInit(): void { const sortConfig = new SortOptions('default', SortDirection.ASC); this.startsWithType = StartsWithType.date; - this.updatePage(new BrowseEntrySearchOptions(this.defaultBrowseId, this.paginationConfig, sortConfig)); + // include the thumbnail configuration in browse search options + this.updatePage(getBrowseSearchOptions(this.defaultBrowseId, this.paginationConfig, sortConfig, this.fetchThumbnails)); this.currentPagination$ = this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig); this.currentSort$ = this.paginationService.getCurrentSort(this.paginationConfig.id, sortConfig); this.subs.push( @@ -65,7 +64,7 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent { const metadataKeys = params.browseDefinition ? params.browseDefinition.metadataKeys : this.defaultMetadataKeys; this.browseId = params.id || this.defaultBrowseId; this.startsWith = +params.startsWith || params.startsWith; - const searchOptions = browseParamsToOptions(params, currentPage, currentSort, this.browseId); + const searchOptions = browseParamsToOptions(params, currentPage, currentSort, this.browseId, this.fetchThumbnails); this.updatePageWithItems(searchOptions, this.value, undefined); this.updateParent(params.scope); this.updateStartsWithOptions(this.browseId, metadataKeys, params.scope); @@ -85,7 +84,7 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent { updateStartsWithOptions(definition: string, metadataKeys: string[], scope?: string) { this.subs.push( this.browseService.getFirstItemFor(definition, scope).subscribe((firstItemRD: RemoteData) => { - let lowerLimit = environment.browseBy.defaultLowerLimit; + let lowerLimit = this.appConfig.browseBy.defaultLowerLimit; if (hasValue(firstItemRD.payload)) { const date = firstItemRD.payload.firstMetadataValue(metadataKeys); if (isNotEmpty(date) && isValidDate(date)) { @@ -96,8 +95,8 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent { } const options = []; const currentYear = new Date().getUTCFullYear(); - const oneYearBreak = Math.floor((currentYear - environment.browseBy.oneYearLimit) / 5) * 5; - const fiveYearBreak = Math.floor((currentYear - environment.browseBy.fiveYearLimit) / 10) * 10; + const oneYearBreak = Math.floor((currentYear - this.appConfig.browseBy.oneYearLimit) / 5) * 5; + const fiveYearBreak = Math.floor((currentYear - this.appConfig.browseBy.fiveYearLimit) / 10) * 10; if (lowerLimit <= fiveYearBreak) { lowerLimit -= 10; } else if (lowerLimit <= oneYearBreak) { diff --git a/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.spec.ts b/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.spec.ts index 03152d0d3e..2984642b73 100644 --- a/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.spec.ts +++ b/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.spec.ts @@ -1,4 +1,8 @@ -import { BrowseByMetadataPageComponent, browseParamsToOptions } from './browse-by-metadata-page.component'; +import { + BrowseByMetadataPageComponent, + browseParamsToOptions, + getBrowseSearchOptions +} from './browse-by-metadata-page.component'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { BrowseService } from '../../core/browse/browse.service'; import { CommonModule } from '@angular/common'; @@ -14,7 +18,7 @@ import { RemoteData } from '../../core/data/remote-data'; import { buildPaginatedList, PaginatedList } from '../../core/data/paginated-list.model'; import { PageInfo } from '../../core/shared/page-info.model'; import { BrowseEntrySearchOptions } from '../../core/browse/browse-entry-search-options.model'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { SortDirection } from '../../core/cache/models/sort-options.model'; import { Item } from '../../core/shared/item.model'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; import { Community } from '../../core/shared/community.model'; @@ -26,7 +30,6 @@ import { PaginationService } from '../../core/pagination/pagination.service'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; import { APP_CONFIG } from '../../../config/app-config.interface'; -import { environment } from '../../../environments/environment'; describe('BrowseByMetadataPageComponent', () => { let comp: BrowseByMetadataPageComponent; @@ -45,6 +48,13 @@ describe('BrowseByMetadataPageComponent', () => { ] }); + const environmentMock = { + browseBy: { + showThumbnails: true, + pageSize: 10 + } + }; + const mockEntries = [ { type: BrowseEntry.type, @@ -100,7 +110,7 @@ describe('BrowseByMetadataPageComponent', () => { { provide: DSpaceObjectDataService, useValue: mockDsoService }, { provide: PaginationService, useValue: paginationService }, { provide: Router, useValue: new RouterMock() }, - { provide: APP_CONFIG, useValue: environment } + { provide: APP_CONFIG, useValue: environmentMock } ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); @@ -121,6 +131,10 @@ describe('BrowseByMetadataPageComponent', () => { expect(comp.items$).toBeUndefined(); }); + it('should set embed thumbnail property to true', () => { + expect(comp.fetchThumbnails).toBeTrue(); + }); + describe('when a value is provided', () => { beforeEach(() => { const paramsWithValue = { @@ -148,14 +162,14 @@ describe('BrowseByMetadataPageComponent', () => { }; const paginationOptions = Object.assign(new PaginationComponentOptions(), { currentPage: 5, - pageSize: 10, + pageSize: comp.appConfig.browseBy.pageSize, }); const sortOptions = { direction: SortDirection.ASC, field: 'fake-field', }; - result = browseParamsToOptions(paramsScope, paginationOptions, sortOptions, 'author'); + result = browseParamsToOptions(paramsScope, paginationOptions, sortOptions, 'author', comp.fetchThumbnails); }); it('should return BrowseEntrySearchOptions with the correct properties', () => { @@ -166,6 +180,36 @@ describe('BrowseByMetadataPageComponent', () => { expect(result.sort.direction).toEqual(SortDirection.ASC); expect(result.sort.field).toEqual('fake-field'); expect(result.scope).toEqual('fake-scope'); + expect(result.fetchThumbnail).toBeTrue(); + }); + }); + + describe('calling getBrowseSearchOptions', () => { + let result: BrowseEntrySearchOptions; + + beforeEach(() => { + const paramsScope = { + scope: 'fake-scope' + }; + const paginationOptions = Object.assign(new PaginationComponentOptions(), { + currentPage: 5, + pageSize: comp.appConfig.browseBy.pageSize, + }); + const sortOptions = { + direction: SortDirection.ASC, + field: 'fake-field', + }; + + result = getBrowseSearchOptions('title', paginationOptions, sortOptions, comp.fetchThumbnails); + }); + it('should return BrowseEntrySearchOptions with the correct properties', () => { + + expect(result.metadataDefinition).toEqual('title'); + expect(result.pagination.currentPage).toEqual(5); + expect(result.pagination.pageSize).toEqual(10); + expect(result.sort.direction).toEqual(SortDirection.ASC); + expect(result.sort.field).toEqual('fake-field'); + expect(result.fetchThumbnail).toBeTrue(); }); }); }); diff --git a/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.ts b/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.ts index 20817d9675..a95aea7c0a 100644 --- a/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.ts +++ b/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.ts @@ -1,6 +1,5 @@ import { combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs'; import { Component, Inject, OnInit } from '@angular/core'; -import { AppConfig, APP_CONFIG } from '../../../config/app-config.interface'; import { RemoteData } from '../../core/data/remote-data'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; @@ -18,6 +17,7 @@ import { StartsWithType } from '../../shared/starts-with/starts-with-decorator'; import { BrowseByDataType, rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator'; import { PaginationService } from '../../core/pagination/pagination.service'; import { map } from 'rxjs/operators'; +import { APP_CONFIG, AppConfig } from '../../../config/app-config.interface'; export const BBM_PAGINATION_ID = 'bbm'; @@ -109,12 +109,19 @@ export class BrowseByMetadataPageComponent implements OnInit { */ startsWith: string; + /** + * Determines whether to request embedded thumbnail. + */ + fetchThumbnails: boolean; + public constructor(protected route: ActivatedRoute, protected browseService: BrowseService, protected dsoService: DSpaceObjectDataService, protected paginationService: PaginationService, protected router: Router, - @Inject(APP_CONFIG) protected appConfig: AppConfig) { + @Inject(APP_CONFIG) public appConfig: AppConfig) { + + this.fetchThumbnails = this.appConfig.browseBy.showThumbnails; this.paginationConfig = Object.assign(new PaginationComponentOptions(), { id: BBM_PAGINATION_ID, currentPage: 1, @@ -122,9 +129,11 @@ export class BrowseByMetadataPageComponent implements OnInit { }); } + ngOnInit(): void { + const sortConfig = new SortOptions('default', SortDirection.ASC); - this.updatePage(new BrowseEntrySearchOptions(this.defaultBrowseId, this.paginationConfig, sortConfig)); + this.updatePage(getBrowseSearchOptions(this.defaultBrowseId, this.paginationConfig, sortConfig)); this.currentPagination$ = this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig); this.currentSort$ = this.paginationService.getCurrentSort(this.paginationConfig.id, sortConfig); this.subs.push( @@ -137,15 +146,16 @@ export class BrowseByMetadataPageComponent implements OnInit { this.authority = params.authority; this.value = +params.value || params.value || ''; this.startsWith = +params.startsWith || params.startsWith; - const searchOptions = browseParamsToOptions(params, currentPage, currentSort, this.browseId); if (isNotEmpty(this.value)) { - this.updatePageWithItems(searchOptions, this.value, this.authority); + this.updatePageWithItems( + browseParamsToOptions(params, currentPage, currentSort, this.browseId, this.fetchThumbnails), this.value, this.authority); } else { - this.updatePage(searchOptions); + this.updatePage(browseParamsToOptions(params, currentPage, currentSort, this.browseId, false)); } this.updateParent(params.scope); })); this.updateStartsWithTextOptions(); + } /** @@ -232,22 +242,44 @@ export class BrowseByMetadataPageComponent implements OnInit { } +/** + * Creates browse entry search options. + * @param defaultBrowseId the metadata definition to fetch entries or items for + * @param paginationConfig the required pagination configuration + * @param sortConfig the required sort configuration + * @param fetchThumbnails optional boolean for fetching thumbnails + * @returns BrowseEntrySearchOptions instance + */ +export function getBrowseSearchOptions(defaultBrowseId: string, + paginationConfig: PaginationComponentOptions, + sortConfig: SortOptions, + fetchThumbnails?: boolean) { + if (!hasValue(fetchThumbnails)) { + fetchThumbnails = false; + } + return new BrowseEntrySearchOptions(defaultBrowseId, paginationConfig, sortConfig, null, + null, fetchThumbnails); +} + /** * Function to transform query and url parameters into searchOptions used to fetch browse entries or items * @param params URL and query parameters * @param paginationConfig Pagination configuration * @param sortConfig Sorting configuration * @param metadata Optional metadata definition to fetch browse entries/items for + * @param fetchThumbnail Optional parameter for requesting thumbnail images */ export function browseParamsToOptions(params: any, paginationConfig: PaginationComponentOptions, sortConfig: SortOptions, - metadata?: string): BrowseEntrySearchOptions { + metadata?: string, + fetchThumbnail?: boolean): BrowseEntrySearchOptions { return new BrowseEntrySearchOptions( metadata, paginationConfig, sortConfig, +params.startsWith || params.startsWith, - params.scope + params.scope, + fetchThumbnail ); } diff --git a/src/app/browse-by/browse-by-title-page/browse-by-title-page.component.spec.ts b/src/app/browse-by/browse-by-title-page/browse-by-title-page.component.spec.ts index 600eab575b..e32c0ac430 100644 --- a/src/app/browse-by/browse-by-title-page/browse-by-title-page.component.spec.ts +++ b/src/app/browse-by/browse-by-title-page/browse-by-title-page.component.spec.ts @@ -18,13 +18,11 @@ import { BrowseService } from '../../core/browse/browse.service'; import { RouterMock } from '../../shared/mocks/router.mock'; import { VarDirective } from '../../shared/utils/var.directive'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { PaginationService } from '../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; -import { FindListOptions } from '../../core/data/find-list-options.model'; -import { APP_CONFIG } from 'src/config/app-config.interface'; -import { environment } from 'src/environments/environment'; +import { APP_CONFIG } from '../../../config/app-config.interface'; +import { environment } from '../../../environments/environment'; + describe('BrowseByTitlePageComponent', () => { let comp: BrowseByTitlePageComponent; diff --git a/src/app/browse-by/browse-by-title-page/browse-by-title-page.component.ts b/src/app/browse-by/browse-by-title-page/browse-by-title-page.component.ts index a6528bed49..85693ccecd 100644 --- a/src/app/browse-by/browse-by-title-page/browse-by-title-page.component.ts +++ b/src/app/browse-by/browse-by-title-page/browse-by-title-page.component.ts @@ -4,9 +4,8 @@ import { ActivatedRoute, Params, Router } from '@angular/router'; import { hasValue } from '../../shared/empty.util'; import { BrowseByMetadataPageComponent, - browseParamsToOptions + browseParamsToOptions, getBrowseSearchOptions } from '../browse-by-metadata-page/browse-by-metadata-page.component'; -import { BrowseEntrySearchOptions } from '../../core/browse/browse-entry-search-options.model'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; import { BrowseService } from '../../core/browse/browse.service'; import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; @@ -32,13 +31,14 @@ export class BrowseByTitlePageComponent extends BrowseByMetadataPageComponent { protected dsoService: DSpaceObjectDataService, protected paginationService: PaginationService, protected router: Router, - @Inject(APP_CONFIG) protected appConfig: AppConfig) { + @Inject(APP_CONFIG) public appConfig: AppConfig) { super(route, browseService, dsoService, paginationService, router, appConfig); } ngOnInit(): void { const sortConfig = new SortOptions('dc.title', SortDirection.ASC); - this.updatePage(new BrowseEntrySearchOptions(this.defaultBrowseId, this.paginationConfig, sortConfig)); + // include the thumbnail configuration in browse search options + this.updatePage(getBrowseSearchOptions(this.defaultBrowseId, this.paginationConfig, sortConfig, this.fetchThumbnails)); this.currentPagination$ = this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig); this.currentSort$ = this.paginationService.getCurrentSort(this.paginationConfig.id, sortConfig); this.subs.push( @@ -49,7 +49,7 @@ export class BrowseByTitlePageComponent extends BrowseByMetadataPageComponent { ).subscribe(([params, currentPage, currentSort]: [Params, PaginationComponentOptions, SortOptions]) => { this.startsWith = +params.startsWith || params.startsWith; this.browseId = params.id || this.defaultBrowseId; - this.updatePageWithItems(browseParamsToOptions(params, currentPage, currentSort, this.browseId), undefined, undefined); + this.updatePageWithItems(browseParamsToOptions(params, currentPage, currentSort, this.browseId, this.fetchThumbnails), undefined, undefined); this.updateParent(params.scope); })); this.updateStartsWithTextOptions(); diff --git a/src/app/collection-page/collection-page.component.ts b/src/app/collection-page/collection-page.component.ts index 09471d4c6d..f730f44658 100644 --- a/src/app/collection-page/collection-page.component.ts +++ b/src/app/collection-page/collection-page.component.ts @@ -28,6 +28,7 @@ import { AuthorizationDataService } from '../core/data/feature-authorization/aut import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { getCollectionPageRoute } from './collection-page-routing-paths'; import { redirectOn4xx } from '../core/shared/authorized.operators'; +import { BROWSE_LINKS_TO_FOLLOW } from '../core/browse/browse.service'; @Component({ selector: 'ds-collection-page', @@ -74,6 +75,7 @@ export class CollectionPageComponent implements OnInit { this.paginationConfig.pageSize = 5; this.paginationConfig.currentPage = 1; this.sortConfig = new SortOptions('dc.date.accessioned', SortDirection.DESC); + } ngOnInit(): void { @@ -102,13 +104,14 @@ export class CollectionPageComponent implements OnInit { getFirstSucceededRemoteData(), map((rd) => rd.payload.id), switchMap((id: string) => { - return this.searchService.search( + return this.searchService.search( new PaginatedSearchOptions({ scope: id, pagination: currentPagination, sort: currentSort, dsoTypes: [DSpaceObjectType.ITEM] - })).pipe(toDSpaceObjectListRD()) as Observable>>; + }), null, true, true, ...BROWSE_LINKS_TO_FOLLOW) + .pipe(toDSpaceObjectListRD()) as Observable>>; }), startWith(undefined) // Make sure switching pages shows loading component ) diff --git a/src/app/collection-page/collection-page.resolver.ts b/src/app/collection-page/collection-page.resolver.ts index d476a180d3..2f5b3ed37a 100644 --- a/src/app/collection-page/collection-page.resolver.ts +++ b/src/app/collection-page/collection-page.resolver.ts @@ -17,7 +17,7 @@ export const COLLECTION_PAGE_LINKS_TO_FOLLOW: FollowLinkConfig[] = [ followLink('parentCommunity', {}, followLink('parentCommunity') ), - followLink('logo') + followLink('logo'), ]; /** diff --git a/src/app/core/auth/auth-request.service.spec.ts b/src/app/core/auth/auth-request.service.spec.ts index 2afeb26b02..704922c5b5 100644 --- a/src/app/core/auth/auth-request.service.spec.ts +++ b/src/app/core/auth/auth-request.service.spec.ts @@ -111,7 +111,6 @@ describe(`AuthRequestService`, () => { body: undefined, options, })); - expect((service as any).fetchRequest).toHaveBeenCalledWith(requestID); }); }); }); @@ -151,7 +150,6 @@ describe(`AuthRequestService`, () => { body: { content: 'something' }, options, })); - expect((service as any).fetchRequest).toHaveBeenCalledWith(requestID); }); }); }); diff --git a/src/app/core/auth/auth-request.service.ts b/src/app/core/auth/auth-request.service.ts index 7fd93fb014..5c0c3340c7 100644 --- a/src/app/core/auth/auth-request.service.ts +++ b/src/app/core/auth/auth-request.service.ts @@ -58,7 +58,9 @@ export abstract class AuthRequestService { public postToEndpoint(method: string, body?: any, options?: HttpOptions): Observable> { const requestId = this.requestService.generateRequestId(); - this.halService.getEndpoint(this.linkName).pipe( + const endpoint$ = this.halService.getEndpoint(this.linkName); + + endpoint$.pipe( filter((href: string) => isNotEmpty(href)), map((endpointURL) => this.getEndpointByMethod(endpointURL, method)), distinctUntilChanged(), @@ -68,7 +70,9 @@ export abstract class AuthRequestService { this.requestService.send(request); }); - return this.fetchRequest(requestId); + return endpoint$.pipe( + switchMap(() => this.fetchRequest(requestId)), + ); } /** @@ -79,7 +83,9 @@ export abstract class AuthRequestService { public getRequest(method: string, options?: HttpOptions, ...linksToFollow: FollowLinkConfig[]): Observable> { const requestId = this.requestService.generateRequestId(); - this.halService.getEndpoint(this.linkName).pipe( + const endpoint$ = this.halService.getEndpoint(this.linkName); + + endpoint$.pipe( filter((href: string) => isNotEmpty(href)), map((endpointURL) => this.getEndpointByMethod(endpointURL, method, ...linksToFollow)), distinctUntilChanged(), @@ -89,7 +95,9 @@ export abstract class AuthRequestService { this.requestService.send(request); }); - return this.fetchRequest(requestId, ...linksToFollow); + return endpoint$.pipe( + switchMap(() => this.fetchRequest(requestId, ...linksToFollow)), + ); } /** * Factory function to create the request object to send. This needs to be a POST client side and diff --git a/src/app/core/breadcrumbs/dso-name.service.ts b/src/app/core/breadcrumbs/dso-name.service.ts index 02ead1615c..d56f4a00eb 100644 --- a/src/app/core/breadcrumbs/dso-name.service.ts +++ b/src/app/core/breadcrumbs/dso-name.service.ts @@ -31,6 +31,8 @@ export class DSONameService { const givenName = dso.firstMetadataValue('person.givenName'); if (isEmpty(familyName) && isEmpty(givenName)) { return dso.firstMetadataValue('dc.title') || dso.name; + } else if (isEmpty(familyName) || isEmpty(givenName)) { + return familyName || givenName; } else { return `${familyName}, ${givenName}`; } @@ -55,11 +57,14 @@ export class DSONameService { .filter((type) => typeof type === 'string') .find((type: string) => Object.keys(this.factories).includes(type)) as string; + let name; if (hasValue(match)) { - return this.factories[match](dso); - } else { - return this.factories.Default(dso); + name = this.factories[match](dso); } + if (isEmpty(name)) { + name = this.factories.Default(dso); + } + return name; } } diff --git a/src/app/core/browse/browse-entry-search-options.model.ts b/src/app/core/browse/browse-entry-search-options.model.ts index 417bf7ce75..1604c693e9 100644 --- a/src/app/core/browse/browse-entry-search-options.model.ts +++ b/src/app/core/browse/browse-entry-search-options.model.ts @@ -6,13 +6,16 @@ import { SortOptions } from '../cache/models/sort-options.model'; * - metadataDefinition: The metadata definition to fetch entries or items for * - pagination: Optional pagination options to use * - sort: Optional sorting options to use + * - startsWith An optional value to use to filter the browse results * - scope: An optional scope to limit the results within a specific collection or community + * - fetchThumbnail An optional boolean to request thumbnail for items */ export class BrowseEntrySearchOptions { constructor(public metadataDefinition: string, public pagination?: PaginationComponentOptions, public sort?: SortOptions, public startsWith?: string, - public scope?: string) { + public scope?: string, + public fetchThumbnail?: boolean) { } } diff --git a/src/app/core/browse/browse.service.ts b/src/app/core/browse/browse.service.ts index 8fd11ad048..2fab189254 100644 --- a/src/app/core/browse/browse.service.ts +++ b/src/app/core/browse/browse.service.ts @@ -21,6 +21,12 @@ import { URLCombiner } from '../url-combiner/url-combiner'; import { BrowseEntrySearchOptions } from './browse-entry-search-options.model'; import { BrowseDefinitionDataService } from './browse-definition-data.service'; import { HrefOnlyDataService } from '../data/href-only-data.service'; +import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; + + +export const BROWSE_LINKS_TO_FOLLOW: FollowLinkConfig[] = [ + followLink('thumbnail') +]; /** * The service handling all browse requests @@ -96,6 +102,9 @@ export class BrowseService { return href; }) ); + if (options.fetchThumbnail ) { + return this.hrefOnlyDataService.findListByHref(href$, {}, null, null, ...BROWSE_LINKS_TO_FOLLOW); + } return this.hrefOnlyDataService.findListByHref(href$); } @@ -141,6 +150,9 @@ export class BrowseService { return href; }), ); + if (options.fetchThumbnail) { + return this.hrefOnlyDataService.findListByHref(href$, {}, null, null, ...BROWSE_LINKS_TO_FOLLOW); + } return this.hrefOnlyDataService.findListByHref(href$); } diff --git a/src/app/core/data/find-list-options.model.ts b/src/app/core/data/find-list-options.model.ts index 52a527d9e0..dc567d4b53 100644 --- a/src/app/core/data/find-list-options.model.ts +++ b/src/app/core/data/find-list-options.model.ts @@ -11,4 +11,5 @@ export class FindListOptions { sort?: SortOptions; searchParams?: RequestParam[]; startsWith?: string; + fetchThumbnail?: boolean; } diff --git a/src/app/core/data/relationship-data.service.spec.ts b/src/app/core/data/relationship-data.service.spec.ts index 2f0ecd9cf4..39aa7cbd58 100644 --- a/src/app/core/data/relationship-data.service.spec.ts +++ b/src/app/core/data/relationship-data.service.spec.ts @@ -202,6 +202,7 @@ describe('RelationshipDataService', () => { }); it('should call getItemRelationshipsByLabel with the correct params', (done) => { + mockOptions = Object.assign(mockOptions, { fetchThumbnail: true }); service.getRelatedItemsByLabel( mockItem, mockLabel, @@ -213,8 +214,8 @@ describe('RelationshipDataService', () => { mockOptions, true, true, - followLink('leftItem'), - followLink('rightItem'), + followLink('leftItem',{}, followLink('thumbnail')), + followLink('rightItem',{}, followLink('thumbnail')), followLink('relationshipType') ); done(); diff --git a/src/app/core/data/relationship-data.service.ts b/src/app/core/data/relationship-data.service.ts index d14a609a96..85adeff754 100644 --- a/src/app/core/data/relationship-data.service.ts +++ b/src/app/core/data/relationship-data.service.ts @@ -45,6 +45,7 @@ import { SearchData, SearchDataImpl } from './base/search-data'; import { PutData, PutDataImpl } from './base/put-data'; import { IdentifiableDataService } from './base/identifiable-data.service'; import { dataService } from './base/data-service.decorator'; +import { itemLinksToFollow } from '../../shared/utils/relation-query.utils'; const relationshipListsStateSelector = (state: AppState) => state.relationshipLists; @@ -185,7 +186,7 @@ export class RelationshipDataService extends IdentifiableDataService !existsInOC && !existsInRC), take(1), - ).subscribe(() => this.itemService.findByHref(item._links.self.href, false)); + ).subscribe(() => this.itemService.findByHref(item._links.self.href)); } /** @@ -258,7 +259,10 @@ export class RelationshipDataService extends IdentifiableDataService>> { - return this.getItemRelationshipsByLabel(item, label, options, true, true, followLink('leftItem'), followLink('rightItem'), followLink('relationshipType')).pipe(this.paginatedRelationsToItems(item.uuid)); + let linksToFollow: FollowLinkConfig[] = itemLinksToFollow(options.fetchThumbnail); + linksToFollow.push(followLink('relationshipType')); + + return this.getItemRelationshipsByLabel(item, label, options, true, true, ...linksToFollow).pipe(this.paginatedRelationsToItems(item.uuid)); } /** @@ -516,14 +520,14 @@ export class RelationshipDataService extends IdentifiableDataService>>; diff --git a/src/app/core/shared/browse-entry.model.ts b/src/app/core/shared/browse-entry.model.ts index df748ac61c..d4842e1294 100644 --- a/src/app/core/shared/browse-entry.model.ts +++ b/src/app/core/shared/browse-entry.model.ts @@ -40,6 +40,12 @@ export class BrowseEntry extends ListableObject implements TypedObject { @autoserializeAs('valueLang') language: string; + /** + * Thumbnail link used when browsing items with showThumbs config enabled. + */ + @autoserializeAs('thumbnail') + thumbnail: string; + /** * The count of this browse entry */ @@ -51,6 +57,7 @@ export class BrowseEntry extends ListableObject implements TypedObject { _links: { self: HALLink; entries: HALLink; + thumbnail: HALLink; }; /** diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html index 883d68cea2..c6c29c2f1a 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html @@ -21,7 +21,7 @@
-

+

diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html index 1ba143ef61..5849105f96 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html @@ -21,7 +21,7 @@

-

+

diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html index 57a8813ead..9a3ea95c07 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html @@ -21,7 +21,7 @@

-

+

diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html index 6d88c9761b..d93639a5d9 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html @@ -1,12 +1,23 @@ - - - - - +

+ +
+ + + + + @@ -22,4 +33,6 @@ - + +
+
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts index b47a767be2..178ed86c40 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts @@ -9,6 +9,7 @@ import { TruncatePipe } from '../../../../../shared/utils/truncate.pipe'; import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; let journalIssueListElementComponent: JournalIssueSearchResultListElementComponent; let fixture: ComponentFixture; @@ -57,13 +58,26 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( }) }); +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + +const enviromentNoThumbs = { + browseBy: { + showThumbnails: false + } +}; + describe('JournalIssueSearchResultListElementComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [JournalIssueSearchResultListElementComponent, TruncatePipe], providers: [ { provide: TruncatableService, useValue: {} }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] @@ -78,6 +92,22 @@ describe('JournalIssueSearchResultListElementComponent', () => { })); + describe('with environment.browseBy.showThumbnails set to true', () => { + beforeEach(() => { + journalIssueListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + it('should set showThumbnails to true', () => { + expect(journalIssueListElementComponent.showThumbnails).toBeTrue(); + }); + + it('should add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeTruthy(); + }); + }); + + describe('When the item has a journal identifier', () => { beforeEach(() => { journalIssueListElementComponent.object = mockItemWithMetadata; @@ -126,3 +156,39 @@ describe('JournalIssueSearchResultListElementComponent', () => { }); }); }); + +describe('JournalIssueSearchResultListElementComponent', () => { + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [JournalIssueSearchResultListElementComponent, TruncatePipe], + providers: [ + {provide: TruncatableService, useValue: {}}, + {provide: DSONameService, useClass: DSONameServiceMock}, + { provide: APP_CONFIG, useValue: enviromentNoThumbs } + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(JournalIssueSearchResultListElementComponent, { + set: {changeDetection: ChangeDetectionStrategy.Default} + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(JournalIssueSearchResultListElementComponent); + journalIssueListElementComponent = fixture.componentInstance; + })); + + describe('with environment.browseBy.showThumbnails set to false', () => { + beforeEach(() => { + + journalIssueListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + + it('should not add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeFalsy(); + }); + }); +}); diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.ts index dcb54b8d39..88f93d9d85 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.ts @@ -13,4 +13,15 @@ import { ItemSearchResultListElementComponent } from '../../../../../shared/obje * The component for displaying a list element for an item search result of the type Journal Issue */ export class JournalIssueSearchResultListElementComponent extends ItemSearchResultListElementComponent { + + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + + ngOnInit(): void { + super.ngOnInit(); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; + } + } diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html index b7cb645e31..2226d03649 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html @@ -1,12 +1,23 @@ - - - - - +
+ +
+ + + + + @@ -22,4 +33,6 @@ - + +
+
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts index d03bc29d6b..71fa83a3b1 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts @@ -9,6 +9,7 @@ import { TruncatePipe } from '../../../../../shared/utils/truncate.pipe'; import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; let journalVolumeListElementComponent: JournalVolumeSearchResultListElementComponent; let fixture: ComponentFixture; @@ -56,6 +57,18 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( }) }); +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + +const enviromentNoThumbs = { + browseBy: { + showThumbnails: false + } +}; + describe('JournalVolumeSearchResultListElementComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ @@ -63,6 +76,7 @@ describe('JournalVolumeSearchResultListElementComponent', () => { providers: [ { provide: TruncatableService, useValue: {} }, { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] @@ -77,6 +91,21 @@ describe('JournalVolumeSearchResultListElementComponent', () => { })); + describe('with environment.browseBy.showThumbnails set to true', () => { + beforeEach(() => { + journalVolumeListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + it('should set showThumbnails to true', () => { + expect(journalVolumeListElementComponent.showThumbnails).toBeTrue(); + }); + + it('should add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeTruthy(); + }); + }); + describe('When the item has a journal title', () => { beforeEach(() => { journalVolumeListElementComponent.object = mockItemWithMetadata; @@ -125,3 +154,38 @@ describe('JournalVolumeSearchResultListElementComponent', () => { }); }); }); + +describe('JournalVolumeSearchResultListElementComponent', () => { + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [JournalVolumeSearchResultListElementComponent, TruncatePipe], + providers: [ + {provide: TruncatableService, useValue: {}}, + {provide: DSONameService, useClass: DSONameServiceMock}, + { provide: APP_CONFIG, useValue: enviromentNoThumbs } + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(JournalVolumeSearchResultListElementComponent, { + set: {changeDetection: ChangeDetectionStrategy.Default} + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(JournalVolumeSearchResultListElementComponent); + journalVolumeListElementComponent = fixture.componentInstance; + })); + + describe('with environment.browseBy.showThumbnails set to false', () => { + beforeEach(() => { + journalVolumeListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + + it('should not add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeFalsy(); + }); + }); +}); diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.ts index 7cba2ef591..ec98946937 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.ts @@ -13,4 +13,15 @@ import { ItemSearchResultListElementComponent } from '../../../../../shared/obje * The component for displaying a list element for an item search result of the type Journal Volume */ export class JournalVolumeSearchResultListElementComponent extends ItemSearchResultListElementComponent { + + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + + ngOnInit(): void { + super.ngOnInit(); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; + } + } diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html index 988fb2d4b5..3cafccf0b9 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html @@ -1,12 +1,21 @@ - - +
+
- - + [routerLink]="[itemPageRoute]" class="lead item-list-title dont-break-out"> + + + +
+
+ + + + + @@ -16,4 +25,6 @@ - + +
+
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts index 9aca414ec6..07970d7128 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts @@ -9,6 +9,7 @@ import { TruncatableService } from '../../../../../shared/truncatable/truncatabl import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; let journalListElementComponent: JournalSearchResultListElementComponent; let fixture: ComponentFixture; @@ -52,6 +53,18 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( } ); +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + +const enviromentNoThumbs = { + browseBy: { + showThumbnails: false + } +}; + describe('JournalSearchResultListElementComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ @@ -59,6 +72,7 @@ describe('JournalSearchResultListElementComponent', () => { providers: [ { provide: TruncatableService, useValue: {} }, { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] @@ -73,6 +87,21 @@ describe('JournalSearchResultListElementComponent', () => { })); + describe('with environment.browseBy.showThumbnails set to true', () => { + beforeEach(() => { + journalListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + it('should set showThumbnails to true', () => { + expect(journalListElementComponent.showThumbnails).toBeTrue(); + }); + + it('should add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeTruthy(); + }); + }); + describe('When the item has an issn', () => { beforeEach(() => { journalListElementComponent.object = mockItemWithMetadata; @@ -97,3 +126,39 @@ describe('JournalSearchResultListElementComponent', () => { }); }); }); + +describe('JournalSearchResultListElementComponent', () => { + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [JournalSearchResultListElementComponent, TruncatePipe], + providers: [ + {provide: TruncatableService, useValue: {}}, + {provide: DSONameService, useClass: DSONameServiceMock}, + { provide: APP_CONFIG, useValue: enviromentNoThumbs } + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(JournalSearchResultListElementComponent, { + set: {changeDetection: ChangeDetectionStrategy.Default} + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(JournalSearchResultListElementComponent); + journalListElementComponent = fixture.componentInstance; + })); + + describe('with environment.browseBy.showThumbnails set to false', () => { + beforeEach(() => { + + journalListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + + it('should not add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeFalsy(); + }); + }); +}); diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.ts index 85460b47e4..199bd3a748 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.ts @@ -13,4 +13,15 @@ import { ItemSearchResultListElementComponent } from '../../../../../shared/obje * The component for displaying a list element for an item search result of the type Journal */ export class JournalSearchResultListElementComponent extends ItemSearchResultListElementComponent { + + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + + ngOnInit(): void { + super.ngOnInit(); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; + } + } diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html index dbd9d03994..bf73a62447 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html +++ b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html @@ -1,7 +1,6 @@
-

- {{'journalissue.page.titleprefix' | translate}} -

+ +
-

- {{'journalvolume.page.titleprefix' | translate}} -

+ +
-

- {{'journal.page.titleprefix' | translate}} -

+ +
-

+

diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html index c5248990b4..853a717965 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html @@ -21,8 +21,7 @@

-

+

-

+

diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html index 40f837bcd1..fc14a99caf 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.html @@ -1,17 +1,33 @@ - - - - - +

+ +
+ + + + + + [innerHTML]="firstMetadataValue('dc.description')"> - + +
+
diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.spec.ts index d116b2ade7..974c418cdc 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.spec.ts @@ -9,6 +9,7 @@ import { TruncatableService } from '../../../../../shared/truncatable/truncatabl import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; let orgUnitListElementComponent: OrgUnitSearchResultListElementComponent; let fixture: ComponentFixture; @@ -50,13 +51,26 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( }) }); +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + +const enviromentNoThumbs = { + browseBy: { + showThumbnails: false + } +}; + describe('OrgUnitSearchResultListElementComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [ OrgUnitSearchResultListElementComponent , TruncatePipe], providers: [ { provide: TruncatableService, useValue: {} }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [ NO_ERRORS_SCHEMA ] @@ -71,6 +85,21 @@ describe('OrgUnitSearchResultListElementComponent', () => { })); + describe('with environment.browseBy.showThumbnails set to true', () => { + beforeEach(() => { + orgUnitListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + it('should set showThumbnails to true', () => { + expect(orgUnitListElementComponent.showThumbnails).toBeTrue(); + }); + + it('should add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeTruthy(); + }); + }); + describe('When the item has an org unit description', () => { beforeEach(() => { orgUnitListElementComponent.object = mockItemWithMetadata; @@ -95,3 +124,39 @@ describe('OrgUnitSearchResultListElementComponent', () => { }); }); }); + +describe('OrgUnitSearchResultListElementComponent', () => { + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [OrgUnitSearchResultListElementComponent, TruncatePipe], + providers: [ + {provide: TruncatableService, useValue: {}}, + {provide: DSONameService, useClass: DSONameServiceMock}, + { provide: APP_CONFIG, useValue: enviromentNoThumbs } + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(OrgUnitSearchResultListElementComponent, { + set: {changeDetection: ChangeDetectionStrategy.Default} + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(OrgUnitSearchResultListElementComponent); + orgUnitListElementComponent = fixture.componentInstance; + })); + + describe('with environment.browseBy.showThumbnails set to false', () => { + beforeEach(() => { + + orgUnitListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + + it('should not add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeNull(); + }); + }); +}); diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.ts index 2165b7d94d..baa27cdf0c 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/org-unit/org-unit-search-result-list-element.component.ts @@ -13,4 +13,15 @@ import { ItemSearchResultListElementComponent } from '../../../../../shared/obje * The component for displaying a list element for an item search result of the type Organisation Unit */ export class OrgUnitSearchResultListElementComponent extends ItemSearchResultListElementComponent { + + /** + * Display thumbnail if required by configuration + */ + showThumbnails: boolean; + + ngOnInit(): void { + super.ngOnInit(); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; + } + } diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html index 6d9cfe10c4..979c8711d6 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html @@ -1,12 +1,26 @@ - - - - - +
+ +
+ + + + + @@ -16,4 +30,7 @@ - + +
+
+ diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts index 2acb02da7d..6c69bfd58d 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts @@ -9,6 +9,7 @@ import { TruncatePipe } from '../../../../../shared/utils/truncate.pipe'; import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; let personListElementComponent: PersonSearchResultListElementComponent; let fixture: ComponentFixture; @@ -50,13 +51,26 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( }) }); +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + +const enviromentNoThumbs = { + browseBy: { + showThumbnails: false + } +}; + describe('PersonSearchResultListElementComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [PersonSearchResultListElementComponent, TruncatePipe], providers: [ { provide: TruncatableService, useValue: {} }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] @@ -71,6 +85,21 @@ describe('PersonSearchResultListElementComponent', () => { })); + describe('with environment.browseBy.showThumbnails set to true', () => { + beforeEach(() => { + personListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + it('should set showThumbnails to true', () => { + expect(personListElementComponent.showThumbnails).toBeTrue(); + }); + + it('should add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeTruthy(); + }); + }); + describe('When the item has a job title', () => { beforeEach(() => { personListElementComponent.object = mockItemWithMetadata; @@ -95,3 +124,39 @@ describe('PersonSearchResultListElementComponent', () => { }); }); }); + +describe('PersonSearchResultListElementComponent', () => { + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [PersonSearchResultListElementComponent, TruncatePipe], + providers: [ + {provide: TruncatableService, useValue: {}}, + {provide: DSONameService, useClass: DSONameServiceMock}, + { provide: APP_CONFIG, useValue: enviromentNoThumbs } + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(PersonSearchResultListElementComponent, { + set: {changeDetection: ChangeDetectionStrategy.Default} + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(PersonSearchResultListElementComponent); + personListElementComponent = fixture.componentInstance; + })); + + describe('with environment.browseBy.showThumbnails set to false', () => { + beforeEach(() => { + + personListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + + it('should not add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeFalsy(); + }); + }); +}); diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.ts index 3b222ce27c..217d7baef9 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; @@ -8,6 +8,7 @@ import { } from '../../../../../shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface'; @listableObjectComponent('PersonSearchResult', ViewMode.ListElement) @Component({ @@ -20,14 +21,21 @@ import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service */ export class PersonSearchResultListElementComponent extends ItemSearchResultListElementComponent { - public constructor(protected truncatableService: TruncatableService, protected dsoNameService: DSONameService) { - super(truncatableService, dsoNameService); + public constructor( + protected truncatableService: TruncatableService, + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig + ) { + super(truncatableService, dsoNameService, appConfig); } /** - * Return the person name + * Display thumbnail if required by configuration */ - get name() { - return this.dsoNameService.getName(this.dso); + showThumbnails: boolean; + + ngOnInit(): void { + super.ngOnInit(); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; } } diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html index d711ad7c18..3cfc6eaeb4 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html @@ -1,19 +1,35 @@ - - - - - - - - - - - - - - - +
+ +
+ + + + + + + + + + + + + + + +
+
diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts index 8b27a86f6d..0cb3e63e87 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts @@ -8,6 +8,8 @@ import { TruncatePipe } from '../../../../../shared/utils/truncate.pipe'; import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock'; +import { By } from '@angular/platform-browser'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; let projectListElementComponent: ProjectSearchResultListElementComponent; let fixture: ComponentFixture; @@ -50,13 +52,26 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( }) }); +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + +const enviromentNoThumbs = { + browseBy: { + showThumbnails: false + } +}; + describe('ProjectSearchResultListElementComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [ProjectSearchResultListElementComponent, TruncatePipe], providers: [ { provide: TruncatableService, useValue: {} }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] @@ -71,6 +86,21 @@ describe('ProjectSearchResultListElementComponent', () => { })); + describe('with environment.browseBy.showThumbnails set to true', () => { + beforeEach(() => { + projectListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + it('should set showThumbnails to true', () => { + expect(projectListElementComponent.showThumbnails).toBeTrue(); + }); + + it('should add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeTruthy(); + }); + }); + // describe('When the item has a status', () => { // beforeEach(() => { // projectListElementComponent.item = mockItemWithMetadata; @@ -95,3 +125,40 @@ describe('ProjectSearchResultListElementComponent', () => { // }); // }); }); + +describe('ProjectSearchResultListElementComponent', () => { + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ProjectSearchResultListElementComponent, TruncatePipe], + providers: [ + {provide: TruncatableService, useValue: {}}, + {provide: DSONameService, useClass: DSONameServiceMock}, + { provide: APP_CONFIG, useValue: enviromentNoThumbs } + + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(ProjectSearchResultListElementComponent, { + set: {changeDetection: ChangeDetectionStrategy.Default} + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(ProjectSearchResultListElementComponent); + projectListElementComponent = fixture.componentInstance; + })); + + describe('with environment.browseBy.showThumbnails set to false', () => { + beforeEach(() => { + + projectListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + + it('should not add thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeFalsy(); + }); + }); +}); diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.ts index 6ad8c0fcaa..88e95528ac 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.ts @@ -13,4 +13,15 @@ import { ItemSearchResultListElementComponent } from '../../../../../shared/obje * The component for displaying a list element for an item search result of the type Project */ export class ProjectSearchResultListElementComponent extends ItemSearchResultListElementComponent { + + /** + * Display thumbnail if required by configuration + */ + showThumbnails: boolean; + + ngOnInit(): void { + super.ngOnInit(); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; + } + } diff --git a/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/org-unit/org-unit-sidebar-search-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/org-unit/org-unit-sidebar-search-list-element.component.spec.ts index a271273a1b..ab8e1b8363 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/org-unit/org-unit-sidebar-search-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/org-unit/org-unit-sidebar-search-list-element.component.spec.ts @@ -8,6 +8,11 @@ const object = Object.assign(new ItemSearchResult(), { indexableObject: Object.assign(new Item(), { id: 'test-item', metadata: { + 'dspace.entity.type': [ + { + value: 'OrgUnit' + } + ], 'organization.legalName': [ { value: 'title' diff --git a/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/org-unit/org-unit-sidebar-search-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/org-unit/org-unit-sidebar-search-list-element.component.ts index 17e9790593..25ff6181b2 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/org-unit/org-unit-sidebar-search-list-element.component.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/org-unit/org-unit-sidebar-search-list-element.component.ts @@ -17,12 +17,6 @@ import { Item } from '../../../../../core/shared/item.model'; * a sidebar search modal */ export class OrgUnitSidebarSearchListElementComponent extends SidebarSearchListElementComponent { - /** - * Get the title of the Org Unit by returning its legal name - */ - getTitle(): string { - return this.firstMetadataValue('organization.legalName'); - } /** * Get the description of the Org Unit by returning its dc.description diff --git a/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/person/person-sidebar-search-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/person/person-sidebar-search-list-element.component.spec.ts index e93dd78636..f49ec452c9 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/person/person-sidebar-search-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/person/person-sidebar-search-list-element.component.spec.ts @@ -3,12 +3,16 @@ import { Collection } from '../../../../../core/shared/collection.model'; import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; import { createSidebarSearchListElementTests } from '../../../../../shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.spec'; import { PersonSidebarSearchListElementComponent } from './person-sidebar-search-list-element.component'; -import { TranslateService } from '@ngx-translate/core'; const object = Object.assign(new ItemSearchResult(), { indexableObject: Object.assign(new Item(), { id: 'test-item', metadata: { + 'dspace.entity.type': [ + { + value: 'Person', + } + ], 'person.familyName': [ { value: 'family name' @@ -40,6 +44,5 @@ const parent = Object.assign(new Collection(), { describe('PersonSidebarSearchListElementComponent', createSidebarSearchListElementTests(PersonSidebarSearchListElementComponent, object, parent, 'parent title', 'family name, given name', 'job title', [ - { provide: TranslateService, useValue: jasmine.createSpyObj('translate', { instant: '' }) } ]) ); diff --git a/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/person/person-sidebar-search-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/person/person-sidebar-search-list-element.component.ts index 281f22ddb4..bc9d3d4302 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/person/person-sidebar-search-list-element.component.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/sidebar-search-list-elements/person/person-sidebar-search-list-element.component.ts @@ -30,25 +30,6 @@ export class PersonSidebarSearchListElementComponent extends SidebarSearchListEl super(truncatableService, linkService, dsoNameService); } - /** - * Get the title of the Person by returning a combination of its family name and given name (or "No name found") - */ - getTitle(): string { - const familyName = this.firstMetadataValue('person.familyName'); - const givenName = this.firstMetadataValue('person.givenName'); - let title = ''; - if (isNotEmpty(familyName)) { - title = familyName; - } - if (isNotEmpty(title)) { - title += ', '; - } - if (isNotEmpty(givenName)) { - title += givenName; - } - return this.defaultIfEmpty(title, this.translateService.instant('person.listelement.no-title')); - } - /** * Get the description of the Person by returning its job title(s) */ diff --git a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html index ff4bc4d226..ac92e4ad6d 100644 --- a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html +++ b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html @@ -1,7 +1,6 @@
-

- {{'orgunit.page.titleprefix' | translate}} -

+ +
-
+
-

- {{'person.page.titleprefix' | translate}} -

+ +
-
+
-

- {{'project.page.titleprefix' | translate}} -

+ +
-->
-
+
-
+
; @@ -117,7 +119,8 @@ describe('OrgUnitSearchResultListSubmissionElementComponent', () => { { provide: DSOChangeAnalyzer, useValue: {} }, { provide: DefaultChangeAnalyzer, useValue: {} }, { provide: BitstreamDataService, useValue: mockBitstreamDataService }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environment } ], schemas: [NO_ERRORS_SCHEMA] @@ -179,4 +182,6 @@ describe('OrgUnitSearchResultListSubmissionElementComponent', () => { expect(jobTitleField).toBeNull(); }); }); + }); + diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-search-result-list-submission-element.component.ts b/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-search-result-list-submission-element.component.ts index 42a9dc9141..7a38a02cf4 100644 --- a/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-search-result-list-submission-element.component.ts +++ b/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-search-result-list-submission-element.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Inject, OnInit } from '@angular/core'; import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; import { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component'; import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; @@ -17,6 +17,7 @@ import { ItemDataService } from '../../../../../core/data/item-data.service'; import { SelectableListService } from '../../../../../shared/object-list/selectable-list/selectable-list.service'; import { NameVariantModalComponent } from '../../name-variant-modal/name-variant-modal.component'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface'; @listableObjectComponent('OrgUnitSearchResult', ViewMode.ListElement, Context.EntitySearchModal) @listableObjectComponent('OrgUnitSearchResult', ViewMode.ListElement, Context.EntitySearchModalWithNameVariants) @@ -35,6 +36,11 @@ export class OrgUnitSearchResultListSubmissionElementComponent extends SearchRes alternativeField = 'dc.title.alternative'; useNameVariants = false; + /** + * Display thumbnail if required by configuration + */ + showThumbnails: boolean; + constructor(protected truncatableService: TruncatableService, private relationshipService: RelationshipDataService, private notificationsService: NotificationsService, @@ -43,9 +49,10 @@ export class OrgUnitSearchResultListSubmissionElementComponent extends SearchRes private itemDataService: ItemDataService, private bitstreamDataService: BitstreamDataService, private selectableListService: SelectableListService, - protected dsoNameService: DSONameService + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig ) { - super(truncatableService, dsoNameService); + super(truncatableService, dsoNameService, appConfig); } ngOnInit() { @@ -54,7 +61,7 @@ export class OrgUnitSearchResultListSubmissionElementComponent extends SearchRes this.useNameVariants = this.context === Context.EntitySearchModalWithNameVariants; if (this.useNameVariants) { - const defaultValue = this.firstMetadataValue('organization.legalName'); + const defaultValue = this.dsoTitle; const alternatives = this.allMetadataValues(this.alternativeField); this.allSuggestions = [defaultValue, ...alternatives]; @@ -65,6 +72,7 @@ export class OrgUnitSearchResultListSubmissionElementComponent extends SearchRes } ); } + this.showThumbnails = this.appConfig.browseBy.showThumbnails; } select(value) { diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.html b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.html index 9fe9898c2b..7d1ab508b7 100644 --- a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.html +++ b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.html @@ -1,6 +1,20 @@ -
-
- +
+ +
+
+
+ @@ -9,5 +23,7 @@ +
+
diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.spec.ts b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.spec.ts index c0fad3ed3f..9e4d347150 100644 --- a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.spec.ts @@ -27,6 +27,7 @@ import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote- import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; import { TruncatePipe } from '../../../../../shared/utils/truncate.pipe'; import { PersonSearchResultListSubmissionElementComponent } from './person-search-result-list-submission-element.component'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; let personListElementComponent: PersonSearchResultListSubmissionElementComponent; let fixture: ComponentFixture; @@ -37,6 +38,18 @@ let mockItemWithoutMetadata: ItemSearchResult; let nameVariant; let mockRelationshipService; +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + +const enviromentNoThumbs = { + browseBy: { + showThumbnails: false + } +}; + function init() { mockItemWithMetadata = Object.assign( new ItemSearchResult(), @@ -109,6 +122,7 @@ describe('PersonSearchResultListElementSubmissionComponent', () => { { provide: DSOChangeAnalyzer, useValue: {} }, { provide: DefaultChangeAnalyzer, useValue: {} }, { provide: BitstreamDataService, useValue: mockBitstreamDataService }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] @@ -146,4 +160,72 @@ describe('PersonSearchResultListElementSubmissionComponent', () => { expect(jobTitleField).toBeNull(); }); }); + + describe('When the environment is set to show thumbnails', () => { + beforeEach(() => { + personListElementComponent.object = mockItemWithoutMetadata; + fixture.detectChanges(); + }); + + it('should add the ds-thumbnail element', () => { + const thumbnail = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnail).toBeTruthy(); + }); + }); +}); + +describe('PersonSearchResultListElementSubmissionComponent', () => { + const mockBitstreamDataService = { + getThumbnailFor(item: Item): Observable> { + return createSuccessfulRemoteDataObject$(new Bitstream()); + } + }; + beforeEach(waitForAsync(() => { + init(); + TestBed.configureTestingModule({ + declarations: [PersonSearchResultListSubmissionElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: {} }, + { provide: RelationshipDataService, useValue: mockRelationshipService }, + { provide: NotificationsService, useValue: {} }, + { provide: TranslateService, useValue: {} }, + { provide: NgbModal, useValue: {} }, + { provide: ItemDataService, useValue: {} }, + { provide: SelectableListService, useValue: {} }, + { provide: Store, useValue: {}}, + { provide: ObjectCacheService, useValue: {} }, + { provide: UUIDService, useValue: {} }, + { provide: RemoteDataBuildService, useValue: {} }, + { provide: CommunityDataService, useValue: {} }, + { provide: HALEndpointService, useValue: {} }, + { provide: HttpClient, useValue: {} }, + { provide: DSOChangeAnalyzer, useValue: {} }, + { provide: DefaultChangeAnalyzer, useValue: {} }, + { provide: BitstreamDataService, useValue: mockBitstreamDataService }, + { provide: APP_CONFIG, useValue: enviromentNoThumbs } + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(PersonSearchResultListSubmissionElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(PersonSearchResultListSubmissionElementComponent); + personListElementComponent = fixture.componentInstance; + + })); + + describe('When the environment is not set to show thumbnails', () => { + beforeEach(() => { + personListElementComponent.object = mockItemWithoutMetadata; + fixture.detectChanges(); + }); + + it('should not add the ds-thumbnail element', () => { + const thumbnail = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnail).toBeNull(); + }); + }); }); diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts index 395b275f69..7d761c42dd 100644 --- a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts +++ b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Inject, OnInit } from '@angular/core'; import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; import { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component'; import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; @@ -17,6 +17,7 @@ import { MetadataValue } from '../../../../../core/shared/metadata.models'; import { ItemDataService } from '../../../../../core/data/item-data.service'; import { SelectableListService } from '../../../../../shared/object-list/selectable-list/selectable-list.service'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface'; @listableObjectComponent('PersonSearchResult', ViewMode.ListElement, Context.EntitySearchModalWithNameVariants) @Component({ @@ -33,6 +34,11 @@ export class PersonSearchResultListSubmissionElementComponent extends SearchResu selectedName: string; alternativeField = 'dc.title.alternative'; + /** + * Display thumbnail if required by configuration + */ + showThumbnails: boolean; + constructor(protected truncatableService: TruncatableService, private relationshipService: RelationshipDataService, private notificationsService: NotificationsService, @@ -41,14 +47,15 @@ export class PersonSearchResultListSubmissionElementComponent extends SearchResu private itemDataService: ItemDataService, private bitstreamDataService: BitstreamDataService, private selectableListService: SelectableListService, - protected dsoNameService: DSONameService + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig ) { - super(truncatableService, dsoNameService); + super(truncatableService, dsoNameService, appConfig); } ngOnInit() { super.ngOnInit(); - const defaultValue = this.firstMetadataValue('person.familyName') + ', ' + this.firstMetadataValue('person.givenName'); + const defaultValue = this.dsoTitle; const alternatives = this.allMetadataValues(this.alternativeField); this.allSuggestions = [defaultValue, ...alternatives]; @@ -58,6 +65,7 @@ export class PersonSearchResultListSubmissionElementComponent extends SearchResu this.selectedName = nameVariant || defaultValue; } ); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; } select(value) { diff --git a/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts b/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts index 76c5717bb8..4cd663f0fb 100644 --- a/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts +++ b/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts @@ -31,6 +31,7 @@ import { SearchConfigurationServiceStub } from '../../../../shared/testing/searc import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; import { Router } from '@angular/router'; import { RouterMock } from '../../../../shared/mocks/router.mock'; +import { APP_CONFIG } from '../../../../../config/app-config.interface'; let comp: EditRelationshipListComponent; let fixture: ComponentFixture; @@ -201,6 +202,12 @@ describe('EditRelationshipListComponent', () => { })) }); + const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } + }; + TestBed.configureTestingModule({ imports: [SharedModule, TranslateModule.forRoot()], declarations: [EditRelationshipListComponent], @@ -217,6 +224,7 @@ describe('EditRelationshipListComponent', () => { { provide: LinkHeadService, useValue: linkHeadService }, { provide: ConfigurationDataService, useValue: configurationDataService }, { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [ NO_ERRORS_SCHEMA ] @@ -259,9 +267,11 @@ describe('EditRelationshipListComponent', () => { const callArgs = relationshipService.getItemRelationshipsByLabel.calls.mostRecent().args; const findListOptions = callArgs[2]; - + const linksToFollow = callArgs[5]; expect(findListOptions.elementsPerPage).toEqual(paginationOptions.pageSize); expect(findListOptions.currentPage).toEqual(paginationOptions.currentPage); + expect(linksToFollow.linksToFollow[0].name).toEqual('thumbnail'); + }); describe('when the publication is on the left side of the relationship', () => { diff --git a/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.ts b/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.ts index f5a5a583d7..b8542f5806 100644 --- a/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.ts +++ b/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Inject, Input, OnDestroy, OnInit, Output } from '@angular/core'; import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { ObjectUpdatesService } from '../../../../core/data/object-updates/object-updates.service'; @@ -29,7 +29,7 @@ import { DsDynamicLookupRelationModalComponent } from '../../../../shared/form/b import { RelationshipOptions } from '../../../../shared/form/builder/models/relationship-options.model'; import { SelectableListService } from '../../../../shared/object-list/selectable-list/selectable-list.service'; import { SearchResult } from '../../../../shared/search/models/search-result.model'; -import { followLink } from '../../../../shared/utils/follow-link-config.model'; +import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../../core/data/paginated-list.model'; import { RemoteData } from '../../../../core/data/remote-data'; import { Collection } from '../../../../core/shared/collection.model'; @@ -39,6 +39,8 @@ import { RelationshipTypeDataService } from '../../../../core/data/relationship- import { FieldUpdate } from '../../../../core/data/object-updates/field-update.model'; import { FieldUpdates } from '../../../../core/data/object-updates/field-updates.model'; import { FieldChangeType } from '../../../../core/data/object-updates/field-change-type.model'; +import { APP_CONFIG, AppConfig } from '../../../../../config/app-config.interface'; +import { itemLinksToFollow } from '../../../../shared/utils/relation-query.utils'; @Component({ selector: 'ds-edit-relationship-list', @@ -138,6 +140,10 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy { */ modalRef: NgbModalRef; + /** + * Determines whether to ask for the embedded item thumbnail. + */ + fetchThumbnail: boolean; constructor( protected objectUpdatesService: ObjectUpdatesService, @@ -147,7 +153,9 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy { protected modalService: NgbModal, protected paginationService: PaginationService, protected selectableListService: SelectableListService, + @Inject(APP_CONFIG) protected appConfig: AppConfig ) { + this.fetchThumbnail = this.appConfig.browseBy.showThumbnails; } /** @@ -484,6 +492,9 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy { tap(() => this.loading$.next(true)) ); + // this adds thumbnail images when required by configuration + let linksToFollow: FollowLinkConfig[] = itemLinksToFollow(this.fetchThumbnail); + this.subs.push( observableCombineLatest([ currentPagination$, @@ -496,12 +507,11 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy { currentItemIsLeftItem ? this.relationshipType.leftwardType : this.relationshipType.rightwardType, { elementsPerPage: currentPagination.pageSize, - currentPage: currentPagination.currentPage, + currentPage: currentPagination.currentPage }, false, true, - followLink('leftItem'), - followLink('rightItem'), + ...linksToFollow )), ).subscribe((rd: RemoteData>) => { this.relationshipsRd$.next(rd); diff --git a/src/app/item-page/item-page.module.ts b/src/app/item-page/item-page.module.ts index cbb9f3299e..c4e86a37fb 100644 --- a/src/app/item-page/item-page.module.ts +++ b/src/app/item-page/item-page.module.ts @@ -16,9 +16,6 @@ import { ItemPageAbstractFieldComponent } from './simple/field-components/specific-field/abstract/item-page-abstract-field.component'; import { ItemPageUriFieldComponent } from './simple/field-components/specific-field/uri/item-page-uri-field.component'; -import { - ItemPageTitleFieldComponent -} from './simple/field-components/specific-field/title/item-page-title-field.component'; import { ItemPageFieldComponent } from './simple/field-components/specific-field/item-page-field.component'; import { CollectionsComponent } from './field-components/collections/collections.component'; import { FullItemPageComponent } from './full/full-item-page.component'; @@ -68,7 +65,6 @@ const DECLARATIONS = [ ItemPageDateFieldComponent, ItemPageAbstractFieldComponent, ItemPageUriFieldComponent, - ItemPageTitleFieldComponent, ItemPageFieldComponent, CollectionsComponent, FullFileSectionComponent, diff --git a/src/app/item-page/simple/abstract-incremental-list/abstract-incremental-list.component.ts b/src/app/item-page/simple/abstract-incremental-list/abstract-incremental-list.component.ts index c965648c15..e788e6e575 100644 --- a/src/app/item-page/simple/abstract-incremental-list/abstract-incremental-list.component.ts +++ b/src/app/item-page/simple/abstract-incremental-list/abstract-incremental-list.component.ts @@ -10,6 +10,7 @@ import { hasValue, isNotEmpty } from '../../../shared/empty.util'; * An abstract component for displaying an incremental list of objects */ export class AbstractIncrementalListComponent implements OnInit, OnDestroy { + /** * The amount to increment the list by * Define this amount in the child component overriding this component @@ -21,6 +22,11 @@ export class AbstractIncrementalListComponent implements OnInit, OnDestroy { */ objects: T[]; + /** + * Placeholder css class (defined in global-styles) + */ + placeholderFontClass: string; + /** * A list of open subscriptions */ diff --git a/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.html b/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.html index 12987dc6d3..15960bdc9d 100644 --- a/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.html +++ b/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.html @@ -1,6 +1,6 @@

-
+
{{ type.toLowerCase() + '.page.titleprefix' | translate }}
- + {{ dsoNameService.getName(item) }}

diff --git a/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts b/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts index c67d8bcf62..a8d9e8ad8e 100644 --- a/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts @@ -1,34 +1,25 @@ import { Component, Input } from '@angular/core'; import { Item } from '../../../../../core/shared/item.model'; -import { ItemPageFieldComponent } from '../item-page-field.component'; +import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; @Component({ - selector: 'ds-item-page-title-field', - templateUrl: './item-page-title-field.component.html' + selector: 'ds-item-page-title-field', + templateUrl: './item-page-title-field.component.html' }) /** - * This component is used for displaying the title (dc.title) of an item + * This component is used for displaying the title (defined by the {@link DSONameService}) of an item */ -export class ItemPageTitleFieldComponent extends ItemPageFieldComponent { +export class ItemPageTitleFieldComponent { - /** - * The item to display metadata for - */ - @Input() item: Item; + /** + * The item to display metadata for + */ + @Input() item: Item; - /** - * Separator string between multiple values of the metadata fields defined - * @type {string} - */ - separator: string; - - /** - * Fields (schema.element.qualifier) used to render their values. - * In this component, we want to display values for metadata 'dc.title' - */ - fields: string[] = [ - 'dc.title' - ]; + constructor( + public dsoNameService: DSONameService, + ) { + } } diff --git a/src/app/item-page/simple/item-types/publication/publication.component.html b/src/app/item-page/simple/item-types/publication/publication.component.html index d83202ce12..392d5ddd0c 100644 --- a/src/app/item-page/simple/item-types/publication/publication.component.html +++ b/src/app/item-page/simple/item-types/publication/publication.component.html @@ -8,9 +8,8 @@
-

- {{'publication.page.titleprefix' | translate}} -

+ +
-
+
-

- -

+ +
>>> { + /** * The parent of the list of related items to display */ @@ -53,8 +57,28 @@ export class RelatedItemsComponent extends AbstractIncrementalListComponent>> { - return this.relationshipService.getRelatedItemsByLabel(this.parentItem, this.relationType, Object.assign(this.options, { elementsPerPage: this.incrementBy, currentPage: page })); + return this.relationshipService.getRelatedItemsByLabel(this.parentItem, this.relationType, Object.assign(this.options, + { elementsPerPage: this.incrementBy, currentPage: page, fetchThumbnail: this.fetchThumbnail })); } } diff --git a/src/app/item-page/simple/related-items/related-items.component.html b/src/app/item-page/simple/related-items/related-items.component.html index 2a43ae90dc..0d1e14941d 100644 --- a/src/app/item-page/simple/related-items/related-items.component.html +++ b/src/app/item-page/simple/related-items/related-items.component.html @@ -1,4 +1,4 @@ - + { let comp: RelatedItemsComponent; let fixture: ComponentFixture; @@ -45,7 +58,8 @@ describe('RelatedItemsComponent', () => { imports: [TranslateModule.forRoot()], declarations: [RelatedItemsComponent, VarDirective], providers: [ - { provide: RelationshipDataService, useValue: relationshipService } + { provide: RelationshipDataService, useValue: relationshipService }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(RelatedItemsComponent, { @@ -82,9 +96,11 @@ describe('RelatedItemsComponent', () => { it('should call relationship-service\'s getRelatedItemsByLabel with the correct arguments (second page)', () => { expect(relationshipService.getRelatedItemsByLabel).toHaveBeenCalledWith(parentItem, relationType, Object.assign(comp.options, { elementsPerPage: comp.incrementBy, - currentPage: 2 + currentPage: 2, + fetchThumbnail: true })); }); + }); describe('when decrease is called', () => { @@ -100,3 +116,42 @@ describe('RelatedItemsComponent', () => { }); }); +describe('RelatedItemsComponent', () => { + let comp: RelatedItemsComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + relationshipService = jasmine.createSpyObj('relationshipService', + { + getRelatedItemsByLabel: createSuccessfulRemoteDataObject$(createPaginatedList(mockItems)), + } + ); + + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot()], + declarations: [RelatedItemsComponent, VarDirective], + providers: [ + {provide: RelationshipDataService, useValue: relationshipService}, + {provide: APP_CONFIG, useValue: enviromentNoThumbs} + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(RelatedItemsComponent, { + set: {changeDetection: ChangeDetectionStrategy.Default} + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(RelatedItemsComponent); + comp = fixture.componentInstance; + comp.parentItem = parentItem; + comp.relationType = relationType; + fixture.detectChanges(); + })); + it('should call relationship-service\'s getRelatedItemsByLabel with the correct arguments (second page)', () => { + expect(relationshipService.getRelatedItemsByLabel).toHaveBeenCalledWith(parentItem, relationType, Object.assign(comp.options, { + elementsPerPage: comp.incrementBy, + currentPage: 2, + fetchThumbnail: false + })); + }); +}); diff --git a/src/app/page-error/themed-page-error.component.ts b/src/app/page-error/themed-page-error.component.ts index 34d29fb2a9..3bfc6bf1a1 100644 --- a/src/app/page-error/themed-page-error.component.ts +++ b/src/app/page-error/themed-page-error.component.ts @@ -6,7 +6,7 @@ import { PageErrorComponent } from './page-error.component'; * Themed wrapper for PageErrorComponent */ @Component({ - selector: 'ds-themed-search-page', + selector: 'ds-themed-page-error', styleUrls: [], templateUrl: '../shared/theme-support/themed.component.html', }) diff --git a/src/app/page-internal-server-error/themed-page-internal-server-error.component.ts b/src/app/page-internal-server-error/themed-page-internal-server-error.component.ts index e8792c4789..a5f9101b69 100644 --- a/src/app/page-internal-server-error/themed-page-internal-server-error.component.ts +++ b/src/app/page-internal-server-error/themed-page-internal-server-error.component.ts @@ -6,7 +6,7 @@ import { PageInternalServerErrorComponent } from './page-internal-server-error.c * Themed wrapper for PageInternalServerErrorComponent */ @Component({ - selector: 'ds-themed-search-page', + selector: 'ds-themed-page-internal-server-error', styleUrls: [], templateUrl: '../shared/theme-support/themed.component.html', }) diff --git a/src/app/pagenotfound/themed-pagenotfound.component.ts b/src/app/pagenotfound/themed-pagenotfound.component.ts index e6ef9eb700..3d284b1d6d 100644 --- a/src/app/pagenotfound/themed-pagenotfound.component.ts +++ b/src/app/pagenotfound/themed-pagenotfound.component.ts @@ -6,7 +6,7 @@ import { PageNotFoundComponent } from './pagenotfound.component'; * Themed wrapper for PageNotFoundComponent */ @Component({ - selector: 'ds-themed-search-page', + selector: 'ds-themed-pagenotfound', styleUrls: [], templateUrl: '../shared/theme-support/themed.component.html', }) diff --git a/src/app/shared/browse-by/browse-by.component.spec.ts b/src/app/shared/browse-by/browse-by.component.spec.ts index 720c6b2686..2a679035f6 100644 --- a/src/app/shared/browse-by/browse-by.component.spec.ts +++ b/src/app/shared/browse-by/browse-by.component.spec.ts @@ -132,7 +132,7 @@ describe('BrowseByComponent', () => { { provide: PaginationService, useValue: paginationService }, { provide: MockThemedBrowseEntryListElementComponent }, { provide: ThemeService, useValue: themeService }, - {provide: RouteService, useValue: routeServiceStub}, + { provide: RouteService, useValue: routeServiceStub}, { provide: SelectableListService, useValue: {} }, { provide: HostWindowService, useValue: new HostWindowServiceStub(800) }, ], diff --git a/src/app/shared/loading/loading.component.html b/src/app/shared/loading/loading.component.html index efec4e597e..bb407098d7 100644 --- a/src/app/shared/loading/loading.component.html +++ b/src/app/shared/loading/loading.component.html @@ -1,4 +1,4 @@ -
+
@@ -13,3 +13,6 @@
+
+ {{ message }} +
diff --git a/src/app/shared/loading/loading.component.scss b/src/app/shared/loading/loading.component.scss index e2287cdc8b..a86778c9b5 100644 --- a/src/app/shared/loading/loading.component.scss +++ b/src/app/shared/loading/loading.component.scss @@ -3,7 +3,7 @@ } span { - display: block; + display: block; margin: 0 auto; } @@ -13,11 +13,11 @@ span[class*="l-"] { background: #000; display: inline-block; margin: 12px 2px; - + border-radius: 100%; -webkit-border-radius: 100%; -moz-border-radius: 100%; - + -webkit-animation: loader 2s infinite; -webkit-animation-timing-function: cubic-bezier(0.030, 0.615, 0.995, 0.415); -webkit-animation-fill-mode: both; @@ -71,3 +71,7 @@ span.l-10 {-webkit-animation-delay: 0s;animation-delay: 0s;-ms-animation-delay: 50% {-ms-transform: translateX(30px); opacity: 0;} 100% {opacity: 0;} } + +.spinner { + color: var(--bs-gray-600); +} diff --git a/src/app/shared/loading/loading.component.ts b/src/app/shared/loading/loading.component.ts index d617d8c7a4..e64d89620b 100644 --- a/src/app/shared/loading/loading.component.ts +++ b/src/app/shared/loading/loading.component.ts @@ -15,6 +15,11 @@ export class LoadingComponent implements OnDestroy, OnInit { @Input() message: string; @Input() showMessage = true; + /** + * Show a more compact spinner animation instead of the default one + */ + @Input() spinner = false; + private subscription: Subscription; constructor(private translate: TranslateService) { diff --git a/src/app/shared/loading/themed-loading.component.ts b/src/app/shared/loading/themed-loading.component.ts index 0f887a025f..ffdf9d3cbe 100644 --- a/src/app/shared/loading/themed-loading.component.ts +++ b/src/app/shared/loading/themed-loading.component.ts @@ -15,8 +15,9 @@ export class ThemedLoadingComponent extends ThemedComponent { @Input() message: string; @Input() showMessage = true; + @Input() spinner = false; - protected inAndOutputNames: (keyof LoadingComponent & keyof this)[] = ['message', 'showMessage']; + protected inAndOutputNames: (keyof LoadingComponent & keyof this)[] = ['message', 'showMessage', 'spinner']; constructor( protected resolver: ComponentFactoryResolver, diff --git a/src/app/shared/object-collection/object-collection.component.html b/src/app/shared/object-collection/object-collection.component.html index 999ae9a120..eb72d07fe5 100644 --- a/src/app/shared/object-collection/object-collection.component.html +++ b/src/app/shared/object-collection/object-collection.component.html @@ -1,4 +1,4 @@ - { expect(fixture.debugElement.query(By.css('ds-object-list'))).toBeDefined(); expect(fixture.debugElement.query(By.css('ds-object-grid'))).toBeNull(); }); + it('should set fallback placeholder font size during test', () => { + objectCollectionComponent.currentMode$ = observableOf(ViewMode.ListElement); + expect(fixture.debugElement.query(By.css('thumb-font-3'))).toBeDefined(); + }); }); diff --git a/src/app/shared/object-collection/object-collection.component.ts b/src/app/shared/object-collection/object-collection.component.ts index f2706f1a4c..3c3de72d21 100644 --- a/src/app/shared/object-collection/object-collection.component.ts +++ b/src/app/shared/object-collection/object-collection.component.ts @@ -1,4 +1,11 @@ -import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { + ChangeDetectorRef, + Component, ElementRef, + EventEmitter, Inject, + Input, + OnInit, + Output, PLATFORM_ID, +} from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { Observable } from 'rxjs'; @@ -14,6 +21,8 @@ import { ViewMode } from '../../core/shared/view-mode.model'; import { CollectionElementLinkType } from './collection-element-link.type'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { Context } from '../../core/shared/context.model'; +import { setPlaceHolderAttributes } from '../utils/object-list-utils'; +import { isPlatformBrowser } from '@angular/common'; /** * Component that can render a list of listable objects in different view modes @@ -147,14 +156,13 @@ export class ObjectCollectionComponent implements OnInit { */ viewModeEnum = ViewMode; - ngOnInit(): void { - this.currentMode$ = this.route - .queryParams - .pipe( - map((params) => isEmpty(params?.view) ? ViewMode.ListElement : params.view), - distinctUntilChanged() - ); - } + /** + * Placeholder class (defined in global-styles) + */ + placeholderFontClass: string; + + + /** * @param cdRef @@ -163,11 +171,30 @@ export class ObjectCollectionComponent implements OnInit { * Route is a singleton service provided by Angular. * @param router * Router is a singleton service provided by Angular. + * @param elementRef + * Used only to read DOM for the element width */ constructor( private cdRef: ChangeDetectorRef, private route: ActivatedRoute, - private router: Router) { + private router: Router, + private elementRef: ElementRef, + @Inject(PLATFORM_ID) private platformId: Object) { + } + + ngOnInit(): void { + this.currentMode$ = this.route + .queryParams + .pipe( + map((params) => isEmpty(params?.view) ? ViewMode.ListElement : params.view), + distinctUntilChanged() + ); + if (isPlatformBrowser(this.platformId)) { + const width = this.elementRef.nativeElement.offsetWidth; + this.placeholderFontClass = setPlaceHolderAttributes(width); + } else { + this.placeholderFontClass = 'hide-placeholder-text'; + } } /** diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html index 61e2955deb..c9c2da5c2e 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html @@ -3,10 +3,8 @@
-

- - {{('mydspace.results.no-title' | translate)}} -

+ +
diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html index 91fb85be40..c7e7e2d056 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html @@ -20,7 +20,7 @@ -

+

diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts index a628c1e7e8..b5f9c016e4 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts @@ -1,11 +1,16 @@ import { Component } from '@angular/core'; import { focusShadow } from '../../../../animations/focus'; import { ViewMode } from '../../../../../core/shared/view-mode.model'; -import { listableObjectComponent } from '../../../../object-collection/shared/listable-object/listable-object.decorator'; +import { + listableObjectComponent +} from '../../../../object-collection/shared/listable-object/listable-object.decorator'; import { SearchResultGridElementComponent } from '../../search-result-grid-element.component'; import { Item } from '../../../../../core/shared/item.model'; import { ItemSearchResult } from '../../../../object-collection/shared/item-search-result.model'; import { getItemPageRoute } from '../../../../../item-page/item-page-routing-paths'; +import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; +import { TruncatableService } from '../../../../truncatable/truncatable.service'; +import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; @listableObjectComponent('PublicationSearchResult', ViewMode.GridElement) @listableObjectComponent(ItemSearchResult, ViewMode.GridElement) @@ -24,8 +29,19 @@ export class ItemSearchResultGridElementComponent extends SearchResultGridElemen */ itemPageRoute: string; + dsoTitle: string; + + constructor( + protected truncatableService: TruncatableService, + protected bitstreamDataService: BitstreamDataService, + private dsoNameService: DSONameService, + ) { + super(truncatableService, bitstreamDataService); + } + ngOnInit(): void { super.ngOnInit(); this.itemPageRoute = getItemPageRoute(this.dso); + this.dsoTitle = this.dsoNameService.getName(this.dso); } } diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.spec.ts index c2b106c76a..742d71c59e 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.spec.ts @@ -17,6 +17,8 @@ import { ClaimedApprovedTaskSearchResult } from '../../../../object-collection/s import { ClaimedApprovedSearchResultListElementComponent } from './claimed-approved-search-result-list-element.component'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; +import { environment } from '../../../../../../environments/environment'; let component: ClaimedApprovedSearchResultListElementComponent; let fixture: ComponentFixture; @@ -67,7 +69,8 @@ describe('ClaimedApprovedSearchResultListElementComponent', () => { providers: [ { provide: TruncatableService, useValue: {} }, { provide: LinkService, useValue: linkService }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environment } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ClaimedApprovedSearchResultListElementComponent, { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.ts index eaf407d787..5dda0e44ea 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-approved-search-result/claimed-approved-search-result-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { ClaimedApprovedTaskSearchResult } from '../../../../object-collection/shared/claimed-approved-task-search-result.model'; import { listableObjectComponent } from '../../../../object-collection/shared/listable-object/listable-object.decorator'; @@ -13,6 +13,7 @@ import { SearchResultListElementComponent } from '../../../search-result-list-el import { ClaimedTaskSearchResult } from '../../../../object-collection/shared/claimed-task-search-result.model'; import { ClaimedTask } from '../../../../../core/tasks/models/claimed-task-object.model'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface'; /** * This component renders claimed task approved object for the search result in the list view. @@ -43,9 +44,10 @@ export class ClaimedApprovedSearchResultListElementComponent extends SearchResul public constructor( protected linkService: LinkService, protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig ) { - super(truncatableService, dsoNameService); + super(truncatableService, dsoNameService, appConfig); } /** diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declided-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declided-search-result-list-element.component.spec.ts index 15b5a5345d..16ed3d7f41 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declided-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declided-search-result-list-element.component.spec.ts @@ -17,6 +17,8 @@ import { LinkService } from '../../../../../core/cache/builders/link.service'; import { MyDspaceItemStatusType } from '../../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../config/app-config.interface'; +import { environment } from '../../../../../../environments/environment'; let component: ClaimedDeclinedSearchResultListElementComponent; let fixture: ComponentFixture; @@ -67,7 +69,8 @@ describe('ClaimedDeclinedSearchResultListElementComponent', () => { providers: [ { provide: TruncatableService, useValue: {} }, { provide: LinkService, useValue: linkService }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environment } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ClaimedDeclinedSearchResultListElementComponent, { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declined-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declined-search-result-list-element.component.ts index 0b9a925dbf..90f523a7fb 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declined-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-declined-search-result/claimed-declined-search-result-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { listableObjectComponent } from '../../../../object-collection/shared/listable-object/listable-object.decorator'; import { ClaimedDeclinedTaskSearchResult } from '../../../../object-collection/shared/claimed-declined-task-search-result.model'; @@ -14,6 +14,7 @@ import { SearchResultListElementComponent } from '../../../search-result-list-el import { ClaimedTaskSearchResult } from '../../../../object-collection/shared/claimed-task-search-result.model'; import { ClaimedTask } from '../../../../../core/tasks/models/claimed-task-object.model'; import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface'; /** * This component renders claimed task declined object for the search result in the list view. @@ -44,9 +45,10 @@ export class ClaimedDeclinedSearchResultListElementComponent extends SearchResul public constructor( protected linkService: LinkService, protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig ) { - super(truncatableService, dsoNameService); + super(truncatableService, dsoNameService, appConfig); } /** diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts index 7896061a73..24cacb79a9 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts @@ -18,6 +18,8 @@ import { getMockLinkService } from '../../../mocks/link-service.mock'; import { By } from '@angular/platform-browser'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../config/app-config.interface'; +import { environment } from '../../../../../environments/environment'; let component: ClaimedSearchResultListElementComponent; let fixture: ComponentFixture; @@ -68,7 +70,8 @@ describe('ClaimedSearchResultListElementComponent', () => { providers: [ { provide: TruncatableService, useValue: {} }, { provide: LinkService, useValue: linkService }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environment } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ClaimedSearchResultListElementComponent, { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts index 2cf8f9a231..27e5831c39 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator'; @@ -13,6 +13,7 @@ import { followLink } from '../../../utils/follow-link-config.model'; import { SearchResultListElementComponent } from '../../search-result-list-element/search-result-list-element.component'; import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../../config/app-config.interface'; @Component({ selector: 'ds-claimed-search-result-list-element', @@ -40,9 +41,10 @@ export class ClaimedSearchResultListElementComponent extends SearchResultListEle public constructor( protected linkService: LinkService, protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig ) { - super(truncatableService, dsoNameService); + super(truncatableService, dsoNameService, appConfig); } /** diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html index 78181dc65a..d2db0ba209 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html @@ -1,23 +1,32 @@ -

- - - -
- - +
+
+ +
- -

-
+
+
+ + + +
+ + +
+ +

+
( - ) + ) - {{'mydspace.results.no-authors' | translate}} - + {{'mydspace.results.no-authors' | translate}} + ; @@ -26,12 +35,14 @@ - + - + +
+
+
- - +
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.spec.ts index 023b51a8dd..aaddebd8eb 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.spec.ts @@ -10,6 +10,7 @@ import { ItemListPreviewComponent } from './item-list-preview.component'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { TranslateLoaderMock } from '../../../mocks/translate-loader.mock'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { APP_CONFIG } from '../../../../../config/app-config.interface'; let component: ItemListPreviewComponent; let fixture: ComponentFixture; @@ -66,6 +67,18 @@ const mockItemWithEntityType: Item = Object.assign(new Item(), { } }); +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + +const enviromentNoThumbs = { + browseBy: { + showThumbnails: false + } +}; + describe('ItemListPreviewComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ @@ -80,8 +93,8 @@ describe('ItemListPreviewComponent', () => { ], declarations: [ItemListPreviewComponent, TruncatePipe], providers: [ - { provide: 'objectElementProvider', useValue: { mockItemWithAuthorAndDate } } - + { provide: 'objectElementProvider', useValue: { mockItemWithAuthorAndDate }}, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] @@ -100,6 +113,17 @@ describe('ItemListPreviewComponent', () => { component.object = { hitHighlights: {} } as any; }); + describe('When showThumbnails is true', () => { + beforeEach(() => { + component.item = mockItemWithAuthorAndDate; + fixture.detectChanges(); + }); + it('should add the ds-thumbnail element', () => { + const thumbnail = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnail).toBeTruthy(); + }); + }); + describe('When the item has an author', () => { beforeEach(() => { component.item = mockItemWithAuthorAndDate; @@ -160,3 +184,48 @@ describe('ItemListPreviewComponent', () => { }); }); }); + +describe('ItemListPreviewComponent', () => { + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + NoopAnimationsModule + ], + declarations: [ItemListPreviewComponent, TruncatePipe], + providers: [ + {provide: 'objectElementProvider', useValue: {mockItemWithAuthorAndDate}}, + {provide: APP_CONFIG, useValue: enviromentNoThumbs} + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(ItemListPreviewComponent, { + set: {changeDetection: ChangeDetectionStrategy.Default} + }).compileComponents(); + })); + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(ItemListPreviewComponent); + component = fixture.componentInstance; + + })); + + beforeEach(() => { + component.object = { hitHighlights: {} } as any; + }); + + describe('When showThumbnails is true', () => { + beforeEach(() => { + component.item = mockItemWithAuthorAndDate; + fixture.detectChanges(); + }); + it('should add the ds-thumbnail element', () => { + const thumbnail = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnail).toBeFalsy(); + }); + }); +}); diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts index 34b2d979c1..04f1e24d7b 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts @@ -1,9 +1,13 @@ -import { Component, Input } from '@angular/core'; +import { Component, Inject, Input, OnInit } from '@angular/core'; import { Item } from '../../../../core/shared/item.model'; import { fadeInOut } from '../../../animations/fade'; -import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; +import { + MyDspaceItemStatusType +} from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { SearchResult } from '../../../search/models/search-result.model'; +import { APP_CONFIG, AppConfig } from '../../../../../config/app-config.interface'; +import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; /** * This component show metadata for the given item object in the list view. @@ -14,7 +18,7 @@ import { SearchResult } from '../../../search/models/search-result.model'; templateUrl: 'item-list-preview.component.html', animations: [fadeInOut] }) -export class ItemListPreviewComponent { +export class ItemListPreviewComponent implements OnInit { /** * The item to display @@ -35,4 +39,24 @@ export class ItemListPreviewComponent { * A boolean representing if to show submitter information */ @Input() showSubmitter = false; + + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + + dsoTitle: string; + + constructor( + @Inject(APP_CONFIG) protected appConfig: AppConfig, + private dsoNameService: DSONameService, + ) { + } + + ngOnInit(): void { + this.showThumbnails = this.appConfig.browseBy.showThumbnails; + this.dsoTitle = this.dsoNameService.getName(this.item); + } + + } diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component.ts index 982a04207f..3fe825d236 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component.ts @@ -24,6 +24,7 @@ export class ThemedItemListPreviewComponent extends ThemedComponent - +
+
+ +
+
+ diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts index d1871d0996..1dc221f2ed 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts @@ -12,6 +12,8 @@ import { TruncatableService } from '../../../truncatable/truncatable.service'; import { By } from '@angular/platform-browser'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../config/app-config.interface'; +import { environment } from '../../../../../environments/environment'; let component: ItemSearchResultListElementSubmissionComponent; let fixture: ComponentFixture; @@ -56,7 +58,8 @@ describe('ItemMyDSpaceResultListElementComponent', () => { declarations: [ItemSearchResultListElementSubmissionComponent], providers: [ { provide: TruncatableService, useValue: {} }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environment } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ItemSearchResultListElementSubmissionComponent, { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.ts index 3ef45d1c47..26cbafc102 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.ts @@ -25,7 +25,13 @@ export class ItemSearchResultListElementSubmissionComponent extends SearchResult */ public status = MyDspaceItemStatusType.ARCHIVED; + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + ngOnInit() { super.ngOnInit(); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; } } diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.html index 346f9b249a..0fd27eb073 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.html @@ -4,5 +4,10 @@ [object]="object" [showSubmitter]="showSubmitter" [status]="status"> - +
+
+ +
+
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts index 18db9abd67..4f839a5d86 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts @@ -18,6 +18,7 @@ import { getMockLinkService } from '../../../mocks/link-service.mock'; import { By } from '@angular/platform-browser'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../config/app-config.interface'; let component: PoolSearchResultListElementComponent; let fixture: ComponentFixture; @@ -54,6 +55,13 @@ const item = Object.assign(new Item(), { ] } }); + +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + const rdItem = createSuccessfulRemoteDataObject(item); const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdItem) }); const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem); @@ -68,7 +76,8 @@ describe('PoolSearchResultListElementComponent', () => { providers: [ { provide: TruncatableService, useValue: {} }, { provide: LinkService, useValue: linkService }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(PoolSearchResultListElementComponent, { @@ -112,4 +121,9 @@ describe('PoolSearchResultListElementComponent', () => { expect(component.reloadedObject.emit).toHaveBeenCalledWith(actionPayload.reloadedObject); })); + + it('should add an offset to the actions element', () => { + const thumbnail = fixture.debugElement.query(By.css('.offset-3')); + expect(thumbnail).toBeTruthy(); + }); }); diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts index e9d64db572..71feeb6bdd 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Inject, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; @@ -14,6 +14,7 @@ import { TruncatableService } from '../../../truncatable/truncatable.service'; import { followLink } from '../../../utils/follow-link-config.model'; import { LinkService } from '../../../../core/cache/builders/link.service'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../../config/app-config.interface'; /** * This component renders pool task object for the search result in the list view. @@ -47,12 +48,18 @@ export class PoolSearchResultListElementComponent extends SearchResultListElemen */ public index: number; + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + constructor( protected linkService: LinkService, protected truncatableService: TruncatableService, - protected dsoNameService: DSONameService + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig ) { - super(truncatableService, dsoNameService); + super(truncatableService, dsoNameService, appConfig); } /** @@ -64,6 +71,7 @@ export class PoolSearchResultListElementComponent extends SearchResultListElemen followLink('item'), followLink('submitter') ), followLink('action')); this.workflowitemRD$ = this.dso.workflowitem as Observable>; + this.showThumbnails = this.appConfig.browseBy.showThumbnails; } } diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.html index 4a5f330f46..74a2433ba3 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.html @@ -3,9 +3,13 @@ [item]="item$ | async" [object]="object" [status]="status"> - - +
+
+ +
+
+ diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts index 61337b0cb3..0f051c3c4b 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts @@ -18,6 +18,7 @@ import { WorkflowItemSearchResultListElementComponent } from './workflow-item-se import { By } from '@angular/platform-browser'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../config/app-config.interface'; let component: WorkflowItemSearchResultListElementComponent; let fixture: ComponentFixture; @@ -54,6 +55,13 @@ const item = Object.assign(new Item(), { ] } }); + +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + const rd = createSuccessfulRemoteDataObject(item); mockResultObject.indexableObject = Object.assign(new WorkflowItem(), { item: observableOf(rd) }); @@ -69,7 +77,8 @@ describe('WorkflowItemSearchResultListElementComponent', () => { { provide: TruncatableService, useValue: {} }, { provide: ItemDataService, useValue: {} }, { provide: LinkService, useValue: linkService }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(WorkflowItemSearchResultListElementComponent, { @@ -110,4 +119,10 @@ describe('WorkflowItemSearchResultListElementComponent', () => { expect(component.reloadedObject.emit).toHaveBeenCalledWith(actionPayload.reloadedObject); })); + + it('should add an offset to the actions element', () => { + const thumbnail = fixture.debugElement.query(By.css('.offset-3')); + expect(thumbnail).toBeTruthy(); + }); + }); diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.ts index 836a3ee268..f123caf1ac 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { Observable } from 'rxjs'; import { find, map } from 'rxjs/operators'; @@ -16,6 +16,7 @@ import { TruncatableService } from '../../../truncatable/truncatable.service'; import { followLink } from '../../../utils/follow-link-config.model'; import { SearchResultListElementComponent } from '../../search-result-list-element/search-result-list-element.component'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../../config/app-config.interface'; /** * This component renders workflowitem object for the search result in the list view. @@ -39,12 +40,18 @@ export class WorkflowItemSearchResultListElementComponent extends SearchResultLi */ public status = MyDspaceItemStatusType.WORKFLOW; + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + constructor( protected truncatableService: TruncatableService, protected linkService: LinkService, - protected dsoNameService: DSONameService + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig ) { - super(truncatableService, dsoNameService); + super(truncatableService, dsoNameService, appConfig); } /** @@ -54,6 +61,7 @@ export class WorkflowItemSearchResultListElementComponent extends SearchResultLi super.ngOnInit(); this.linkService.resolveLink(this.dso, followLink('item')); this.initItem(this.dso.item as Observable> ); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; } /** diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.html b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.html index 07e8aaa75d..4781b87f01 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.html @@ -4,7 +4,11 @@ [object]="object" [status]="status"> - +
+
+ +
+
; @@ -54,6 +55,13 @@ const item = Object.assign(new Item(), { ] } }); + +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + const rd = createSuccessfulRemoteDataObject(item); mockResultObject.indexableObject = Object.assign(new WorkspaceItem(), { item: observableOf(rd) }); let linkService; @@ -68,7 +76,8 @@ describe('WorkspaceItemSearchResultListElementComponent', () => { { provide: TruncatableService, useValue: {} }, { provide: ItemDataService, useValue: {} }, { provide: LinkService, useValue: linkService }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(WorkspaceItemSearchResultListElementComponent, { @@ -110,4 +119,10 @@ describe('WorkspaceItemSearchResultListElementComponent', () => { expect(component.reloadedObject.emit).toHaveBeenCalledWith(actionPayload.reloadedObject); })); + + + it('should add an offset to the actions element', () => { + const thumbnail = fixture.debugElement.query(By.css('.offset-3')); + expect(thumbnail).toBeTruthy(); + }); }); diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.ts index 5edfc1929e..675cdef975 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { Observable } from 'rxjs'; import { find, map } from 'rxjs/operators'; @@ -16,6 +16,7 @@ import { TruncatableService } from '../../../truncatable/truncatable.service'; import { followLink } from '../../../utils/follow-link-config.model'; import { SearchResultListElementComponent } from '../../search-result-list-element/search-result-list-element.component'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../../config/app-config.interface'; /** * This component renders workspaceitem object for the search result in the list view. @@ -39,12 +40,18 @@ export class WorkspaceItemSearchResultListElementComponent extends SearchResultL */ status = MyDspaceItemStatusType.WORKSPACE; + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + constructor( protected truncatableService: TruncatableService, protected linkService: LinkService, - protected dsoNameService: DSONameService + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig: AppConfig ) { - super(truncatableService, dsoNameService); + super(truncatableService, dsoNameService, appConfig); } /** @@ -54,6 +61,7 @@ export class WorkspaceItemSearchResultListElementComponent extends SearchResultL super.ngOnInit(); this.linkService.resolveLink(this.dso, followLink('item')); this.initItem(this.dso.item as Observable>); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; } /** diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html index c98003cd1d..83a8f4fdfa 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html @@ -1,4 +1,9 @@ - - - -
+
+
+
+ + + +
+
+
diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts index bdfe825c82..e5ea60b35d 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts @@ -9,6 +9,7 @@ import { TruncatableService } from '../../../truncatable/truncatable.service'; import { CollectionSearchResult } from '../../../object-collection/shared/collection-search-result.model'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../config/app-config.interface'; let collectionSearchResultListElementComponent: CollectionSearchResultListElementComponent; let fixture: ComponentFixture; @@ -43,13 +44,20 @@ mockCollectionWithoutAbstract.indexableObject = Object.assign(new Collection(), } }); +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + describe('CollectionSearchResultListElementComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [CollectionSearchResultListElementComponent, TruncatePipe], providers: [ { provide: TruncatableService, useValue: truncatableServiceStub }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(CollectionSearchResultListElementComponent, { @@ -87,4 +95,11 @@ describe('CollectionSearchResultListElementComponent', () => { expect(collectionAbstractField).toBeNull(); }); }); + + describe('when environment is set to show thumbnail images', () => { + it('should offset content', () => { + const offset = fixture.debugElement.query(By.css('offset-md-2')); + }); + }); + }); diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts index 9e09068ddf..60415f649e 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts @@ -14,4 +14,16 @@ import { listableObjectComponent } from '../../../object-collection/shared/lista * Component representing a collection search result in list view */ @listableObjectComponent(CollectionSearchResult, ViewMode.ListElement) -export class CollectionSearchResultListElementComponent extends SearchResultListElementComponent {} +export class CollectionSearchResultListElementComponent extends SearchResultListElementComponent { + + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + + ngOnInit(): void { + super.ngOnInit(); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; + } + +} diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html index e0f0319ffc..22be357a53 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html @@ -1,4 +1,9 @@ - - - -
+
+
+
+ + + +
+
+
diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts index 529594671c..ce12f5f7da 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts @@ -9,6 +9,7 @@ import { TruncatableService } from '../../../truncatable/truncatable.service'; import { CommunitySearchResult } from '../../../object-collection/shared/community-search-result.model'; import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../config/app-config.interface'; let communitySearchResultListElementComponent: CommunitySearchResultListElementComponent; let fixture: ComponentFixture; @@ -43,13 +44,20 @@ mockCommunityWithoutAbstract.indexableObject = Object.assign(new Community(), { } }); +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; + describe('CommunitySearchResultListElementComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [CommunitySearchResultListElementComponent, TruncatePipe], providers: [ { provide: TruncatableService, useValue: truncatableServiceStub }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] @@ -88,4 +96,10 @@ describe('CommunitySearchResultListElementComponent', () => { expect(communityAbstractField).toBeNull(); }); }); + + describe('when environment is set to show thumbnail images', () => { + it('should offset content', () => { + const offset = fixture.debugElement.query(By.css('offset-md-2')); + }); + }); }); diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts index b2fd695b39..4cc25b8b76 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts @@ -15,5 +15,14 @@ import { listableObjectComponent } from '../../../object-collection/shared/lista */ @listableObjectComponent(CommunitySearchResult, ViewMode.ListElement) export class CommunitySearchResultListElementComponent extends SearchResultListElementComponent { + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + + ngOnInit(): void { + super.ngOnInit(); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; + } } diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html index 645cace8dc..90a6633980 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html @@ -1,15 +1,24 @@ -
- - -
- - +
+
- - + [routerLink]="[itemPageRoute]" class="dont-break-out"> + + + +
+
+
+ + +
+ + + + + ( @@ -23,9 +32,11 @@ -
+
+ [innerHTML]="firstMetadataValue('dc.description.abstract')"> -
- +
+
+
+
diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.spec.ts index d32ac8058d..d1e6c27ba4 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.spec.ts @@ -9,6 +9,7 @@ import { TruncatableService } from '../../../../../truncatable/truncatable.servi import { ItemSearchResult } from '../../../../../object-collection/shared/item-search-result.model'; import { DSONameService } from '../../../../../../core/breadcrumbs/dso-name.service'; import { DSONameServiceMock, UNDEFINED_NAME } from '../../../../../mocks/dso-name.service.mock'; +import { APP_CONFIG } from '../../../../../../../config/app-config.interface'; let publicationListElementComponent: ItemSearchResultListElementComponent; let fixture: ComponentFixture; @@ -59,14 +60,26 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign(new ItemSearchRe }) }); +const environmentUseThumbs = { + browseBy: { + showThumbnails: true + } +}; -describe('ItemListElementComponent', () => { +const enviromentNoThumbs = { + browseBy: { + showThumbnails: false + } +}; + +describe('ItemSearchResultListElementComponent', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [ItemSearchResultListElementComponent, TruncatePipe], providers: [ { provide: TruncatableService, useValue: {} }, - { provide: DSONameService, useClass: DSONameServiceMock } + { provide: DSONameService, useClass: DSONameServiceMock }, + { provide: APP_CONFIG, useValue: environmentUseThumbs } ], schemas: [NO_ERRORS_SCHEMA] @@ -81,6 +94,21 @@ describe('ItemListElementComponent', () => { })); + describe('with environment.browseBy.showThumbnails set to true', () => { + beforeEach(() => { + publicationListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + it('should set showThumbnails to true', () => { + expect(publicationListElementComponent.showThumbnails).toBeTrue(); + }); + + it('should add ds-thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeTruthy(); + }); + }); + describe('When the item has an author', () => { beforeEach(() => { publicationListElementComponent.object = mockItemWithMetadata; @@ -189,3 +217,39 @@ describe('ItemListElementComponent', () => { }); }); }); + +describe('ItemSearchResultListElementComponent', () => { + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ItemSearchResultListElementComponent, TruncatePipe], + providers: [ + {provide: TruncatableService, useValue: {}}, + {provide: DSONameService, useClass: DSONameServiceMock}, + { provide: APP_CONFIG, useValue: enviromentNoThumbs } + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(ItemSearchResultListElementComponent, { + set: {changeDetection: ChangeDetectionStrategy.Default} + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(ItemSearchResultListElementComponent); + publicationListElementComponent = fixture.componentInstance; + })); + + describe('with environment.browseBy.showThumbnails set to false', () => { + beforeEach(() => { + + publicationListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + + it('should not add ds-thumbnail element', () => { + const thumbnailElement = fixture.debugElement.query(By.css('ds-thumbnail')); + expect(thumbnailElement).toBeFalsy(); + }); + }); +}); diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts index b5eb64869d..f84ae642ad 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.ts @@ -22,8 +22,14 @@ export class ItemSearchResultListElementComponent extends SearchResultListElemen */ itemPageRoute: string; + /** + * Display thumbnails if required by configuration + */ + showThumbnails: boolean; + ngOnInit(): void { super.ngOnInit(); + this.showThumbnails = this.appConfig.browseBy.showThumbnails; this.itemPageRoute = getItemPageRoute(this.dso); } } diff --git a/src/app/shared/object-list/search-result-list-element/search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/search-result-list-element.component.ts index b85fb0a39f..72120a6b68 100644 --- a/src/app/shared/object-list/search-result-list-element/search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/search-result-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Inject, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { SearchResult } from '../../search/models/search-result.model'; @@ -8,6 +8,7 @@ import { AbstractListableElementComponent } from '../../object-collection/shared import { TruncatableService } from '../../truncatable/truncatable.service'; import { Metadata } from '../../../core/shared/metadata.utils'; import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { APP_CONFIG, AppConfig } from '../../../../config/app-config.interface'; @Component({ selector: 'ds-search-result-list-element', @@ -20,7 +21,9 @@ export class SearchResultListElementComponent, K exten dso: K; dsoTitle: string; - public constructor(protected truncatableService: TruncatableService, protected dsoNameService: DSONameService) { + public constructor(protected truncatableService: TruncatableService, + protected dsoNameService: DSONameService, + @Inject(APP_CONFIG) protected appConfig?: AppConfig) { super(); } diff --git a/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html b/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html index 6a13b7e362..040f528768 100644 --- a/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html +++ b/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.html @@ -2,10 +2,10 @@
- +
+ [innerHTML]="dsoTitle">
{ - expect(component.title).toEqual(expectedTitle); + expect(component.dsoTitle).toEqual(expectedTitle); }); it('should contain the correct description', () => { diff --git a/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.ts b/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.ts index 91f3ba6d88..c87559e11d 100644 --- a/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.ts +++ b/src/app/shared/object-list/sidebar-search-list-element/sidebar-search-list-element.component.ts @@ -28,11 +28,6 @@ export class SidebarSearchListElementComponent, K exte */ parentTitle$: Observable; - /** - * The title for the object to display - */ - title: string; - /** * A description to display below the title */ @@ -42,7 +37,7 @@ export class SidebarSearchListElementComponent, K exte protected linkService: LinkService, protected dsoNameService: DSONameService ) { - super(truncatableService, dsoNameService); + super(truncatableService, dsoNameService, null); } /** @@ -52,7 +47,6 @@ export class SidebarSearchListElementComponent, K exte super.ngOnInit(); if (hasValue(this.dso)) { this.parentTitle$ = this.getParentTitle(); - this.title = this.getTitle(); this.description = this.getDescription(); } } @@ -71,7 +65,7 @@ export class SidebarSearchListElementComponent, K exte getParentTitle(): Observable { return this.getParent().pipe( map((parentRD: RemoteData) => { - return hasValue(parentRD) && hasValue(parentRD.payload) ? parentRD.payload.firstMetadataValue('dc.title') : undefined; + return hasValue(parentRD) && hasValue(parentRD.payload) ? this.dsoNameService.getName(parentRD.payload) : undefined; }) ); } @@ -89,14 +83,6 @@ export class SidebarSearchListElementComponent, K exte return observableOf(undefined); } - /** - * Get the title of the object - * Default: "dc.title" - */ - getTitle(): string { - return this.firstMetadataValue('dc.title'); - } - /** * Get the description of the object * Default: "(dc.publisher, dc.date.issued) authors" diff --git a/src/app/shared/pagination/pagination.component.scss b/src/app/shared/pagination/pagination.component.scss index 755d916faa..dac826dc6d 100644 --- a/src/app/shared/pagination/pagination.component.scss +++ b/src/app/shared/pagination/pagination.component.scss @@ -5,4 +5,4 @@ .dropdown-item { padding-left: 20px; } -} \ No newline at end of file +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 5e78796e24..fc65fb6882 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -314,6 +314,9 @@ import { BrowserOnlyPipe } from './utils/browser-only.pipe'; import { ThemedLoadingComponent } from './loading/themed-loading.component'; import { PersonPageClaimButtonComponent } from './dso-page/person-page-claim-button/person-page-claim-button.component'; import { SearchExportCsvComponent } from './search/search-export-csv/search-export-csv.component'; +import { + ItemPageTitleFieldComponent +} from '../item-page/simple/field-components/specific-field/title/item-page-title-field.component'; const MODULES = [ CommonModule, @@ -495,7 +498,8 @@ const COMPONENTS = [ CollectionSidebarSearchListElementComponent, CommunitySidebarSearchListElementComponent, SearchNavbarComponent, - ScopeSelectorModalComponent + ScopeSelectorModalComponent, + ItemPageTitleFieldComponent, ]; const ENTRY_COMPONENTS = [ diff --git a/src/app/shared/testing/authorization-service.stub.ts b/src/app/shared/testing/authorization-service.stub.ts new file mode 100644 index 0000000000..253599233e --- /dev/null +++ b/src/app/shared/testing/authorization-service.stub.ts @@ -0,0 +1,8 @@ +import { Observable, of as observableOf } from 'rxjs'; +import { FeatureID } from '../../core/data/feature-authorization/feature-id'; + +export class AuthorizationDataServiceStub { + isAuthorized(featureId?: FeatureID, objectUrl?: string, ePersonUuid?: string): Observable { + return observableOf(false); + } +} diff --git a/src/app/shared/testing/file-service.stub.ts b/src/app/shared/testing/file-service.stub.ts new file mode 100644 index 0000000000..c675df83e1 --- /dev/null +++ b/src/app/shared/testing/file-service.stub.ts @@ -0,0 +1,7 @@ +import { of as observableOf } from 'rxjs'; + +export class FileServiceStub { + retrieveFileDownloadLink() { + return observableOf(null); + } +} diff --git a/src/app/shared/theme-support/theme.service.spec.ts b/src/app/shared/theme-support/theme.service.spec.ts index 43b5964b8c..f56fb86cbc 100644 --- a/src/app/shared/theme-support/theme.service.spec.ts +++ b/src/app/shared/theme-support/theme.service.spec.ts @@ -413,7 +413,7 @@ describe('ThemeService', () => { link.setAttribute('rel', 'stylesheet'); link.setAttribute('type', 'text/css'); link.setAttribute('class', 'theme-css'); - link.setAttribute('href', '/custom-theme.css'); + link.setAttribute('href', 'custom-theme.css'); expect(headSpy.appendChild).toHaveBeenCalledWith(link); }); diff --git a/src/app/shared/theme-support/theme.service.ts b/src/app/shared/theme-support/theme.service.ts index c0b04cd6b3..6d2939a5f8 100644 --- a/src/app/shared/theme-support/theme.service.ts +++ b/src/app/shared/theme-support/theme.service.ts @@ -182,7 +182,7 @@ export class ThemeService { link.setAttribute('rel', 'stylesheet'); link.setAttribute('type', 'text/css'); link.setAttribute('class', 'theme-css'); - link.setAttribute('href', `/${encodeURIComponent(themeName)}-theme.css`); + link.setAttribute('href', `${encodeURIComponent(themeName)}-theme.css`); // wait for the new css to download before removing the old one to prevent a // flash of unstyled content link.onload = () => { diff --git a/src/app/shared/utils/object-list-utils.ts b/src/app/shared/utils/object-list-utils.ts new file mode 100644 index 0000000000..cb7b6b739a --- /dev/null +++ b/src/app/shared/utils/object-list-utils.ts @@ -0,0 +1,15 @@ +/** + * Sets the class to be used for the "no thumbnail" + * placeholder font size in lists. + */ +export function setPlaceHolderAttributes(width: number): string { + if (width < 400) { + return 'thumb-font-0'; + } else if (width < 750) { + return 'thumb-font-1'; + } else if (width < 1000) { + return 'thumb-font-2'; + } else { + return 'thumb-font-3'; + } +} diff --git a/src/app/shared/utils/relation-query.utils.ts b/src/app/shared/utils/relation-query.utils.ts index 13248c5a6b..62a69075fc 100644 --- a/src/app/shared/utils/relation-query.utils.ts +++ b/src/app/shared/utils/relation-query.utils.ts @@ -1,3 +1,6 @@ +import { followLink, FollowLinkConfig } from './follow-link-config.model'; +import { Relationship } from '../../core/shared/item-relationships/relationship.model'; + /** * Get the query for looking up items by relation type * @param {string} relationType Relation type @@ -16,3 +19,21 @@ export function getQueryByRelations(relationType: string, itemUUID: string): str export function getFilterByRelation(relationType: string, itemUUID: string): string { return `f.${relationType}=${itemUUID},equals`; } + +/** + * Creates links to follow for the leftItem and rightItem. Links will include + * @param showThumbnail thumbnail image configuration + * @returns followLink array + */ +export function itemLinksToFollow(showThumbnail: boolean): FollowLinkConfig[] { + let linksToFollow: FollowLinkConfig[]; + if (showThumbnail) { + linksToFollow = [ + followLink('leftItem',{}, followLink('thumbnail')), + followLink('rightItem',{}, followLink('thumbnail')) + ]; + } else { + linksToFollow = [followLink('leftItem'), followLink('rightItem')]; + } + return linksToFollow; +} diff --git a/src/app/thumbnail/thumbnail.component.html b/src/app/thumbnail/thumbnail.component.html index aedfd95c5a..6a0516b0d4 100644 --- a/src/app/thumbnail/thumbnail.component.html +++ b/src/app/thumbnail/thumbnail.component.html @@ -1,14 +1,21 @@ -
- - text-content - - - -
-
-
{{ placeholder | translate }}
+
+
+
+
+
- +
+ + + +
+
+
+ {{ placeholder | translate }} +
+
+
+
diff --git a/src/app/thumbnail/thumbnail.component.scss b/src/app/thumbnail/thumbnail.component.scss index b15238afac..e9cb1a6cb5 100644 --- a/src/app/thumbnail/thumbnail.component.scss +++ b/src/app/thumbnail/thumbnail.component.scss @@ -26,6 +26,10 @@ img { border: var(--ds-thumbnail-placeholder-border); color: var(--ds-thumbnail-placeholder-color); font-weight: bold; + } + > .centered { + width: 100%; + height: 100%; display: flex; justify-content: center; align-items: center; diff --git a/src/app/thumbnail/thumbnail.component.spec.ts b/src/app/thumbnail/thumbnail.component.spec.ts index 11271ebeb4..5b313d61d4 100644 --- a/src/app/thumbnail/thumbnail.component.spec.ts +++ b/src/app/thumbnail/thumbnail.component.spec.ts @@ -3,12 +3,15 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Bitstream } from '../core/shared/bitstream.model'; import { SafeUrlPipe } from '../shared/utils/safe-url-pipe'; +import { of as observableOf } from 'rxjs'; import { ThumbnailComponent } from './thumbnail.component'; import { RemoteData } from '../core/data/remote-data'; -import { - createFailedRemoteDataObject, createPendingRemoteDataObject, createSuccessfulRemoteDataObject, -} from '../shared/remote-data.utils'; +import { createFailedRemoteDataObject, createSuccessfulRemoteDataObject } from '../shared/remote-data.utils'; +import { AuthService } from '../core/auth/auth.service'; +import { FileService } from '../core/shared/file.service'; +import { VarDirective } from '../shared/utils/var.directive'; +import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; // eslint-disable-next-line @angular-eslint/pipe-prefix @Pipe({ name: 'translate' }) @@ -18,143 +21,311 @@ class MockTranslatePipe implements PipeTransform { } } +const CONTENT = 'content.url'; + describe('ThumbnailComponent', () => { let comp: ThumbnailComponent; let fixture: ComponentFixture; let de: DebugElement; let el: HTMLElement; + let authService; + let authorizationService; + let fileService; beforeEach(waitForAsync(() => { + authService = jasmine.createSpyObj('AuthService', { + isAuthenticated: observableOf(true), + }); + authorizationService = jasmine.createSpyObj('AuthorizationService', { + isAuthorized: observableOf(true), + }); + fileService = jasmine.createSpyObj('FileService', { + retrieveFileDownloadLink: null + }); + fileService.retrieveFileDownloadLink.and.callFake((url) => observableOf(`${url}?authentication-token=fake`)); + TestBed.configureTestingModule({ - declarations: [ThumbnailComponent, SafeUrlPipe, MockTranslatePipe], + declarations: [ThumbnailComponent, SafeUrlPipe, MockTranslatePipe, VarDirective], + providers: [ + { provide: AuthService, useValue: authService }, + { provide: AuthorizationDataService, useValue: authorizationService }, + { provide: FileService, useValue: fileService } + ] }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(ThumbnailComponent); + fixture.detectChanges(); + + authService = TestBed.inject(AuthService); + comp = fixture.componentInstance; // ThumbnailComponent test instance de = fixture.debugElement.query(By.css('div.thumbnail')); el = de.nativeElement; }); - const withoutThumbnail = () => { - describe('and there is a default image', () => { - it('should display the default image', () => { - comp.src = 'http://bit.stream'; - comp.defaultImage = 'http://default.img'; - comp.errorHandler(); - expect(comp.src).toBe(comp.defaultImage); - }); - it('should include the alt text', () => { - comp.src = 'http://bit.stream'; - comp.defaultImage = 'http://default.img'; - comp.errorHandler(); - comp.ngOnChanges(); + describe('loading', () => { + it('should start out with isLoading$ true', () => { + expect(comp.isLoading$.getValue()).toBeTrue(); + }); + + it('should set isLoading$ to false once an image is successfully loaded', () => { + comp.setSrc('http://bit.stream'); + fixture.debugElement.query(By.css('img.thumbnail-content')).triggerEventHandler('load', new Event('load')); + expect(comp.isLoading$.getValue()).toBeFalse(); + }); + + it('should set isLoading$ to false once the src is set to null', () => { + comp.setSrc(null); + expect(comp.isLoading$.getValue()).toBeFalse(); + }); + + it('should show a loading animation while isLoading$ is true', () => { + expect(de.query(By.css('ds-themed-loading'))).toBeTruthy(); + + comp.isLoading$.next(false); + fixture.detectChanges(); + expect(fixture.debugElement.query(By.css('ds-themed-loading'))).toBeFalsy(); + }); + + describe('with a thumbnail image', () => { + beforeEach(() => { + comp.src$.next('https://bit.stream'); fixture.detectChanges(); - const image: HTMLElement = de.query(By.css('img')).nativeElement; - expect(image.getAttribute('alt')).toBe('TRANSLATED ' + comp.alt); + }); + + it('should render but hide the image while loading and show it once done', () => { + let img = fixture.debugElement.query(By.css('img.thumbnail-content')); + expect(img).toBeTruthy(); + expect(img.classes['d-none']).toBeTrue(); + + comp.isLoading$.next(false); + fixture.detectChanges(); + img = fixture.debugElement.query(By.css('img.thumbnail-content')); + expect(img).toBeTruthy(); + expect(img.classes['d-none']).toBeFalsy(); + }); + + }); + + describe('without a thumbnail image', () => { + beforeEach(() => { + comp.src$.next(null); + fixture.detectChanges(); + }); + + it('should only show the HTML placeholder once done loading', () => { + expect(fixture.debugElement.query(By.css('div.thumbnail-placeholder'))).toBeFalsy(); + + comp.isLoading$.next(false); + fixture.detectChanges(); + expect(fixture.debugElement.query(By.css('div.thumbnail-placeholder'))).toBeTruthy(); }); }); - describe('and there is no default image', () => { - it('should display the placeholder', () => { - comp.src = 'http://default.img'; - comp.errorHandler(); - expect(comp.src).toBe(null); - comp.ngOnChanges(); - fixture.detectChanges(); - const placeholder = fixture.debugElement.query(By.css('div.thumbnail-placeholder')).nativeElement; - expect(placeholder.innerHTML).toBe('TRANSLATED ' + comp.placeholder); + }); + + const errorHandler = () => { + let fallbackSpy; + + beforeEach(() => { + fallbackSpy = spyOn(comp, 'showFallback').and.callThrough(); + }); + + describe('retry with authentication token', () => { + beforeEach(() => { + // disconnect error handler to be sure it's only called once + const img = fixture.debugElement.query(By.css('img.thumbnail-content')); + img.nativeNode.onerror = null; + }); + + it('should remember that it already retried once', () => { + expect(comp.retriedWithToken).toBeFalse(); + comp.errorHandler(); + expect(comp.retriedWithToken).toBeTrue(); + }); + + describe('if not logged in', () => { + beforeEach(() => { + authService.isAuthenticated.and.returnValue(observableOf(false)); + }); + + it('should fall back to default', () => { + comp.errorHandler(); + expect(fallbackSpy).toHaveBeenCalled(); + }); + }); + + describe('if logged in', () => { + beforeEach(() => { + authService.isAuthenticated.and.returnValue(observableOf(true)); + }); + + describe('and authorized to download the thumbnail', () => { + beforeEach(() => { + authorizationService.isAuthorized.and.returnValue(observableOf(true)); + }); + + it('should add an authentication token to the thumbnail URL', () => { + comp.errorHandler(); + + if ((comp.thumbnail as RemoteData)?.hasFailed) { + // If we failed to retrieve the Bitstream in the first place, fall back to the default + expect(comp.src$.getValue()).toBe(null); + expect(fallbackSpy).toHaveBeenCalled(); + } else { + expect(comp.src$.getValue()).toBe(CONTENT + '?authentication-token=fake'); + expect(fallbackSpy).not.toHaveBeenCalled(); + } + }); + }); + + describe('but not authorized to download the thumbnail', () => { + beforeEach(() => { + authorizationService.isAuthorized.and.returnValue(observableOf(false)); + }); + + it('should fall back to default', () => { + comp.errorHandler(); + + expect(comp.src$.getValue()).toBe(null); + expect(fallbackSpy).toHaveBeenCalled(); + + // We don't need to check authorization if we failed to retrieve the Bitstreamin the first place + if (!(comp.thumbnail as RemoteData)?.hasFailed) { + expect(authorizationService.isAuthorized).toHaveBeenCalled(); + } + }); + }); + }); + }); + + describe('after retrying with token', () => { + beforeEach(() => { + comp.retriedWithToken = true; + }); + + it('should fall back to default', () => { + comp.errorHandler(); + expect(authService.isAuthenticated).not.toHaveBeenCalled(); + expect(fileService.retrieveFileDownloadLink).not.toHaveBeenCalled(); + expect(fallbackSpy).toHaveBeenCalled(); }); }); }; + describe('fallback', () => { + describe('if there is a default image', () => { + it('should display the default image', () => { + comp.src$.next('http://bit.stream'); + comp.defaultImage = 'http://default.img'; + comp.errorHandler(); + expect(comp.src$.getValue()).toBe(comp.defaultImage); + }); + + it('should include the alt text', () => { + comp.src$.next('http://bit.stream'); + comp.defaultImage = 'http://default.img'; + comp.errorHandler(); + + fixture.detectChanges(); + const image: HTMLElement = fixture.debugElement.query(By.css('img')).nativeElement; + expect(image.getAttribute('alt')).toBe('TRANSLATED ' + comp.alt); + }); + }); + + describe('if there is no default image', () => { + it('should display the HTML placeholder', () => { + comp.src$.next('http://default.img'); + comp.defaultImage = null; + comp.errorHandler(); + expect(comp.src$.getValue()).toBe(null); + + fixture.detectChanges(); + const placeholder = fixture.debugElement.query(By.css('div.thumbnail-placeholder')).nativeElement; + expect(placeholder.innerHTML).toContain('TRANSLATED ' + comp.placeholder); + }); + }); + }); + describe('with thumbnail as Bitstream', () => { - let thumbnail: Bitstream; + let thumbnail; beforeEach(() => { thumbnail = new Bitstream(); thumbnail._links = { self: { href: 'self.url' }, bundle: { href: 'bundle.url' }, format: { href: 'format.url' }, - content: { href: 'content.url' }, + content: { href: CONTENT }, thumbnail: undefined, }; + comp.thumbnail = thumbnail; }); it('should display an image', () => { - comp.thumbnail = thumbnail; comp.ngOnChanges(); fixture.detectChanges(); - const image: HTMLElement = de.query(By.css('img')).nativeElement; - expect(image.getAttribute('src')).toBe(comp.thumbnail._links.content.href); + const image: HTMLElement = fixture.debugElement.query(By.css('img')).nativeElement; + expect(image.getAttribute('src')).toBe(thumbnail._links.content.href); }); it('should include the alt text', () => { - comp.thumbnail = thumbnail; comp.ngOnChanges(); fixture.detectChanges(); - const image: HTMLElement = de.query(By.css('img')).nativeElement; + const image: HTMLElement = fixture.debugElement.query(By.css('img')).nativeElement; expect(image.getAttribute('alt')).toBe('TRANSLATED ' + comp.alt); }); describe('when there is no thumbnail', () => { - withoutThumbnail(); + errorHandler(); }); }); describe('with thumbnail as RemoteData', () => { - let thumbnail: RemoteData; + let thumbnail: Bitstream; - describe('while loading', () => { - beforeEach(() => { - thumbnail = createPendingRemoteDataObject(); - }); - - it('should show a loading animation', () => { - comp.thumbnail = thumbnail; - comp.ngOnChanges(); - fixture.detectChanges(); - expect(de.query(By.css('ds-themed-loading'))).toBeTruthy(); - }); + beforeEach(() => { + thumbnail = new Bitstream(); + thumbnail._links = { + self: { href: 'self.url' }, + bundle: { href: 'bundle.url' }, + format: { href: 'format.url' }, + content: { href: CONTENT }, + thumbnail: undefined + }; }); describe('when there is a thumbnail', () => { beforeEach(() => { - const bitstream = new Bitstream(); - bitstream._links = { - self: { href: 'self.url' }, - bundle: { href: 'bundle.url' }, - format: { href: 'format.url' }, - content: { href: 'content.url' }, - thumbnail: undefined, - }; - thumbnail = createSuccessfulRemoteDataObject(bitstream); + comp.thumbnail = createSuccessfulRemoteDataObject(thumbnail); }); it('should display an image', () => { - comp.thumbnail = thumbnail; comp.ngOnChanges(); fixture.detectChanges(); const image: HTMLElement = de.query(By.css('img')).nativeElement; - expect(image.getAttribute('src')).toBe(comp.thumbnail.payload._links.content.href); + expect(image.getAttribute('src')).toBe(thumbnail._links.content.href); }); it('should display the alt text', () => { - comp.thumbnail = thumbnail; comp.ngOnChanges(); fixture.detectChanges(); const image: HTMLElement = de.query(By.css('img')).nativeElement; expect(image.getAttribute('alt')).toBe('TRANSLATED ' + comp.alt); }); + + describe('but it can\'t be loaded', () => { + errorHandler(); + }); }); describe('when there is no thumbnail', () => { beforeEach(() => { - thumbnail = createFailedRemoteDataObject(); + comp.thumbnail = createFailedRemoteDataObject(); }); - withoutThumbnail(); + errorHandler(); }); }); }); diff --git a/src/app/thumbnail/thumbnail.component.ts b/src/app/thumbnail/thumbnail.component.ts index 3e122cde78..ac0992c345 100644 --- a/src/app/thumbnail/thumbnail.component.ts +++ b/src/app/thumbnail/thumbnail.component.ts @@ -1,7 +1,13 @@ import { Component, Input, OnChanges } from '@angular/core'; import { Bitstream } from '../core/shared/bitstream.model'; -import { hasValue } from '../shared/empty.util'; +import { hasNoValue, hasValue } from '../shared/empty.util'; import { RemoteData } from '../core/data/remote-data'; +import { BehaviorSubject, of as observableOf } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { FeatureID } from '../core/data/feature-authorization/feature-id'; +import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; +import { AuthService } from '../core/auth/auth.service'; +import { FileService } from '../core/shared/file.service'; /** * This component renders a given Bitstream as a thumbnail. @@ -28,7 +34,9 @@ export class ThumbnailComponent implements OnChanges { /** * The src attribute used in the template to render the image. */ - src: string = null; + src$ = new BehaviorSubject(undefined); + + retriedWithToken = false; /** * i18n key of thumbnail alt text @@ -45,49 +53,123 @@ export class ThumbnailComponent implements OnChanges { */ @Input() limitWidth? = true; - isLoading: boolean; + /** + * Whether the thumbnail is currently loading + * Start out as true to avoid flashing the alt text while a thumbnail is being loaded. + */ + isLoading$ = new BehaviorSubject(true); + + constructor( + protected auth: AuthService, + protected authorizationService: AuthorizationDataService, + protected fileService: FileService, + ) { + } /** * Resolve the thumbnail. * Use a default image if no actual image is available. */ ngOnChanges(): void { - if (this.thumbnail === undefined || this.thumbnail === null) { + if (hasNoValue(this.thumbnail)) { return; } - if (this.thumbnail instanceof Bitstream) { - this.resolveThumbnail(this.thumbnail as Bitstream); + + const thumbnail = this.bitstream; + if (hasValue(thumbnail?._links?.content?.href)) { + this.setSrc(thumbnail?._links?.content?.href); } else { - const thumbnailRD = this.thumbnail as RemoteData; - if (thumbnailRD.isLoading) { - this.isLoading = true; - } else { - this.resolveThumbnail(thumbnailRD.payload as Bitstream); - } + this.showFallback(); } } - private resolveThumbnail(thumbnail: Bitstream): void { - if (hasValue(thumbnail) && hasValue(thumbnail._links) - && hasValue(thumbnail._links.content) - && thumbnail._links.content.href) { - this.src = thumbnail._links.content.href; - } else { - this.src = this.defaultImage; + /** + * The current thumbnail Bitstream + * @private + */ + private get bitstream(): Bitstream { + if (this.thumbnail instanceof Bitstream) { + return this.thumbnail as Bitstream; + } else if (this.thumbnail instanceof RemoteData) { + return (this.thumbnail as RemoteData).payload; } - this.isLoading = false; } /** * Handle image download errors. - * If the image can't be found, use the defaultImage instead. - * If that also can't be found, use null to fall back to the HTML placeholder. + * If the image can't be loaded, try re-requesting it with an authorization token in case it's a restricted Bitstream + * Otherwise, fall back to the default image or a HTML placeholder */ errorHandler() { - if (this.src !== this.defaultImage) { - this.src = this.defaultImage; + if (!this.retriedWithToken && hasValue(this.thumbnail)) { + // the thumbnail may have failed to load because it's restricted + // → retry with an authorization token + // only do this once; fall back to the default if it still fails + this.retriedWithToken = true; + + const thumbnail = this.bitstream; + this.auth.isAuthenticated().pipe( + switchMap((isLoggedIn) => { + if (isLoggedIn && hasValue(thumbnail)) { + return this.authorizationService.isAuthorized(FeatureID.CanDownload, thumbnail.self); + } else { + return observableOf(false); + } + }), + switchMap((isAuthorized) => { + if (isAuthorized) { + return this.fileService.retrieveFileDownloadLink(thumbnail._links.content.href); + } else { + return observableOf(null); + } + }) + ).subscribe((url: string) => { + if (hasValue(url)) { + // If we got a URL, try to load it + // (if it still fails this method will be called again, and we'll fall back to the default) + // Otherwise, fall back to the default image right now + this.setSrc(url); + } else { + this.showFallback(); + } + }); } else { - this.src = null; + this.showFallback(); } } + + /** + * To be called when the requested thumbnail could not be found + * - If the current src is not the default image, try that first + * - If this was already the case and the default image could not be found either, + * show an HTML placecholder by setting src to null + * + * Also stops the loading animation. + */ + showFallback() { + if (this.src$.getValue() !== this.defaultImage) { + this.setSrc(this.defaultImage); + } else { + this.setSrc(null); + } + } + + /** + * Set the thumbnail. + * Stop the loading animation if setting to null. + * @param src + */ + setSrc(src: string): void { + this.src$.next(src); + if (src === null) { + this.isLoading$.next(false); + } + } + + /** + * Stop the loading animation once the thumbnail is successfully loaded + */ + successHandler() { + this.isLoading$.next(false); + } } diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 3e48254a6e..93ab5302fb 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -927,7 +927,7 @@ "collection.edit.tabs.source.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", + "collection.edit.tabs.source.notifications.discarded.title": "Changes discarded", "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", @@ -1934,7 +1934,7 @@ "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - "item.edit.metadata.notifications.discarded.title": "Changed discarded", + "item.edit.metadata.notifications.discarded.title": "Changes discarded", "item.edit.metadata.notifications.error.title": "An error occurred", @@ -1944,7 +1944,7 @@ "item.edit.metadata.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", - "item.edit.metadata.notifications.outdated.title": "Changed outdated", + "item.edit.metadata.notifications.outdated.title": "Changes outdated", "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", diff --git a/src/assets/i18n/fi.json5 b/src/assets/i18n/fi.json5 index 860062fa67..5c5f3b6168 100644 --- a/src/assets/i18n/fi.json5 +++ b/src/assets/i18n/fi.json5 @@ -3274,7 +3274,7 @@ "mydspace.status.workspace": "Työtila", // "mydspace.title": "MyDSpace", - "mydspace.title": "Omat tiedot", + "mydspace.title": "Oma DSpace", // "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", "mydspace.upload.upload-failed": "Virhe uutta työtilaa luotaessa. Tarkista ladattava sisältö ennen kuin yrität uudelleen.", @@ -4345,13 +4345,13 @@ "statistics.table.title.TotalDownloads": "Tiedostokäyntejä", // "statistics.table.title.TopCountries": "Top country views", - "statistics.table.title.TopCountries": "Eniten latauksia maittain", + "statistics.table.title.TopCountries": "Eniten katseluita maittain", // "statistics.table.title.TopCities": "Top city views", - "statistics.table.title.TopCities": "Eniten latauksia kaupungeittain", + "statistics.table.title.TopCities": "Eniten katseluita kaupungeittain", // "statistics.table.header.views": "Views", - "statistics.table.header.views": "Latauksia", + "statistics.table.header.views": "Katseluita", diff --git a/src/assets/i18n/sv.json5 b/src/assets/i18n/sv.json5 index 0339969b31..c81482d110 100644 --- a/src/assets/i18n/sv.json5 +++ b/src/assets/i18n/sv.json5 @@ -1,53 +1,41 @@ { // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", - // TODO New key - Add a translation "401.help": "Du saknar behörighet att se denna sida. Använd knappen nedan för att återvända till startsidan.", // "401.link.home-page": "Take me to the home page", - // TODO New key - Add a translation "401.link.home-page": "Ta mig till startsidan", // "401.unauthorized": "unauthorized", - // TODO New key - Add a translation "401.unauthorized": "obehörig", // "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", - // TODO New key - Add a translation "403.help": "Du saknar behörighet att nå denna sida. Använd knappen nedan för att återvända till startsidan.", // "403.link.home-page": "Take me to the home page", - // TODO New key - Add a translation "403.link.home-page": "Ta mig till startsidan", // "403.forbidden": "forbidden", - // TODO New key - Add a translation "403.forbidden": "förbjuden", // "500.page-internal-server-error": "Service Unavailable", - // TODO New key - Add a translation "500.page-internal-server-error": "Tjänsten kan inte nås", // "500.help": "The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.", - // TODO New key - Add a translation "500.help": "Tjänsten är tillfälligt nere. Försök senare.", // "500.link.home-page": "Take me to the home page", - // TODO New key - Add a translation "500.link.home-page": "Till startsidan", // "404.help": "We can't find the page you're looking for. The page may have been moved or deleted. You can use the button below to get back to the home page. ", - // TODO New key - Add a translation "404.help": "Sidan kan inte hittas. Den kan ha blivit flyttad eller raderad. Använd knappen nedan för att återvända till startsidan. ", // "404.link.home-page": "Take me to the home page", - // TODO New key - Add a translation "404.link.home-page": "Till startsidan", // "404.page-not-found": "page not found", - // TODO New key - Add a translation "404.page-not-found": "sidan hittas inte", // "admin.curation-tasks.breadcrumbs": "System curation tasks", @@ -67,63 +55,48 @@ "admin.registries.bitstream-formats.breadcrumbs": "Format registry", // "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", - // TODO New key - Add a translation "admin.registries.bitstream-formats.create.breadcrumbs": "Filformat", // "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", - // TODO New key - Add a translation "admin.registries.bitstream-formats.create.failure.content": "Ett fel uppstod när nytt filformat skulle skapas.", // "admin.registries.bitstream-formats.create.failure.head": "Failure", - // TODO New key - Add a translation "admin.registries.bitstream-formats.create.failure.head": "Misslyckades", // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", - // TODO New key - Add a translation "admin.registries.bitstream-formats.create.head": "Skapa nytt filformat", // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", - // TODO New key - Add a translation "admin.registries.bitstream-formats.create.new": "Lägg till nytt filformat", // "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", - // TODO New key - Add a translation "admin.registries.bitstream-formats.create.success.content": "Nytt filformat har skapats.", // "admin.registries.bitstream-formats.create.success.head": "Success", - // TODO New key - Add a translation "admin.registries.bitstream-formats.create.success.head": "Lyckades", // "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", - // TODO New key - Add a translation "admin.registries.bitstream-formats.delete.failure.amount": "Misslyckades med att radera {{ amount }} format", // "admin.registries.bitstream-formats.delete.failure.head": "Failure", - // TODO New key - Add a translation "admin.registries.bitstream-formats.delete.failure.head": "Misslyckades", // "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", - // TODO New key - Add a translation "admin.registries.bitstream-formats.delete.success.amount": "Har raderat {{ amount }} format", // "admin.registries.bitstream-formats.delete.success.head": "Success", - // TODO New key - Add a translation "admin.registries.bitstream-formats.delete.success.head": "Lyckades", // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", - // TODO New key - Add a translation "admin.registries.bitstream-formats.description": "Listan innehåller information om kända filformat.", // "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.breadcrumbs": "Filformat", // "admin.registries.bitstream-formats.edit.description.hint": "", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.description.hint": "", // "admin.registries.bitstream-formats.edit.description.label": "Beskrivning", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.description.label": "Beskrivning", // "admin.registries.bitstream-formats.edit.extensions.hint": "Extensions are file extensions that are used to automatically identify the format of uploaded files. You can enter several extensions for each format.", @@ -131,209 +104,158 @@ "admin.registries.bitstream-formats.edit.extensions.hint": "Extensions are file extensions that are used to automatically identify the format of uploaded files. You can enter several extensions for each format.", // "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.extensions.label": "Filtillägg", // "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.extensions.placeholder": "Ange ett filtillägg (utan punkt)", // "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.failure.content": "Ett fel uppstod vid redigering av filformat.", // "admin.registries.bitstream-formats.edit.failure.head": "Failure", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.failure.head": "Misslyckades", // "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.head": "Filformat: {{ format }}", // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.internal.hint": "Format som har markerats som interna visas inte utåt och används enbart för administrativa syften.", // "admin.registries.bitstream-formats.edit.internal.label": "Internal", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.internal.label": "Interna", // "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.mimetype.hint": "MIME typ som associeras med detta format, beöver inte vara unikt.", // "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.mimetype.label": "MIME typ", // "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.shortDescription.hint": "Unikt namn för detta format, (t ex Microsoft Word XP eller Microsoft Word 2000)", // "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.shortDescription.label": "Namn", // "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.success.content": "Filformatet har ändrats.", // "admin.registries.bitstream-formats.edit.success.head": "Success", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.success.head": "Lyckades", // "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.supportLevel.hint": "Nivån som din organisation stödjer detta format.", // "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.supportLevel.label": "Supportnivå", // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", - // TODO New key - Add a translation "admin.registries.bitstream-formats.head": "Filformat registry", // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", - // TODO New key - Add a translation "admin.registries.bitstream-formats.no-items": "Det finns inga filformat att visa.", // "admin.registries.bitstream-formats.table.delete": "Delete selected", - // TODO New key - Add a translation "admin.registries.bitstream-formats.table.delete": "Radera markerade", // "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", - // TODO New key - Add a translation "admin.registries.bitstream-formats.table.deselect-all": "Avmarkera alla", // "admin.registries.bitstream-formats.table.internal": "internal", - // TODO New key - Add a translation "admin.registries.bitstream-formats.table.internal": "interna", // "admin.registries.bitstream-formats.table.mimetype": "MIME Type", - // TODO New key - Add a translation "admin.registries.bitstream-formats.table.mimetype": "MIME typ", // "admin.registries.bitstream-formats.table.name": "Name", - // TODO New key - Add a translation "admin.registries.bitstream-formats.table.name": "Namn", // "admin.registries.bitstream-formats.table.return": "Back", - // TODO New key - Add a translation "admin.registries.bitstream-formats.table.return": "Tillbaka", // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", - // TODO New key - Add a translation "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Känd", // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", - // TODO New key - Add a translation "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Stöds", // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", - // TODO New key - Add a translation "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Okänd", // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", - // TODO New key - Add a translation "admin.registries.bitstream-formats.table.supportLevel.head": "Support (nivå))", // "admin.registries.bitstream-formats.title": "Bitstream Format Registry", - // TODO New key - Add a translation "admin.registries.bitstream-formats.title": "Filformat registry", // "admin.registries.metadata.breadcrumbs": "Metadata registry", - // TODO New key - Add a translation "admin.registries.metadata.breadcrumbs": "Metadata registry", // "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", - // TODO New key - Add a translation - "admin.registries.metadata.description": "Metadata registry inneåller en lista med samtliga fält som stöds av detta repository. Fälten kan förekomma i flera scheman. DSpace kräver dock det utökade Dublin Core (qdc) schemat.", + "admin.registries.metadata.description": "Metadata registry innehåller en lista med samtliga fält som stöds av detta repository. Fälten kan förekomma i flera scheman. DSpace kräver dock det utökade Dublin Core (qdc) schemat.", // "admin.registries.metadata.form.create": "Create metadata schema", - // TODO New key - Add a translation "admin.registries.metadata.form.create": "Skapa metadataschema", // "admin.registries.metadata.form.edit": "Edit metadata schema", - // TODO New key - Add a translation "admin.registries.metadata.form.edit": "Redigera metadataschema", // "admin.registries.metadata.form.name": "Name", - // TODO New key - Add a translation "admin.registries.metadata.form.name": "Namn", // "admin.registries.metadata.form.namespace": "Namespace", - // TODO New key - Add a translation "admin.registries.metadata.form.namespace": "Namnrymd", // "admin.registries.metadata.head": "Metadata Registry", - // TODO New key - Add a translation "admin.registries.metadata.head": "Metadata registry", // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", - // TODO New key - Add a translation "admin.registries.metadata.schemas.no-items": "Det finns inga metadatascema att visa.", // "admin.registries.metadata.schemas.table.delete": "Delete selected", - // TODO New key - Add a translation "admin.registries.metadata.schemas.table.delete": "Radera markerade", // "admin.registries.metadata.schemas.table.id": "ID", - // TODO New key - Add a translation "admin.registries.metadata.schemas.table.id": "ID", // "admin.registries.metadata.schemas.table.name": "Name", - // TODO New key - Add a translation "admin.registries.metadata.schemas.table.name": "Namn", // "admin.registries.metadata.schemas.table.namespace": "Namespace", - // TODO New key - Add a translation - "admin.registries.metadata.schemas.table.namespace": "Namespace", + "admin.registries.metadata.schemas.table.namespace": "Namnrymd", // "admin.registries.metadata.title": "Metadata Registry", - // TODO New key - Add a translation "admin.registries.metadata.title": "Metadata registry", // "admin.registries.schema.breadcrumbs": "Metadata schema", - // TODO New key - Add a translation "admin.registries.schema.breadcrumbs": "Metadataschema", // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", - // TODO New key - Add a translation "admin.registries.schema.description": "Metadatascema för \"{{namespace}}\".", // "admin.registries.schema.fields.head": "Schema metadata fields", - // TODO New key - Add a translation "admin.registries.schema.fields.head": "Schema metadata fält", // "admin.registries.schema.fields.no-items": "No metadata fields to show.", - // TODO New key - Add a translation "admin.registries.schema.fields.no-items": "Det finns inga metadatafält att visa.", // "admin.registries.schema.fields.table.delete": "Delete selected", - // TODO New key - Add a translation "admin.registries.schema.fields.table.delete": "Radera markerade", // "admin.registries.schema.fields.table.field": "Field", - // TODO New key - Add a translation "admin.registries.schema.fields.table.field": "Fält", // "admin.registries.schema.fields.table.scopenote": "Scope Note", - // TODO New key - Add a translation "admin.registries.schema.fields.table.scopenote": "Anmärkning (scope note)", // "admin.registries.schema.form.create": "Create metadata field", - // TODO New key - Add a translation "admin.registries.schema.form.create": "Skapa metadatafält", // "admin.registries.schema.form.edit": "Edit metadata field", - // TODO New key - Add a translation "admin.registries.schema.form.edit": "Redigera metadatafält", // "admin.registries.schema.form.element": "Element", - // TODO New key - Add a translation "admin.registries.schema.form.element": "Element", // "admin.registries.schema.form.qualifier": "Qualifier", @@ -341,55 +263,42 @@ "admin.registries.schema.form.qualifier": "Qualifier", // "admin.registries.schema.form.scopenote": "Scope Note", - // TODO New key - Add a translation "admin.registries.schema.form.scopenote": "Anmärkning (scope note)", // "admin.registries.schema.head": "Metadata Schema", - // TODO New key - Add a translation "admin.registries.schema.head": "Metadataschema", // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", - // TODO New key - Add a translation - "admin.registries.schema.notification.created": "ar skapat metadataschemat \"{{prefix}}\"", + "admin.registries.schema.notification.created": "Har skapat metadataschemat \"{{prefix}}\"", // "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", - // TODO New key - Add a translation "admin.registries.schema.notification.deleted.failure": "Misslyckades med att radera {{amount}} metadatascheman", // "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", - // TODO New key - Add a translation "admin.registries.schema.notification.deleted.success": "Har raderat {{amount}} metadatascheman", // "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", - // TODO New key - Add a translation "admin.registries.schema.notification.edited": "Metadataschema \"{{prefix}}\" har redigerats", // "admin.registries.schema.notification.failure": "Error", - // TODO New key - Add a translation "admin.registries.schema.notification.failure": "Fel", // "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", - // TODO New key - Add a translation - "admin.registries.schema.notification.field.created": "har skapat metadatafält \"{{field}}\"", + "admin.registries.schema.notification.field.created": "Har skapat metadatafält \"{{field}}\"", // "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", - // TODO New key - Add a translation "admin.registries.schema.notification.field.deleted.failure": "Misslyckades med att radera {{amount}} metadatafält", // "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", - // TODO New key - Add a translation "admin.registries.schema.notification.field.deleted.success": "Har raderat {{amount}} metadatafält", // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", - // TODO New key - Add a translation "admin.registries.schema.notification.field.edited": "Har redigerat metadatafält \"{{field}}\"", // "admin.registries.schema.notification.success": "Success", - // TODO New key - Add a translation "admin.registries.schema.notification.success": "Lyckades", // "admin.registries.schema.return": "Back", - // TODO New key - Add a translation "admin.registries.schema.return": "Tillbaka", // "admin.registries.schema.title": "Metadata Schema Registry", @@ -399,1991 +308,1530 @@ // "admin.access-control.epeople.actions.delete": "Delete EPerson", - // TODO New key - Add a translation "admin.access-control.epeople.actions.delete": "Radera EPerson", // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", - // TODO New key - Add a translation "admin.access-control.epeople.actions.impersonate": "Agera som EPerson", // "admin.access-control.epeople.actions.reset": "Reset password", - // TODO New key - Add a translation "admin.access-control.epeople.actions.reset": "Återställ lösenord", // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", - // TODO New key - Add a translation "admin.access-control.epeople.actions.stop-impersonating": "Sluta agera som EPerson", // "admin.access-control.epeople.breadcrumbs": "EPeople", - // TODO New key - Add a translation "admin.access-control.epeople.breadcrumbs": "EPersoner", // "admin.access-control.epeople.title": "EPeople", - // TODO New key - Add a translation "admin.access-control.epeople.title": "EPersoner", // "admin.access-control.epeople.head": "EPeople", - // TODO New key - Add a translation "admin.access-control.epeople.head": "EPersoner", // "admin.access-control.epeople.search.head": "Search", - // TODO New key - Add a translation "admin.access-control.epeople.search.head": "Sök", // "admin.access-control.epeople.button.see-all": "Browse All", - // TODO New key - Add a translation "admin.access-control.epeople.button.see-all": "Bläddra bland alla", // "admin.access-control.epeople.search.scope.metadata": "Metadata", - // TODO New key - Add a translation "admin.access-control.epeople.search.scope.metadata": "Metadata", // "admin.access-control.epeople.search.scope.email": "E-mail (exact)", - // TODO New key - Add a translation "admin.access-control.epeople.search.scope.email": "E-post (exakt)", // "admin.access-control.epeople.search.button": "Search", - // TODO New key - Add a translation "admin.access-control.epeople.search.button": "Sök", // "admin.access-control.epeople.search.placeholder": "Search people...", - // TODO New key - Add a translation "admin.access-control.epeople.search.placeholder": "Sök personer...", // "admin.access-control.epeople.button.add": "Add EPerson", - // TODO New key - Add a translation "admin.access-control.epeople.button.add": "Lägg till EPerson", // "admin.access-control.epeople.table.id": "ID", - // TODO New key - Add a translation "admin.access-control.epeople.table.id": "ID", // "admin.access-control.epeople.table.name": "Name", - // TODO New key - Add a translation "admin.access-control.epeople.table.name": "Namn", // "admin.access-control.epeople.table.email": "E-mail (exact)", - // TODO New key - Add a translation "admin.access-control.epeople.table.email": "E-post (exakt)", // "admin.access-control.epeople.table.edit": "Edit", - // TODO New key - Add a translation "admin.access-control.epeople.table.edit": "Redigera", // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.epeople.table.edit.buttons.edit": "Redigera \"{{name}}\"", // "admin.access-control.epeople.table.edit.buttons.edit-disabled": "You are not authorized to edit this group", - // TODO New key - Add a translation "admin.access-control.epeople.table.edit.buttons.edit-disabled": "Du har inte behöriget att redigera denna grupp", // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.epeople.table.edit.buttons.remove": "Radera \"{{name}}\"", // "admin.access-control.epeople.no-items": "No EPeople to show.", - // TODO New key - Add a translation "admin.access-control.epeople.no-items": "Det finns inga Epersoner att visa.", // "admin.access-control.epeople.form.create": "Create EPerson", - // TODO New key - Add a translation "admin.access-control.epeople.form.create": "Skapa EPerson", // "admin.access-control.epeople.form.edit": "Edit EPerson", - // TODO New key - Add a translation "admin.access-control.epeople.form.edit": "Redigera EPerson", // "admin.access-control.epeople.form.firstName": "First name", - // TODO New key - Add a translation "admin.access-control.epeople.form.firstName": "Förnamn", // "admin.access-control.epeople.form.lastName": "Last name", - // TODO New key - Add a translation "admin.access-control.epeople.form.lastName": "Efternamn", // "admin.access-control.epeople.form.email": "E-mail", - // TODO New key - Add a translation "admin.access-control.epeople.form.email": "E-post", // "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", - // TODO New key - Add a translation "admin.access-control.epeople.form.emailHint": "Det måste vara en giltig e-postadress", // "admin.access-control.epeople.form.canLogIn": "Can log in", - // TODO New key - Add a translation "admin.access-control.epeople.form.canLogIn": "Kan logga in", // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", - // TODO New key - Add a translation "admin.access-control.epeople.form.requireCertificate": "Kräver certificate", // "admin.access-control.epeople.form.return": "Back", - // TODO New key - Add a translation "admin.access-control.epeople.form.return": "Tillbaka", // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.epeople.form.notification.created.success": "EPerson \"{{name}}\" har skapats", // "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.epeople.form.notification.created.failure": "Misslyckades med att skapa EPerson \"{{name}}\"", // "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", - // TODO New key - Add a translation "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Misslyckades med att skapa EPerson \"{{name}}\", e-postadressen \"{{email}}\" används redan.", // "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", - // TODO New key - Add a translation "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Misslyckades med att redigera EPerson \"{{name}}\", e-postadressen \"{{email}}\" används redan.", // "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.epeople.form.notification.edited.success": "EPerson \"{{name}}\" har redigerats", // "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.epeople.form.notification.edited.failure": "Misslyckades med att redigera EPerson \"{{name}}\"", // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.epeople.form.notification.deleted.success": "EPerson \"{{name}}\" har raderats", // "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.epeople.form.notification.deleted.failure": "Misslyckades med att radera EPerson \"{{name}}\"", // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", - // TODO New key - Add a translation "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Medlem i följande grupper:", // "admin.access-control.epeople.form.table.id": "ID", - // TODO New key - Add a translation "admin.access-control.epeople.form.table.id": "ID", // "admin.access-control.epeople.form.table.name": "Name", - // TODO New key - Add a translation "admin.access-control.epeople.form.table.name": "Namn", // "admin.access-control.epeople.form.table.collectionOrCommunity": "Collection/Community", - // TODO New key - Add a translation "admin.access-control.epeople.form.table.collectionOrCommunity": "Samling/Enhet", // "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", - // TODO New key - Add a translation "admin.access-control.epeople.form.memberOfNoGroups": "Denna EPerson är inte medlem i någon grupp", // "admin.access-control.epeople.form.goToGroups": "Add to groups", - // TODO New key - Add a translation "admin.access-control.epeople.form.goToGroups": "Lägg till i grupper", // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.epeople.notification.deleted.failure": "Misslyckades med att radera EPerson: \"{{name}}\"", // "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.epeople.notification.deleted.success": "EPerson: \"{{name}}\" har raderats", // "admin.access-control.groups.title": "Groups", - // TODO New key - Add a translation "admin.access-control.groups.title": "Grupper", // "admin.access-control.groups.breadcrumbs": "Groups", - // TODO New key - Add a translation "admin.access-control.groups.breadcrumbs": "Grupper", // "admin.access-control.groups.singleGroup.breadcrumbs": "Edit Group", - // TODO New key - Add a translation "admin.access-control.groups.singleGroup.breadcrumbs": "Redigera grupp", // "admin.access-control.groups.title.singleGroup": "Edit Group", - // TODO New key - Add a translation "admin.access-control.groups.title.singleGroup": "Redigera grupp", // "admin.access-control.groups.title.addGroup": "New Group", - // TODO New key - Add a translation "admin.access-control.groups.title.addGroup": "Ny grupp", // "admin.access-control.groups.addGroup.breadcrumbs": "New Group", - // TODO New key - Add a translation "admin.access-control.groups.addGroup.breadcrumbs": "Ny grupp", // "admin.access-control.groups.head": "Groups", - // TODO New key - Add a translation "admin.access-control.groups.head": "Grupper", // "admin.access-control.groups.button.add": "Add group", - // TODO New key - Add a translation "admin.access-control.groups.button.add": "Lägg till grupp", // "admin.access-control.groups.search.head": "Search groups", - // TODO New key - Add a translation "admin.access-control.groups.search.head": "Sök grupper", // "admin.access-control.groups.button.see-all": "Browse all", - // TODO New key - Add a translation - "admin.access-control.groups.button.see-all": "Browsa alla", + "admin.access-control.groups.button.see-all": "Bläddra bland alla", // "admin.access-control.groups.search.button": "Search", - // TODO New key - Add a translation "admin.access-control.groups.search.button": "Sök", // "admin.access-control.groups.search.placeholder": "Search groups...", - // TODO New key - Add a translation "admin.access-control.groups.search.placeholder": "Sök grupper...", // "admin.access-control.groups.table.id": "ID", - // TODO New key - Add a translation "admin.access-control.groups.table.id": "ID", // "admin.access-control.groups.table.name": "Name", - // TODO New key - Add a translation "admin.access-control.groups.table.name": "Namn", // "admin.access-control.groups.table.collectionOrCommunity": "Collection/Community", - // TODO New key - Add a translation "admin.access-control.groups.table.collectionOrCommunity": "Samling/Enhet", // "admin.access-control.groups.table.members": "Members", - // TODO New key - Add a translation "admin.access-control.groups.table.members": "Medlemmar", // "admin.access-control.groups.table.edit": "Edit", - // TODO New key - Add a translation "admin.access-control.groups.table.edit": "Redigera", // "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.table.edit.buttons.edit": "Redigera \"{{name}}\"", // "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.table.edit.buttons.remove": "Radera \"{{name}}\"", // "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", - // TODO New key - Add a translation "admin.access-control.groups.no-items": "Ingan grupper kunde hittas", // "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.notification.deleted.success": "Grupp \"{{name}}\" har raderats", // "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.notification.deleted.failure.title": "Misslyckades med att radera grupp \"{{name}}\"", // "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", - // TODO New key - Add a translation "admin.access-control.groups.notification.deleted.failure.content": "Orsak: \"{{cause}}\"", // "admin.access-control.groups.form.alert.permanent": "This group is permanent, so it can't be edited or deleted. You can still add and remove group members using this page.", - // TODO New key - Add a translation "admin.access-control.groups.form.alert.permanent": "Denna grupp är permant och kan inte raderas eller redigeras. Du kan fortfarande lägga till eller ta bort medlemmar i gruppen här.", // "admin.access-control.groups.form.alert.workflowGroup": "This group can’t be modified or deleted because it corresponds to a role in the submission and workflow process in the \"{{name}}\" {{comcol}}. You can delete it from the \"assign roles\" tab on the edit {{comcol}} page. You can still add and remove group members using this page.", - // TODO New key - Add a translation "admin.access-control.groups.form.alert.workflowGroup": "Denna grupp kan inte raderas eller redigeras eftersom den används i submission eller workflow process i \"{{name}}\" {{comcol}}. Du kan radera den från fliken \"tilldela roller\" på sidan {{comcol}} för att redigera. Du kan fortfarande lägga till eller ta bort medlemmar i gruppen här.", // "admin.access-control.groups.form.head.create": "Create group", - // TODO New key - Add a translation "admin.access-control.groups.form.head.create": "Skapa grupp", // "admin.access-control.groups.form.head.edit": "Edit group", - // TODO New key - Add a translation "admin.access-control.groups.form.head.edit": "Redigera grupp", // "admin.access-control.groups.form.groupName": "Group name", - // TODO New key - Add a translation "admin.access-control.groups.form.groupName": "Gruppens namn", // "admin.access-control.groups.form.groupCommunity": "Community or Collection", - // TODO New key - Add a translation "admin.access-control.groups.form.groupCommunity": "Enhet eller samling", // "admin.access-control.groups.form.groupDescription": "Beskrivning", - // TODO New key - Add a translation "admin.access-control.groups.form.groupDescription": "Beskrivning", // "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.notification.created.success": "Gruppen \"{{name}}\" har skapats", // "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.notification.created.failure": "Misslyckades med att skapa grupp \"{{name}}\"", // "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Failed to create Group with name: \"{{name}}\", make sure the name is not already in use.", - // TODO New key - Add a translation "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Misslyckades med att skapa grupp: \"{{name}}\", kontrollera om namnet redan används.", // "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.notification.edited.failure": "Misslyckades med att redigera grupp \"{{name}}\"", // "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", - // TODO New key - Add a translation "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Namnet \"{{name}}\" används redan!", // "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.notification.edited.success": "Gruppen \"{{name}}\" har redigerats", // "admin.access-control.groups.form.actions.delete": "Delete Group", - // TODO New key - Add a translation "admin.access-control.groups.form.actions.delete": "Radera grupp", // "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.delete-group.modal.header": "Radera grupp \"{{ dsoName }}\"", // "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.delete-group.modal.info": "Är du säker på att du vill radera gruppen \"{{ dsoName }}\"", // "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", - // TODO New key - Add a translation "admin.access-control.groups.form.delete-group.modal.cancel": "Avbryt", // "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", - // TODO New key - Add a translation "admin.access-control.groups.form.delete-group.modal.confirm": "Radera", // "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.notification.deleted.success": "Gruppen \"{{ name }}\" har raderats", // "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.notification.deleted.failure.title": "Misslyckades med att radera grupp \"{{ name }}\"", // "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.notification.deleted.failure.content": "Orsak: \"{{ cause }}\"", // "admin.access-control.groups.form.members-list.head": "EPeople", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.head": "EPersoner", // "admin.access-control.groups.form.members-list.search.head": "Add EPeople", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.search.head": "Lägg till EPersoner", // "admin.access-control.groups.form.members-list.button.see-all": "Browse All", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.button.see-all": "Browsa alla", + "admin.access-control.groups.form.members-list.button.see-all": "Bläddra bland alla", // "admin.access-control.groups.form.members-list.headMembers": "Current Members", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.headMembers": "Nuvarande medlemmar", // "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", // "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.search.scope.email": "E-post (exakt)", // "admin.access-control.groups.form.members-list.search.button": "Search", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.search.button": "Sök", // "admin.access-control.groups.form.members-list.table.id": "ID", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.id": "ID", // "admin.access-control.groups.form.members-list.table.name": "Name", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.name": "Namn", // "admin.access-control.groups.form.members-list.table.identity": "Identity", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.identity": "Identitet", // "admin.access-control.groups.form.members-list.table.email": "Email", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.email": "E-post", // "admin.access-control.groups.form.members-list.table.netid": "NetID", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.netid": "NetID", // "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.edit": "Radera / Lägg till", // "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Ta bort medlem \"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.notification.success.addMember": "Medlem: \"{{name}}\" har lagts till", // "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.notification.failure.addMember": "Misslyckades med att lägga till medlem: \"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Medlem: \"{{name}}\" har tagits bort", // "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Misslyckades med att ta bort medlem: \"{{name}}\"", // "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Lägg till medlem \"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "Det finns ingen aktiv grupp, ange ett namn först.", // "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.no-members-yet": "Det finns inga medlemmar i gruppen, sök och Lägg till.", // "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", - // TODO New key - Add a translation "admin.access-control.groups.form.members-list.no-items": "Inga EPersoner hittades", // "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.failure": "Något gick fel: \"{{cause}}\"", // "admin.access-control.groups.form.subgroups-list.head": "Groups", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.head": "Grupper", // "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.search.head": "Lägg till undergrupp", // "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.button.see-all": "Browsa alla", + "admin.access-control.groups.form.subgroups-list.button.see-all": "Bläddra alla", // "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.headSubgroups": "Nuvarande undergrupper", // "admin.access-control.groups.form.subgroups-list.search.button": "Search", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.search.button": "Sök", // "admin.access-control.groups.form.subgroups-list.table.id": "ID", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.id": "ID", // "admin.access-control.groups.form.subgroups-list.table.name": "Name", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.name": "Namn", // "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Collection/Community", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Samling/Enhet", // "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.edit": "Ta bort / Lägg till", // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Ta bort undergrupp \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Lägg till undergrupp \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Nuvarande grupp", // "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Undergrupp: \"{{name}}\" har lagts till", // "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Misslyckades med att lägga till undergrupp: \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Undergrupp: \"{{name}}\" har raderats", // "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Misslyckades med att radera undergrupp: \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Det finns ingen aktiv grupp, ange ett namn först.", // "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "Detta är den aktiva gruppen, den kan inte läggas till.", // "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.no-items": "Inga grupper kunde hittas", // "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Det finns inga undergrupper i denna grupp ännu.", // "admin.access-control.groups.form.return": "Back", - // TODO New key - Add a translation "admin.access-control.groups.form.return": "Tillbaka", // "admin.search.breadcrumbs": "Administrative Search", - // TODO New key - Add a translation "admin.search.breadcrumbs": "Admin sökning", // "admin.search.collection.edit": "Edit", - // TODO New key - Add a translation "admin.search.collection.edit": "Redigera", // "admin.search.community.edit": "Edit", - // TODO New key - Add a translation "admin.search.community.edit": "Redigera", // "admin.search.item.delete": "Delete", - // TODO New key - Add a translation "admin.search.item.delete": "Radera", // "admin.search.item.edit": "Edit", - // TODO New key - Add a translation "admin.search.item.edit": "Redigera", // "admin.search.item.make-private": "Make non-discoverable", - // TODO New key - Add a translation "admin.search.item.make-private": "Undanta från sökning", // "admin.search.item.make-public": "Make discoverable", - // TODO New key - Add a translation "admin.search.item.make-public": "Gör sökbar", // "admin.search.item.move": "Move", - // TODO New key - Add a translation "admin.search.item.move": "Flytta", // "admin.search.item.reinstate": "Reinstate", - // TODO New key - Add a translation "admin.search.item.reinstate": "Återställ", // "admin.search.item.withdraw": "Withdraw", - // TODO New key - Add a translation "admin.search.item.withdraw": "Återkalla", // "admin.search.title": "Administrative Search", - // TODO New key - Add a translation "admin.search.title": "Admin sökning", // "administrativeView.search.results.head": "Administrative Search", - // TODO New key - Add a translation "administrativeView.search.results.head": "Admin sökning", // "admin.workflow.breadcrumbs": "Administer Workflow", - // TODO New key - Add a translation "admin.workflow.breadcrumbs": "Administrera arbetsflöde", // "admin.workflow.title": "Administer Workflow", - // TODO New key - Add a translation "admin.workflow.title": "Administrera arbetsflöde", // "admin.workflow.item.workflow": "Workflow", - // TODO New key - Add a translation "admin.workflow.item.workflow": "Arbetsflöde", // "admin.workflow.item.delete": "Delete", - // TODO New key - Add a translation "admin.workflow.item.delete": "Radera", // "admin.workflow.item.send-back": "Send back", - // TODO New key - Add a translation "admin.workflow.item.send-back": "Skicka tillbaka", // "admin.metadata-import.breadcrumbs": "Import Metadata", - // TODO New key - Add a translation "admin.metadata-import.breadcrumbs": "Importera metadata", // "admin.metadata-import.title": "Import Metadata", - // TODO New key - Add a translation "admin.metadata-import.title": "Importera metadata", // "admin.metadata-import.page.header": "Import Metadata", - // TODO New key - Add a translation "admin.metadata-import.page.header": "Importera metadata", // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", - // TODO New key - Add a translation "admin.metadata-import.page.help": "Du kan öppna eller dra och släppa CSV-filer som innehåller batchvisa metadaåtgärder på filer här", // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", - // TODO New key - Add a translation "admin.metadata-import.page.dropMsg": "Dra och släpp CSV-fil för att importera", // "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", - // TODO New key - Add a translation "admin.metadata-import.page.dropMsgReplace": "Dra och släpp för att ersätta CSV-fil att importera", // "admin.metadata-import.page.button.return": "Back", - // TODO New key - Add a translation "admin.metadata-import.page.button.return": "Tillbaka", // "admin.metadata-import.page.button.proceed": "Proceed", - // TODO New key - Add a translation "admin.metadata-import.page.button.proceed": "Fortsätt", // "admin.metadata-import.page.error.addFile": "Select file first!", - // TODO New key - Add a translation "admin.metadata-import.page.error.addFile": "Välj fil först!", // "auth.errors.invalid-user": "Invalid email address or password.", - // TODO New key - Add a translation "auth.errors.invalid-user": "Ogiltig e-postadress eller lösenord.", // "auth.messages.expired": "Your session has expired. Please log in again.", - // TODO New key - Add a translation "auth.messages.expired": "Din session har upphört. Logga in igen.", // "auth.messages.token-refresh-failed": "Refreshing your session token failed. Please log in again.", - // TODO New key - Add a translation "auth.messages.token-refresh-failed": "Misslyckades med att förnya session token. Logga in igen.", // "bitstream.download.page": "Now downloading {{bitstream}}..." , - // TODO New key - Add a translation "bitstream.download.page": "Laddar ner {{bitstream}}..." , // "bitstream.download.page.back": "Back" , - // TODO New key - Add a translation "bitstream.download.page.back": "Tillbaka" , // "bitstream.edit.authorizations.link": "Edit bitstream's Policies", - // TODO New key - Add a translation "bitstream.edit.authorizations.link": "Redigera policy för fil", // "bitstream.edit.authorizations.title": "Edit bitstream's Policies", - // TODO New key - Add a translation "bitstream.edit.authorizations.title": "Redigera policy för fil", // "bitstream.edit.return": "Back", - // TODO New key - Add a translation "bitstream.edit.return": "Tillbaka", // "bitstream.edit.bitstream": "Bitstream: ", - // TODO New key - Add a translation "bitstream.edit.bitstream": "Fil: ", // "bitstream.edit.form.description.hint": "Optionally, provide a brief description of the file, for example \"Main article\" or \"Experiment data readings\".", - // TODO New key - Add a translation "bitstream.edit.form.description.hint": "Du kan ange en kort beskrivning av innehållet, t ex \"Main article\" or \"Experiment data readings\".", // "bitstream.edit.form.description.label": "Beskrivning", - // TODO New key - Add a translation "bitstream.edit.form.description.label": "Beskrivning", // "bitstream.edit.form.embargo.hint": "The first day from which access is allowed. This date cannot be modified on this form. To set an embargo date for a bitstream, go to the Item Status tab, click Authorizations..., create or edit the bitstream's READ policy, and set the Start Date as desired.", - // TODO New key - Add a translation "bitstream.edit.form.embargo.hint": "Tidigaste datum när filen skall vara åtkomplig. Detta datum kan inte ändras här. För att ange embargodatum för en post, gå till fliken Poststatus, klicka Behörigheter..., skapa eller redigera filens READ policy, och ange startdatum.", // "bitstream.edit.form.embargo.label": "Embargo until specific date", - // TODO New key - Add a translation "bitstream.edit.form.embargo.label": "Skall vara under embrgo till angivet datum", // "bitstream.edit.form.fileName.hint": "Change the filename for the bitstream. Note that this will change the display bitstream URL, but old links will still resolve as long as the sequence ID does not change.", - // TODO New key - Add a translation "bitstream.edit.form.fileName.hint": "Ändra filnamnet. Detta kommer att förändra den publika URL:en, men tidigare länkar kommer att fortätta fungera som vanligt.", // "bitstream.edit.form.fileName.label": "Filename", - // TODO New key - Add a translation "bitstream.edit.form.fileName.label": "Filnamn", // "bitstream.edit.form.newFormat.label": "Describe new format", - // TODO New key - Add a translation "bitstream.edit.form.newFormat.label": "Beskriv nytt format", // "bitstream.edit.form.newFormat.hint": "The application you used to create the file, and the version number (for example, \"ACMESoft SuperApp version 1.5\").", - // TODO New key - Add a translation "bitstream.edit.form.newFormat.hint": "Programmet som använts för att skapa filen, samt versionsnummer (t ex, \"ACMESoft SuperApp version 1.5\").", // "bitstream.edit.form.primaryBitstream.label": "Primary bitstream", - // TODO New key - Add a translation "bitstream.edit.form.primaryBitstream.label": "Primär fil", // "bitstream.edit.form.selectedFormat.hint": "If the format is not in the above list, select \"format not in list\" above and describe it under \"Describe new format\".", - // TODO New key - Add a translation "bitstream.edit.form.selectedFormat.hint": "Om formatet inte visas i listan ovan, välj \"formatet saknas\" och lägg till beskrivning under \"Beskriv nytt format\".", // "bitstream.edit.form.selectedFormat.label": "Selected Format", - // TODO New key - Add a translation "bitstream.edit.form.selectedFormat.label": "Välj format", // "bitstream.edit.form.selectedFormat.unknown": "Format not in list", - // TODO New key - Add a translation "bitstream.edit.form.selectedFormat.unknown": "Formatet saknas", // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", - // TODO New key - Add a translation "bitstream.edit.notifications.error.format.title": "Det uppstod ett fel när formatet skulle sparas", // "bitstream.edit.form.iiifLabel.label": "IIIF Label", - // TODO New key - Add a translation "bitstream.edit.form.iiifLabel.label": "IIIF Label", // "bitstream.edit.form.iiifLabel.hint": "Canvas label for this image. If not provided default label will be used.", - // TODO New key - Add a translation "bitstream.edit.form.iiifLabel.hint": "Canvas label for this image. If not provided default label will be used.", // "bitstream.edit.form.iiifToc.label": "IIIF Table of Contents", - // TODO New key - Add a translation "bitstream.edit.form.iiifToc.label": "IIIF Table of Contents", // "bitstream.edit.form.iiifToc.hint": "Adding text here makes this the start of a new table of contents range.", - // TODO New key - Add a translation "bitstream.edit.form.iiifToc.hint": "Adding text here makes this the start of a new table of contents range.", // "bitstream.edit.form.iiifWidth.label": "IIIF Canvas Width", - // TODO New key - Add a translation "bitstream.edit.form.iiifWidth.label": "IIIF Canvas Width", // "bitstream.edit.form.iiifWidth.hint": "The canvas width should usually match the image width.", - // TODO New key - Add a translation "bitstream.edit.form.iiifWidth.hint": "The canvas width should usually match the image width.", // "bitstream.edit.form.iiifHeight.label": "IIIF Canvas Height", - // TODO New key - Add a translation "bitstream.edit.form.iiifHeight.label": "IIIF Canvas Height", // "bitstream.edit.form.iiifHeight.hint": "The canvas height should usually match the image height.", - // TODO New key - Add a translation "bitstream.edit.form.iiifHeight.hint": "The canvas height should usually match the image height.", // "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", - // TODO New key - Add a translation "bitstream.edit.notifications.saved.content": "Ändringarna sparades.", // "bitstream.edit.notifications.saved.title": "Bitstream saved", - // TODO New key - Add a translation "bitstream.edit.notifications.saved.title": "Filen har sparats", // "bitstream.edit.title": "Edit bitstream", - // TODO New key - Add a translation "bitstream.edit.title": "Redigera fil", // "bitstream-request-a-copy.alert.canDownload1": "You already have access to this file. If you want to download the file, click ", - // TODO New key - Add a translation "bitstream-request-a-copy.alert.canDownload1": "Du har redan åtkomst till denna, för att ladda ner den, klicka ", // "bitstream-request-a-copy.alert.canDownload2": "here", - // TODO New key - Add a translation "bitstream-request-a-copy.alert.canDownload2": "här", // "bitstream-request-a-copy.header": "Request a copy of the file", - // TODO New key - Add a translation "bitstream-request-a-copy.header": "Begär en kopia av filen", // "bitstream-request-a-copy.intro": "Enter the following information to request a copy for the following item: ", - // TODO New key - Add a translation "bitstream-request-a-copy.intro": "Ange följande information för att begära en kopia: ", // "bitstream-request-a-copy.intro.bitstream.one": "Requesting the following file: ", - // TODO New key - Add a translation "bitstream-request-a-copy.intro.bitstream.one": "Önskar följande fil: ", // "bitstream-request-a-copy.intro.bitstream.all": "Requesting all files. ", - // TODO New key - Add a translation "bitstream-request-a-copy.intro.bitstream.all": "Önskar samtliga filer. ", // "bitstream-request-a-copy.name.label": "Name *", - // TODO New key - Add a translation "bitstream-request-a-copy.name.label": "Namn *", // "bitstream-request-a-copy.name.error": "The name is required", - // TODO New key - Add a translation "bitstream-request-a-copy.name.error": "Namn måste anges", // "bitstream-request-a-copy.email.label": "Your e-mail address *", - // TODO New key - Add a translation "bitstream-request-a-copy.email.label": "E-post *", // "bitstream-request-a-copy.email.hint": "This email address is used for sending the file.", - // TODO New key - Add a translation "bitstream-request-a-copy.email.hint": "Filen kommer skickas till denna e-postadress.", // "bitstream-request-a-copy.email.error": "Please enter a valid email address.", - // TODO New key - Add a translation "bitstream-request-a-copy.email.error": "Ange en giltig e-postadress.", // "bitstream-request-a-copy.allfiles.label": "Files", - // TODO New key - Add a translation "bitstream-request-a-copy.allfiles.label": "Filer", // "bitstream-request-a-copy.files-all-false.label": "Only the requested file", - // TODO New key - Add a translation "bitstream-request-a-copy.files-all-false.label": "Endast den begärda filen", // "bitstream-request-a-copy.files-all-true.label": "All files (of this item) in restricted access", - // TODO New key - Add a translation "bitstream-request-a-copy.files-all-true.label": "Alla filer (i denna post) som har begränsad åtkomst", // "bitstream-request-a-copy.message.label": "Message", - // TODO New key - Add a translation "bitstream-request-a-copy.message.label": "Meddelande", // "bitstream-request-a-copy.return": "Back", - // TODO New key - Add a translation "bitstream-request-a-copy.return": "Tillbaka", // "bitstream-request-a-copy.submit": "Request copy", - // TODO New key - Add a translation "bitstream-request-a-copy.submit": "Begär kopia", // "bitstream-request-a-copy.submit.success": "The item request was submitted successfully.", - // TODO New key - Add a translation "bitstream-request-a-copy.submit.success": "Begäran har skickats.", // "bitstream-request-a-copy.submit.error": "Something went wrong with submitting the item request.", - // TODO New key - Add a translation "bitstream-request-a-copy.submit.error": "Ett fel uppstod när begäran skulle skickas.", // "browse.comcol.by.author": "By Author", - // TODO New key - Add a translation "browse.comcol.by.author": "Författare", // "browse.comcol.by.dateissued": "By Issue Date", - // TODO New key - Add a translation "browse.comcol.by.dateissued": "Datum", // "browse.comcol.by.subject": "By Subject", - // TODO New key - Add a translation "browse.comcol.by.subject": "Ämne", // "browse.comcol.by.title": "By Title", - // TODO New key - Add a translation "browse.comcol.by.title": "Titel", // "browse.comcol.head": "Browse", - // TODO New key - Add a translation - "browse.comcol.head": "Browse", + "browse.comcol.head": "Bläddra", // "browse.empty": "No items to show.", - // TODO New key - Add a translation "browse.empty": "Inga poster att visa.", // "browse.metadata.author": "Author", - // TODO New key - Add a translation "browse.metadata.author": "Författare", // "browse.metadata.dateissued": "Issue Date", - // TODO New key - Add a translation "browse.metadata.dateissued": "Publicerad", // "browse.metadata.subject": "Subject", - // TODO New key - Add a translation "browse.metadata.subject": "Ämnesord", // "browse.metadata.title": "Title", - // TODO New key - Add a translation "browse.metadata.title": "Titel", // "browse.metadata.author.breadcrumbs": "Browse by Author", - // TODO New key - Add a translation "browse.metadata.author.breadcrumbs": "Författare", // "browse.metadata.dateissued.breadcrumbs": "Browse by Date", - // TODO New key - Add a translation "browse.metadata.dateissued.breadcrumbs": "Publiceringsdatum", // "browse.metadata.subject.breadcrumbs": "Browse by Subject", - // TODO New key - Add a translation "browse.metadata.subject.breadcrumbs": "Ämnen", // "browse.metadata.title.breadcrumbs": "Browse by Title", - // TODO New key - Add a translation "browse.metadata.title.breadcrumbs": "Titlar", // "pagination.next.button": "Next", - // TODO New key - Add a translation "pagination.next.button": "Nästa", // "pagination.previous.button": "Föregående", - // TODO New key - Add a translation "pagination.previous.button": "Föregående", // "browse.startsWith.choose_start": "(Choose start)", - // TODO New key - Add a translation "browse.startsWith.choose_start": "(Välj startdatum)", // "browse.startsWith.choose_year": "(Välj årtal)", - // TODO New key - Add a translation "browse.startsWith.choose_year": "(Välj årtal)", // "browse.startsWith.choose_year.label": "Choose the issue year", - // TODO New key - Add a translation "browse.startsWith.choose_year.label": "Välj år", // "browse.startsWith.jump": "Jump to a point in the index:", - // TODO New key - Add a translation "browse.startsWith.jump": "Gå direkt till:", // "browse.startsWith.months.april": "April", - // TODO New key - Add a translation "browse.startsWith.months.april": "April", // "browse.startsWith.months.august": "August", - // TODO New key - Add a translation "browse.startsWith.months.august": "Augusti", // "browse.startsWith.months.december": "December", - // TODO New key - Add a translation "browse.startsWith.months.december": "December", // "browse.startsWith.months.february": "February", - // TODO New key - Add a translation "browse.startsWith.months.february": "Februari", // "browse.startsWith.months.january": "January", - // TODO New key - Add a translation "browse.startsWith.months.january": "Januari", // "browse.startsWith.months.july": "July", - // TODO New key - Add a translation "browse.startsWith.months.july": "Juli", // "browse.startsWith.months.june": "June", - // TODO New key - Add a translation - "browse.startsWith.months.june": "June", + "browse.startsWith.months.june": "Juni", // "browse.startsWith.months.march": "March", - // TODO New key - Add a translation "browse.startsWith.months.march": "Mars", // "browse.startsWith.months.may": "May", - // TODO New key - Add a translation "browse.startsWith.months.may": "Maj", // "browse.startsWith.months.none": "(Välj månad)", - // TODO New key - Add a translation "browse.startsWith.months.none": "(Välj månad)", // "browse.startsWith.months.none.label": "Choose the issue month", - // TODO New key - Add a translation "browse.startsWith.months.none.label": "Välj utgivningsmånad", // "browse.startsWith.months.november": "November", - // TODO New key - Add a translation "browse.startsWith.months.november": "November", // "browse.startsWith.months.october": "October", - // TODO New key - Add a translation "browse.startsWith.months.october": "Oktober", // "browse.startsWith.months.september": "September", - // TODO New key - Add a translation "browse.startsWith.months.september": "September", // "browse.startsWith.submit": "Browse", - // TODO New key - Add a translation - "browse.startsWith.submit": "Browse", + "browse.startsWith.submit": "Bläddra", // "browse.startsWith.type_date": "Or type in a date (year-month) and click 'Browse'", - // TODO New key - Add a translation - "browse.startsWith.type_date": "Eller skriv in ett datum (år-månad) och klicka på 'Browse'", + "browse.startsWith.type_date": "Eller skriv in ett datum (år-månad) och klicka på 'Bläddra'", // "browse.startsWith.type_date.label": "Or type in a date (year-month) and click on the Browse button", - // TODO New key - Add a translation - "browse.startsWith.type_date.label": "Eller skriv in ett datum (år-månad) och klicka på 'Browse'", + "browse.startsWith.type_date.label": "Eller skriv in ett datum (år-månad) och klicka på 'Bläddra'", // "browse.startsWith.type_text": "Type the first few letters and click on the Browse button", - // TODO New key - Add a translation - "browse.startsWith.type_text": "Ange de första bokstäverna och klicka på 'Browse'", + "browse.startsWith.type_text": "Ange de första bokstäverna och klicka på 'Bläddra'", // "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", - // TODO New key - Add a translation - "browse.title": "Browsar {{ collection }} efter {{ field }} {{ value }}", + "browse.title": "Bläddrar {{ collection }} efter {{ field }} {{ value }}", // "chips.remove": "Remove chip", - // TODO New key - Add a translation "chips.remove": "Radera chip", // "collection.create.head": "Create a Collection", - // TODO New key - Add a translation "collection.create.head": "Skapa samling", // "collection.create.notifications.success": "Successfully created the Collection", - // TODO New key - Add a translation "collection.create.notifications.success": "Samlingen har skapats", // "collection.create.sub-head": "Create a Collection for Community {{ parent }}", - // TODO New key - Add a translation "collection.create.sub-head": "Skapa en samling i enhet {{ parent }}", // "collection.curate.header": "Curate Collection: {{collection}}", - // TODO New key - Add a translation "collection.curate.header": "Kurera samling: {{collection}}", // "collection.delete.cancel": "Cancel", - // TODO New key - Add a translation "collection.delete.cancel": "Avbryt", // "collection.delete.confirm": "Confirm", - // TODO New key - Add a translation "collection.delete.confirm": "Bekräfta", // "collection.delete.processing": "Deleting", - // TODO New key - Add a translation "collection.delete.processing": "Raderar", // "collection.delete.head": "Delete Collection", - // TODO New key - Add a translation "collection.delete.head": "Radera samling", // "collection.delete.notification.fail": "Collection could not be deleted", - // TODO New key - Add a translation "collection.delete.notification.fail": "Samlingen kunde inte raderas", // "collection.delete.notification.success": "Successfully deleted collection", - // TODO New key - Add a translation "collection.delete.notification.success": "Samlingen har raderats", // "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", - // TODO New key - Add a translation "collection.delete.text": "Är du säker på att du vill radera denna samling: \"{{ dso }}\"", // "collection.edit.delete": "Delete this collection", - // TODO New key - Add a translation "collection.edit.delete": "Radera denna samling", // "collection.edit.head": "Edit Collection", - // TODO New key - Add a translation "collection.edit.head": "Redigera denna samling", // "collection.edit.breadcrumbs": "Edit Collection", - // TODO New key - Add a translation "collection.edit.breadcrumbs": "Redigera samling", // "collection.edit.tabs.mapper.head": "Item Mapper", - // TODO New key - Add a translation "collection.edit.tabs.mapper.head": "Mappa poster", // "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", - // TODO New key - Add a translation "collection.edit.tabs.item-mapper.title": "Redigera samling - Mappa poster", // "collection.edit.item-mapper.cancel": "Cancel", - // TODO New key - Add a translation "collection.edit.item-mapper.cancel": "Avbryt", // "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", - // TODO New key - Add a translation "collection.edit.item-mapper.collection": "Samling: \"{{name}}\"", // "collection.edit.item-mapper.confirm": "Map selected items", - // TODO New key - Add a translation "collection.edit.item-mapper.confirm": "Mappa markerade poster", // "collection.edit.item-mapper.description": "This is the item mapper tool that allows collection administrators to map items from other collections into this collection. You can search for items from other collections and map them, or browse the list of currently mapped items.", - // TODO New key - Add a translation "collection.edit.item-mapper.description": "Detta är ett verktyg som möjliggör för administratörer att mappa poster från andra samlingar till denna. Sök efter poster för att mappa, eller lista redan mappade poster.", // "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", - // TODO New key - Add a translation "collection.edit.item-mapper.head": "Mappa poster - Mappa poster från andra samlingar", // "collection.edit.item-mapper.no-search": "Please enter a query to search", - // TODO New key - Add a translation "collection.edit.item-mapper.no-search": "Ange en sökfråga", // "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", - // TODO New key - Add a translation "collection.edit.item-mapper.notifications.map.error.content": "Ett fel uppstod vid mappningen för {{amount}} poster.", // "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", - // TODO New key - Add a translation "collection.edit.item-mapper.notifications.map.error.head": "Mappningsfel", // "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", - // TODO New key - Add a translation "collection.edit.item-mapper.notifications.map.success.content": "{{amount}} poster har mappats.", // "collection.edit.item-mapper.notifications.map.success.head": "Mapping completed", - // TODO New key - Add a translation "collection.edit.item-mapper.notifications.map.success.head": "Mappningen har slutförts", // "collection.edit.item-mapper.notifications.unmap.error.content": "Errors occurred for removing the mappings of {{amount}} items.", - // TODO New key - Add a translation "collection.edit.item-mapper.notifications.unmap.error.content": "Fel vid mappningen uppstod för {{amount}} poster.", // "collection.edit.item-mapper.notifications.unmap.error.head": "Remove mapping errors", - // TODO New key - Add a translation "collection.edit.item-mapper.notifications.unmap.error.head": "Ta bort mappningsfel", // "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", - // TODO New key - Add a translation "collection.edit.item-mapper.notifications.unmap.success.content": "Mappningen för {{amount}} poster har tagits bort.", // "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", - // TODO New key - Add a translation "collection.edit.item-mapper.notifications.unmap.success.head": "Mappning har tagits bort", // "collection.edit.item-mapper.remove": "Remove selected item mappings", - // TODO New key - Add a translation "collection.edit.item-mapper.remove": "Ta bort markerade mappningar", // "collection.edit.item-mapper.search-form.placeholder": "Search items...", - // TODO New key - Add a translation "collection.edit.item-mapper.search-form.placeholder": "Sök...", // "collection.edit.item-mapper.tabs.browse": "Browse mapped items", - // TODO New key - Add a translation - "collection.edit.item-mapper.tabs.browse": "Browsa mappade poster", + "collection.edit.item-mapper.tabs.browse": "Bläddra i mappade poster", // "collection.edit.item-mapper.tabs.map": "Map new items", - // TODO New key - Add a translation "collection.edit.item-mapper.tabs.map": "Mappa nya poster", // "collection.edit.logo.delete.title": "Delete logo", - // TODO New key - Add a translation "collection.edit.logo.delete.title": "Radera logga", // "collection.edit.logo.delete-undo.title": "Undo delete", - // TODO New key - Add a translation "collection.edit.logo.delete-undo.title": "Ångra radera", // "collection.edit.logo.label": "Collection logo", - // TODO New key - Add a translation "collection.edit.logo.label": "Logga för samlingen", // "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", - // TODO New key - Add a translation "collection.edit.logo.notifications.add.error": "Uppladdning av logga för samlingen misslyckades. Kontrollera filen och försök igen.", // "collection.edit.logo.notifications.add.success": "Upload Collection logo successful.", - // TODO New key - Add a translation "collection.edit.logo.notifications.add.success": "Logga för samlingen har laddats upp.", // "collection.edit.logo.notifications.delete.success.title": "Logo deleted", - // TODO New key - Add a translation "collection.edit.logo.notifications.delete.success.title": "Logga har raderats", // "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", - // TODO New key - Add a translation "collection.edit.logo.notifications.delete.success.content": "Samlingens logga har raderats", // "collection.edit.logo.notifications.delete.error.title": "Error deleting logo", - // TODO New key - Add a translation "collection.edit.logo.notifications.delete.error.title": "Ett fel uppstod när logga skulle raderas", // "collection.edit.logo.upload": "Drop a Collection Logo to upload", - // TODO New key - Add a translation "collection.edit.logo.upload": "Släpp en logga här för att ladda upp", // "collection.edit.notifications.success": "Successfully edited the Collection", - // TODO New key - Add a translation "collection.edit.notifications.success": "Samlingen har redigerats", // "collection.edit.return": "Back", - // TODO New key - Add a translation "collection.edit.return": "Tillbaka", // "collection.edit.tabs.curate.head": "Curate", - // TODO New key - Add a translation "collection.edit.tabs.curate.head": "Kurera", // "collection.edit.tabs.curate.title": "Collection Edit - Curate", - // TODO New key - Add a translation "collection.edit.tabs.curate.title": "Redigera samling - kurera", // "collection.edit.tabs.authorizations.head": "Authorizations", - // TODO New key - Add a translation "collection.edit.tabs.authorizations.head": "Behörigheter", // "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", - // TODO New key - Add a translation "collection.edit.tabs.authorizations.title": "Redigera samling - Behörigheter", // "collection.edit.tabs.metadata.head": "Edit Metadata", - // TODO New key - Add a translation "collection.edit.tabs.metadata.head": "Redigera metadata", // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", - // TODO New key - Add a translation "collection.edit.tabs.metadata.title": "Redigera samling - Metadata", // "collection.edit.tabs.roles.head": "Assign Roles", - // TODO New key - Add a translation "collection.edit.tabs.roles.head": "Tilldela behörighet (roller)", // "collection.edit.tabs.roles.title": "Collection Edit - Roles", - // TODO New key - Add a translation "collection.edit.tabs.roles.title": "Redigera samling - Behörigheter", // "collection.edit.tabs.source.external": "This collection harvests its content from an external source", - // TODO New key - Add a translation "collection.edit.tabs.source.external": "Denna samling höstar in sitt innehåll från en extern källa", // "collection.edit.tabs.source.form.errors.oaiSource.required": "You must provide a set id of the target collection.", - // TODO New key - Add a translation "collection.edit.tabs.source.form.errors.oaiSource.required": "Du måste ange set id för målsamlingen.", // "collection.edit.tabs.source.form.harvestType": "Content being harvested", - // TODO New key - Add a translation "collection.edit.tabs.source.form.harvestType": "Innehåll höstas in", // "collection.edit.tabs.source.form.head": "Configure an external source", - // TODO New key - Add a translation "collection.edit.tabs.source.form.head": "Konfigurera en extern källa", // "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", - // TODO New key - Add a translation "collection.edit.tabs.source.form.metadataConfigId": "Metadataformat", // "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", - // TODO New key - Add a translation "collection.edit.tabs.source.form.oaiSetId": "OAI specifikt set id", // "collection.edit.tabs.source.form.oaiSource": "OAI Provider", - // TODO New key - Add a translation "collection.edit.tabs.source.form.oaiSource": "OAI Provider", // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Harvest metadata and bitstreams (requires ORE support)", - // TODO New key - Add a translation "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Hösta både metadata och filer (kräver stöd för ORE)", // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest metadata and references to bitstreams (requires ORE support)", - // TODO New key - Add a translation "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Hösta både metadata och referenser till filer (kräver stöd för ORE)", // "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvest metadata only", - // TODO New key - Add a translation "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Hösta enbart metadata", // "collection.edit.tabs.source.head": "Content Source", - // TODO New key - Add a translation "collection.edit.tabs.source.head": "Källa för innehåll", // "collection.edit.tabs.source.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - // TODO New key - Add a translation "collection.edit.tabs.source.notifications.discarded.content": "Ändringarna sparades inte. För att återkalla dina förändringar, klicka 'Ångra'", // "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", - // TODO New key - Add a translation "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", // "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", - // TODO New key - Add a translation "collection.edit.tabs.source.notifications.invalid.content": "Ändringarna sparades inte. Kontrollera att alla fält är giltiga och försök att spara igen.", // "collection.edit.tabs.source.notifications.invalid.title": "Metadata invalid", - // TODO New key - Add a translation "collection.edit.tabs.source.notifications.invalid.title": "Metadatan är ogiltig", // "collection.edit.tabs.source.notifications.saved.content": "Your changes to this collection's content source were saved.", - // TODO New key - Add a translation "collection.edit.tabs.source.notifications.saved.content": "Ändringarna har sparats.", // "collection.edit.tabs.source.notifications.saved.title": "Content Source saved", - // TODO New key - Add a translation "collection.edit.tabs.source.notifications.saved.title": "Källa sparades.", // "collection.edit.tabs.source.title": "Collection Edit - Content Source", - // TODO New key - Add a translation "collection.edit.tabs.source.title": "Redigera samling - Källa för innehåll", // "collection.edit.template.add-button": "Add", - // TODO New key - Add a translation "collection.edit.template.add-button": "Lägg till", // "collection.edit.template.breadcrumbs": "Item template", - // TODO New key - Add a translation "collection.edit.template.breadcrumbs": "postmall", // "collection.edit.template.cancel": "Cancel", - // TODO New key - Add a translation "collection.edit.template.cancel": "Avbryt", // "collection.edit.template.delete-button": "Delete", - // TODO New key - Add a translation "collection.edit.template.delete-button": "Radera", // "collection.edit.template.edit-button": "Edit", - // TODO New key - Add a translation "collection.edit.template.edit-button": "Redigera", // "collection.edit.template.error": "An error occurred retrieving the template item", - // TODO New key - Add a translation "collection.edit.template.error": "Ett fel uppstod när mallen hämtades", // "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", - // TODO New key - Add a translation "collection.edit.template.head": "Redigera postmall för samlingen \"{{ collection }}\"", // "collection.edit.template.label": "Template item", - // TODO New key - Add a translation "collection.edit.template.label": "Postmall", // "collection.edit.template.loading": "Loading template item...", - // TODO New key - Add a translation "collection.edit.template.loading": "Laddar postmall...", // "collection.edit.template.notifications.delete.error": "Failed to delete the item template", - // TODO New key - Add a translation "collection.edit.template.notifications.delete.error": "Misslickades med att radera postmall", // "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", - // TODO New key - Add a translation "collection.edit.template.notifications.delete.success": "Postmall har raderats", // "collection.edit.template.title": "Edit Template Item", - // TODO New key - Add a translation "collection.edit.template.title": "Redigera postmall", // "collection.form.abstract": "Short Beskrivning", - // TODO New key - Add a translation "collection.form.abstract": "Kort beskrivning", // "collection.form.description": "Introductory text (HTML)", - // TODO New key - Add a translation "collection.form.description": "Inledande text (HTML)", // "collection.form.errors.title.required": "Please enter a collection name", - // TODO New key - Add a translation "collection.form.errors.title.required": "Ange ett namn för samlingen", // "collection.form.license": "License", - // TODO New key - Add a translation "collection.form.license": "Licens", // "collection.form.provenance": "Provenance", - // TODO New key - Add a translation "collection.form.provenance": "Provenance", // "collection.form.rights": "Copyright text (HTML)", - // TODO New key - Add a translation "collection.form.rights": "Copyright text (HTML)", // "collection.form.tableofcontents": "News (HTML)", - // TODO New key - Add a translation "collection.form.tableofcontents": "Nyheter (HTML)", // "collection.form.title": "Name", - // TODO New key - Add a translation "collection.form.title": "Namn", // "collection.form.entityType": "Entity Type", - // TODO New key - Add a translation "collection.form.entityType": "Entitetstyp", // "collection.listelement.badge": "Collection", - // TODO New key - Add a translation "collection.listelement.badge": "Samling", // "collection.page.browse.recent.head": "Recent Submissions", - // TODO New key - Add a translation "collection.page.browse.recent.head": "Senast publicerade", // "collection.page.browse.recent.empty": "No items to show", - // TODO New key - Add a translation "collection.page.browse.recent.empty": "Det finns ingenting att visa", // "collection.page.edit": "Edit this collection", - // TODO New key - Add a translation "collection.page.edit": "Redigera denna samling", // "collection.page.handle": "Permanent URI for this collection", - // TODO New key - Add a translation "collection.page.handle": "Använd denna länk för att länka till denna samling:", // "collection.page.license": "License", - // TODO New key - Add a translation "collection.page.license": "Licens", // "collection.page.news": "News", - // TODO New key - Add a translation "collection.page.news": "Nyheter", // "collection.select.confirm": "Confirm selected", - // TODO New key - Add a translation "collection.select.confirm": "Bekräfta val", // "collection.select.empty": "No collections to show", - // TODO New key - Add a translation "collection.select.empty": "Det finns inga samlingar att visa", // "collection.select.table.title": "Title", - // TODO New key - Add a translation "collection.select.table.title": "Titel", // "collection.source.controls.head": "Harvest Controls", - // TODO New key - Add a translation "collection.source.controls.head": "Inställningar för höstning", + // "collection.source.controls.test.submit.error": "Something went wrong with initiating the testing of the settings", - // TODO New key - Add a translation "collection.source.controls.test.submit.error": "Något gick fel när testet av inställningarna initierades", + // "collection.source.controls.test.failed": "The script to test the settings has failed", - // TODO New key - Add a translation "collection.source.controls.test.failed": "Skriptet som testar inställningarna kunde inte köras", + // "collection.source.controls.test.completed": "The script to test the settings has successfully finished", - // TODO New key - Add a translation "collection.source.controls.test.completed": "Skriptet som testar inställningarna har körts med lyckat resultat", + // "collection.source.controls.test.submit": "Test configuration", - // TODO New key - Add a translation "collection.source.controls.test.submit": "Testa konfigurationen", + // "collection.source.controls.test.running": "Testing configuration...", - // TODO New key - Add a translation "collection.source.controls.test.running": "Testar konfigurationen...", + // "collection.source.controls.import.submit.success": "The import has been successfully initiated", - // TODO New key - Add a translation "collection.source.controls.import.submit.success": "Importen har initierats", + // "collection.source.controls.import.submit.error": "Something went wrong with initiating the import", - // TODO New key - Add a translation "collection.source.controls.import.submit.error": "Något gick fel när importen skulle initieras", + // "collection.source.controls.import.submit": "Import now", - // TODO New key - Add a translation "collection.source.controls.import.submit": "Importera nu", + // "collection.source.controls.import.running": "Importing...", - // TODO New key - Add a translation "collection.source.controls.import.running": "Importerar...", + // "collection.source.controls.import.failed": "An error occurred during the import", - // TODO New key - Add a translation "collection.source.controls.import.failed": "Ett fel uppstod under importen", + // "collection.source.controls.import.completed": "The import completed", - // TODO New key - Add a translation "collection.source.controls.import.completed": "Importen har slutförts", + // "collection.source.controls.reset.submit.success": "The reset and reimport has been successfully initiated", - // TODO New key - Add a translation "collection.source.controls.reset.submit.success": "Återställning och omimport har initierats", + // "collection.source.controls.reset.submit.error": "Something went wrong with initiating the reset and reimport", - // TODO New key - Add a translation "collection.source.controls.reset.submit.error": "Något gick fel vid initiering av återställning och omimport", + // "collection.source.controls.reset.failed": "An error occurred during the reset and reimport", - // TODO New key - Add a translation "collection.source.controls.reset.failed": "Ett fel uppstod under återställning och omimport", + // "collection.source.controls.reset.completed": "The reset and reimport completed", - // TODO New key - Add a translation "collection.source.controls.reset.completed": "Återställningen och omimporten har slutförts", + // "collection.source.controls.reset.submit": "Reset and reimport", - // TODO New key - Add a translation "collection.source.controls.reset.submit": "Återställ och importera om", + // "collection.source.controls.reset.running": "Resetting and reimporting...", - // TODO New key - Add a translation "collection.source.controls.reset.running": "Återställer och importerar om...", + // "collection.source.controls.harvest.status": "Harvest status:", - // TODO New key - Add a translation "collection.source.controls.harvest.status": "Status:", + // "collection.source.controls.harvest.start": "Harvest start time:", - // TODO New key - Add a translation "collection.source.controls.harvest.start": "Starttid:", + // "collection.source.controls.harvest.last": "Last time harvested:", - // TODO New key - Add a translation "collection.source.controls.harvest.last": "Senaste höstning:", + // "collection.source.controls.harvest.message": "Harvest info:", - // TODO New key - Add a translation "collection.source.controls.harvest.message": "Info om höstning:", + // "collection.source.controls.harvest.no-information": "N/A", - // TODO New key - Add a translation "collection.source.controls.harvest.no-information": "saknas", // "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", - // TODO New key - Add a translation "collection.source.update.notifications.error.content": "Inställningarna har testats och fungerade inte.", // "collection.source.update.notifications.error.title": "Server Error", - // TODO New key - Add a translation "collection.source.update.notifications.error.title": "Serverfel", // "communityList.breadcrumbs": "Community List", - // TODO New key - Add a translation "communityList.breadcrumbs": "Enheter", // "communityList.tabTitle": "Community List", - // TODO New key - Add a translation "communityList.tabTitle": "Enheter", - // "communityList.title": "Samlingar i Chalmers ODR", - // TODO New key - Add a translation - "communityList.title": "Samlingar i Chalmers ODR", + // "communityList.title": "List of Communities", + "communityList.title": "Lista med enheter", // "communityList.showMore": "Show More", - // TODO New key - Add a translation "communityList.showMore": "Visa fler", // "community.create.head": "Create a Community", - // TODO New key - Add a translation "community.create.head": "Skapa en ny enhet", // "community.create.notifications.success": "Successfully created the Community", - // TODO New key - Add a translation "community.create.notifications.success": "Enheten har skapats", // "community.create.sub-head": "Create a Sub-Community for Community {{ parent }}", - // TODO New key - Add a translation "community.create.sub-head": "Skapa en underenhet till enheten {{ parent }}", // "community.curate.header": "Curate Community: {{community}}", - // TODO New key - Add a translation "community.curate.header": "Kurera enhet: {{community}}", // "community.delete.cancel": "Cancel", - // TODO New key - Add a translation "community.delete.cancel": "Avbryt", // "community.delete.confirm": "Confirm", - // TODO New key - Add a translation "community.delete.confirm": "Bekräfta", // "community.delete.processing": "Deleting...", - // TODO New key - Add a translation "community.delete.processing": "Raderar...", // "community.delete.head": "Delete Community", - // TODO New key - Add a translation "community.delete.head": "Radera enhet", // "community.delete.notification.fail": "Community could not be deleted", - // TODO New key - Add a translation - "community.delete.notification.fail": "Eneten kunde inte raderas", + "community.delete.notification.fail": "Enheten kunde inte raderas", // "community.delete.notification.success": "Successfully deleted community", - // TODO New key - Add a translation "community.delete.notification.success": "Enheten har raderats", // "community.delete.text": "Are you sure you want to delete community \"{{ dso }}\"", - // TODO New key - Add a translation "community.delete.text": "Är du säker på att du vill radera denna enhet \"{{ dso }}\"", // "community.edit.delete": "Delete this community", - // TODO New key - Add a translation "community.edit.delete": "Radera denna enhet", // "community.edit.head": "Edit Community", - // TODO New key - Add a translation "community.edit.head": "Redigera enhet", // "community.edit.breadcrumbs": "Edit Community", - // TODO New key - Add a translation "community.edit.breadcrumbs": "Redigera enhet", // "community.edit.logo.delete.title": "Delete logo", - // TODO New key - Add a translation "community.edit.logo.delete.title": "Radera logga", // "community.edit.logo.delete-undo.title": "Undo delete", - // TODO New key - Add a translation "community.edit.logo.delete-undo.title": "Ångra radering", // "community.edit.logo.label": "Community logo", - // TODO New key - Add a translation "community.edit.logo.label": "Enhetens logga", // "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", - // TODO New key - Add a translation "community.edit.logo.notifications.add.error": "Uppladdningen misslyckades. Kontrollera filen och försök igen.", // "community.edit.logo.notifications.add.success": "Upload Community logo successful.", - // TODO New key - Add a translation "community.edit.logo.notifications.add.success": "Uppladdningen lyckades.", // "community.edit.logo.notifications.delete.success.title": "Logo deleted", - // TODO New key - Add a translation "community.edit.logo.notifications.delete.success.title": "Loggan har raderats", // "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", - // TODO New key - Add a translation "community.edit.logo.notifications.delete.success.content": "Loggan har raderats", // "community.edit.logo.notifications.delete.error.title": "Error deleting logo", - // TODO New key - Add a translation "community.edit.logo.notifications.delete.error.title": "Logga kunde inte raderas", // "community.edit.logo.upload": "Drop a Community Logo to upload", - // TODO New key - Add a translation "community.edit.logo.upload": "Släpp en logga här för att ladda upp", // "community.edit.notifications.success": "Successfully edited the Community", - // TODO New key - Add a translation "community.edit.notifications.success": "Enheten har redigerats", // "community.edit.notifications.unauthorized": "You do not have privileges to make this change", - // TODO New key - Add a translation "community.edit.notifications.unauthorized": "Du har inte behörighet att göra denna ändring", // "community.edit.notifications.error": "An error occured while editing the Community", - // TODO New key - Add a translation "community.edit.notifications.error": "Ett fel uppstod när enheten redigerades", // "community.edit.return": "Back", - // TODO New key - Add a translation "community.edit.return": "Tillbaka", // "community.edit.tabs.curate.head": "Curate", - // TODO New key - Add a translation "community.edit.tabs.curate.head": "Kurera", // "community.edit.tabs.curate.title": "Community Edit - Curate", - // TODO New key - Add a translation "community.edit.tabs.curate.title": "Redigera enhet - Kurera", // "community.edit.tabs.metadata.head": "Edit Metadata", - // TODO New key - Add a translation "community.edit.tabs.metadata.head": "Redigera metadata", // "community.edit.tabs.metadata.title": "Community Edit - Metadata", - // TODO New key - Add a translation "community.edit.tabs.metadata.title": "Redigera enhet - Metadata", // "community.edit.tabs.roles.head": "Assign Roles", - // TODO New key - Add a translation "community.edit.tabs.roles.head": "Tilldela roller", // "community.edit.tabs.roles.title": "Community Edit - Roles", - // TODO New key - Add a translation "community.edit.tabs.roles.title": "Redigera enhet - Roller", // "community.edit.tabs.authorizations.head": "Authorizations", - // TODO New key - Add a translation "community.edit.tabs.authorizations.head": "Behörigheter", // "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", - // TODO New key - Add a translation "community.edit.tabs.authorizations.title": "Redigera enhet - Behörigheter", // "community.listelement.badge": "Community", - // TODO New key - Add a translation "community.listelement.badge": "Enhet", // "comcol-role.edit.no-group": "None", - // TODO New key - Add a translation "comcol-role.edit.no-group": "Ingen", // "comcol-role.edit.create": "Create", - // TODO New key - Add a translation "comcol-role.edit.create": "Skapa", // "comcol-role.edit.restrict": "Restrict", - // TODO New key - Add a translation "comcol-role.edit.restrict": "Begränsa", // "comcol-role.edit.delete": "Delete", - // TODO New key - Add a translation "comcol-role.edit.delete": "Radera", // "comcol-role.edit.community-admin.name": "Administrators", - // TODO New key - Add a translation "comcol-role.edit.community-admin.name": "Administratörer", // "comcol-role.edit.collection-admin.name": "Administrators", - // TODO New key - Add a translation "comcol-role.edit.collection-admin.name": "Administratörer", // "comcol-role.edit.community-admin.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", - // TODO New key - Add a translation "comcol-role.edit.community-admin.description": "Administratörer för enheter kan skapa underenheter eller samlingar och administrera dessa. De kan också avgöra vem skall ha behörighet till dessa, redigera metadata (på befintliga poster), och mappa existerande poster från andra samlingar (beroende på behörighet till dessa).", // "comcol-role.edit.collection-admin.description": "Collection administrators decide who can submit items to the collection, edit item metadata (after submission), and add (map) existing items from other collections to this collection (subject to authorization for that collection).", - // TODO New key - Add a translation "comcol-role.edit.collection-admin.description": "Administratörer för samlingar avgör vem som kan skapa nya poster i dessa, redigera metadata (på befintliga poster) och mappa existerande poster från andra samlingar till denna (beroende på behörighet).", // "comcol-role.edit.submitters.name": "Submitters", - // TODO New key - Add a translation "comcol-role.edit.submitters.name": "Submitters", // "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", - // TODO New key - Add a translation "comcol-role.edit.submitters.description": "EPersoner och grupper som har behörighet att skapa nya poster i denna samling.", // "comcol-role.edit.item_read.name": "Default item read access", - // TODO New key - Add a translation "comcol-role.edit.item_read.name": "Default läsåtkomst till post", // "comcol-role.edit.item_read.description": "E-People and Groups that can read new items submitted to this collection. Changes to this role are not retroactive. Existing items in the system will still be viewable by those who had read access at the time of their addition.", - // TODO New key - Add a translation "comcol-role.edit.item_read.description": "EPersoner och grupper som kan läsa nya poster som skapats i denna samling. Förändringar i rollen är inte retroaktiva. Existerande poster kommer fortfarande att vara synliga för dem som hade läsåtkomst när de skapades.", // "comcol-role.edit.item_read.anonymous-group": "Default read for incoming items is currently set to Anonymous.", - // TODO New key - Add a translation "comcol-role.edit.item_read.anonymous-group": "Default läsåtkomst till nyskapade poster är för närvarande satt till Anonymous.", // "comcol-role.edit.bitstream_read.name": "Default bitstream read access", - // TODO New key - Add a translation "comcol-role.edit.bitstream_read.name": "Default läsåtkomst till filer", // "comcol-role.edit.bitstream_read.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", - // TODO New key - Add a translation "comcol-role.edit.bitstream_read.description": "Administratörer för enheter kan skapa underenheter eller samlingar och administrera dessa. De kan också avgöra vem skall ha behörighet till dessa, redigera metadata (på befintliga poster), och mappa existerande poster från andra samlingar (beroende på behörighet till dessa).", // "comcol-role.edit.bitstream_read.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", - // TODO New key - Add a translation "comcol-role.edit.bitstream_read.anonymous-group": "Default läsåtkomst till nyuppladdade filer är för närvarande satt till Anonymous.", // "comcol-role.edit.editor.name": "Editors", - // TODO New key - Add a translation "comcol-role.edit.editor.name": "Editors", // "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", - // TODO New key - Add a translation "comcol-role.edit.editor.description": "Dessa kan redigera metadata på inkommande bidrag, samt acceptera eller neka dessa.", // "comcol-role.edit.finaleditor.name": "Final editors", - // TODO New key - Add a translation "comcol-role.edit.finaleditor.name": "Final editors", // "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", - // TODO New key - Add a translation "comcol-role.edit.finaleditor.description": "Dessa kan redigera metadata på inkommande bidrag, men har inte möjlighet att neka dem.", // "comcol-role.edit.reviewer.name": "Reviewers", - // TODO New key - Add a translation "comcol-role.edit.reviewer.name": "Reviewers", // "comcol-role.edit.reviewer.description": "Reviewers are able to accept or reject incoming submissions. However, they are not able to edit the submission's metadata.", - // TODO New key - Add a translation "comcol-role.edit.reviewer.description": "Reviewers kan acceptera eller neka inkommande bidrag. Men de kan inte redigera metadata.", // "community.form.abstract": "Short Beskrivning", - // TODO New key - Add a translation "community.form.abstract": "Kort beskrivning", // "community.form.description": "Introductory text (HTML)", - // TODO New key - Add a translation "community.form.description": "Inledande text (HTML)", // "community.form.errors.title.required": "Please enter a community name", - // TODO New key - Add a translation "community.form.errors.title.required": "Ange ett namn på enheten", // "community.form.rights": "Copyright text (HTML)", - // TODO New key - Add a translation "community.form.rights": "Copyright text (HTML)", // "community.form.tableofcontents": "News (HTML)", - // TODO New key - Add a translation "community.form.tableofcontents": "Nyheter (HTML)", // "community.form.title": "Name", - // TODO New key - Add a translation "community.form.title": "Namn", // "community.page.edit": "Edit this community", - // TODO New key - Add a translation "community.page.edit": "Redigera denna enhet", // "community.page.handle": "Permanent URI for this community", - // TODO New key - Add a translation "community.page.handle": "Använd denna länk för att länka till samlingen:", // "community.page.license": "License", - // TODO New key - Add a translation "community.page.license": "Licens", // "community.page.news": "News", - // TODO New key - Add a translation "community.page.news": "News", // "community.all-lists.head": "Subcommunities and Collections", - // TODO New key - Add a translation "community.all-lists.head": "Samling", // "community.sub-collection-list.head": "Samlingar Community", - // TODO New key - Add a translation "community.sub-collection-list.head": "Samlingar", // "community.sub-community-list.head": "Communities of this Community", - // TODO New key - Add a translation "community.sub-community-list.head": "Enheter under denna enhet", // "cookies.consent.accept-all": "Accept all", - // TODO New key - Add a translation "cookies.consent.accept-all": "Acceptera alla", // "cookies.consent.accept-selected": "Accept selected", - // TODO New key - Add a translation "cookies.consent.accept-selected": "Acceptera markerade", // "cookies.consent.app.opt-out.description": "This app is loaded by default (but you can opt out)", - // TODO New key - Add a translation "cookies.consent.app.opt-out.description": "Denna app har laddats per default (men du kan välja opt out)", // "cookies.consent.app.opt-out.title": "(opt-out)", - // TODO New key - Add a translation "cookies.consent.app.opt-out.title": "(opt-out)", // "cookies.consent.app.purpose": "purpose", - // TODO New key - Add a translation "cookies.consent.app.purpose": "syfte", // "cookies.consent.app.required.description": "This application is always required", - // TODO New key - Add a translation "cookies.consent.app.required.description": "Denna applikation krävs alltid", // "cookies.consent.app.required.title": "(always required)", - // TODO New key - Add a translation "cookies.consent.app.required.title": "(krävs alltid)", // "cookies.consent.update": "There were changes since your last visit, please update your consent.", - // TODO New key - Add a translation "cookies.consent.update": "Ändringar har gjorts sedan ditt senaste besök, vänligen uppdatera ditt medgivande.", // "cookies.consent.close": "Close", - // TODO New key - Add a translation "cookies.consent.close": "Stäng", // "cookies.consent.decline": "Decline", - // TODO New key - Add a translation "cookies.consent.decline": "Avböj", // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", - // TODO New key - Add a translation "cookies.consent.content-notice.description": "Vi samlar in och hanterar dina persondata för följande syften: Autenticering, inställningar, godkännanden och statistik.
För mer information, läs {privacyPolicy}.", // "cookies.consent.content-notice.learnMore": "Customize", - // TODO New key - Add a translation "cookies.consent.content-notice.learnMore": "Anpassa", // "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", - // TODO New key - Add a translation "cookies.consent.content-modal.description": "Se och anpassa den information som vi samlar in.", // "cookies.consent.content-modal.privacy-policy.name": "privacy policy", - // TODO New key - Add a translation "cookies.consent.content-modal.privacy-policy.name": "personuppgifter och cookies", // "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", - // TODO New key - Add a translation "cookies.consent.content-modal.privacy-policy.text": "För mer information, läs {privacyPolicy}.", // "cookies.consent.content-modal.title": "Information that we collect", - // TODO New key - Add a translation "cookies.consent.content-modal.title": "Information som vi samlar in", // "cookies.consent.app.title.authentication": "Authentication", - // TODO New key - Add a translation "cookies.consent.app.title.authentication": "Autenticering", // "cookies.consent.app.description.authentication": "Required for signing you in", - // TODO New key - Add a translation "cookies.consent.app.description.authentication": "Behövs för att du skall kunna logga in", // "cookies.consent.app.title.preferences": "Preferences", - // TODO New key - Add a translation "cookies.consent.app.title.preferences": "Inställningar", // "cookies.consent.app.description.preferences": "Required for saving your preferences", - // TODO New key - Add a translation "cookies.consent.app.description.preferences": "Behövs för att kunna spara dina inställningar", // "cookies.consent.app.title.acknowledgement": "Acknowledgement", - // TODO New key - Add a translation "cookies.consent.app.title.acknowledgement": "Godkännande", // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", - // TODO New key - Add a translation "cookies.consent.app.description.acknowledgement": "Behövs för att spara dina godkännanden och medgivanden", // "cookies.consent.app.title.google-analytics": "Google Analytics", - // TODO New key - Add a translation "cookies.consent.app.title.google-analytics": "Google Analytics", // "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", - // TODO New key - Add a translation "cookies.consent.app.description.google-analytics": "Tillåt oss att spåra statistiska data", // "cookies.consent.purpose.functional": "Functional", - // TODO New key - Add a translation "cookies.consent.purpose.functional": "Funktionella", // "cookies.consent.purpose.statistical": "Statistical", - // TODO New key - Add a translation "cookies.consent.purpose.statistical": "Statistiska", // "curation-task.task.checklinks.label": "Check Links in Metadata", - // TODO New key - Add a translation "curation-task.task.checklinks.label": "Kontrollera länkar i metadata", // "curation-task.task.noop.label": "NOOP", - // TODO New key - Add a translation "curation-task.task.noop.label": "NOOP", // "curation-task.task.profileformats.label": "Profile Bitstream Formats", @@ -2391,252 +1839,192 @@ "curation-task.task.profileformats.label": "Profile Bitstream Formats", // "curation-task.task.requiredmetadata.label": "Check for Required Metadata", - // TODO New key - Add a translation "curation-task.task.requiredmetadata.label": "Kontrollera obligatoriska metadata", // "curation-task.task.translate.label": "Microsoft Translator", - // TODO New key - Add a translation "curation-task.task.translate.label": "Microsoft Translator", // "curation-task.task.vscan.label": "Virus Scan", - // TODO New key - Add a translation "curation-task.task.vscan.label": "Virus Scan", // "curation.form.task-select.label": "Task:", - // TODO New key - Add a translation "curation.form.task-select.label": "Uppgift:", // "curation.form.submit": "Start", - // TODO New key - Add a translation "curation.form.submit": "Starta", // "curation.form.submit.success.head": "The curation task has been started successfully", - // TODO New key - Add a translation "curation.form.submit.success.head": "Kureringsjobbet har startats", // "curation.form.submit.success.content": "You will be redirected to the corresponding process page.", - // TODO New key - Add a translation "curation.form.submit.success.content": "Du kommer att skickas till sidan för att övervaka processen.", // "curation.form.submit.error.head": "Running the curation task failed", - // TODO New key - Add a translation "curation.form.submit.error.head": "Kureringsjobbet misslyckades", // "curation.form.submit.error.content": "An error occured when trying to start the curation task.", - // TODO New key - Add a translation "curation.form.submit.error.content": "Ett fel uppstod när kureringsjobbet skulle startas.", // "curation.form.handle.label": "Handle:", - // TODO New key - Add a translation "curation.form.handle.label": "Handle:", // "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", - // TODO New key - Add a translation "curation.form.handle.hint": "Tips: Ange [your-handle-prefix]/0 för att köra ett jobb för hela sajten (alla jobb kanske inte stöder detta)", // "deny-request-copy.email.message": "Dear {{ recipientName }},\nIn response to your request I regret to inform you that it's not possible to send you a copy of the file(s) you have requested, concerning the document: \"{{ itemUrl }}\" ({{ itemName }}), of which I am an author.\n\nBest regards,\n{{ authorName }} <{{ authorEmail }}>", - // TODO New key - Add a translation "deny-request-copy.email.message": "Hej {{ recipientName }},\nDet är tyvärr inte möjligt att skicka den eller de filer som du har begärt. Angående: \"{{ itemUrl }}\" ({{ itemName }}), som jag har författat.\n\nMed vänliga hälsningar,\n{{ authorName }} <{{ authorEmail }}>", // "deny-request-copy.email.subject": "Request copy of document", - // TODO New key - Add a translation "deny-request-copy.email.subject": "Begär en kopia av dokument", // "deny-request-copy.error": "An error occurred", - // TODO New key - Add a translation "deny-request-copy.error": "Ett fel uppstod", // "deny-request-copy.header": "Deny document copy request", - // TODO New key - Add a translation "deny-request-copy.header": "Neka begäran", // "deny-request-copy.intro": "This message will be sent to the applicant of the request", - // TODO New key - Add a translation "deny-request-copy.intro": "Detta meddelande kommer att skickas till personen som har begärt kopian", // "deny-request-copy.success": "Successfully denied item request", - // TODO New key - Add a translation "deny-request-copy.success": "Begäran nekades", // "dso.name.untitled": "Untitled", - // TODO New key - Add a translation "dso.name.untitled": "Utan titel", // "dso-selector.create.collection.head": "New collection", - // TODO New key - Add a translation "dso-selector.create.collection.head": "Ny samling", // "dso-selector.create.collection.sub-level": "Create a new collection in", - // TODO New key - Add a translation "dso-selector.create.collection.sub-level": "Skapa en ny samling i", // "dso-selector.create.community.head": "New community", - // TODO New key - Add a translation "dso-selector.create.community.head": "Ny enhet", // "dso-selector.create.community.sub-level": "Create a new community in", - // TODO New key - Add a translation "dso-selector.create.community.sub-level": "Skapa en ny enhet i", // "dso-selector.create.community.top-level": "Create a new top-level community", - // TODO New key - Add a translation "dso-selector.create.community.top-level": "Skapa en ny enhet på toppnivå", // "dso-selector.create.item.head": "New item", - // TODO New key - Add a translation "dso-selector.create.item.head": "Ny post", // "dso-selector.create.item.sub-level": "Create a new item in", - // TODO New key - Add a translation "dso-selector.create.item.sub-level": "Skapa en ny post i", // "dso-selector.create.submission.head": "New submission", - // TODO New key - Add a translation "dso-selector.create.submission.head": "Nytt bidrag", // "dso-selector.edit.collection.head": "Edit collection", - // TODO New key - Add a translation "dso-selector.edit.collection.head": "Redigera samling", // "dso-selector.edit.community.head": "Edit community", - // TODO New key - Add a translation "dso-selector.edit.community.head": "Redigera enhet", // "dso-selector.edit.item.head": "Edit item", - // TODO New key - Add a translation "dso-selector.edit.item.head": "Redigera post", // "dso-selector.error.title": "An error occurred searching for a {{ type }}", - // TODO New key - Add a translation "dso-selector.error.title": "Ett fel uppstod vid sökning på {{ type }}", // "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", - // TODO New key - Add a translation "dso-selector.export-metadata.dspaceobject.head": "Exportera metadata från", // "dso-selector.no-results": "No {{ type }} found", - // TODO New key - Add a translation "dso-selector.no-results": "Ingen {{ type }} kunde hittas", // "dso-selector.placeholder": "Search for a {{ type }}", - // TODO New key - Add a translation "dso-selector.placeholder": "Sök efter en {{ type }}", // "dso-selector.select.collection.head": "Select a collection", - // TODO New key - Add a translation "dso-selector.select.collection.head": "Välj en samling", // "dso-selector.set-scope.community.head": "Select a search scope", - // TODO New key - Add a translation "dso-selector.set-scope.community.head": "Välj ett scope för sökning", // "dso-selector.set-scope.community.button": "Search all of DSpace", - // TODO New key - Add a translation "dso-selector.set-scope.community.button": "Sök i hela arkivet", // "dso-selector.set-scope.community.input-header": "Search for a community or collection", - // TODO New key - Add a translation "dso-selector.set-scope.community.input-header": "Sök efter en samling eller enhet", // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", - // TODO New key - Add a translation "confirmation-modal.export-metadata.header": "Exportera metadata från {{ dsoName }}", // "confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}", - // TODO New key - Add a translation "confirmation-modal.export-metadata.info": "Vill du exportera metadata från {{ dsoName }}", // "confirmation-modal.export-metadata.cancel": "Cancel", - // TODO New key - Add a translation "confirmation-modal.export-metadata.cancel": "Avbryt", // "confirmation-modal.export-metadata.confirm": "Export", - // TODO New key - Add a translation "confirmation-modal.export-metadata.confirm": "Exportera", // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", - // TODO New key - Add a translation "confirmation-modal.delete-eperson.header": "Radera e-Person \"{{ dsoName }}\"", // "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", - // TODO New key - Add a translation "confirmation-modal.delete-eperson.info": "Vill du radera e-Person \"{{ dsoName }}\"", // "confirmation-modal.delete-eperson.cancel": "Cancel", - // TODO New key - Add a translation "confirmation-modal.delete-eperson.cancel": "Avbryt", // "confirmation-modal.delete-eperson.confirm": "Delete", - // TODO New key - Add a translation "confirmation-modal.delete-eperson.confirm": "Radera", // "error.bitstream": "Error fetching bitstream", - // TODO New key - Add a translation "error.bitstream": "Ett fel uppstod när felen hämtades", // "error.browse-by": "Error fetching items", - // TODO New key - Add a translation "error.browse-by": "Ett fel uppstod när posterna hämtades", // "error.collection": "Error fetching collection", - // TODO New key - Add a translation "error.collection": "Ett fel uppstod när samling hämtades", // "error.collections": "Error fetching collections", - // TODO New key - Add a translation "error.collections": "Ett fel uppstod när samlingar hämtades", // "error.community": "Error fetching community", - // TODO New key - Add a translation "error.community": "Ett fel uppstod när enhet hämtades", // "error.identifier": "No item found for the identifier", - // TODO New key - Add a translation "error.identifier": "Inga post med denna identifiererare kunde hittas", // "error.default": "Error", - // TODO New key - Add a translation "error.default": "Fel", // "error.item": "Error fetching item", - // TODO New key - Add a translation "error.item": "Ett fel uppstod när posten hämtades", // "error.items": "Error fetching items", - // TODO New key - Add a translation "error.items": "Ett fel uppstod när poster hämtades", // "error.objects": "Error fetching objects", - // TODO New key - Add a translation "error.objects": "Ett fel uppstod när objekt hämtades", // "error.recent-submissions": "Error fetching recent submissions", - // TODO New key - Add a translation "error.recent-submissions": "Ett fel uppstod när senste bidrag hämtades", // "error.search-results": "Error fetching search results", - // TODO New key - Add a translation "error.search-results": "Ett fel uppstod när sökresultaten hämtades", // "error.invalid-search-query": "Search query is not valid. Please check Solr query syntax best practices for further information about this error.", - // TODO New key - Add a translation "error.invalid-search-query": "Ogiltig sökfråga. Se Solr query syntax för hjälp och mer information.", // "error.sub-collections": "Error fetching sub-collections", - // TODO New key - Add a translation "error.sub-collections": "Ett fel uppstod när undersamlingar hämtades", // "error.sub-communities": "Error fetching sub-communities", - // TODO New key - Add a translation "error.sub-communities": "Ett fel uppstod när underenheter hämtades", // "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

", @@ -2644,11 +2032,9 @@ "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

", // "error.top-level-communities": "Error fetching top-level communities", - // TODO New key - Add a translation "error.top-level-communities": "Ett fel uppstod när enheter på toppnivå hämtades", // "error.validation.license.notgranted": "You must grant this license to complete your submission. If you are unable to grant this license at this time you may save your work and return later or remove the submission.", - // TODO New key - Add a translation "error.validation.license.notgranted": "Du måste godkänna dessa villkor för att skutföra registreringen. Om detta inte är möjligt så kan du spara nu och återvända hit senare, eller radera bidraget.", // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", @@ -2656,46 +2042,36 @@ "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", // "error.validation.filerequired": "The file upload is mandatory", - // TODO New key - Add a translation "error.validation.filerequired": "Filuppladdning är obligatorisk", // "error.validation.required": "This field is required", - // TODO New key - Add a translation "error.validation.required": "Detta fält är obligatoriskt", // "error.validation.NotValidEmail": "This E-mail is not a valid email", - // TODO New key - Add a translation "error.validation.NotValidEmail": "Ogiltig e-postadress", // "error.validation.emailTaken": "This E-mail is already taken", - // TODO New key - Add a translation "error.validation.emailTaken": "E-postadressen finns redan", // "error.validation.groupExists": "This group already exists", - // TODO New key - Add a translation "error.validation.groupExists": "Denna grupp existerar redan", // "file-section.error.header": "Error obtaining files for this item", - // TODO New key - Add a translation "file-section.error.header": "Det gick inte att hämta filerna till denna post", // "footer.copyright": "copyright © 2002-{{ year }}", - // TODO New key - Add a translation "footer.copyright": "copyright © 2002-{{ year }}", // "footer.link.dspace": "DSpace software", - // TODO New key - Add a translation "footer.link.dspace": "DSpace software", // "footer.link.lyrasis": "LYRASIS", - // TODO New key - Add a translation "footer.link.lyrasis": "LYRASIS", // "footer.link.cookies": "Cookie settings", - // TODO New key - Add a translation "footer.link.cookies": "Cookieinställningar", // "footer.link.privacy-policy": "Privacy policy", @@ -2707,246 +2083,187 @@ "footer.link.end-user-agreement":"End User Agreement", // "footer.link.feedback":"Send Feedback", - // TODO New key - Add a translation "footer.link.feedback":"Skicka feedback", // "forgot-email.form.header": "Forgot Password", - // TODO New key - Add a translation "forgot-email.form.header": "Glömt lösenord", // "forgot-email.form.info": "Enter Register an account to subscribe to collections for email updates, and submit new items to DSpace.", - // TODO New key - Add a translation "forgot-email.form.info": "Registrera dig som användare för att prenumerera på nyheter eller ladda upp nya filer till arkivet.", // "forgot-email.form.email": "E-post *", - // TODO New key - Add a translation "forgot-email.form.email": "E-post *", // "forgot-email.form.email.error.required": "Please fill in an email address", - // TODO New key - Add a translation "forgot-email.form.email.error.required": "Ange en giltig e-postadress", // "forgot-email.form.email.error.pattern": "Please fill in a valid email address", - // TODO New key - Add a translation "forgot-email.form.email.error.pattern": "Ange en giltig e-postadress", // "forgot-email.form.email.hint": "This address will be verified and used as your login name.", - // TODO New key - Add a translation "forgot-email.form.email.hint": "E-postadressen kommer att verifieras och användas som ditt användarnamn.", // "forgot-email.form.submit": "Save", - // TODO New key - Add a translation "forgot-email.form.submit": "Spara", // "forgot-email.form.success.head": "Verification email sent", - // TODO New key - Add a translation "forgot-email.form.success.head": "Ett verifieringsmejl har skickats", // "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", - // TODO New key - Add a translation "forgot-email.form.success.content": "Ett mejl med vidare instruktioner har skickats till {{ email }}.", // "forgot-email.form.error.head": "Error when trying to register email", - // TODO New key - Add a translation "forgot-email.form.error.head": "Ett fel har uppstått", // "forgot-email.form.error.content": "An error occured when registering the following email address: {{ email }}", - // TODO New key - Add a translation "forgot-email.form.error.content": "Ett fel uppstod när följande e-postadress skulle registreras: {{ email }}", // "forgot-password.title": "Forgot Password", - // TODO New key - Add a translation "forgot-password.title": "Glömt lösenord", // "forgot-password.form.head": "Forgot Password", - // TODO New key - Add a translation "forgot-password.form.head": "Glömt lösenord", // "forgot-password.form.info": "Enter a new password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", - // TODO New key - Add a translation "forgot-password.form.info": "Ange och bekräfta ett nytt lösenord nedan (minst 6 tecken).", // "forgot-password.form.card.security": "Säkerhet", - // TODO New key - Add a translation "forgot-password.form.card.security": "Säkerhet", // "forgot-password.form.identification.header": "Identify", - // TODO New key - Add a translation "forgot-password.form.identification.header": "Identifiera", // "forgot-password.form.identification.email": "Email address: ", - // TODO New key - Add a translation "forgot-password.form.identification.email": "E-post: ", // "forgot-password.form.label.password": "Password", - // TODO New key - Add a translation "forgot-password.form.label.password": "Lösenord", // "forgot-password.form.label.passwordrepeat": "Bekräfta", - // TODO New key - Add a translation "forgot-password.form.label.passwordrepeat": "Bekräfta", // "forgot-password.form.error.empty-password": "Please enter a password in the box below.", - // TODO New key - Add a translation "forgot-password.form.error.empty-password": "Ange ett lösenord nedan.", // "forgot-password.form.error.matching-passwords": "Lösenorden överensstämmer inte.", - // TODO New key - Add a translation "forgot-password.form.error.matching-passwords": "Lösenorden överensstämmer inte.", // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", - // TODO New key - Add a translation "forgot-password.form.error.password-length": "Lösenordet måste bestå av minst 6 tecken.", // "forgot-password.form.notification.error.title": "Error when trying to submit new password", - // TODO New key - Add a translation "forgot-password.form.notification.error.title": "Ett fel uppstod när det nya lösenordet skulle sparas", // "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", - // TODO New key - Add a translation "forgot-password.form.notification.success.content": "Lösenordet har återställts. Du är nu inloggad.", // "forgot-password.form.notification.success.title": "Password reset completed", - // TODO New key - Add a translation "forgot-password.form.notification.success.title": "Lösenordet har återställts", // "forgot-password.form.submit": "Submit password", - // TODO New key - Add a translation "forgot-password.form.submit": "Spara lösenord", // "form.add": "Add more", - // TODO New key - Add a translation "form.add": "Lägg till fler", // "form.add-help": "Click here to add the current entry and to add another one", - // TODO New key - Add a translation "form.add-help": "Klicka här för att spara nuvarande post och lägga till en ny", // "form.cancel": "Cancel", - // TODO New key - Add a translation "form.cancel": "Avbryt", // "form.clear": "Clear", - // TODO New key - Add a translation "form.clear": "Rensa", // "form.clear-help": "Click here to remove the selected value", - // TODO New key - Add a translation "form.clear-help": "Klicka för att avmarkera", // "form.discard": "Discard", - // TODO New key - Add a translation "form.discard": "Dra tillbaka", // "form.drag": "Drag", - // TODO New key - Add a translation "form.drag": "Dra", // "form.edit": "Edit", - // TODO New key - Add a translation "form.edit": "Redigera", // "form.edit-help": "Click here to edit the selected value", - // TODO New key - Add a translation "form.edit-help": "Klicka för att redigera det markerade", // "form.first-name": "First name", - // TODO New key - Add a translation "form.first-name": "Förnamn", // "form.group-collapse": "Collapse", - // TODO New key - Add a translation "form.group-collapse": "Fäll ihop", // "form.group-collapse-help": "Click here to collapse", - // TODO New key - Add a translation "form.group-collapse-help": "Klicka här för att fälla ihop", // "form.group-expand": "Expand", - // TODO New key - Add a translation "form.group-expand": "Expandera", // "form.group-expand-help": "Click here to expand and add more elements", - // TODO New key - Add a translation "form.group-expand-help": "Klicka här för att expandera och lägga till fler element", // "form.last-name": "Last name", - // TODO New key - Add a translation "form.last-name": "Efternamn", // "form.loading": "Loading...", - // TODO New key - Add a translation "form.loading": "Laddar...", // "form.lookup": "Lookup", - // TODO New key - Add a translation "form.lookup": "Slå upp", // "form.lookup-help": "Click here to look up an existing relation", - // TODO New key - Add a translation "form.lookup-help": "Klicka för att leta upp en befintlig relation", // "form.no-results": "No results found", - // TODO New key - Add a translation "form.no-results": "Inga resultat", // "form.no-value": "No value entered", - // TODO New key - Add a translation "form.no-value": "Inget värde har angivits", // "form.other-information": {}, - // TODO New key - Add a translation "form.other-information": {}, // "form.remove": "Remove", - // TODO New key - Add a translation "form.remove": "Ta bort", // "form.save": "Save", - // TODO New key - Add a translation "form.save": "Spara", // "form.save-help": "Save changes", - // TODO New key - Add a translation "form.save-help": "Spara ändringar", // "form.search": "Search", - // TODO New key - Add a translation "form.search": "Sök", // "form.search-help": "Click here to look for an existing correspondence", - // TODO New key - Add a translation "form.search-help": "Klicka här för att leta efter en befintlig korrespondens", // "form.submit": "Save", - // TODO New key - Add a translation "form.submit": "Spara", // "form.repeatable.sort.tip": "Drop the item in the new position", - // TODO New key - Add a translation "form.repeatable.sort.tip": "Släpp posten i den nya positionen", // "grant-deny-request-copy.deny": "Don't send copy", - // TODO New key - Add a translation "grant-deny-request-copy.deny": "Skicka inte kopia", // "grant-deny-request-copy.email.back": "Back", - // TODO New key - Add a translation "grant-deny-request-copy.email.back": "Tillbaka", // "grant-deny-request-copy.email.message": "Message", - // TODO New key - Add a translation "grant-deny-request-copy.email.message": "Meddelande", // "grant-deny-request-copy.email.message.empty": "Please enter a message", - // TODO New key - Add a translation "grant-deny-request-copy.email.message.empty": "Skriv ett meddelande", // "grant-deny-request-copy.email.permissions.info": "You may use this occasion to reconsider the access restrictions on the document, to avoid having to respond to these requests. If you’d like to ask the repository administrators to remove these restrictions, please check the box below.", @@ -2954,1143 +2271,869 @@ "grant-deny-request-copy.email.permissions.info": "You may use this occasion to reconsider the access restrictions on the document, to avoid having to respond to these requests. If you’d like to ask the repository administrators to remove these restrictions, please check the box below.", // "grant-deny-request-copy.email.permissions.label": "Change to open access", - // TODO New key - Add a translation "grant-deny-request-copy.email.permissions.label": "Ändra till öppen tillgång", // "grant-deny-request-copy.email.send": "Send", - // TODO New key - Add a translation "grant-deny-request-copy.email.send": "Skicka", // "grant-deny-request-copy.email.subject": "Subject", - // TODO New key - Add a translation "grant-deny-request-copy.email.subject": "Ämne", // "grant-deny-request-copy.email.subject.empty": "Please enter a subject", - // TODO New key - Add a translation "grant-deny-request-copy.email.subject.empty": "Ange ett ämne", // "grant-deny-request-copy.grant": "Send copy", - // TODO New key - Add a translation "grant-deny-request-copy.grant": "Skicka kopia", // "grant-deny-request-copy.header": "Document copy request", - // TODO New key - Add a translation "grant-deny-request-copy.header": "Begäran om kopia", // "grant-deny-request-copy.home-page": "Take me to the home page", - // TODO New key - Add a translation "grant-deny-request-copy.home-page": "Till startsidan", // "grant-deny-request-copy.intro1": "If you are one of the Författare of the document {{ name }}, then please use one of the options below to respond to the user's request.", - // TODO New key - Add a translation "grant-deny-request-copy.intro1": "Om du är en av författarna av {{ name }}, välj svar på användarens förfrågan nedan.", // "grant-deny-request-copy.intro2": "After choosing an option, you will be presented with a suggested email reply which you may edit.", - // TODO New key - Add a translation "grant-deny-request-copy.intro2": "När du har gjort ditt val kommer du att se det mejl som skall skickas till användaren. Du kan redigera innehållet i detta.", // "grant-deny-request-copy.processed": "This request has already been processed. You can use the button below to get back to the home page.", - // TODO New key - Add a translation "grant-deny-request-copy.processed": "Denna begäran har redan behandlats. Använd knappen nedan för att komma till startsidan.", // "grant-request-copy.email.message": "Dear {{ recipientName }},\nIn response to your request I have the pleasure to send you in attachment a copy of the file(s) concerning the document: \"{{ itemUrl }}\" ({{ itemName }}), of which I am an author.\n\nBest regards,\n{{ authorName }} <{{ authorEmail }}>", - // TODO New key - Add a translation "grant-request-copy.email.message": "Hej {{ recipientName }},\nDet dokument du har begärt, och som jag är författare till, bifogas i detta mejl: \"{{ itemUrl }}\" ({{ itemName }}).\n\nMed vänliga hälsningar,\n{{ authorName }} <{{ authorEmail }}>", // "grant-request-copy.email.subject": "Request copy of document", - // TODO New key - Add a translation "grant-request-copy.email.subject": "Begär kopia av dokument", // "grant-request-copy.error": "An error occurred", - // TODO New key - Add a translation "grant-request-copy.error": "Ett fel uppstod", // "grant-request-copy.header": "Grant document copy request", - // TODO New key - Add a translation "grant-request-copy.header": "Bevilja begäran av kopia", // "grant-request-copy.intro": "This message will be sent to the applicant of the request. The requested document(s) will be attached.", - // TODO New key - Add a translation "grant-request-copy.intro": "Detta meddelande kommer att skickas till personen som begärt detta. Filer kommer att bifogas.", // "grant-request-copy.success": "Successfully granted item request", - // TODO New key - Add a translation "grant-request-copy.success": "Begäran beviljades.", // "home.description": "", - // TODO New key - Add a translation "home.description": "Till startsidan", // "home.breadcrumbs": "Home", - // TODO New key - Add a translation "home.breadcrumbs": "Hem", // "home.search-form.placeholder": "Search the repository ...", - // TODO New key - Add a translation "home.search-form.placeholder": "Sök i arkivet ...", // "home.title": "Home", - // TODO New key - Add a translation "home.title": "Hem", // "home.top-level-communities.head": "Enheter i ODR", - // TODO New key - Add a translation "home.top-level-communities.head": "Enheter i DSpace", // "home.top-level-communities.help": "Select a community to browse its collections.", - // TODO New key - Add a translation "home.top-level-communities.help": "Välj en enhet för att se alla samlingar.", // "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", - // TODO New key - Add a translation "info.end-user-agreement.accept": "Jag har läst och förstått villkoren i användaravtalet", // "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", - // TODO New key - Add a translation "info.end-user-agreement.accept.error": "Ett fel uppstod när användaravtalet godkändes", // "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", - // TODO New key - Add a translation "info.end-user-agreement.accept.success": "Användaravtalet har uppdaterats", // "info.end-user-agreement.breadcrumbs": "End User Agreement", - // TODO New key - Add a translation "info.end-user-agreement.breadcrumbs": "Användaravtal", // "info.end-user-agreement.buttons.cancel": "Cancel", - // TODO New key - Add a translation "info.end-user-agreement.buttons.cancel": "Avbryt", // "info.end-user-agreement.buttons.save": "Save", - // TODO New key - Add a translation "info.end-user-agreement.buttons.save": "Spara", // "info.end-user-agreement.head": "End User Agreement", - // TODO New key - Add a translation "info.end-user-agreement.head": "Användaravtal", // "info.end-user-agreement.title": "End User Agreement", - // TODO New key - Add a translation "info.end-user-agreement.title": "Användaravtal", // "info.privacy.breadcrumbs": "Privacy Statement", - // TODO New key - Add a translation "info.privacy.breadcrumbs": "Integritetspolicy", // "info.privacy.head": "Privacy Statement", - // TODO New key - Add a translation "info.privacy.head": "Integritetspolicy", // "info.privacy.title": "Privacy Statement", - // TODO New key - Add a translation "info.privacy.title": "Integritetspolicy", // "info.feedback.breadcrumbs": "Feedback", - // TODO New key - Add a translation "info.feedback.breadcrumbs": "Feedback", // "info.feedback.head": "Feedback", - // TODO New key - Add a translation "info.feedback.head": "Feedback", // "info.feedback.title": "Feedback", - // TODO New key - Add a translation "info.feedback.title": "Feedback", // "info.feedback.info": "Thanks for sharing your feedback about the DSpace system. Your comments are appreciated!", - // TODO New key - Add a translation "info.feedback.info": "Tack för att du lämnar dina synpunkter på tjänsten. Dina åsikter betyder mycket för oss!", // "info.feedback.email_help": "This address will be used to follow up on your feedback.", - // TODO New key - Add a translation "info.feedback.email_help": "Denna adress kommer att användas för att återkoppla till dig.", // "info.feedback.send": "Send Feedback", - // TODO New key - Add a translation "info.feedback.send": "Skicka feedback", // "info.feedback.comments": "Comments", - // TODO New key - Add a translation "info.feedback.comments": "Kommentarer", // "info.feedback.email-label": "Your Email", - // TODO New key - Add a translation "info.feedback.email-label": "Din e-postadress", // "info.feedback.create.success" : "Feedback Sent Successfully!", - // TODO New key - Add a translation "info.feedback.create.success" : "Feedback har skickats!", // "info.feedback.error.email.required" : "A valid email address is required", - // TODO New key - Add a translation "info.feedback.error.email.required" : "Du måste ange en giltig e-postadress", // "info.feedback.error.message.required" : "A comment is required", - // TODO New key - Add a translation "info.feedback.error.message.required" : "Du måste skriva en kommentar", // "info.feedback.page-label" : "Page", - // TODO New key - Add a translation "info.feedback.page-label" : "Sida", // "info.feedback.page_help" : "Tha page related to your feedback", - // TODO New key - Add a translation "info.feedback.page_help" : "Den är sidan är relaterad till din feedback", // "item.alerts.private": "This item is non-discoverable", - // TODO New key - Add a translation "item.alerts.private": "Denna post är dold vid sökning", // "item.alerts.withdrawn": "This item has been withdrawn", - // TODO New key - Add a translation "item.alerts.withdrawn": "Denna post har återkallats", // "item.edit.authorizations.heading": "With this editor you can view and alter the policies of an item, plus alter policies of individual item components: bundles and bitstreams. Briefly, an item is a container of bundles, and bundles are containers of bitstreams. Containers usually have ADD/REMOVE/READ/WRITE policies, while bitstreams only have READ/WRITE policies.", - // TODO New key - Add a translation "item.edit.authorizations.heading": "Här kan du se och ändra de villkor som gäller för en post och dess ingående komponenter: buntar (bundles) och filer. En post är en container som innehåller en eller flera buntar (bundles), som i sin tur är en container med en eller flera filer. Buntar har behörigheter för att LÄGGA TILL/RADERA/LÄSA/SKRIVA, medan filer bara har behörigheter för att LÄSA och SKRIVA.", // "item.edit.authorizations.title": "Edit item's Policies", - // TODO New key - Add a translation "item.edit.authorizations.title": "Redigera behörigheter för post", // "item.badge.private": "Non-discoverable", - // TODO New key - Add a translation "item.badge.private": "Dold vid sökning", // "item.badge.withdrawn": "Withdrawn", - // TODO New key - Add a translation "item.badge.withdrawn": "Återkallad", // "item.bitstreams.upload.bundle": "Bundle", - // TODO New key - Add a translation "item.bitstreams.upload.bundle": "Bunt", // "item.bitstreams.upload.bundle.placeholder": "Select a bundle", - // TODO New key - Add a translation "item.bitstreams.upload.bundle.placeholder": "Välj en bunt", // "item.bitstreams.upload.bundle.new": "Create bundle", - // TODO New key - Add a translation "item.bitstreams.upload.bundle.new": "Skapa bunt", // "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.", - // TODO New key - Add a translation "item.bitstreams.upload.bundles.empty": "Denna post innehåller inga buntar som man kan ladda upp filer i.", // "item.bitstreams.upload.cancel": "Cancel", - // TODO New key - Add a translation "item.bitstreams.upload.cancel": "Avbryt", // "item.bitstreams.upload.drop-message": "Drop a file to upload", - // TODO New key - Add a translation "item.bitstreams.upload.drop-message": "Dra och släpp en fil här för att ladda upp", // "item.bitstreams.upload.item": "Item: ", - // TODO New key - Add a translation "item.bitstreams.upload.item": "Post: ", // "item.bitstreams.upload.notifications.bundle.created.content": "Successfully created new bundle.", - // TODO New key - Add a translation "item.bitstreams.upload.notifications.bundle.created.content": "En ny bunt har skapats.", // "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", - // TODO New key - Add a translation "item.bitstreams.upload.notifications.bundle.created.title": "Skapad bunt", // "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", - // TODO New key - Add a translation "item.bitstreams.upload.notifications.upload.failed": "Uppladdningen misslyckades. Kontrollera filen och försök igen.", // "item.bitstreams.upload.title": "Upload bitstream", - // TODO New key - Add a translation "item.bitstreams.upload.title": "Ladda upp fil", // "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", - // TODO New key - Add a translation "item.edit.bitstreams.bundle.edit.buttons.upload": "Ladda upp", // "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", - // TODO New key - Add a translation "item.edit.bitstreams.bundle.displaying": "Visar {{ amount }} av {{ total }} filer.", // "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", - // TODO New key - Add a translation "item.edit.bitstreams.bundle.load.all": "Ladda alla ({{ total }})", // "item.edit.bitstreams.bundle.load.more": "Load more", - // TODO New key - Add a translation "item.edit.bitstreams.bundle.load.more": "Ladda fler", // "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", - // TODO New key - Add a translation "item.edit.bitstreams.bundle.name": "BUNT: {{ name }}", // "item.edit.bitstreams.discard-button": "Discard", - // TODO New key - Add a translation "item.edit.bitstreams.discard-button": "Förkasta", // "item.edit.bitstreams.edit.buttons.download": "Download", - // TODO New key - Add a translation "item.edit.bitstreams.edit.buttons.download": "Ladda ner", // "item.edit.bitstreams.edit.buttons.drag": "Drag", - // TODO New key - Add a translation "item.edit.bitstreams.edit.buttons.drag": "Dra", // "item.edit.bitstreams.edit.buttons.edit": "Edit", - // TODO New key - Add a translation "item.edit.bitstreams.edit.buttons.edit": "Redigera", // "item.edit.bitstreams.edit.buttons.remove": "Remove", - // TODO New key - Add a translation "item.edit.bitstreams.edit.buttons.remove": "Radera", // "item.edit.bitstreams.edit.buttons.undo": "Undo changes", - // TODO New key - Add a translation "item.edit.bitstreams.edit.buttons.undo": "Ångra ändringar", // "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", - // TODO New key - Add a translation "item.edit.bitstreams.empty": "Posten innehåller inga filer. Välj ladda upp.", // "item.edit.bitstreams.headers.actions": "Actions", - // TODO New key - Add a translation "item.edit.bitstreams.headers.actions": "Händelser", // "item.edit.bitstreams.headers.bundle": "Bundle", - // TODO New key - Add a translation "item.edit.bitstreams.headers.bundle": "Bunt", // "item.edit.bitstreams.headers.description": "Beskrivning", - // TODO New key - Add a translation "item.edit.bitstreams.headers.description": "Beskrivning", // "item.edit.bitstreams.headers.format": "Format", - // TODO New key - Add a translation "item.edit.bitstreams.headers.format": "Format", // "item.edit.bitstreams.headers.name": "Name", - // TODO New key - Add a translation "item.edit.bitstreams.headers.name": "Namn", // "item.edit.bitstreams.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - // TODO New key - Add a translation "item.edit.bitstreams.notifications.discarded.content": "Dina ändringar förkastades. Klicka på 'Ångra' för att göra om", // "item.edit.bitstreams.notifications.discarded.title": "Changes discarded", - // TODO New key - Add a translation "item.edit.bitstreams.notifications.discarded.title": "Ändringarna förkastades", // "item.edit.bitstreams.notifications.move.failed.title": "Error moving bitstreams", - // TODO New key - Add a translation "item.edit.bitstreams.notifications.move.failed.title": "Ett fel uppstod när fil skulle flyttas", // "item.edit.bitstreams.notifications.move.saved.content": "Your move changes to this item's bitstreams and bundles have been saved.", - // TODO New key - Add a translation "item.edit.bitstreams.notifications.move.saved.content": "Ändringarna har sparats.", // "item.edit.bitstreams.notifications.move.saved.title": "Move changes saved", - // TODO New key - Add a translation "item.edit.bitstreams.notifications.move.saved.title": "Ändringarna har sparats", // "item.edit.bitstreams.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", - // TODO New key - Add a translation "item.edit.bitstreams.notifications.outdated.content": "Den aktuella posten har ändrats av en annan användare. Dina ändringar har förkastats för att undvika konflikter", // "item.edit.bitstreams.notifications.outdated.title": "Changes outdated", - // TODO New key - Add a translation "item.edit.bitstreams.notifications.outdated.title": "Ändringarna är föråldrade", // "item.edit.bitstreams.notifications.remove.failed.title": "Error deleting bitstream", - // TODO New key - Add a translation "item.edit.bitstreams.notifications.remove.failed.title": "Ett fel uppstod när filen skulle raderas", // "item.edit.bitstreams.notifications.remove.saved.content": "Your removal changes to this item's bitstreams have been saved.", - // TODO New key - Add a translation "item.edit.bitstreams.notifications.remove.saved.content": "Ändringarna har sparats.", // "item.edit.bitstreams.notifications.remove.saved.title": "Removal changes saved", - // TODO New key - Add a translation "item.edit.bitstreams.notifications.remove.saved.title": "Ändringarna har sparats", // "item.edit.bitstreams.reinstate-button": "Undo", - // TODO New key - Add a translation "item.edit.bitstreams.reinstate-button": "Ångra", // "item.edit.bitstreams.save-button": "Save", - // TODO New key - Add a translation "item.edit.bitstreams.save-button": "Spara", // "item.edit.bitstreams.upload-button": "Upload", - // TODO New key - Add a translation "item.edit.bitstreams.upload-button": "Ladda upp", // "item.edit.delete.cancel": "Cancel", - // TODO New key - Add a translation "item.edit.delete.cancel": "Avbryt", // "item.edit.delete.confirm": "Delete", - // TODO New key - Add a translation "item.edit.delete.confirm": "Radera", // "item.edit.delete.description": "Are you sure this item should be completely deleted? Caution: At present, no tombstone would be left.", - // TODO New key - Add a translation "item.edit.delete.description": "Är du säker på att du vill radera denna post? Notera: Posten kommer att raderas helt från systemet, utan historik.", // "item.edit.delete.error": "An error occurred while deleting the item", - // TODO New key - Add a translation "item.edit.delete.error": "Ett fel uppstod när posten skulle raderas", // "item.edit.delete.header": "Delete item: {{ id }}", - // TODO New key - Add a translation "item.edit.delete.header": "Radera post: {{ id }}", // "item.edit.delete.success": "The item has been deleted", - // TODO New key - Add a translation "item.edit.delete.success": "Posten har raderats", // "item.edit.head": "Edit Item", - // TODO New key - Add a translation "item.edit.head": "Redigera post", // "item.edit.breadcrumbs": "Edit Item", - // TODO New key - Add a translation "item.edit.breadcrumbs": "Redigera post", // "item.edit.tabs.disabled.tooltip": "You're not authorized to access this tab", - // TODO New key - Add a translation "item.edit.tabs.disabled.tooltip": "Du har inte behöriget att använda denna flik", // "item.edit.tabs.mapper.head": "Collection Mapper", - // TODO New key - Add a translation "item.edit.tabs.mapper.head": "Mappa samlingar", // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", - // TODO New key - Add a translation "item.edit.tabs.item-mapper.title": "Redigera post - mappa samlingar", // "item.edit.item-mapper.buttons.add": "Map item to selected collections", - // TODO New key - Add a translation "item.edit.item-mapper.buttons.add": "Mappa post till denna samling", // "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", - // TODO New key - Add a translation "item.edit.item-mapper.buttons.remove": "Ta bort postens mappning till markerade samlingar", // "item.edit.item-mapper.cancel": "Cancel", - // TODO New key - Add a translation "item.edit.item-mapper.cancel": "Avbryt", // "item.edit.item-mapper.description": "This is the item mapper tool that allows administrators to map this item to other collections. You can search for collections and map them, or browse the list of collections the item is currently mapped to.", - // TODO New key - Add a translation "item.edit.item-mapper.description": "Detta är ett verktyg för att mappa poster till samlingar. Du kan söka efter samlingar eller bläddra i listan över samlingar som posten är mappad till nu.", // "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", - // TODO New key - Add a translation "item.edit.item-mapper.head": "Mappa post till samling(ar)", // "item.edit.item-mapper.item": "Item: \"{{name}}\"", - // TODO New key - Add a translation "item.edit.item-mapper.item": "Post: \"{{name}}\"", // "item.edit.item-mapper.no-search": "Please enter a query to search", - // TODO New key - Add a translation "item.edit.item-mapper.no-search": "Ange en sökfråga", // "item.edit.item-mapper.notifications.add.error.content": "Errors occurred for mapping of item to {{amount}} collections.", - // TODO New key - Add a translation "item.edit.item-mapper.notifications.add.error.content": "Ett fel uppstod när post skulle mappas till {{amount}} samling(ar).", // "item.edit.item-mapper.notifications.add.error.head": "Mapping errors", - // TODO New key - Add a translation "item.edit.item-mapper.notifications.add.error.head": "Fel uppstod vid mappning", // "item.edit.item-mapper.notifications.add.success.content": "Successfully mapped item to {{amount}} collections.", - // TODO New key - Add a translation "item.edit.item-mapper.notifications.add.success.content": "Posten har mappats till {{amount}} samling(ar)s.", // "item.edit.item-mapper.notifications.add.success.head": "Mapping completed", - // TODO New key - Add a translation "item.edit.item-mapper.notifications.add.success.head": "Mappning har avslutats", // "item.edit.item-mapper.notifications.remove.error.content": "Errors occurred for the removal of the mapping to {{amount}} collections.", - // TODO New key - Add a translation "item.edit.item-mapper.notifications.remove.error.content": "Det uppstod ett fel när posten skulle mappas till {{amount}} samling(ar).", // "item.edit.item-mapper.notifications.remove.error.head": "Removal of mapping errors", - // TODO New key - Add a translation "item.edit.item-mapper.notifications.remove.error.head": "Ett fel uppstod när mappning skulle tas bort", // "item.edit.item-mapper.notifications.remove.success.content": "Successfully removed mapping of item to {{amount}} collections.", - // TODO New key - Add a translation "item.edit.item-mapper.notifications.remove.success.content": "Mappning till {{amount}} samling(ar) har tagits bort.", // "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", - // TODO New key - Add a translation "item.edit.item-mapper.notifications.remove.success.head": "Mappning borttagen", // "item.edit.item-mapper.search-form.placeholder": "Search collections...", - // TODO New key - Add a translation "item.edit.item-mapper.search-form.placeholder": "Sök samlingar...", // "item.edit.item-mapper.tabs.browse": "Browse mapped collections", - // TODO New key - Add a translation "item.edit.item-mapper.tabs.browse": "Bläddra bland mappade samlingar", // "item.edit.item-mapper.tabs.map": "Map new collections", - // TODO New key - Add a translation "item.edit.item-mapper.tabs.map": "Mappa en ny samling", // "item.edit.metadata.add-button": "Add", - // TODO New key - Add a translation "item.edit.metadata.add-button": "Lägg till", // "item.edit.metadata.discard-button": "Discard", - // TODO New key - Add a translation "item.edit.metadata.discard-button": "Avbryt", // "item.edit.metadata.edit.buttons.edit": "Edit", - // TODO New key - Add a translation "item.edit.metadata.edit.buttons.edit": "Radera", // "item.edit.metadata.edit.buttons.remove": "Remove", - // TODO New key - Add a translation "item.edit.metadata.edit.buttons.remove": "Ta bort", // "item.edit.metadata.edit.buttons.undo": "Undo changes", - // TODO New key - Add a translation "item.edit.metadata.edit.buttons.undo": "Ängra ändringar", // "item.edit.metadata.edit.buttons.unedit": "Stop editing", - // TODO New key - Add a translation "item.edit.metadata.edit.buttons.unedit": "Avbryt redigering", // "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", - // TODO New key - Add a translation "item.edit.metadata.empty": "Denna post innehåller inga metadata. Klicka på Lägg till.", // "item.edit.metadata.headers.edit": "Edit", - // TODO New key - Add a translation "item.edit.metadata.headers.edit": "Redigera", // "item.edit.metadata.headers.field": "Field", - // TODO New key - Add a translation "item.edit.metadata.headers.field": "Fält", // "item.edit.metadata.headers.language": "Lang", - // TODO New key - Add a translation "item.edit.metadata.headers.language": "Språk", // "item.edit.metadata.headers.value": "Value", - // TODO New key - Add a translation "item.edit.metadata.headers.value": "Värde", // "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", - // TODO New key - Add a translation "item.edit.metadata.metadatafield.invalid": "Välj ett giltigt metadatafält", // "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - // TODO New key - Add a translation "item.edit.metadata.notifications.discarded.content": "Dina ändringar förkastades. För att återställa, klicka på 'Ångra'", // "item.edit.metadata.notifications.discarded.title": "Changed discarded", - // TODO New key - Add a translation "item.edit.metadata.notifications.discarded.title": "Ändringar förkastade", // "item.edit.metadata.notifications.error.title": "An error occurred", - // TODO New key - Add a translation "item.edit.metadata.notifications.error.title": "Ett fel har uppstått", // "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", - // TODO New key - Add a translation "item.edit.metadata.notifications.invalid.content": "Dina ändringar sparades inte. Kontrollera att alla fält innehåller giltiga värden.", // "item.edit.metadata.notifications.invalid.title": "Metadata invalid", - // TODO New key - Add a translation "item.edit.metadata.notifications.invalid.title": "Ogiltiga metadata", // "item.edit.metadata.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", - // TODO New key - Add a translation "item.edit.metadata.notifications.outdated.content": "Posten har ändrats av en annan användare. Dina ändringar har inte sparats", // "item.edit.metadata.notifications.outdated.title": "Changed outdated", - // TODO New key - Add a translation "item.edit.metadata.notifications.outdated.title": "Ändring är föräldrad", // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", - // TODO New key - Add a translation "item.edit.metadata.notifications.saved.content": "Dina ändringar har sparats.", // "item.edit.metadata.notifications.saved.title": "Metadata saved", - // TODO New key - Add a translation "item.edit.metadata.notifications.saved.title": "Metadata har sparats", // "item.edit.metadata.reinstate-button": "Undo", - // TODO New key - Add a translation "item.edit.metadata.reinstate-button": "Ångra", // "item.edit.metadata.save-button": "Save", - // TODO New key - Add a translation "item.edit.metadata.save-button": "Spara", // "item.edit.modify.overview.field": "Field", - // TODO New key - Add a translation "item.edit.modify.overview.field": "Fält", // "item.edit.modify.overview.language": "Språk", - // TODO New key - Add a translation "item.edit.modify.overview.language": "Språk", // "item.edit.modify.overview.value": "Value", - // TODO New key - Add a translation "item.edit.modify.overview.value": "Värde", // "item.edit.move.cancel": "Back", - // TODO New key - Add a translation "item.edit.move.cancel": "Tillbaka", // "item.edit.move.save-button": "Save", - // TODO New key - Add a translation "item.edit.move.save-button": "Spara", // "item.edit.move.discard-button": "Discard", - // TODO New key - Add a translation "item.edit.move.discard-button": "Ta bort", // "item.edit.move.description": "Select the collection you wish to move this item to. To narrow down the list of displayed collections, you can enter a search query in the box.", - // TODO New key - Add a translation "item.edit.move.description": "Välj samling som du vill flytta denna post till. Du kan söka efter samling(ar) i fältet nedan.", // "item.edit.move.error": "An error occurred when attempting to move the item", - // TODO New key - Add a translation "item.edit.move.error": "Ett fel uppstod när posten skulle flyttas", // "item.edit.move.head": "Move item: {{id}}", - // TODO New key - Add a translation "item.edit.move.head": "Flytta post: {{id}}", // "item.edit.move.inheritpolicies.checkbox": "Inherit policies", - // TODO New key - Add a translation "item.edit.move.inheritpolicies.checkbox": "Ärv policies", // "item.edit.move.inheritpolicies.description": "Inherit the default policies of the destination collection", - // TODO New key - Add a translation "item.edit.move.inheritpolicies.description": "Använd samma policies som i den mottagande samlingen", // "item.edit.move.move": "Move", - // TODO New key - Add a translation "item.edit.move.move": "Flytta", // "item.edit.move.processing": "Moving...", - // TODO New key - Add a translation "item.edit.move.processing": "Flyttar...", // "item.edit.move.search.placeholder": "Enter a search query to look for collections", - // TODO New key - Add a translation "item.edit.move.search.placeholder": "Ange sökord för att söka efter samling", // "item.edit.move.success": "The item has been moved successfully", - // TODO New key - Add a translation "item.edit.move.success": "Posten har flyttats", // "item.edit.move.title": "Move item", - // TODO New key - Add a translation "item.edit.move.title": "Flytta post", // "item.edit.private.cancel": "Cancel", - // TODO New key - Add a translation "item.edit.private.cancel": "Avbryt", // "item.edit.private.confirm": "Make it non-discoverable", - // TODO New key - Add a translation "item.edit.private.confirm": "Gör posten ej sökbar", // "item.edit.private.description": "Are you sure this item should be made non-discoverable in the archive?", - // TODO New key - Add a translation "item.edit.private.description": "Är du säker på att posten inte skall vara sökbar i arkivet?", // "item.edit.private.error": "An error occurred while making the item non-discoverable", - // TODO New key - Add a translation "item.edit.private.error": "Ett fel uppstod", // "item.edit.private.header": "Make item non-discoverable: {{ id }}", - // TODO New key - Add a translation "item.edit.private.header": "Gör denna post ej sökbar: {{ id }}", // "item.edit.private.success": "The item is now non-discoverable", - // TODO New key - Add a translation "item.edit.private.success": "Denna post är nu inte längre sökbar", // "item.edit.public.cancel": "Cancel", - // TODO New key - Add a translation "item.edit.public.cancel": "Avbryt", // "item.edit.public.confirm": "Make it discoverable", - // TODO New key - Add a translation "item.edit.public.confirm": "Gör denna sökbar", // "item.edit.public.description": "Are you sure this item should be made discoverable in the archive?", - // TODO New key - Add a translation "item.edit.public.description": "Är du säker på att denna post skall vara sökbar i arkivet?", // "item.edit.public.error": "An error occurred while making the item discoverable", - // TODO New key - Add a translation "item.edit.public.error": "Ett fel uppstod", // "item.edit.public.header": "Make item discoverable: {{ id }}", - // TODO New key - Add a translation "item.edit.public.header": "Gör post sökbar: {{ id }}", // "item.edit.public.success": "The item is now discoverable", - // TODO New key - Add a translation "item.edit.public.success": "Posten är nu sökbar", // "item.edit.reinstate.cancel": "Cancel", - // TODO New key - Add a translation "item.edit.reinstate.cancel": "Avbryt", // "item.edit.reinstate.confirm": "Reinstate", - // TODO New key - Add a translation "item.edit.reinstate.confirm": "Återställ", // "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?", - // TODO New key - Add a translation "item.edit.reinstate.description": "Är du säker på att denna post skall återställas?", // "item.edit.reinstate.error": "An error occurred while reinstating the item", - // TODO New key - Add a translation "item.edit.reinstate.error": "Ett fel uppstod", // "item.edit.reinstate.header": "Reinstate item: {{ id }}", - // TODO New key - Add a translation "item.edit.reinstate.header": "Återställ post: {{ id }}", // "item.edit.reinstate.success": "The item was reinstated successfully", - // TODO New key - Add a translation "item.edit.reinstate.success": "Posten har nu återställts", // "item.edit.relationships.discard-button": "Discard", - // TODO New key - Add a translation "item.edit.relationships.discard-button": "Kasta bort", // "item.edit.relationships.edit.buttons.add": "Add", - // TODO New key - Add a translation "item.edit.relationships.edit.buttons.add": "Lägg till", // "item.edit.relationships.edit.buttons.remove": "Remove", - // TODO New key - Add a translation "item.edit.relationships.edit.buttons.remove": "Ta bort", // "item.edit.relationships.edit.buttons.undo": "Undo changes", - // TODO New key - Add a translation "item.edit.relationships.edit.buttons.undo": "Ångra ändringar", // "item.edit.relationships.no-relationships": "No relationships", - // TODO New key - Add a translation "item.edit.relationships.no-relationships": "Relationer saknas", // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - // TODO New key - Add a translation "item.edit.relationships.notifications.discarded.content": "Dina ändringar sparades inte. Klicka på 'Ångra' för att göra om", // "item.edit.relationships.notifications.discarded.title": "Changes discarded", - // TODO New key - Add a translation "item.edit.relationships.notifications.discarded.title": "Ändringarna sparades inte", // "item.edit.relationships.notifications.failed.title": "Error editing relationships", - // TODO New key - Add a translation "item.edit.relationships.notifications.failed.title": "Ett fel uppstod när relationer redigerades", // "item.edit.relationships.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", - // TODO New key - Add a translation "item.edit.relationships.notifications.outdated.content": "Denna post har nyligen ändrats av en annan användare. Dina ändringar har inte sparats, för att undvika konflikterer", // "item.edit.relationships.notifications.outdated.title": "Changes outdated", - // TODO New key - Add a translation "item.edit.relationships.notifications.outdated.title": "Ändringarna är föråldrade", // "item.edit.relationships.notifications.saved.content": "Your changes to this item's relationships were saved.", - // TODO New key - Add a translation "item.edit.relationships.notifications.saved.content": "Ändringarna har sparats.", // "item.edit.relationships.notifications.saved.title": "Relationships saved", - // TODO New key - Add a translation "item.edit.relationships.notifications.saved.title": "Relationerna har sparats", // "item.edit.relationships.reinstate-button": "Undo", - // TODO New key - Add a translation "item.edit.relationships.reinstate-button": "Ångra", // "item.edit.relationships.save-button": "Save", - // TODO New key - Add a translation "item.edit.relationships.save-button": "Spara", // "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", - // TODO New key - Add a translation "item.edit.relationships.no-entity-type": "Lägg till 'dspace.entity.type' metadata för att möjliggöra relationer till denna post", + // "item.edit.return": "Back", - // TODO New key - Add a translation "item.edit.return": "Tillbaka", // "item.edit.tabs.bitstreams.head": "Bitstreams", - // TODO New key - Add a translation "item.edit.tabs.bitstreams.head": "Filer", // "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", - // TODO New key - Add a translation "item.edit.tabs.bitstreams.title": "Redigera post - Filer", // "item.edit.tabs.curate.head": "Curate", - // TODO New key - Add a translation "item.edit.tabs.curate.head": "Kurera", // "item.edit.tabs.curate.title": "Item Edit - Curate", - // TODO New key - Add a translation "item.edit.tabs.curate.title": "Redigera post - Kurera", // "item.edit.tabs.metadata.head": "Metadata", - // TODO New key - Add a translation "item.edit.tabs.metadata.head": "Metadata", // "item.edit.tabs.metadata.title": "Item Edit - Metadata", - // TODO New key - Add a translation "item.edit.tabs.metadata.title": "Redigera post - Metadata", // "item.edit.tabs.relationships.head": "Relationships", - // TODO New key - Add a translation "item.edit.tabs.relationships.head": "Relationer", // "item.edit.tabs.relationships.title": "Item Edit - Relationships", - // TODO New key - Add a translation "item.edit.tabs.relationships.title": "Redigera post - Relationer", // "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.authorizations.button": "Behörigheter...", // "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.authorizations.label": "Redigera behörigheter för post", // "item.edit.tabs.status.buttons.delete.button": "Permanently delete", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.delete.button": "Radera permanent", // "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.delete.label": "Radera fullständigt", // "item.edit.tabs.status.buttons.mappedCollections.button": "Mapped collections", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.mappedCollections.button": "Mappade samlingar", // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.mappedCollections.label": "Hantera mappade samlingar", // "item.edit.tabs.status.buttons.move.button": "Move...", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.move.button": "Flytta...", // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.move.label": "Flytta post till en annan samling", // "item.edit.tabs.status.buttons.private.button": "Make it non-discoverable...", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.private.button": "Exkludera posten från sökningar...", // "item.edit.tabs.status.buttons.private.label": "Make item non-discoverable", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.private.label": "Gör post ej sökbar", // "item.edit.tabs.status.buttons.public.button": "Make it discoverable...", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.public.button": "Gör posten sökbar...", // "item.edit.tabs.status.buttons.public.label": "Make item discoverable", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.public.label": "Gör posten sökbar", // "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.reinstate.button": "Återställ...", // "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.reinstate.label": "Återställ post i arkivet", // "item.edit.tabs.status.buttons.unauthorized": "You're not authorized to perform this action", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.unauthorized": "Du saknar behörighet att utföra detta", // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.withdraw.button": "Återkalla...", // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", - // TODO New key - Add a translation "item.edit.tabs.status.buttons.withdraw.label": "Återkalla post från arkivet", // "item.edit.tabs.status.description": "Welcome to the item management page. From here you can withdraw, reinstate, move or delete the item. You may also update or add new metadata / bitstreams on the other tabs.", - // TODO New key - Add a translation "item.edit.tabs.status.description": "Detta är sidan för att hantera poster. Här kan du återkalla, återställa, flytta eller radera poster. Du kan också redigera postens metadata och/eller filer.", // "item.edit.tabs.status.head": "Status", - // TODO New key - Add a translation "item.edit.tabs.status.head": "Status", // "item.edit.tabs.status.labels.handle": "Handle", - // TODO New key - Add a translation "item.edit.tabs.status.labels.handle": "Handle", // "item.edit.tabs.status.labels.id": "Item Internal ID", - // TODO New key - Add a translation "item.edit.tabs.status.labels.id": "Postens interna ID", // "item.edit.tabs.status.labels.itemPage": "Item Page", - // TODO New key - Add a translation "item.edit.tabs.status.labels.itemPage": "Post", // "item.edit.tabs.status.labels.lastModified": "Last Modified", - // TODO New key - Add a translation "item.edit.tabs.status.labels.lastModified": "Senast ändrad", // "item.edit.tabs.status.title": "Item Edit - Status", - // TODO New key - Add a translation "item.edit.tabs.status.title": "Redigera post - Status", // "item.edit.tabs.versionhistory.head": "Version History", - // TODO New key - Add a translation "item.edit.tabs.versionhistory.head": "Versionshistorik", // "item.edit.tabs.versionhistory.title": "Item Edit - Version History", - // TODO New key - Add a translation "item.edit.tabs.versionhistory.title": "Redigera post - Versionshistorik", // "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", - // TODO New key - Add a translation "item.edit.tabs.versionhistory.under-construction": "Det är inte möjligt att redigera eller skapa nya versioner på denna sida.", // "item.edit.tabs.view.head": "View Item", - // TODO New key - Add a translation "item.edit.tabs.view.head": "Visa post", // "item.edit.tabs.view.title": "Item Edit - View", - // TODO New key - Add a translation "item.edit.tabs.view.title": "Redigera post - Visa", // "item.edit.withdraw.cancel": "Cancel", - // TODO New key - Add a translation "item.edit.withdraw.cancel": "Avbryt", // "item.edit.withdraw.confirm": "Withdraw", - // TODO New key - Add a translation "item.edit.withdraw.confirm": "Återkalla", // "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?", - // TODO New key - Add a translation "item.edit.withdraw.description": "Är du säker på att du vill återkalla denna post från arkivet?", // "item.edit.withdraw.error": "An error occurred while withdrawing the item", - // TODO New key - Add a translation "item.edit.withdraw.error": "Ett fel uppstod när posten skulle återkallas", // "item.edit.withdraw.header": "Withdraw item: {{ id }}", - // TODO New key - Add a translation "item.edit.withdraw.header": "Återkalla post: {{ id }}", // "item.edit.withdraw.success": "The item was withdrawn successfully", - // TODO New key - Add a translation "item.edit.withdraw.success": "Posten har återkallats", // "item.listelement.badge": "Item", - // TODO New key - Add a translation "item.listelement.badge": "Post", // "item.page.description": "Beskrivning", - // TODO New key - Add a translation "item.page.description": "Beskrivning", // "item.page.journal-issn": "Journal ISSN", - // TODO New key - Add a translation "item.page.journal-issn": "ISSN", // "item.page.journal-title": "Journal Title", - // TODO New key - Add a translation "item.page.journal-title": "Tidskriftstitel", // "item.page.publisher": "Publisher", - // TODO New key - Add a translation "item.page.publisher": "Utgivare", // "item.page.titleprefix": "Item: ", - // TODO New key - Add a translation "item.page.titleprefix": "Post: ", // "item.page.volume-title": "Volume Title", - // TODO New key - Add a translation "item.page.volume-title": "Volymtitel", // "item.search.results.head": "Item Search Results", - // TODO New key - Add a translation "item.search.results.head": "Sökresultat", // "item.search.title": "Item Search", - // TODO New key - Add a translation "item.search.title": "Sökresultat", // "item.page.abstract": "Abstract", - // TODO New key - Add a translation "item.page.abstract": "Sammanfattning", // "item.page.author": "Författare", - // TODO New key - Add a translation "item.page.author": "Författare", // "item.page.citation": "Citation", - // TODO New key - Add a translation "item.page.citation": "Citation", // "item.page.collections": "Collections", - // TODO New key - Add a translation "item.page.collections": "Samling", // "item.page.collections.loading": "Loading...", - // TODO New key - Add a translation "item.page.collections.loading": "Laddar..", // "item.page.collections.load-more": "Load more", - // TODO New key - Add a translation "item.page.collections.load-more": "Ladda fler", // "item.page.date": "Date", - // TODO New key - Add a translation "item.page.date": "Publicerad", // "item.page.edit": "Edit this item", - // TODO New key - Add a translation "item.page.edit": "Redigera denna post", // "item.page.files": "Files", - // TODO New key - Add a translation "item.page.files": "Filer", // "item.page.filesection.description": "Beskrivning:", - // TODO New key - Add a translation "item.page.filesection.description": "Beskrivning:", // "item.page.filesection.download": "Download", - // TODO New key - Add a translation "item.page.filesection.download": "Ladda ner", // "item.page.filesection.format": "Format:", - // TODO New key - Add a translation "item.page.filesection.format": "Format:", // "item.page.filesection.name": "Name:", - // TODO New key - Add a translation "item.page.filesection.name": "Namn:", // "item.page.filesection.size": "Storlek:", - // TODO New key - Add a translation "item.page.filesection.size": "Storlek:", // "item.page.journal.search.title": "Articles in this journal", - // TODO New key - Add a translation "item.page.journal.search.title": "Artiklar i denna tidskrift", // "item.page.link.full": "Full item page", - // TODO New key - Add a translation "item.page.link.full": "Visa fullständig post", // "item.page.link.simple": "Simple item page", - // TODO New key - Add a translation "item.page.link.simple": "Visa enkel post", // "item.page.person.search.title": "Articles by this author", - // TODO New key - Add a translation "item.page.person.search.title": "Artiklar av denna författare", // "item.page.related-items.view-more": "Show {{ amount }} more", - // TODO New key - Add a translation "item.page.related-items.view-more": "Visa {{ amount }} fler", // "item.page.related-items.view-less": "Hide last {{ amount }}", - // TODO New key - Add a translation "item.page.related-items.view-less": "Göm senaste {{ amount }}", // "item.page.relationships.isAuthorOfPublication": "Publications", - // TODO New key - Add a translation "item.page.relationships.isAuthorOfPublication": "Publikationer", // "item.page.relationships.isJournalOfPublication": "Publications", - // TODO New key - Add a translation "item.page.relationships.isJournalOfPublication": "Publikationer", // "item.page.relationships.isOrgUnitOfPerson": "Författare", - // TODO New key - Add a translation "item.page.relationships.isOrgUnitOfPerson": "Författare", // "item.page.relationships.isOrgUnitOfProject": "Research Projects", - // TODO New key - Add a translation "item.page.relationships.isOrgUnitOfProject": "Forskningsprojekt", // "item.page.subject": "Keywords", - // TODO New key - Add a translation "item.page.subject": "Ämne/nyckelord", // "item.page.uri": "URI", - // TODO New key - Add a translation "item.page.uri": "URI", // "item.page.bitstreams.view-more": "Show more", - // TODO New key - Add a translation "item.page.bitstreams.view-more": "Visa mer", // "item.page.bitstreams.collapse": "Collapse", - // TODO New key - Add a translation "item.page.bitstreams.collapse": "Fäll ihop", // "item.page.filesection.original.bundle" : "Original bundle", @@ -4102,146 +3145,111 @@ "item.page.filesection.license.bundle" : "License bundle", // "item.page.return": "Back", - // TODO New key - Add a translation "item.page.return": "Tillbaka", // "item.page.version.create": "Create new version", - // TODO New key - Add a translation "item.page.version.create": "Skapa ny version", // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", - // TODO New key - Add a translation "item.page.version.hasDraft": "Ny version kan inte skapas pga pågående uppladdning i versionshistoriken", // "item.preview.dc.identifier.uri": "Identifier:", - // TODO New key - Add a translation "item.preview.dc.identifier.uri": "Identifierare:", // "item.preview.dc.contributor.author": "Författare:", - // TODO New key - Add a translation "item.preview.dc.contributor.author": "Författare:", // "item.preview.dc.date.issued": "Published date:", - // TODO New key - Add a translation "item.preview.dc.date.issued": "Publicerad:", // "item.preview.dc.description.abstract": "Abstract:", - // TODO New key - Add a translation "item.preview.dc.description.abstract": "Sammanfattning:", // "item.preview.dc.identifier.other": "Other identifier:", - // TODO New key - Add a translation "item.preview.dc.identifier.other": "Annan identifierare:", // "item.preview.dc.language.iso": "Språk:", - // TODO New key - Add a translation "item.preview.dc.language.iso": "Språk:", // "item.preview.dc.subject": "Subjects:", - // TODO New key - Add a translation "item.preview.dc.subject": "Ämnen:", // "item.preview.dc.title": "Title:", - // TODO New key - Add a translation "item.preview.dc.title": "Titel:", // "item.preview.person.familyName": "Surname:", - // TODO New key - Add a translation "item.preview.person.familyName": "Förnamn:", // "item.preview.person.givenName": "Name:", - // TODO New key - Add a translation "item.preview.person.givenName": "Namn:", // "item.preview.person.identifier.orcid": "ORCID:", - // TODO New key - Add a translation "item.preview.person.identifier.orcid": "ORCID:", // "item.preview.project.funder.name": "Funder:", - // TODO New key - Add a translation "item.preview.project.funder.name": "Finansiär:", // "item.preview.project.funder.identifier": "Funder Identifier:", - // TODO New key - Add a translation "item.preview.project.funder.identifier": "Finansiär ID:", // "item.preview.oaire.awardNumber": "Funding ID:", - // TODO New key - Add a translation "item.preview.oaire.awardNumber": "Finansiering ID:", // "item.preview.dc.title.alternative": "Acronym:", - // TODO New key - Add a translation "item.preview.dc.title.alternative": "Akronym:", // "item.preview.dc.coverage.spatial": "Jurisdiction:", - // TODO New key - Add a translation "item.preview.dc.coverage.spatial": "Jurisdiktion:", // "item.preview.oaire.fundingStream": "Funding Stream:", - // TODO New key - Add a translation "item.preview.oaire.fundingStream": "Funding Stream:", // "item.select.confirm": "Confirm selected", - // TODO New key - Add a translation "item.select.confirm": "Bekräfta valda", // "item.select.empty": "No items to show", - // TODO New key - Add a translation "item.select.empty": "Inga poster att visa. ", // "item.select.table.author": "Author", - // TODO New key - Add a translation "item.select.table.author": "Författare", // "item.select.table.collection": "Collection", - // TODO New key - Add a translation "item.select.table.collection": "Samling", // "item.select.table.title": "Title", - // TODO New key - Add a translation "item.select.table.title": "Titel", // "item.version.history.empty": "There are no other versions for this item yet.", - // TODO New key - Add a translation "item.version.history.empty": "Det finns inga andra versioner av denna post.", // "item.version.history.head": "Version History", - // TODO New key - Add a translation "item.version.history.head": "Versionshistorik", // "item.version.history.return": "Back", - // TODO New key - Add a translation "item.version.history.return": "Tillbaka", // "item.version.history.selected": "Selected version", - // TODO New key - Add a translation "item.version.history.selected": "Vald version", // "item.version.history.selected.alert": "You are currently viewing version {{version}} of the item.", - // TODO New key - Add a translation "item.version.history.selected.alert": "Du tittat på version {{version}} av denna post.", // "item.version.history.table.version": "Version", - // TODO New key - Add a translation "item.version.history.table.version": "Version", // "item.version.history.table.item": "Item", - // TODO New key - Add a translation "item.version.history.table.item": "Post", // "item.version.history.table.editor": "Editor", - // TODO New key - Add a translation "item.version.history.table.editor": "Redaktör", // "item.version.history.table.date": "Date", - // TODO New key - Add a translation "item.version.history.table.date": "Datum", // "item.version.history.table.summary": "Summary", - // TODO New key - Add a translation "item.version.history.table.summary": "Sammanfattning", // "item.version.history.table.workspaceItem": "Workspace item", @@ -4249,35 +3257,27 @@ "item.version.history.table.workspaceItem": "Workspace item", // "item.version.history.table.workflowItem": "Workflow item", - // TODO New key - Add a translation "item.version.history.table.workflowItem": "Post i arbetsflöde", // "item.version.history.table.actions": "Action", - // TODO New key - Add a translation "item.version.history.table.actions": "Åtgärd", // "item.version.history.table.action.editWorkspaceItem": "Edit workspace item", - // TODO New key - Add a translation "item.version.history.table.action.editWorkspaceItem": "Redigera post", // "item.version.history.table.action.editSummary": "Edit summary", - // TODO New key - Add a translation "item.version.history.table.action.editSummary": "Redigera sammanfattning", // "item.version.history.table.action.saveSummary": "Save summary edits", - // TODO New key - Add a translation "item.version.history.table.action.saveSummary": "Spara ändringar", // "item.version.history.table.action.discardSummary": "Discard summary edits", - // TODO New key - Add a translation "item.version.history.table.action.discardSummary": "Förkasta ändringar", // "item.version.history.table.action.newVersion": "Create new version from this one", - // TODO New key - Add a translation "item.version.history.table.action.newVersion": "Skapa ny version av denna", // "item.version.history.table.action.deleteVersion": "Delete version", - // TODO New key - Add a translation "item.version.history.table.action.deleteVersion": "Radera version", // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", @@ -4286,52 +3286,40 @@ // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", - // TODO New key - Add a translation "item.version.notice": "Detta är inte den senaste versionen. Senaste versionen finns här.", // "item.version.create.modal.header": "New version", - // TODO New key - Add a translation "item.version.create.modal.header": "Ny version", // "item.version.create.modal.text": "Create a new version for this item", - // TODO New key - Add a translation "item.version.create.modal.text": "Skapa ny version av denna post", // "item.version.create.modal.text.startingFrom": "starting from version {{version}}", - // TODO New key - Add a translation "item.version.create.modal.text.startingFrom": "med början från version {{version}}", // "item.version.create.modal.button.confirm": "Create", - // TODO New key - Add a translation "item.version.create.modal.button.confirm": "Skapa", // "item.version.create.modal.button.confirm.tooltip": "Create new version", - // TODO New key - Add a translation "item.version.create.modal.button.confirm.tooltip": "Skapa ny version", // "item.version.create.modal.button.cancel": "Cancel", - // TODO New key - Add a translation "item.version.create.modal.button.cancel": "Avbryt", // "item.version.create.modal.button.cancel.tooltip": "Do not create new version", - // TODO New key - Add a translation "item.version.create.modal.button.cancel.tooltip": "Skapa inte ny version", // "item.version.create.modal.form.summary.label": "Summary", - // TODO New key - Add a translation "item.version.create.modal.form.summary.label": "Sammanfattning", // "item.version.create.modal.form.summary.placeholder": "Insert the summary for the new version", - // TODO New key - Add a translation "item.version.create.modal.form.summary.placeholder": "Lägg till sammanfattning av den nya versionen", // "item.version.create.notification.success" : "New version has been created with version number {{version}}", - // TODO New key - Add a translation "item.version.create.notification.success" : "En ny version med nummer {{version}} har skapats", // "item.version.create.notification.failure" : "New version has not been created", - // TODO New key - Add a translation "item.version.create.notification.failure" : "Ny version har inte skapats", // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", @@ -4340,82 +3328,63 @@ // "item.version.delete.modal.header": "Delete version", - // TODO New key - Add a translation "item.version.delete.modal.header": "Radera version", // "item.version.delete.modal.text": "Do you want to delete version {{version}}?", - // TODO New key - Add a translation "item.version.delete.modal.text": "Vill du radera version {{version}}?", // "item.version.delete.modal.button.confirm": "Delete", - // TODO New key - Add a translation "item.version.delete.modal.button.confirm": "Radera", // "item.version.delete.modal.button.confirm.tooltip": "Delete this version", - // TODO New key - Add a translation "item.version.delete.modal.button.confirm.tooltip": "Radera denna version", // "item.version.delete.modal.button.cancel": "Cancel", - // TODO New key - Add a translation "item.version.delete.modal.button.cancel": "Avbryt", // "item.version.delete.modal.button.cancel.tooltip": "Do not delete this version", - // TODO New key - Add a translation "item.version.delete.modal.button.cancel.tooltip": "Radera inte denna version", // "item.version.delete.notification.success" : "Version number {{version}} has been deleted", - // TODO New key - Add a translation "item.version.delete.notification.success" : "Version {{version}} har raderats", // "item.version.delete.notification.failure" : "Version number {{version}} has not been deleted", - // TODO New key - Add a translation "item.version.delete.notification.failure" : "Version {{version}} har inte raderats", // "item.version.edit.notification.success" : "The summary of version number {{version}} has been changed", - // TODO New key - Add a translation "item.version.edit.notification.success" : "Sammanfattningen av version {{version}} har ändrats", // "item.version.edit.notification.failure" : "The summary of version number {{version}} has not been changed", - // TODO New key - Add a translation "item.version.edit.notification.failure" : "Sammanfattningen av version {{version}} har inte ändrats", // "journal.listelement.badge": "Journal", - // TODO New key - Add a translation "journal.listelement.badge": "Tidskrift", // "journal.page.description": "Beskrivning", - // TODO New key - Add a translation "journal.page.description": "Beskrivning", // "journal.page.edit": "Edit this item", - // TODO New key - Add a translation "journal.page.edit": "Redigera denna", // "journal.page.editor": "Editor-in-Chief", - // TODO New key - Add a translation "journal.page.editor": "Editor-in-Chief", // "journal.page.issn": "ISSN", - // TODO New key - Add a translation "journal.page.issn": "ISSN", // "journal.page.publisher": "Publisher", - // TODO New key - Add a translation "journal.page.publisher": "Utgivare", // "journal.page.titleprefix": "Journal: ", - // TODO New key - Add a translation "journal.page.titleprefix": "Tidskrift: ", // "journal.search.results.head": "Journal Search Results", - // TODO New key - Add a translation "journal.search.results.head": "Sökresultat", // "journal.search.title": "Journal Search", - // TODO New key - Add a translation "journal.search.title": "Sök tidskrift", @@ -4425,7 +3394,6 @@ "journalissue.listelement.badge": "Journal Issue", // "journalissue.page.description": "Beskrivning", - // TODO New key - Add a translation "journalissue.page.description": "Beskrivning", // "journalissue.page.edit": "Edit this item", @@ -4445,7 +3413,6 @@ "journalissue.page.journal-title": "Journal Title", // "journalissue.page.keyword": "Keywords", - // TODO New key - Add a translation "journalissue.page.keyword": "Ämne/nyckelord", // "journalissue.page.number": "Number", @@ -4463,7 +3430,6 @@ "journalvolume.listelement.badge": "Journal Volume", // "journalvolume.page.description": "Beskrivning", - // TODO New key - Add a translation "journalvolume.page.description": "Beskrivning", // "journalvolume.page.edit": "Edit this item", @@ -4500,7 +3466,6 @@ "iiifsearchable.page.issue": "Issue: ", // "iiifsearchable.page.description": "Beskrivning: ", - // TODO New key - Add a translation "iiifsearchable.page.description": "Beskrivning: ", // "iiifviewer.fullscreen.notice": "Use full screen for better viewing.", @@ -4524,650 +3489,498 @@ "iiif.page.issue": "Issue: ", // "iiif.page.description": "Beskrivning: ", - // TODO New key - Add a translation "iiif.page.description": "Beskrivning: ", // "loading.bitstream": "Loading bitstream...", - // TODO New key - Add a translation "loading.bitstream": "Hämtar fil...", // "loading.bitstreams": "Loading bitstreams...", - // TODO New key - Add a translation "loading.bitstreams": "Hämtar filer...", // "loading.browse-by": "Loading items...", - // TODO New key - Add a translation "loading.browse-by": "Hämtar poster...", // "loading.browse-by-page": "Loading page...", - // TODO New key - Add a translation "loading.browse-by-page": "Hämtar sida...", // "loading.collection": "Loading collection...", - // TODO New key - Add a translation "loading.collection": "Hämtar samling...", // "loading.collections": "Loading collections...", - // TODO New key - Add a translation "loading.collections": "Hämtar samlingar..", // "loading.content-source": "Loading content source...", - // TODO New key - Add a translation "loading.content-source": "Hämtar källa...", // "loading.community": "Loading community...", - // TODO New key - Add a translation "loading.community": "Hämtar enhet...", // "loading.default": "Loading...", - // TODO New key - Add a translation "loading.default": "Hämtar...", // "loading.item": "Loading item...", - // TODO New key - Add a translation "loading.item": "Hämtar post...", // "loading.items": "Loading items...", - // TODO New key - Add a translation "loading.items": "Hämtar poster...", // "loading.mydspace-results": "Loading items...", - // TODO New key - Add a translation "loading.mydspace-results": "Hämtar poster...", // "loading.objects": "Loading...", - // TODO New key - Add a translation "loading.objects": "Hämtar...", // "loading.recent-submissions": "Loading recent submissions...", - // TODO New key - Add a translation "loading.recent-submissions": "Hämtar de senaste bidragen...", // "loading.search-results": "Loading search results...", - // TODO New key - Add a translation "loading.search-results": "Hämtar sökresultat...", // "loading.sub-collections": "Loading sub-collections...", - // TODO New key - Add a translation "loading.sub-collections": "Hämtar underavdelningar...", // "loading.sub-communities": "Loading sub-communities...", - // TODO New key - Add a translation "loading.sub-communities": "Hämtar underenheter...", // "loading.top-level-communities": "Loading top-level communities...", - // TODO New key - Add a translation "loading.top-level-communities": "Hämtar enheter på toppnivå...", // "login.form.email": "Email address", - // TODO New key - Add a translation "login.form.email": "E-postadress", // "login.form.forgot-password": "Have you forgotten your password?", - // TODO New key - Add a translation "login.form.forgot-password": "Har du glömt lösenordet?", // "login.form.header": "Please log in to DSpace", - // TODO New key - Add a translation "login.form.header": "Logga in i ODR", // "login.form.new-user": "New user? Click here to register.", - // TODO New key - Add a translation "login.form.new-user": "Ny användare? Klicka här för att skapa ett användarkonto.", // "login.form.or-divider": "or", - // TODO New key - Add a translation "login.form.or-divider": "eller", // "login.form.oidc": "Log in with OIDC", - // TODO New key - Add a translation "login.form.oidc": "Logga in med OIDC", // "login.form.password": "Password", - // TODO New key - Add a translation "login.form.password": "Lösenord", // "login.form.shibboleth": "Log in with Shibboleth", - // TODO New key - Add a translation "login.form.shibboleth": "Logga in med Shibboleth", // "login.form.submit": "Log in", - // TODO New key - Add a translation "login.form.submit": "Logga in", // "login.title": "Login", - // TODO New key - Add a translation "login.title": "Logga in", // "login.breadcrumbs": "Login", - // TODO New key - Add a translation "login.breadcrumbs": "Logga in", // "logout.form.header": "Log out from DSpace", - // TODO New key - Add a translation "logout.form.header": "Logga ut", // "logout.form.submit": "Log out", - // TODO New key - Add a translation "logout.form.submit": "Logga ut", // "logout.title": "Logout", - // TODO New key - Add a translation "logout.title": "Logga ut", // "menu.header.admin": "Management", - // TODO New key - Add a translation "menu.header.admin": "Administration", // "menu.header.image.logo": "Repository logo", - // TODO New key - Add a translation "menu.header.image.logo": "Logga för arkivet", // "menu.header.admin.description": "Management menu", - // TODO New key - Add a translation "menu.header.admin.description": "Administration meny", // "menu.section.access_control": "Access Control", - // TODO New key - Add a translation "menu.section.access_control": "Åtkomst", // "menu.section.access_control_authorizations": "Authorizations", - // TODO New key - Add a translation "menu.section.access_control_authorizations": "Behörigheter", // "menu.section.access_control_groups": "Groups", - // TODO New key - Add a translation "menu.section.access_control_groups": "Grupper", // "menu.section.access_control_people": "People", - // TODO New key - Add a translation "menu.section.access_control_people": "EPersoner", // "menu.section.admin_search": "Admin Search", - // TODO New key - Add a translation "menu.section.admin_search": "Admin sök", // "menu.section.browse_community": "This Community", - // TODO New key - Add a translation "menu.section.browse_community": "Denna samling", // "menu.section.browse_community_by_author": "By Author", - // TODO New key - Add a translation "menu.section.browse_community_by_author": "Författare", // "menu.section.browse_community_by_issue_date": "By Issue Date", - // TODO New key - Add a translation "menu.section.browse_community_by_issue_date": "Utgivningsår", // "menu.section.browse_community_by_title": "By Title", - // TODO New key - Add a translation "menu.section.browse_community_by_title": "Titel", // "menu.section.browse_global": "All of DSpace", - // TODO New key - Add a translation "menu.section.browse_global": "Hela arkivet", // "menu.section.browse_global_by_author": "By Author", - // TODO New key - Add a translation "menu.section.browse_global_by_author": "Författare", // "menu.section.browse_global_by_dateissued": "By Issue Date", - // TODO New key - Add a translation "menu.section.browse_global_by_dateissued": "Utgivningsår", // "menu.section.browse_global_by_subject": "By Subject", - // TODO New key - Add a translation "menu.section.browse_global_by_subject": "Ämne", // "menu.section.browse_global_by_title": "By Title", - // TODO New key - Add a translation "menu.section.browse_global_by_title": "Titel", // "menu.section.browse_global_communities_and_collections": "Communities & Collections", - // TODO New key - Add a translation "menu.section.browse_global_communities_and_collections": "Enheter och samlingar", // "menu.section.control_panel": "Control Panel", - // TODO New key - Add a translation "menu.section.control_panel": "Kontrollpanel", // "menu.section.curation_task": "Curation Task", - // TODO New key - Add a translation "menu.section.curation_task": "Kurationsuppgift", // "menu.section.edit": "Edit", - // TODO New key - Add a translation "menu.section.edit": "Redigera", // "menu.section.edit_collection": "Collection", - // TODO New key - Add a translation "menu.section.edit_collection": "Samling", // "menu.section.edit_community": "Community", - // TODO New key - Add a translation "menu.section.edit_community": "Enhet", // "menu.section.edit_item": "Item", - // TODO New key - Add a translation "menu.section.edit_item": "Post", // "menu.section.export": "Export", - // TODO New key - Add a translation "menu.section.export": "Exportera", // "menu.section.export_collection": "Collection", - // TODO New key - Add a translation "menu.section.export_collection": "Samling", // "menu.section.export_community": "Community", - // TODO New key - Add a translation "menu.section.export_community": "Enhet", // "menu.section.export_item": "Item", - // TODO New key - Add a translation "menu.section.export_item": "Post", // "menu.section.export_metadata": "Metadata", - // TODO New key - Add a translation "menu.section.export_metadata": "Metadata", // "menu.section.icon.access_control": "Access Control menu section", - // TODO New key - Add a translation "menu.section.icon.access_control": "Åtkomstkontroll - meny", // "menu.section.icon.admin_search": "Admin search menu section", - // TODO New key - Add a translation "menu.section.icon.admin_search": "Admin sök - meny", // "menu.section.icon.control_panel": "Control Panel menu section", - // TODO New key - Add a translation "menu.section.icon.control_panel": "Kontrollpanel - meny", // "menu.section.icon.curation_tasks": "Curation Task menu section", - // TODO New key - Add a translation "menu.section.icon.curation_tasks": "Kureringsuppgift - meny", // "menu.section.icon.edit": "Edit menu section", - // TODO New key - Add a translation "menu.section.icon.edit": "Redigera - meny", // "menu.section.icon.export": "Export menu section", - // TODO New key - Add a translation "menu.section.icon.export": "Exportera - meny", // "menu.section.icon.find": "Find menu section", - // TODO New key - Add a translation "menu.section.icon.find": "Sök - meny", // "menu.section.icon.import": "Import menu section", - // TODO New key - Add a translation "menu.section.icon.import": "Importera - meny", // "menu.section.icon.new": "New menu section", - // TODO New key - Add a translation "menu.section.icon.new": "Ny - meny", // "menu.section.icon.pin": "Pin sidebar", - // TODO New key - Add a translation "menu.section.icon.pin": "Fäst sidomenyn", // "menu.section.icon.processes": "Processes menu section", - // TODO New key - Add a translation "menu.section.icon.processes": "Processer - meny", // "menu.section.icon.registries": "Registries menu section", - // TODO New key - Add a translation "menu.section.icon.registries": "Registries- meny", // "menu.section.icon.statistics_task": "Statistics Task menu section", - // TODO New key - Add a translation "menu.section.icon.statistics_task": "Statistik - meny", // "menu.section.icon.workflow": "Administer workflow menu section", - // TODO New key - Add a translation "menu.section.icon.workflow": "Administrera arbetsflöde - meny", // "menu.section.icon.unpin": "Unpin sidebar", - // TODO New key - Add a translation "menu.section.icon.unpin": "Koppla loss sidomenyn", // "menu.section.import": "Import", - // TODO New key - Add a translation "menu.section.import": "Importera", // "menu.section.import_batch": "Batch Import (ZIP)", - // TODO New key - Add a translation "menu.section.import_batch": "Importera batch (ZIP)", // "menu.section.import_metadata": "Metadata", - // TODO New key - Add a translation "menu.section.import_metadata": "Metadata", // "menu.section.new": "New", - // TODO New key - Add a translation "menu.section.new": "Ny", // "menu.section.new_collection": "Collection", - // TODO New key - Add a translation "menu.section.new_collection": "Samling", // "menu.section.new_community": "Community", - // TODO New key - Add a translation "menu.section.new_community": "Enhet", // "menu.section.new_item": "Item", - // TODO New key - Add a translation "menu.section.new_item": "Post", // "menu.section.new_item_version": "Item Version", - // TODO New key - Add a translation "menu.section.new_item_version": "Post version", // "menu.section.new_process": "Process", - // TODO New key - Add a translation "menu.section.new_process": "Process", // "menu.section.pin": "Pin sidebar", - // TODO New key - Add a translation "menu.section.pin": "Fäst sidomenyn", // "menu.section.unpin": "Unpin sidebar", - // TODO New key - Add a translation "menu.section.unpin": "Koppla loss sidomenyn", // "menu.section.processes": "Processes", - // TODO New key - Add a translation "menu.section.processes": "Processer", // "menu.section.registries": "Registries", - // TODO New key - Add a translation "menu.section.registries": "Registries", // "menu.section.registries_format": "Format", - // TODO New key - Add a translation "menu.section.registries_format": "Format", // "menu.section.registries_metadata": "Metadata", - // TODO New key - Add a translation "menu.section.registries_metadata": "Metadata", // "menu.section.statistics": "Statistics", - // TODO New key - Add a translation "menu.section.statistics": "Statistik", // "menu.section.statistics_task": "Statistics Task", - // TODO New key - Add a translation "menu.section.statistics_task": "Statistik uppgift", // "menu.section.toggle.access_control": "Toggle Access Control section", - // TODO New key - Add a translation "menu.section.toggle.access_control": "Växla till åtkomstkontroll", // "menu.section.toggle.control_panel": "Toggle Control Panel section", - // TODO New key - Add a translation "menu.section.toggle.control_panel": "Växla till kontrollpanel", // "menu.section.toggle.curation_task": "Toggle Curation Task section", - // TODO New key - Add a translation "menu.section.toggle.curation_task": "Växla till kureringsuppgift", // "menu.section.toggle.edit": "Toggle Edit section", - // TODO New key - Add a translation "menu.section.toggle.edit": "Växla till redigera", // "menu.section.toggle.export": "Toggle Export section", - // TODO New key - Add a translation "menu.section.toggle.export": "Växla till exportera", // "menu.section.toggle.find": "Toggle Find section", - // TODO New key - Add a translation "menu.section.toggle.find": "Växla till sök", // "menu.section.toggle.import": "Toggle Import section", - // TODO New key - Add a translation "menu.section.toggle.import": "Växla till importera", // "menu.section.toggle.new": "Toggle New section", - // TODO New key - Add a translation "menu.section.toggle.new": "Växla till ny", // "menu.section.toggle.registries": "Toggle Registries section", - // TODO New key - Add a translation "menu.section.toggle.registries": "Växla till registries", // "menu.section.toggle.statistics_task": "Toggle Statistics Task section", - // TODO New key - Add a translation "menu.section.toggle.statistics_task": "Växla till statistik", // "menu.section.workflow": "Administer Workflow", - // TODO New key - Add a translation "menu.section.workflow": "Administrera arbetsflöde", // "mydspace.breadcrumbs": "MyDSpace", - // TODO New key - Add a translation "mydspace.breadcrumbs": "Mitt DSpace", // "mydspace.description": "", - // TODO New key - Add a translation "mydspace.description": "", // "mydspace.general.text-here": "here", - // TODO New key - Add a translation "mydspace.general.text-here": "här", // "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", - // TODO New key - Add a translation "mydspace.messages.controller-help": "Välj detta för att skicka ett meddelande till uppladdare.", // "mydspace.messages.description-placeholder": "Insert your message here...", - // TODO New key - Add a translation "mydspace.messages.description-placeholder": "Skriv meddelande här...", // "mydspace.messages.hide-msg": "Hide message", - // TODO New key - Add a translation "mydspace.messages.hide-msg": "Göm meddelande", // "mydspace.messages.mark-as-read": "Mark as read", - // TODO New key - Add a translation "mydspace.messages.mark-as-read": "Markera som läst", // "mydspace.messages.mark-as-unread": "Mark as unread", - // TODO New key - Add a translation "mydspace.messages.mark-as-unread": "Markera som oläst", // "mydspace.messages.no-content": "No content.", - // TODO New key - Add a translation "mydspace.messages.no-content": "Innehåll saknas.", // "mydspace.messages.no-messages": "No messages yet.", - // TODO New key - Add a translation "mydspace.messages.no-messages": "Inga meddelanden finns.", // "mydspace.messages.send-btn": "Send", - // TODO New key - Add a translation "mydspace.messages.send-btn": "Skicka", // "mydspace.messages.show-msg": "Show message", - // TODO New key - Add a translation "mydspace.messages.show-msg": "Visa meddelande", // "mydspace.messages.subject-placeholder": "Subject...", - // TODO New key - Add a translation "mydspace.messages.subject-placeholder": "Ämne...", // "mydspace.messages.submitter-help": "Select this option to send a message to controller.", - // TODO New key - Add a translation "mydspace.messages.submitter-help": "Välj detta för att skicka ett meddelande till kontrollant.", // "mydspace.messages.title": "Messages", - // TODO New key - Add a translation "mydspace.messages.title": "Meddelanden", // "mydspace.messages.to": "To", - // TODO New key - Add a translation "mydspace.messages.to": "Till", // "mydspace.new-submission": "New submission", - // TODO New key - Add a translation "mydspace.new-submission": "Nytt bidrag", // "mydspace.new-submission-external": "Import metadata from external source", - // TODO New key - Add a translation "mydspace.new-submission-external": "Importera metadada från extern källa", // "mydspace.new-submission-external-short": "Import metadata", - // TODO New key - Add a translation "mydspace.new-submission-external-short": "Importera metadata", // "mydspace.results.head": "Your submissions", - // TODO New key - Add a translation "mydspace.results.head": "Dina registreringar", // "mydspace.results.no-abstract": "No Abstract", - // TODO New key - Add a translation "mydspace.results.no-abstract": "Ingen sammanfattning", // "mydspace.results.no-Författare": "No Författare", - // TODO New key - Add a translation "mydspace.results.no-Författare": "Inga författare", // "mydspace.results.no-collections": "No Collections", - // TODO New key - Add a translation "mydspace.results.no-collections": "Inga samlingar", // "mydspace.results.no-date": "No Date", - // TODO New key - Add a translation "mydspace.results.no-date": "Inget datum", // "mydspace.results.no-files": "No Files", - // TODO New key - Add a translation "mydspace.results.no-files": "Inga filer", // "mydspace.results.no-results": "There were no items to show", - // TODO New key - Add a translation "mydspace.results.no-results": "Det finns inga poster att visa", // "mydspace.results.no-title": "No title", - // TODO New key - Add a translation "mydspace.results.no-title": "Ingen titel", // "mydspace.results.no-uri": "No Uri", - // TODO New key - Add a translation "mydspace.results.no-uri": "Ingen Uri", // "mydspace.search-form.placeholder": "Search in mydspace...", - // TODO New key - Add a translation "mydspace.search-form.placeholder": "Sök i mydspace...", // "mydspace.show.workflow": "Workflow tasks", - // TODO New key - Add a translation "mydspace.show.workflow": "Arbetsflöde uppgifter", // "mydspace.show.workspace": "Your Submissions", - // TODO New key - Add a translation "mydspace.show.workspace": "Dina registreringar", // "mydspace.status.archived": "Archived", - // TODO New key - Add a translation "mydspace.status.archived": "I arkivet", // "mydspace.status.validation": "Validation", - // TODO New key - Add a translation "mydspace.status.validation": "Validering", // "mydspace.status.waiting-for-controller": "Waiting for controller", - // TODO New key - Add a translation "mydspace.status.waiting-for-controller": "Väntar på kontrollant", // "mydspace.status.workflow": "Workflow", - // TODO New key - Add a translation "mydspace.status.workflow": "Arbetsflöde", // "mydspace.status.workspace": "Workspace", - // TODO New key - Add a translation "mydspace.status.workspace": "I arbetsflödet", // "mydspace.title": "MyDSpace", - // TODO New key - Add a translation - "mydspace.title": "MyDSpace", + "mydspace.title": "Mitt DSpace", // "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", - // TODO New key - Add a translation "mydspace.upload.upload-failed": "Ett fel uppstod när arbetsyta skulle skapas. Verifiera inneållet i det som skall laddas upp och försök igen.", // "mydspace.upload.upload-failed-manyentries": "Unprocessable file. Detected too many entries but allowed only one for file.", - // TODO New key - Add a translation "mydspace.upload.upload-failed-manyentries": "Fil kan inte processes. Detected too many entries but allowed only one for file.", // "mydspace.upload.upload-failed-moreonefile": "Unprocessable request. Only one file is allowed.", - // TODO New key - Add a translation "mydspace.upload.upload-failed-moreonefile": "Begäran kunde inte bearbetas. Endast en fil är möjlig.", // "mydspace.upload.upload-multiple-successful": "{{qty}} new workspace items created.", - // TODO New key - Add a translation "mydspace.upload.upload-multiple-successful": "{{qty}} nya poster har skapats i arbetsytan.", // "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", - // TODO New key - Add a translation "mydspace.upload.upload-successful": "Ny post har skapats i arbetsytan. Klicka {{here}} för att redigera den.", // "mydspace.view-btn": "View", - // TODO New key - Add a translation "mydspace.view-btn": "Visa", // "nav.browse.header": "All of DSpace", - // TODO New key - Add a translation "nav.browse.header": "Hela DSpace", // "nav.community-browse.header": "By Community", - // TODO New key - Add a translation "nav.community-browse.header": "Efter enhet", // "nav.language": "Språk switch", - // TODO New key - Add a translation "nav.language": "Välj språk", // "nav.login": "Log In", - // TODO New key - Add a translation "nav.login": "Logga in", // "nav.logout": "User profile menu and Log Out", @@ -5179,19 +3992,15 @@ "nav.main.description": "Main navigation bar", // "nav.mydspace": "MyDSpace", - // TODO New key - Add a translation - "nav.mydspace": "Mitt ODR", + "nav.mydspace": "Mitt DSpace", // "nav.profile": "Profile", - // TODO New key - Add a translation "nav.profile": "Profil", // "nav.search": "Search", - // TODO New key - Add a translation "nav.search": "Sök", // "nav.statistics.header": "Statistics", - // TODO New key - Add a translation "nav.statistics.header": "Statistik", // "nav.stop-impersonating": "Stop impersonating EPerson", @@ -5228,7 +4037,6 @@ "orgunit.page.dateestablished": "Date established", // "orgunit.page.description": "Beskrivning", - // TODO New key - Add a translation "orgunit.page.description": "Beskrivning", // "orgunit.page.edit": "Edit this item", @@ -5236,7 +4044,6 @@ "orgunit.page.edit": "Edit this item", // "orgunit.page.id": "ID", - // TODO New key - Add a translation "orgunit.page.id": "ID", // "orgunit.page.titleprefix": "Organizational Unit: ", @@ -5244,23 +4051,18 @@ "orgunit.page.titleprefix": "Organizational Unit: ", // "pagination.options.description": "Pagination options", - // TODO New key - Add a translation "pagination.options.description": "Träffar per sida", // "pagination.results-per-page": "Results Per Page", - // TODO New key - Add a translation "pagination.results-per-page": "Sökresultat per sida", // "pagination.showing.detail": "{{ range }} of {{ total }}", - // TODO New key - Add a translation "pagination.showing.detail": "{{ range }} av {{ total }}", // "pagination.showing.label": "Now showing ", - // TODO New key - Add a translation "pagination.showing.label": "Visar ", // "pagination.sort-direction": "Sort Options", - // TODO New key - Add a translation "pagination.sort-direction": "Sortera efter", @@ -5282,19 +4084,15 @@ "person.page.edit": "Edit this item", // "person.page.email": "E-post", - // TODO New key - Add a translation "person.page.email": "E-post", // "person.page.firstname": "First Name", - // TODO New key - Add a translation "person.page.firstname": "Förnamn", // "person.page.jobtitle": "Job Title", - // TODO New key - Add a translation "person.page.jobtitle": "Job Title", // "person.page.lastname": "Last Name", - // TODO New key - Add a translation "person.page.lastname": "Efternamn", // "person.page.link.full": "Show all metadata", @@ -5302,7 +4100,6 @@ "person.page.link.full": "Show all metadata", // "person.page.orcid": "ORCID", - // TODO New key - Add a translation "person.page.orcid": "ORCID", // "person.page.staffid": "Staff ID", @@ -5332,7 +4129,6 @@ "process.new.cancel": "Cancel", // "process.new.submit": "Save", - // TODO New key - Add a translation "process.new.submit": "Spara", // "process.new.select-script": "Script", @@ -5454,7 +4250,6 @@ "process.detail.end-time" : "Finish time", // "process.detail.status" : "Status", - // TODO New key - Add a translation "process.detail.status" : "Status", // "process.detail.create" : "Create similar process", @@ -5464,152 +4259,115 @@ // "process.overview.table.finish" : "Finish time (UTC)", - // TODO New key - Add a translation "process.overview.table.finish" : "Sluttid (UTC)", // "process.overview.table.id" : "Process ID", - // TODO New key - Add a translation "process.overview.table.id" : "Process ID", // "process.overview.table.name" : "Name", - // TODO New key - Add a translation "process.overview.table.name" : "Namn", // "process.overview.table.start" : "Start time (UTC)", - // TODO New key - Add a translation "process.overview.table.start" : "Starttid (UTC)", // "process.overview.table.status" : "Status", - // TODO New key - Add a translation "process.overview.table.status" : "Status", // "process.overview.table.user" : "User", - // TODO New key - Add a translation "process.overview.table.user" : "Användare", // "process.overview.title": "Processes Overview", - // TODO New key - Add a translation "process.overview.title": "Processer översikt", // "process.overview.breadcrumbs": "Processes Overview", - // TODO New key - Add a translation "process.overview.breadcrumbs": "Processer översikt", // "process.overview.new": "New", - // TODO New key - Add a translation "process.overview.new": "Ny", // "profile.breadcrumbs": "Update Profile", - // TODO New key - Add a translation "profile.breadcrumbs": "Uppdatera profil", // "profile.card.identify": "Identify", - // TODO New key - Add a translation "profile.card.identify": "Identifiera", // "profile.card.security": "Säkerhet", - // TODO New key - Add a translation "profile.card.security": "Säkerhet och inloggning", // "profile.form.submit": "Save", - // TODO New key - Add a translation "profile.form.submit": "Spara", // "profile.groups.head": "Authorization groups you belong to", - // TODO New key - Add a translation "profile.groups.head": "Behörighetsgrupper som du är medlem i", // "profile.head": "Update Profile", - // TODO New key - Add a translation "profile.head": "Uppdatera profil", // "profile.metadata.form.error.firstname.required": "First Name is required", - // TODO New key - Add a translation "profile.metadata.form.error.firstname.required": "Förnamn är obligatotiskt", // "profile.metadata.form.error.lastname.required": "Last Name is required", - // TODO New key - Add a translation "profile.metadata.form.error.lastname.required": "Efternamn är obligatoriskt", // "profile.metadata.form.label.email": "E-post", - // TODO New key - Add a translation "profile.metadata.form.label.email": "E-post", // "profile.metadata.form.label.firstname": "First Name", - // TODO New key - Add a translation "profile.metadata.form.label.firstname": "Förnamn", // "profile.metadata.form.label.language": "Språk", - // TODO New key - Add a translation "profile.metadata.form.label.language": "Språk", // "profile.metadata.form.label.lastname": "Last Name", - // TODO New key - Add a translation "profile.metadata.form.label.lastname": "Efternamn", // "profile.metadata.form.label.phone": "Telefonnummer", - // TODO New key - Add a translation "profile.metadata.form.label.phone": "Telefonnummer", // "profile.metadata.form.notifications.success.content": "Your changes to the profile were saved.", - // TODO New key - Add a translation "profile.metadata.form.notifications.success.content": "Dina ändringar har sparats.", // "profile.metadata.form.notifications.success.title": "Profile saved", - // TODO New key - Add a translation "profile.metadata.form.notifications.success.title": "Profilen har sparats", // "profile.notifications.warning.no-changes.content": "No changes were made to the Profile.", - // TODO New key - Add a translation "profile.notifications.warning.no-changes.content": "Inga ändringar gjordes.", // "profile.notifications.warning.no-changes.title": "No changes", - // TODO New key - Add a translation "profile.notifications.warning.no-changes.title": "Inga ändringar", // "profile.security.form.error.matching-passwords": "Lösenorden överensstämmer inte.", - // TODO New key - Add a translation "profile.security.form.error.matching-passwords": "Lösenorden överensstämmer inte.", // "profile.security.form.error.password-length": "The password should be at least 6 characters long.", - // TODO New key - Add a translation "profile.security.form.error.password-length": "Lösenordet måste bestå av minst 6 tecken.", // "profile.security.form.info": "Optionally, you can enter a new password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", - // TODO New key - Add a translation "profile.security.form.info": "Om du vill byta lösenord så kan du göra det nedan. Lösenordet måste bestå av minst 6 tecken.", // "profile.security.form.label.password": "Password", - // TODO New key - Add a translation "profile.security.form.label.password": "Lösenord", // "profile.security.form.label.passwordrepeat": "Bekräfta", - // TODO New key - Add a translation "profile.security.form.label.passwordrepeat": "Bekräfta", // "profile.security.form.notifications.success.content": "Your changes to the password were saved.", - // TODO New key - Add a translation "profile.security.form.notifications.success.content": "Det nya lösenordet har sparats.", // "profile.security.form.notifications.success.title": "Password saved", - // TODO New key - Add a translation "profile.security.form.notifications.success.title": "Lösenordet har sparats", // "profile.security.form.notifications.error.title": "Error changing passwords", - // TODO New key - Add a translation "profile.security.form.notifications.error.title": "Ett del uppstod när lösenordet skulle sparas", // "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", - // TODO New key - Add a translation "profile.security.form.notifications.error.not-long-enough": "Lösenordet måste bestå av minst 6 tecken.", // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", - // TODO New key - Add a translation "profile.security.form.notifications.error.not-same": "Lösenorden överensstämmer inte.", // "profile.title": "Update Profile", - // TODO New key - Add a translation "profile.title": "Uppdatera profil", @@ -5623,7 +4381,6 @@ "project.page.contributor": "Contributors", // "project.page.description": "Beskrivning", - // TODO New key - Add a translation "project.page.description": "Beskrivning", // "project.page.edit": "Edit this item", @@ -5639,15 +4396,12 @@ "project.page.funder": "Funders", // "project.page.id": "ID", - // TODO New key - Add a translation "project.page.id": "ID", // "project.page.keyword": "Keywords", - // TODO New key - Add a translation "project.page.keyword": "Ämne/nyckelord", // "project.page.status": "Status", - // TODO New key - Add a translation "project.page.status": "Status", // "project.page.titleprefix": "Research Project: ", @@ -5665,7 +4419,6 @@ "publication.listelement.badge": "Publication", // "publication.page.description": "Beskrivning", - // TODO New key - Add a translation "publication.page.description": "Beskrivning", // "publication.page.edit": "Edit this item", @@ -5681,7 +4434,6 @@ "publication.page.journal-title": "Journal Title", // "publication.page.publisher": "Publisher", - // TODO New key - Add a translation "publication.page.publisher": "Utgivare", // "publication.page.titleprefix": "Publication: ", @@ -5702,11 +4454,9 @@ // "media-viewer.next": "Next", - // TODO New key - Add a translation "media-viewer.next": "Nästa", // "media-viewer.previous": "Föregående", - // TODO New key - Add a translation "media-viewer.previous": "Föregående", // "media-viewer.playlist": "Playlist", @@ -5715,752 +4465,567 @@ // "register-email.title": "Ny användare", - // TODO New key - Add a translation "register-email.title": "Ny användare", // "register-page.create-profile.header": "Create Profile", - // TODO New key - Add a translation "register-page.create-profile.header": "Skapa profil", // "register-page.create-profile.identification.header": "Identify", - // TODO New key - Add a translation "register-page.create-profile.identification.header": "Identifera", // "register-page.create-profile.identification.email": "E-post", - // TODO New key - Add a translation "register-page.create-profile.identification.email": "E-post", // "register-page.create-profile.identification.first-name": "First Name *", - // TODO New key - Add a translation "register-page.create-profile.identification.first-name": "Förnamn *", // "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", - // TODO New key - Add a translation "register-page.create-profile.identification.first-name.error": "Ange förnamn", // "register-page.create-profile.identification.last-name": "Last Name *", - // TODO New key - Add a translation "register-page.create-profile.identification.last-name": "Efternamn *", // "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", - // TODO New key - Add a translation "register-page.create-profile.identification.last-name.error": "Ange efternamn", // "register-page.create-profile.identification.contact": "Telefonnummer", - // TODO New key - Add a translation "register-page.create-profile.identification.contact": "Telefonnummer", // "register-page.create-profile.identification.language": "Språk", - // TODO New key - Add a translation "register-page.create-profile.identification.language": "Språk", // "register-page.create-profile.security.header": "Säkerhet", - // TODO New key - Add a translation "register-page.create-profile.security.header": "Säkerhet", // "register-page.create-profile.security.info": "Please enter a password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", - // TODO New key - Add a translation "register-page.create-profile.security.info": "Ange och bekräfta ett lösenord nedan. Det måste bestå av minst 6 tecken.", // "register-page.create-profile.security.label.password": "Password *", - // TODO New key - Add a translation "register-page.create-profile.security.label.password": "Lösenord *", // "register-page.create-profile.security.label.passwordrepeat": "Bekräfta *", - // TODO New key - Add a translation "register-page.create-profile.security.label.passwordrepeat": "Bekräfta *", // "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", - // TODO New key - Add a translation - "register-page.create-profile.security.error.empty-password": "Ange ett lösnord nedan.", + "register-page.create-profile.security.error.empty-password": "Ange ett lösenord nedan.", // "register-page.create-profile.security.error.matching-passwords": "Lösenorden överensstämmer inte.", - // TODO New key - Add a translation "register-page.create-profile.security.error.matching-passwords": "Lösenorden överensstämmer inte.", // "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", - // TODO New key - Add a translation "register-page.create-profile.security.error.password-length": "Lösenordet måste bestå av minst 6 tecken.", // "register-page.create-profile.submit": "Complete Registration", - // TODO New key - Add a translation "register-page.create-profile.submit": "Slutför registrering", // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", - // TODO New key - Add a translation "register-page.create-profile.submit.error.content": "Ett fel uppstod när ny användare registrerades.", // "register-page.create-profile.submit.error.head": "Registration failed", - // TODO New key - Add a translation "register-page.create-profile.submit.error.head": "Registreringen misslyckades", // "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", - // TODO New key - Add a translation - "register-page.create-profile.submit.success.content": "Regsitreringen är klar. Du är nu inloggad som den nya användaren.", + "register-page.create-profile.submit.success.content": "Registreringen är klar. Du är nu inloggad som den nya användaren.", // "register-page.create-profile.submit.success.head": "Registration completed", - // TODO New key - Add a translation "register-page.create-profile.submit.success.head": "Registreringen är klar", // "register-page.registration.header": "Ny användare", - // TODO New key - Add a translation "register-page.registration.header": "Ny användare", // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", - // TODO New key - Add a translation "register-page.registration.info": "Skapa ett konto för att få uppdateringar eller för att kunna registrera nya bidrag i arkivet.", // "register-page.registration.email": "E-post *", - // TODO New key - Add a translation "register-page.registration.email": "E-post *", // "register-page.registration.email.error.required": "Please fill in an email address", - // TODO New key - Add a translation "register-page.registration.email.error.required": "Ange e-post", // "register-page.registration.email.error.pattern": "Please fill in a valid email address", - // TODO New key - Add a translation "register-page.registration.email.error.pattern": "Ange en giltig e-postadress", // "register-page.registration.email.hint": "This address will be verified and used as your login name.", - // TODO New key - Add a translation "register-page.registration.email.hint": "Denna adress kommer att verifieras och användas när du loggar in.", // "register-page.registration.submit": "Register", - // TODO New key - Add a translation "register-page.registration.submit": "Skapa konto", // "register-page.registration.success.head": "Verification email sent", - // TODO New key - Add a translation "register-page.registration.success.head": "Ett verifieringsmejl har skickats", // "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", - // TODO New key - Add a translation "register-page.registration.success.content": "Ett mejl med instruktioner har skickats till {{ email }}.", // "register-page.registration.error.head": "Error when trying to register email", - // TODO New key - Add a translation "register-page.registration.error.head": "Ett fel uppstod när kontot skulle skapas", // "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", - // TODO New key - Add a translation "register-page.registration.error.content": "Ett fel uppstod när kontot skulle skapas för: {{ email }}", // "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", - // TODO New key - Add a translation "relationships.add.error.relationship-type.content": "Det gick inte att hitta något som matchade relationstyp {{ type }} mellan dessa poster", // "relationships.add.error.server.content": "The server returned an error", - // TODO New key - Add a translation "relationships.add.error.server.content": "Servern returnerade ett fel", // "relationships.add.error.title": "Unable to add relationship", - // TODO New key - Add a translation "relationships.add.error.title": "Det gick inte att skapa relation", // "relationships.isAuthorOf": "Författare", - // TODO New key - Add a translation "relationships.isAuthorOf": "Författare", // "relationships.isAuthorOf.Person": "Författare (persons)", - // TODO New key - Add a translation "relationships.isAuthorOf.Person": "Författare (personer)", // "relationships.isAuthorOf.OrgUnit": "Författare (organizational units)", - // TODO New key - Add a translation "relationships.isAuthorOf.OrgUnit": "Författare (organisatoriska enheter)", // "relationships.isIssueOf": "Journal Issues", - // TODO New key - Add a translation "relationships.isIssueOf": "Tidskriftsexemplar", // "relationships.isJournalIssueOf": "Journal Issue", - // TODO New key - Add a translation "relationships.isJournalIssueOf": "Tidskriftsexemplar", // "relationships.isJournalOf": "Journals", - // TODO New key - Add a translation "relationships.isJournalOf": "Tidskrifter", // "relationships.isOrgUnitOf": "Organizational Units", - // TODO New key - Add a translation "relationships.isOrgUnitOf": "Organisatoriska enheter", // "relationships.isPersonOf": "Författare", - // TODO New key - Add a translation "relationships.isPersonOf": "Författare", // "relationships.isProjectOf": "Research Projects", - // TODO New key - Add a translation "relationships.isProjectOf": "Forskningsprojekt", // "relationships.isPublicationOf": "Publications", - // TODO New key - Add a translation "relationships.isPublicationOf": "Publikationer", // "relationships.isPublicationOfJournalIssue": "Articles", - // TODO New key - Add a translation "relationships.isPublicationOfJournalIssue": "Artiklar", // "relationships.isSingleJournalOf": "Journal", - // TODO New key - Add a translation "relationships.isSingleJournalOf": "Tidskrift", // "relationships.isSingleVolumeOf": "Journal Volume", - // TODO New key - Add a translation "relationships.isSingleVolumeOf": "Tidskriftsexemplar", // "relationships.isVolumeOf": "Journal Volumes", - // TODO New key - Add a translation "relationships.isVolumeOf": "Tidskriftsvolymer", // "relationships.isContributorOf": "Contributors", - // TODO New key - Add a translation "relationships.isContributorOf": "Medverkande", // "relationships.isContributorOf.OrgUnit": "Contributor (Organizational Unit)", - // TODO New key - Add a translation "relationships.isContributorOf.OrgUnit": "Medverkande (organisatorisk enhet)", // "relationships.isContributorOf.Person": "Contributor", - // TODO New key - Add a translation "relationships.isContributorOf.Person": "Medverkande", // "relationships.isFundingAgencyOf.OrgUnit": "Funder", - // TODO New key - Add a translation "relationships.isFundingAgencyOf.OrgUnit": "Finansiär", // "repository.image.logo": "Repository logo", - // TODO New key - Add a translation "repository.image.logo": "Repositoriets logga", // "repository.title.prefix": "DSpace Angular :: ", - // TODO New key - Add a translation "repository.title.prefix": "DSpace Angular :: ", // "repository.title.prefixDSpace": "DSpace Angular ::", - // TODO New key - Add a translation "repository.title.prefixDSpace": "DSpace Angular ::", // "resource-policies.add.button": "Add", - // TODO New key - Add a translation "resource-policies.add.button": "Lägg till", // "resource-policies.add.for.": "Add a new policy", - // TODO New key - Add a translation "resource-policies.add.for.": "Lägg till ny policy", // "resource-policies.add.for.bitstream": "Add a new Bitstream policy", - // TODO New key - Add a translation "resource-policies.add.for.bitstream": "Lägg till ny policy för fil", // "resource-policies.add.for.bundle": "Add a new Bundle policy", - // TODO New key - Add a translation "resource-policies.add.for.bundle": "Lägg till ny policy för bunt", // "resource-policies.add.for.item": "Add a new Item policy", - // TODO New key - Add a translation "resource-policies.add.for.item": "Lägg till ny policy för post", // "resource-policies.add.for.community": "Add a new Community policy", - // TODO New key - Add a translation "resource-policies.add.for.community": "Lägg till ny policy för enhet", // "resource-policies.add.for.collection": "Add a new Collection policy", - // TODO New key - Add a translation "resource-policies.add.for.collection": "Lägg till ny policy för samling", // "resource-policies.create.page.heading": "Create new resource policy for ", - // TODO New key - Add a translation "resource-policies.create.page.heading": "Lägg till ny policy för ", // "resource-policies.create.page.failure.content": "An error occurred while creating the resource policy.", - // TODO New key - Add a translation "resource-policies.create.page.failure.content": "Ett fel har uppstått.", // "resource-policies.create.page.success.content": "Operation successful", - // TODO New key - Add a translation "resource-policies.create.page.success.content": "Operationen lyckades", // "resource-policies.create.page.title": "Create new resource policy", - // TODO New key - Add a translation "resource-policies.create.page.title": "Skapa ny policy för resurs", // "resource-policies.delete.btn": "Delete selected", - // TODO New key - Add a translation "resource-policies.delete.btn": "Radera valda", // "resource-policies.delete.btn.title": "Delete selected resource policies", - // TODO New key - Add a translation "resource-policies.delete.btn.title": "Radera valda policies", // "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", - // TODO New key - Add a translation "resource-policies.delete.failure.content": "Ett fel uppstod när policies skulle raderas.", // "resource-policies.delete.success.content": "Operation successful", - // TODO New key - Add a translation "resource-policies.delete.success.content": "Operationen lyckades", // "resource-policies.edit.page.heading": "Edit resource policy ", - // TODO New key - Add a translation "resource-policies.edit.page.heading": "Redigera policy för resurs ", // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", - // TODO New key - Add a translation "resource-policies.edit.page.failure.content": "Ett fel uppstod när policy redigerades.", // "resource-policies.edit.page.success.content": "Operation successful", - // TODO New key - Add a translation "resource-policies.edit.page.success.content": "Operationen lyckades", // "resource-policies.edit.page.title": "Edit resource policy", - // TODO New key - Add a translation "resource-policies.edit.page.title": "Redigera policy för resurs", // "resource-policies.form.action-type.label": "Select the action type", - // TODO New key - Add a translation "resource-policies.form.action-type.label": "Välj typ av åtgärd", // "resource-policies.form.action-type.required": "You must select the resource policy action.", - // TODO New key - Add a translation "resource-policies.form.action-type.required": "Du måste välja typ av åtgärd.", // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", - // TODO New key - Add a translation "resource-policies.form.eperson-group-list.label": "ePerson och/eller grupp som kommer att beviljas åtkomst", // "resource-policies.form.eperson-group-list.select.btn": "Select", - // TODO New key - Add a translation "resource-policies.form.eperson-group-list.select.btn": "Välj", // "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", - // TODO New key - Add a translation "resource-policies.form.eperson-group-list.tab.eperson": "Sök ePerson", // "resource-policies.form.eperson-group-list.tab.group": "Search for a group", - // TODO New key - Add a translation "resource-policies.form.eperson-group-list.tab.group": "Sök grupp", // "resource-policies.form.eperson-group-list.table.headers.action": "Action", - // TODO New key - Add a translation "resource-policies.form.eperson-group-list.table.headers.action": "Åtgärd", // "resource-policies.form.eperson-group-list.table.headers.id": "ID", - // TODO New key - Add a translation "resource-policies.form.eperson-group-list.table.headers.id": "ID", // "resource-policies.form.eperson-group-list.table.headers.name": "Name", - // TODO New key - Add a translation "resource-policies.form.eperson-group-list.table.headers.name": "Namn", // "resource-policies.form.date.end.label": "End Date", - // TODO New key - Add a translation "resource-policies.form.date.end.label": "Slutdatum", // "resource-policies.form.date.start.label": "Start Date", - // TODO New key - Add a translation "resource-policies.form.date.start.label": "Startdatum", // "resource-policies.form.description.label": "Beskrivning", - // TODO New key - Add a translation "resource-policies.form.description.label": "Beskrivning", // "resource-policies.form.name.label": "Name", - // TODO New key - Add a translation "resource-policies.form.name.label": "Namn", // "resource-policies.form.policy-type.label": "Select the policy type", - // TODO New key - Add a translation "resource-policies.form.policy-type.label": "Välj typ av policy", // "resource-policies.form.policy-type.required": "You must select the resource policy type.", - // TODO New key - Add a translation - "resource-policies.form.policy-type.required": "YDu måste välja typ av policy.", + "resource-policies.form.policy-type.required": "Du måste välja typ av policy.", // "resource-policies.table.headers.action": "Action", - // TODO New key - Add a translation "resource-policies.table.headers.action": "Åtgärd", // "resource-policies.table.headers.date.end": "End Date", - // TODO New key - Add a translation "resource-policies.table.headers.date.end": "Slutdatum", // "resource-policies.table.headers.date.start": "Start Date", - // TODO New key - Add a translation "resource-policies.table.headers.date.start": "Startdatum", // "resource-policies.table.headers.edit": "Edit", - // TODO New key - Add a translation "resource-policies.table.headers.edit": "Redigera", // "resource-policies.table.headers.edit.group": "Edit group", - // TODO New key - Add a translation "resource-policies.table.headers.edit.group": "Redigera grupp", // "resource-policies.table.headers.edit.policy": "Edit policy", - // TODO New key - Add a translation "resource-policies.table.headers.edit.policy": "Redigera policy", // "resource-policies.table.headers.eperson": "EPerson", - // TODO New key - Add a translation "resource-policies.table.headers.eperson": "EPerson", // "resource-policies.table.headers.group": "Group", - // TODO New key - Add a translation "resource-policies.table.headers.group": "Grupp", // "resource-policies.table.headers.id": "ID", - // TODO New key - Add a translation "resource-policies.table.headers.id": "ID", // "resource-policies.table.headers.name": "Name", - // TODO New key - Add a translation "resource-policies.table.headers.name": "Namn", // "resource-policies.table.headers.policyType": "type", - // TODO New key - Add a translation "resource-policies.table.headers.policyType": "typ", // "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", - // TODO New key - Add a translation "resource-policies.table.headers.title.for.bitstream": "Policies för fil", // "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", - // TODO New key - Add a translation "resource-policies.table.headers.title.for.bundle": "Policies för bunt", // "resource-policies.table.headers.title.for.item": "Policies for Item", - // TODO New key - Add a translation "resource-policies.table.headers.title.for.item": "Policies för post", // "resource-policies.table.headers.title.for.community": "Policies for Community", - // TODO New key - Add a translation "resource-policies.table.headers.title.for.community": "Policies för enhet", // "resource-policies.table.headers.title.for.collection": "Policies for Collection", - // TODO New key - Add a translation "resource-policies.table.headers.title.for.collection": "Policies för samling", // "search.description": "", - // TODO New key - Add a translation "search.description": "", // "search.switch-configuration.title": "Show", - // TODO New key - Add a translation "search.switch-configuration.title": "Visa", // "search.title": "Search", - // TODO New key - Add a translation "search.title": "Sök", // "search.breadcrumbs": "Search", - // TODO New key - Add a translation "search.breadcrumbs": "Sök", // "search.search-form.placeholder": "Search the repository ...", - // TODO New key - Add a translation "search.search-form.placeholder": "Sök i DSpace...", // "search.filters.applied.f.author": "Author", - // TODO New key - Add a translation "search.filters.applied.f.author": "Författare", // "search.filters.applied.f.dateIssued.max": "End date", - // TODO New key - Add a translation "search.filters.applied.f.dateIssued.max": "Slut", // "search.filters.applied.f.dateIssued.min": "Start date", - // TODO New key - Add a translation "search.filters.applied.f.dateIssued.min": "Start", // "search.filters.applied.f.dateSubmitted": "Date submitted", - // TODO New key - Add a translation "search.filters.applied.f.dateSubmitted": "Skapad", // "search.filters.applied.f.discoverable": "Non-discoverable", - // TODO New key - Add a translation "search.filters.applied.f.discoverable": "Ej sökbar", // "search.filters.applied.f.entityType": "Item Type", - // TODO New key - Add a translation "search.filters.applied.f.entityType": "Typ", // "search.filters.applied.f.has_content_in_original_bundle": "Has files", - // TODO New key - Add a translation "search.filters.applied.f.has_content_in_original_bundle": "Innehåller filer", // "search.filters.applied.f.itemtype": "Type", - // TODO New key - Add a translation "search.filters.applied.f.itemtype": "Typ", // "search.filters.applied.f.namedresourcetype": "Status", - // TODO New key - Add a translation "search.filters.applied.f.namedresourcetype": "Status", // "search.filters.applied.f.subject": "Subject", - // TODO New key - Add a translation "search.filters.applied.f.subject": "Ämne", // "search.filters.applied.f.submitter": "Submitter", - // TODO New key - Add a translation "search.filters.applied.f.submitter": "Skapad av", // "search.filters.applied.f.jobTitle": "Job Title", - // TODO New key - Add a translation "search.filters.applied.f.jobTitle": "Job Title", // "search.filters.applied.f.birthDate.max": "End birth date", - // TODO New key - Add a translation "search.filters.applied.f.birthDate.max": "Födelsedatum (till)", // "search.filters.applied.f.birthDate.min": "Start birth date", - // TODO New key - Add a translation "search.filters.applied.f.birthDate.min": "Födelsedatum (från)", // "search.filters.applied.f.withdrawn": "Withdrawn", - // TODO New key - Add a translation "search.filters.applied.f.withdrawn": "Återkallad", // "search.filters.filter.author.head": "Author", - // TODO New key - Add a translation "search.filters.filter.author.head": "Författare", // "search.filters.filter.author.placeholder": "Author name", - // TODO New key - Add a translation "search.filters.filter.author.placeholder": "Författare (namn)", // "search.filters.filter.author.label": "Search author name", - // TODO New key - Add a translation "search.filters.filter.author.label": "Sök författare", // "search.filters.filter.birthDate.head": "Birth Date", - // TODO New key - Add a translation "search.filters.filter.birthDate.head": "Födelsedatum", // "search.filters.filter.birthDate.placeholder": "Birth Date", - // TODO New key - Add a translation "search.filters.filter.birthDate.placeholder": "Födelsedatum", // "search.filters.filter.birthDate.label": "Search birth date", - // TODO New key - Add a translation "search.filters.filter.birthDate.label": "Sök födelsedatum", // "search.filters.filter.collapse": "Collapse filter", - // TODO New key - Add a translation "search.filters.filter.collapse": "Fäll ihop filter", // "search.filters.filter.creativeDatePublished.head": "Date Published", - // TODO New key - Add a translation "search.filters.filter.creativeDatePublished.head": "Publicerad", // "search.filters.filter.creativeDatePublished.placeholder": "Date Published", - // TODO New key - Add a translation "search.filters.filter.creativeDatePublished.placeholder": "Publicerad", // "search.filters.filter.creativeDatePublished.label": "Search date published", - // TODO New key - Add a translation "search.filters.filter.creativeDatePublished.label": "Sök på publiceringsdatum", // "search.filters.filter.creativeWorkEditor.head": "Editor", - // TODO New key - Add a translation "search.filters.filter.creativeWorkEditor.head": "Redaktör", // "search.filters.filter.creativeWorkEditor.placeholder": "Editor", - // TODO New key - Add a translation "search.filters.filter.creativeWorkEditor.placeholder": "Redaktör", // "search.filters.filter.creativeWorkEditor.label": "Search editor", - // TODO New key - Add a translation "search.filters.filter.creativeWorkEditor.label": "Sök redaktör", // "search.filters.filter.creativeWorkKeywords.head": "Subject", - // TODO New key - Add a translation "search.filters.filter.creativeWorkKeywords.head": "Ämne", // "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", - // TODO New key - Add a translation "search.filters.filter.creativeWorkKeywords.placeholder": "Ämne", // "search.filters.filter.creativeWorkKeywords.label": "Search subject", - // TODO New key - Add a translation "search.filters.filter.creativeWorkKeywords.label": "Sök ämne", // "search.filters.filter.creativeWorkPublisher.head": "Publisher", - // TODO New key - Add a translation "search.filters.filter.creativeWorkPublisher.head": "Utgivare", // "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", - // TODO New key - Add a translation "search.filters.filter.creativeWorkPublisher.placeholder": "Utgivare", // "search.filters.filter.creativeWorkPublisher.label": "Search publisher", - // TODO New key - Add a translation "search.filters.filter.creativeWorkPublisher.label": "Sök utgivare", // "search.filters.filter.dateIssued.head": "Date", - // TODO New key - Add a translation "search.filters.filter.dateIssued.head": "Datum", // "search.filters.filter.dateIssued.max.placeholder": "Maximum Date", - // TODO New key - Add a translation "search.filters.filter.dateIssued.max.placeholder": "Datum (max)", // "search.filters.filter.dateIssued.max.label": "End", - // TODO New key - Add a translation "search.filters.filter.dateIssued.max.label": "Till", // "search.filters.filter.dateIssued.min.placeholder": "Minimum Date", - // TODO New key - Add a translation "search.filters.filter.dateIssued.min.placeholder": "Datum (min)", // "search.filters.filter.dateIssued.min.label": "Start", - // TODO New key - Add a translation "search.filters.filter.dateIssued.min.label": "Från", // "search.filters.filter.dateSubmitted.head": "Date submitted", - // TODO New key - Add a translation "search.filters.filter.dateSubmitted.head": "Skapad", // "search.filters.filter.dateSubmitted.placeholder": "Date submitted", - // TODO New key - Add a translation "search.filters.filter.dateSubmitted.placeholder": "Skapad", // "search.filters.filter.dateSubmitted.label": "Search date submitted", - // TODO New key - Add a translation "search.filters.filter.dateSubmitted.label": "Sök skapad datum", // "search.filters.filter.discoverable.head": "Non-discoverable", - // TODO New key - Add a translation "search.filters.filter.discoverable.head": "Ej sökbar", // "search.filters.filter.withdrawn.head": "Withdrawn", - // TODO New key - Add a translation "search.filters.filter.withdrawn.head": "Återkallad", // "search.filters.filter.entityType.head": "Item Type", - // TODO New key - Add a translation "search.filters.filter.entityType.head": "Typ", // "search.filters.filter.entityType.placeholder": "Item Type", - // TODO New key - Add a translation "search.filters.filter.entityType.placeholder": "Typ", // "search.filters.filter.entityType.label": "Search item type", - // TODO New key - Add a translation "search.filters.filter.entityType.label": "Sök typ av post", // "search.filters.filter.expand": "Expand filter", - // TODO New key - Add a translation "search.filters.filter.expand": "Expandera filter", // "search.filters.filter.has_content_in_original_bundle.head": "Has files", - // TODO New key - Add a translation "search.filters.filter.has_content_in_original_bundle.head": "Innehåller filer", // "search.filters.filter.itemtype.head": "Type", - // TODO New key - Add a translation "search.filters.filter.itemtype.head": "Typ", // "search.filters.filter.itemtype.placeholder": "Type", - // TODO New key - Add a translation "search.filters.filter.itemtype.placeholder": "Typ", // "search.filters.filter.itemtype.label": "Search type", - // TODO New key - Add a translation "search.filters.filter.itemtype.label": "Sök typ", // "search.filters.filter.jobTitle.head": "Job Title", - // TODO New key - Add a translation "search.filters.filter.jobTitle.head": "Job Title", // "search.filters.filter.jobTitle.placeholder": "Job Title", - // TODO New key - Add a translation "search.filters.filter.jobTitle.placeholder": "Job Title", // "search.filters.filter.jobTitle.label": "Search job title", - // TODO New key - Add a translation "search.filters.filter.jobTitle.label": "Sök job title", // "search.filters.filter.knowsLanguage.head": "Known language", - // TODO New key - Add a translation "search.filters.filter.knowsLanguage.head": "Känt språk", // "search.filters.filter.knowsLanguage.placeholder": "Known language", - // TODO New key - Add a translation "search.filters.filter.knowsLanguage.placeholder": "Känt språk", // "search.filters.filter.knowsLanguage.label": "Search known language", - // TODO New key - Add a translation "search.filters.filter.knowsLanguage.label": "Sök språk", // "search.filters.filter.namedresourcetype.head": "Status", - // TODO New key - Add a translation "search.filters.filter.namedresourcetype.head": "Status", // "search.filters.filter.namedresourcetype.placeholder": "Status", - // TODO New key - Add a translation "search.filters.filter.namedresourcetype.placeholder": "Status", // "search.filters.filter.namedresourcetype.label": "Search status", - // TODO New key - Add a translation "search.filters.filter.namedresourcetype.label": "Sök status", // "search.filters.filter.objectpeople.head": "People", - // TODO New key - Add a translation "search.filters.filter.objectpeople.head": "Personer", // "search.filters.filter.objectpeople.placeholder": "People", - // TODO New key - Add a translation "search.filters.filter.objectpeople.placeholder": "Personer", // "search.filters.filter.objectpeople.label": "Search people", - // TODO New key - Add a translation "search.filters.filter.objectpeople.label": "Sök personer", // "search.filters.filter.organizationAddressCountry.head": "Country", - // TODO New key - Add a translation "search.filters.filter.organizationAddressCountry.head": "Land", // "search.filters.filter.organizationAddressCountry.placeholder": "Country", - // TODO New key - Add a translation "search.filters.filter.organizationAddressCountry.placeholder": "Land", // "search.filters.filter.organizationAddressCountry.label": "Search country", - // TODO New key - Add a translation "search.filters.filter.organizationAddressCountry.label": "Sök land", // "search.filters.filter.organizationAddressLocality.head": "City", - // TODO New key - Add a translation "search.filters.filter.organizationAddressLocality.head": "Stad", // "search.filters.filter.organizationAddressLocality.placeholder": "City", - // TODO New key - Add a translation "search.filters.filter.organizationAddressLocality.placeholder": "Stad", // "search.filters.filter.organizationAddressLocality.label": "Search city", - // TODO New key - Add a translation "search.filters.filter.organizationAddressLocality.label": "Sök stad", // "search.filters.filter.organizationFoundingDate.head": "Date Founded", - // TODO New key - Add a translation "search.filters.filter.organizationFoundingDate.head": "Grundad", // "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", - // TODO New key - Add a translation "search.filters.filter.organizationFoundingDate.placeholder": "Grundad", // "search.filters.filter.organizationFoundingDate.label": "Search date founded", - // TODO New key - Add a translation "search.filters.filter.organizationFoundingDate.label": "Sök grundad (datum)", // "search.filters.filter.scope.head": "Scope", @@ -6476,82 +5041,63 @@ "search.filters.filter.scope.label": "Search scope filter", // "search.filters.filter.show-less": "Collapse", - // TODO New key - Add a translation "search.filters.filter.show-less": "Visa färre", // "search.filters.filter.show-more": "Show more", - // TODO New key - Add a translation "search.filters.filter.show-more": "Visa fler", // "search.filters.filter.subject.head": "Subject", - // TODO New key - Add a translation "search.filters.filter.subject.head": "Ämne", // "search.filters.filter.subject.placeholder": "Subject", - // TODO New key - Add a translation "search.filters.filter.subject.placeholder": "Ämne", // "search.filters.filter.subject.label": "Search subject", - // TODO New key - Add a translation "search.filters.filter.subject.label": "Sök ämne", // "search.filters.filter.submitter.head": "Submitter", - // TODO New key - Add a translation "search.filters.filter.submitter.head": "Skapad av", // "search.filters.filter.submitter.placeholder": "Submitter", - // TODO New key - Add a translation "search.filters.filter.submitter.placeholder": "Skapad av", // "search.filters.filter.submitter.label": "Search submitter", - // TODO New key - Add a translation "search.filters.filter.submitter.label": "Sök skapad av", // "search.filters.entityType.JournalIssue": "Journal Issue", - // TODO New key - Add a translation "search.filters.entityType.JournalIssue": "Utgåva", // "search.filters.entityType.JournalVolume": "Journal Volume", - // TODO New key - Add a translation "search.filters.entityType.JournalVolume": "Volym", // "search.filters.entityType.OrgUnit": "Organizational Unit", - // TODO New key - Add a translation "search.filters.entityType.OrgUnit": "Organisatorisk enhet", // "search.filters.has_content_in_original_bundle.true": "Yes", - // TODO New key - Add a translation "search.filters.has_content_in_original_bundle.true": "Ja", // "search.filters.has_content_in_original_bundle.false": "No", - // TODO New key - Add a translation "search.filters.has_content_in_original_bundle.false": "Nej", // "search.filters.discoverable.true": "No", - // TODO New key - Add a translation "search.filters.discoverable.true": "Nej", // "search.filters.discoverable.false": "Yes", - // TODO New key - Add a translation "search.filters.discoverable.false": "Ja", // "search.filters.withdrawn.true": "Yes", - // TODO New key - Add a translation "search.filters.withdrawn.true": "Ja", // "search.filters.withdrawn.false": "No", - // TODO New key - Add a translation "search.filters.withdrawn.false": "Nej", // "search.filters.head": "Filters", - // TODO New key - Add a translation - "search.filters.head": "Filtrera", + "search.filters.head": "Filter", // "search.filters.reset": "Reset filters", - // TODO New key - Add a translation "search.filters.reset": "Rensa filter", // "search.filters.search.submit": "Submit", @@ -6561,117 +5107,90 @@ // "search.form.search": "Search", - // TODO New key - Add a translation "search.form.search": "Sök", // "search.form.search_dspace": "All repository", - // TODO New key - Add a translation "search.form.search_dspace": "Hela arkivet", // "search.form.scope.all": "All of DSpace", - // TODO New key - Add a translation "search.form.scope.all": "Hela arkivet", // "search.results.head": "Search Results", - // TODO New key - Add a translation "search.results.head": "Sökresultat", // "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", - // TODO New key - Add a translation "search.results.no-results": "Sökningen resulterade inte i några träffar. Du kan testa att använda", // "search.results.no-results-link": "quotes around it", - // TODO New key - Add a translation "search.results.no-results-link": "citationstecken före och efter sökfrågan", // "search.results.empty": "Your search returned no results.", - // TODO New key - Add a translation "search.results.empty": "Sökningen resulterade inte i några träffar.", // "search.results.view-result": "View", - // TODO New key - Add a translation "search.results.view-result": "Visa", // "default.search.results.head": "Search Results", - // TODO New key - Add a translation "default.search.results.head": "Sökresultat", // "search.sidebar.close": "Back to results", - // TODO New key - Add a translation "search.sidebar.close": "Tillbaka till sökresultaten", // "search.sidebar.filters.title": "Filters", - // TODO New key - Add a translation - "search.sidebar.filters.title": "Filtrera", + "search.sidebar.filters.title": "Filter", // "search.sidebar.open": "Search Tools", - // TODO New key - Add a translation "search.sidebar.open": "Sökverktyg", // "search.sidebar.results": "results", - // TODO New key - Add a translation "search.sidebar.results": "resultat", // "search.sidebar.settings.rpp": "Results per page", - // TODO New key - Add a translation "search.sidebar.settings.rpp": "Träffar per sida", // "search.sidebar.settings.sort-by": "Sort By", - // TODO New key - Add a translation "search.sidebar.settings.sort-by": "Sortera efter", // "search.sidebar.settings.title": "Settings", - // TODO New key - Add a translation "search.sidebar.settings.title": "Inställningar", // "search.view-switch.show-detail": "Show detail", - // TODO New key - Add a translation "search.view-switch.show-detail": "Visa detaljer", // "search.view-switch.show-grid": "Show as grid", - // TODO New key - Add a translation "search.view-switch.show-grid": "Visa som rutmönster", // "search.view-switch.show-list": "Show as list", - // TODO New key - Add a translation "search.view-switch.show-list": "Visa som lista", // "sorting.ASC": "Ascending", - // TODO New key - Add a translation "sorting.ASC": "Stigande", // "sorting.DESC": "Descending", - // TODO New key - Add a translation "sorting.DESC": "Fallande", // "sorting.dc.title.ASC": "Title Ascending", - // TODO New key - Add a translation "sorting.dc.title.ASC": "Titel", // "sorting.dc.title.DESC": "Title Descending", - // TODO New key - Add a translation "sorting.dc.title.DESC": "Titel", // "sorting.score.ASC": "Least Relevant", - // TODO New key - Add a translation "sorting.score.ASC": "Minst relevant", // "sorting.score.DESC": "Most Relevant", - // TODO New key - Add a translation "sorting.score.DESC": "Mest relevant", // "sorting.dc.date.issued.ASC": "Date Issued Ascending", - // TODO New key - Add a translation "sorting.dc.date.issued.ASC": "Datum (stigande)", // "sorting.dc.date.issued.DESC": "Date Issued Descending", - // TODO New key - Add a translation "sorting.dc.date.issued.DESC": "Datum (fallande)", // "sorting.dc.date.accessioned.ASC": "Accessioned Date Ascending", @@ -6683,187 +5202,142 @@ "sorting.dc.date.accessioned.DESC": "Accessioned Date Descending", // "sorting.lastModified.ASC": "Last modified Ascending", - // TODO New key - Add a translation "sorting.lastModified.ASC": "Senast ändrad (stigande)", // "sorting.lastModified.DESC": "Last modified Descending", - // TODO New key - Add a translation "sorting.lastModified.DESC": "Senast ändrad (fallande)", // "statistics.title": "Statistics", - // TODO New key - Add a translation "statistics.title": "Statistik", // "statistics.header": "Statistics for {{ scope }}", - // TODO New key - Add a translation "statistics.header": "Statistik för {{ scope }}", // "statistics.breadcrumbs": "Statistics", - // TODO New key - Add a translation "statistics.breadcrumbs": "Statistik", // "statistics.page.no-data": "No data available", - // TODO New key - Add a translation "statistics.page.no-data": "Data saknas", // "statistics.table.no-data": "No data available", - // TODO New key - Add a translation "statistics.table.no-data": "Data saknas", // "statistics.table.title.TotalVisits": "Totalt antal besök", - // TODO New key - Add a translation "statistics.table.title.TotalVisits": "Totalt antal besök", // "statistics.table.title.TotalVisitsPerMonth": "Totalt antal besök per month", - // TODO New key - Add a translation "statistics.table.title.TotalVisitsPerMonth": "Totalt antal besök per månad", // "statistics.table.title.TotalDownloads": "File Visits", - // TODO New key - Add a translation "statistics.table.title.TotalDownloads": "Nedladdningar", // "statistics.table.title.TopCountries": "Top country views", - // TODO New key - Add a translation "statistics.table.title.TopCountries": "Visningar per land (topp)", // "statistics.table.title.TopCities": "Top city views", - // TODO New key - Add a translation "statistics.table.title.TopCities": "Visningar per stad (topp)", // "statistics.table.header.views": "Views", - // TODO New key - Add a translation "statistics.table.header.views": "Visningar", // "submission.edit.breadcrumbs": "Edit Submission", - // TODO New key - Add a translation "submission.edit.breadcrumbs": "Redigera bidrag", // "submission.edit.title": "Edit Submission", - // TODO New key - Add a translation "submission.edit.title": "Redigera bidrag", // "submission.general.cancel": "Cancel", - // TODO New key - Add a translation "submission.general.cancel": "Avbryt", // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", - // TODO New key - Add a translation "submission.general.cannot_submit": "Du har inte behörighet att ladda upp nya bidrag.", // "submission.general.deposit": "Deposit", - // TODO New key - Add a translation "submission.general.deposit": "Spara och publicera", // "submission.general.discard.confirm.cancel": "Cancel", - // TODO New key - Add a translation "submission.general.discard.confirm.cancel": "Avbryt", // "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?", - // TODO New key - Add a translation "submission.general.discard.confirm.info": "Är du säker? Denna åtgärd kan inte ångras.", // "submission.general.discard.confirm.submit": "Yes, I'm sure", - // TODO New key - Add a translation "submission.general.discard.confirm.submit": "Ja", // "submission.general.discard.confirm.title": "Discard submission", - // TODO New key - Add a translation "submission.general.discard.confirm.title": "Återkalla bidrag", // "submission.general.discard.submit": "Discard", - // TODO New key - Add a translation "submission.general.discard.submit": "Återkalla", // "submission.general.info.saved": "Saved", - // TODO New key - Add a translation "submission.general.info.saved": "Sparat", // "submission.general.info.pending-changes": "Unsaved changes", - // TODO New key - Add a translation "submission.general.info.pending-changes": "Ändringar som inte har sparats", // "submission.general.save": "Save", - // TODO New key - Add a translation "submission.general.save": "Spara", // "submission.general.save-later": "Save for later", - // TODO New key - Add a translation "submission.general.save-later": "Spara till senare", // "submission.import-external.page.title": "Import metadata from an external source", - // TODO New key - Add a translation "submission.import-external.page.title": "Importera metadata från extern källa", // "submission.import-external.title": "Import metadata from an external source", - // TODO New key - Add a translation "submission.import-external.title": "Importera metadata från extern källa", // "submission.import-external.title.Journal": "Import a journal from an external source", - // TODO New key - Add a translation "submission.import-external.title.Journal": "Importera tidskrift från extern källa", // "submission.import-external.title.JournalIssue": "Import a journal issue from an external source", - // TODO New key - Add a translation "submission.import-external.title.JournalIssue": "Importera tidskrift från extern källa", // "submission.import-external.title.JournalVolume": "Import a journal volume from an external source", - // TODO New key - Add a translation "submission.import-external.title.JournalVolume": "Importera tidskriftsvolym från extern källa", // "submission.import-external.title.OrgUnit": "Import a publisher from an external source", - // TODO New key - Add a translation "submission.import-external.title.OrgUnit": "Importera förlag från extern källa", // "submission.import-external.title.Person": "Import a person from an external source", - // TODO New key - Add a translation "submission.import-external.title.Person": "Importera person från extern källa", // "submission.import-external.title.Project": "Import a project from an external source", - // TODO New key - Add a translation "submission.import-external.title.Project": "Importera projekt från extern källa", // "submission.import-external.title.Publication": "Import a publication from an external source", - // TODO New key - Add a translation "submission.import-external.title.Publication": "Importera publikation från extern källa", // "submission.import-external.title.none": "Import metadata from an external source", - // TODO New key - Add a translation "submission.import-external.title.none": "Importera metadata från extern källa", // "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", - // TODO New key - Add a translation "submission.import-external.page.hint": "Ange en sökfråga för att hitta information på webben att importera.", // "submission.import-external.back-to-my-dspace": "Back to MyDSpace", - // TODO New key - Add a translation - "submission.import-external.back-to-my-dspace": "Tillbaka till MyDSpace", + "submission.import-external.back-to-my-dspace": "Tillbaka till Mitt DSpace", // "submission.import-external.search.placeholder": "Search the external source", - // TODO New key - Add a translation "submission.import-external.search.placeholder": "Sök i extern källa", // "submission.import-external.search.button": "Search", - // TODO New key - Add a translation "submission.import-external.search.button": "Sök", // "submission.import-external.search.button.hint": "Write some words to search", - // TODO New key - Add a translation "submission.import-external.search.button.hint": "Ange sökord", // "submission.import-external.search.source.hint": "Pick an external source", - // TODO New key - Add a translation "submission.import-external.search.source.hint": "Välj extern källa", // "submission.import-external.source.arxiv": "arXiv", - // TODO New key - Add a translation "submission.import-external.source.arxiv": "arXiv", // "submission.import-external.source.loading": "Loading ...", - // TODO New key - Add a translation "submission.import-external.source.loading": "Laddar ...", // "submission.import-external.source.sherpaJournal": "SHERPA Journals", @@ -6883,11 +5357,9 @@ "submission.import-external.source.openAIREFunding": "Funding OpenAIRE API", // "submission.import-external.source.orcid": "ORCID", - // TODO New key - Add a translation "submission.import-external.source.orcid": "ORCID", // "submission.import-external.source.pubmed": "Pubmed", - // TODO New key - Add a translation "submission.import-external.source.pubmed": "Pubmed", // "submission.import-external.source.lcname": "Library of Congress Names", @@ -6895,27 +5367,21 @@ "submission.import-external.source.lcname": "Library of Congress Names", // "submission.import-external.preview.title": "Item Preview", - // TODO New key - Add a translation "submission.import-external.preview.title": "Förandsgranska post", // "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", - // TODO New key - Add a translation "submission.import-external.preview.subtitle": "Informationen nedan har importats från en extern källa. Den kommer att vara ifylld när du påbörjar ett nytt bidrag.", // "submission.import-external.preview.button.import": "Start submission", - // TODO New key - Add a translation "submission.import-external.preview.button.import": "Påbörja bidrag", // "submission.import-external.preview.error.import.title": "Submission error", - // TODO New key - Add a translation "submission.import-external.preview.error.import.title": "Fel", // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", - // TODO New key - Add a translation "submission.import-external.preview.error.import.body": "Ett fel uppstod när externa data skulle importeras.", // "submission.sections.describe.relationship-lookup.close": "Close", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.close": "Stäng", // "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", @@ -6923,31 +5389,24 @@ "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Importera författare", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Importera tidskrift", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Importera tidskriftsexemplar", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Importera tidskriftsvolym", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Project", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Projekt", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "New Entity Added!", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "Ny information har lagts till!", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Project", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Projekt", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", @@ -6955,192 +5414,149 @@ "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Importera författare", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Lokal författare har lagts till", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Successfully imported and added external author to the selection", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Extern författare har lagts till", // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Authority", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Auktoritet", // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Import as a new local authority entry", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Importera som ny lokal auktoritet", // "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Avbryt", // "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Välj samling att importera till", // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Beståndsdelar", // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Import as a new local entity", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Importera som ny lokal beståndsdel", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importera från LC Name", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importera från ORCID", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importera från Sherpa Journal", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importera från Sherpa Publisher", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importera från PubMed", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importera från arXiv", // "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Importera", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Importera tidskrift", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Lokal tidskrift har lagts till", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Extern tidskrift har importerats och lagts till", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Extern tidskrift har importerats och lagts till", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Importera externt tidskriftsexemplar", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Lokal tidskrift har lagts till", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Externt tidskriftsexemplar har importerats och lagts till", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Import Remote Journal Volume", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Importera tidskriftsvolym", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Lokal tidskriftsvolym har lagts till", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Extern tidskriftsvolym har importerats och lagts till", // "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Välj lokal träff:", // "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Avmarkera alla", // "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Avmarkera sida", // "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.loading": "Laddar...", // "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Sökfråga", // "submission.sections.describe.relationship-lookup.search-tab.search": "Go", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.search": "Kör", // "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Search...", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Sök...", // "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.select-all": "Välj alla", // "submission.sections.describe.relationship-lookup.search-tab.select-page": "Select page", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.select-page": "Välj sida", // "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selected": "Har markerat {{ size }} poster", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Författare ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Lokal författare ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Lokala tidskrifter ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Lokala projekt ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Lokala publikationer ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Författare ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Lokala författare ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Locala organisatoriska enheter ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Lokala datapaket ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Lokala filer ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Lokala tidskrifter ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Lokala tidskriftsexemplar ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Lokala tidskriftsvolymer ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", @@ -7152,31 +5568,24 @@ "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Sherpa Publishers ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Search for Funding Agencies", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Sök finansiärer", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Sök finansiering", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Sök organisatoriska enheter", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", @@ -7184,11 +5593,9 @@ "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projects", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projekt", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Funder of the Project", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Finansiär", // "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", @@ -7196,647 +5603,496 @@ "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", // "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Project", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Projekt", // "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projects", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projekt", // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Funder of the Project", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Projektets finansiär", // "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Search...", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Sök...", // "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Aktuellt urval ({{ count }})", // "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", + // "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.JournalIssue": "Tidskriftsexemplar", // "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", + // "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.JournalVolume": "Tidskriftsvolymer", // "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Tidskrifter", // "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Författare", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Författare", // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Finansiär", + // "submission.sections.describe.relationship-lookup.title.Project": "Projects", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.Project": "Projekt", // "submission.sections.describe.relationship-lookup.title.Publication": "Publications", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.Publication": "Publikationer", // "submission.sections.describe.relationship-lookup.title.Person": "Författare", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.Person": "Författare", // "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organisatoriska enheter", // "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.DataPackage": "Datapaket", // "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.DataFile": "Filer", // "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.Funding Agency": "Finansiär", // "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Finansiering", // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Organisatorisk förälder", // "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Växla dropdown", // "submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.settings": "Inställningar", // "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Inget har valts.", // "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Författare", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Valdra författare", // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Valda tidskrifter", // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Valda tidskriftsvolymer", + // "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Valda projekt", // "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Valda publikationer", // "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Författare", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Valda författare", // "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Valda organisatoriska enheter", // "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Valda datapaket", // "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Selected Data Files", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Valda filer", // "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Valda tidskrifter", // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Valt exemnplar", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Valt exemplar", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Vald volym", // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Vald finansiär", // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Vald finansiering", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Valt exemplar ", // "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Vald organisatorisk enet", // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Sökresultat", // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Sökresultat", // "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Sökresultat", // "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Sökresultat", // "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Sökresultat", // "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Sökresultat", // "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Sökresultat", // "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Vill du spara \"{{ value }}\" som en namnvariation för denna person? Om inte så kan du fortfarande använda det i detta bidrag.", // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Spara en ny namnvariation", // "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Använd bara i detta bidrag", // "submission.sections.ccLicense.type": "License Type", - // TODO New key - Add a translation "submission.sections.ccLicense.type": "Typ av license", // "submission.sections.ccLicense.select": "Select a license type…", - // TODO New key - Add a translation "submission.sections.ccLicense.select": "Välj licenstyp…", // "submission.sections.ccLicense.change": "Change your license type…", - // TODO New key - Add a translation "submission.sections.ccLicense.change": "Ändra licenstyp…", // "submission.sections.ccLicense.none": "No licenses available", - // TODO New key - Add a translation "submission.sections.ccLicense.none": "Det finns inga licenser", // "submission.sections.ccLicense.option.select": "Select an option…", - // TODO New key - Add a translation "submission.sections.ccLicense.option.select": "Välj…", // "submission.sections.ccLicense.link": "You’ve selected the following license:", - // TODO New key - Add a translation "submission.sections.ccLicense.link": "Du har valt följande licens:", // "submission.sections.ccLicense.confirmation": "I grant the license above", - // TODO New key - Add a translation "submission.sections.ccLicense.confirmation": "Jag beviljar licensen ovan", // "submission.sections.general.add-more": "Add more", - // TODO New key - Add a translation "submission.sections.general.add-more": "Lägg till fler", // "submission.sections.general.collection": "Collection", - // TODO New key - Add a translation "submission.sections.general.collection": "Samling", // "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", - // TODO New key - Add a translation "submission.sections.general.deposit_error_notice": "Ett fel uppstod, försök igen senare.", // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", - // TODO New key - Add a translation "submission.sections.general.deposit_success_notice": "Bidraget har deponerats.", // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", - // TODO New key - Add a translation "submission.sections.general.discard_error_notice": "Ett fel har uppstått. Försök igen senare.", // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", - // TODO New key - Add a translation "submission.sections.general.discard_success_notice": "Bidraget har dragits tillbaka.", // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", - // TODO New key - Add a translation "submission.sections.general.metadata-extracted": "Nya metadata har extraherats och lagts till i {{sectionId}}.", // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", - // TODO New key - Add a translation "submission.sections.general.metadata-extracted-new-section": "Ny sektion {{sectionId}} har lagts till i bidraget.", // "submission.sections.general.no-collection": "No collection found", - // TODO New key - Add a translation "submission.sections.general.no-collection": "Ingen samling kunde hittas", // "submission.sections.general.no-sections": "No options available", - // TODO New key - Add a translation "submission.sections.general.no-sections": "Det finns inga alternativ att välja", // "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", - // TODO New key - Add a translation "submission.sections.general.save_error_notice": "Ett fel uppstod när posten skulle sparas. Försök igen senare.", // "submission.sections.general.save_success_notice": "Submission saved successfully.", - // TODO New key - Add a translation "submission.sections.general.save_success_notice": "Bidraget har sparats.", // "submission.sections.general.search-collection": "Search for a collection", - // TODO New key - Add a translation "submission.sections.general.search-collection": "Sök efter samling", // "submission.sections.general.sections_not_valid": "There are incomplete sections.", - // TODO New key - Add a translation "submission.sections.general.sections_not_valid": "Det saknas data i vissa delar.", // "submission.sections.submit.progressbar.accessCondition": "Item access conditions", - // TODO New key - Add a translation "submission.sections.submit.progressbar.accessCondition": "Villkor för åtkomst till post", // "submission.sections.submit.progressbar.CClicense": "Creative commons license", - // TODO New key - Add a translation "submission.sections.submit.progressbar.CClicense": "Creative commons licens", // "submission.sections.submit.progressbar.describe.recycle": "Recycle", - // TODO New key - Add a translation "submission.sections.submit.progressbar.describe.recycle": "Återanvänd", // "submission.sections.submit.progressbar.describe.stepcustom": "Describe", - // TODO New key - Add a translation "submission.sections.submit.progressbar.describe.stepcustom": "Beskriv", // "submission.sections.submit.progressbar.describe.stepone": "Describe", - // TODO New key - Add a translation "submission.sections.submit.progressbar.describe.stepone": "Beskriv", // "submission.sections.submit.progressbar.describe.steptwo": "Describe", - // TODO New key - Add a translation "submission.sections.submit.progressbar.describe.steptwo": "Beskriv", // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", - // TODO New key - Add a translation "submission.sections.submit.progressbar.detect-duplicate": "Potentiell dubblett", // "submission.sections.submit.progressbar.license": "Deposit license", - // TODO New key - Add a translation "submission.sections.submit.progressbar.license": "Licensvillkor", // "submission.sections.submit.progressbar.upload": "Upload files", - // TODO New key - Add a translation "submission.sections.submit.progressbar.upload": "Ladda upp filer", // "submission.sections.status.errors.title": "Errors", - // TODO New key - Add a translation "submission.sections.status.errors.title": "Fel", // "submission.sections.status.valid.title": "Valid", - // TODO New key - Add a translation "submission.sections.status.valid.title": "Giltig", // "submission.sections.status.warnings.title": "Warnings", - // TODO New key - Add a translation "submission.sections.status.warnings.title": "Varningar", // "submission.sections.status.errors.aria": "has errors", - // TODO New key - Add a translation - "submission.sections.status.errors.aria": "inneåller fel", + "submission.sections.status.errors.aria": "innehåller fel", // "submission.sections.status.valid.aria": "is valid", - // TODO New key - Add a translation "submission.sections.status.valid.aria": "är giltig", // "submission.sections.status.warnings.aria": "has warnings", - // TODO New key - Add a translation "submission.sections.status.warnings.aria": "ger varningar", // "submission.sections.toggle.open": "Open section", - // TODO New key - Add a translation "submission.sections.toggle.open": "Öppna sektion", // "submission.sections.toggle.close": "Close section", - // TODO New key - Add a translation "submission.sections.toggle.close": "Stäng sektion", // "submission.sections.toggle.aria.open": "Expand {{sectionHeader}} section", - // TODO New key - Add a translation "submission.sections.toggle.aria.open": "Expandera {{sectionHeader}} sektion", // "submission.sections.toggle.aria.close": "Collapse {{sectionHeader}} section", - // TODO New key - Add a translation "submission.sections.toggle.aria.close": "Fäll ihop {{sectionHeader}} sektion", // "submission.sections.upload.delete.confirm.cancel": "Cancel", - // TODO New key - Add a translation "submission.sections.upload.delete.confirm.cancel": "Avbryt", // "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?", - // TODO New key - Add a translation "submission.sections.upload.delete.confirm.info": "Är du säker? Detta kan inte ångras.", // "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", - // TODO New key - Add a translation "submission.sections.upload.delete.confirm.submit": "Ja", // "submission.sections.upload.delete.confirm.title": "Delete bitstream", - // TODO New key - Add a translation "submission.sections.upload.delete.confirm.title": "Radera fil", // "submission.sections.upload.delete.submit": "Delete", - // TODO New key - Add a translation "submission.sections.upload.delete.submit": "Radera", // "submission.sections.upload.download.title": "Download bitstream", - // TODO New key - Add a translation "submission.sections.upload.download.title": "Ladda ner fil", // "submission.sections.upload.drop-message": "Drop files to attach them to the item", - // TODO New key - Add a translation "submission.sections.upload.drop-message": "Släpp filer för att lägga till dem i posten", // "submission.sections.upload.edit.title": "Edit bitstream", - // TODO New key - Add a translation "submission.sections.upload.edit.title": "Redigera fil", // "submission.sections.upload.form.access-condition-label": "Access condition type", - // TODO New key - Add a translation "submission.sections.upload.form.access-condition-label": "Typ av villkor för åtkomst", // "submission.sections.upload.form.access-condition-hint": "Select an access condition to apply on the bitstream once the item is deposited", - // TODO New key - Add a translation "submission.sections.upload.form.access-condition-hint": "Välj typ av villkor för åtkomst till filen när posten har sparats", // "submission.sections.upload.form.date-required": "Date is required.", - // TODO New key - Add a translation "submission.sections.upload.form.date-required": "Datum krävs.", // "submission.sections.upload.form.date-required-from": "Grant access from date is required.", - // TODO New key - Add a translation "submission.sections.upload.form.date-required-from": "Du måste ange från vilket datum den skall vara tillgänglig.", // "submission.sections.upload.form.date-required-until": "Grant access until date is required.", - // TODO New key - Add a translation "submission.sections.upload.form.date-required-until": "Du måste ange till vilket datum den skall vara tillgänglig.", // "submission.sections.upload.form.from-label": "Grant access from", - // TODO New key - Add a translation "submission.sections.upload.form.from-label": "Tillåt åtkomst från", // "submission.sections.upload.form.from-hint": "Select the date from which the related access condition is applied", - // TODO New key - Add a translation "submission.sections.upload.form.from-hint": "Välj datum från när villkoren för åtkomst skall gälla", // "submission.sections.upload.form.from-placeholder": "From", - // TODO New key - Add a translation "submission.sections.upload.form.from-placeholder": "Från", // "submission.sections.upload.form.group-label": "Group", - // TODO New key - Add a translation "submission.sections.upload.form.group-label": "Grupp", // "submission.sections.upload.form.group-required": "Group is required.", - // TODO New key - Add a translation "submission.sections.upload.form.group-required": "Du måste välja en grupp.", // "submission.sections.upload.form.until-label": "Grant access until", - // TODO New key - Add a translation "submission.sections.upload.form.until-label": "Bevilja åtkomst till", // "submission.sections.upload.form.until-hint": "Select the date until which the related access condition is applied", - // TODO New key - Add a translation "submission.sections.upload.form.until-hint": "Välj datum till när villkoren för åtkomst skall gälla", // "submission.sections.upload.form.until-placeholder": "Until", - // TODO New key - Add a translation "submission.sections.upload.form.until-placeholder": "Till", // "submission.sections.upload.header.policy.default.nolist": "Uploaded files in the {{collectionName}} collection will be accessible according to the following group(s):", - // TODO New key - Add a translation "submission.sections.upload.header.policy.default.nolist": "Uppladdade filer i samlingen {{collectionName}} kommer att vara åtkomliga för följande grupp(er):", // "submission.sections.upload.header.policy.default.withlist": "Please note that uploaded files in the {{collectionName}} collection will be accessible, in addition to what is explicitly decided for the single file, with the following group(s):", - // TODO New key - Add a translation "submission.sections.upload.header.policy.default.withlist": "Notera att uppladdade filer i samlingen {{collectionName}} också kommer att vara åtkompliga för följande grupp(er):", // "submission.sections.upload.info": "Here you will find all the files currently in the item. You can update the file metadata and access conditions or upload additional files just dragging & dropping them everywhere in the page", - // TODO New key - Add a translation "submission.sections.upload.info": "Här visas samtliga filer som ingår i posten. Du kan uppdatera filernas metadata och villkor för åtkomst, samt ladda upp nya filer genom att dra och släppa dem här", // "submission.sections.upload.no-entry": "No", - // TODO New key - Add a translation "submission.sections.upload.no-entry": "Nej", // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", - // TODO New key - Add a translation "submission.sections.upload.no-file-uploaded": "Inga filer har laddats upp.", // "submission.sections.upload.save-metadata": "Save metadata", - // TODO New key - Add a translation "submission.sections.upload.save-metadata": "Spara metadata", // "submission.sections.upload.undo": "Cancel", - // TODO New key - Add a translation "submission.sections.upload.undo": "Avbryt", // "submission.sections.upload.upload-failed": "Upload failed", - // TODO New key - Add a translation "submission.sections.upload.upload-failed": "Uppladdningen misslyckades", // "submission.sections.upload.upload-successful": "Upload successful", - // TODO New key - Add a translation "submission.sections.upload.upload-successful": "Uppladdningen lyckades", // "submission.sections.accesses.form.discoverable-description": "When checked, this item will be discoverable in search/browse. When unchecked, the item will only be available via a direct link and will never appear in search/browse.", - // TODO New key - Add a translation "submission.sections.accesses.form.discoverable-description": "När denna är markerad kommer posten att vara sökbar och visas i listor. I annat fall så kommer den bara att kunna nås med en direktlänk.", // "submission.sections.accesses.form.discoverable-label": "Discoverable", - // TODO New key - Add a translation "submission.sections.accesses.form.discoverable-label": "Synlig och sökbar", // "submission.sections.accesses.form.access-condition-label": "Access condition type", - // TODO New key - Add a translation "submission.sections.accesses.form.access-condition-label": "Typ av villkor för åtkomst", // "submission.sections.accesses.form.access-condition-hint": "Select an access condition to apply on the item once it is deposited", - // TODO New key - Add a translation "submission.sections.accesses.form.access-condition-hint": "Välj typ av åtkomst som skall gälla när posten har deponerats", // "submission.sections.accesses.form.date-required": "Date is required.", - // TODO New key - Add a translation "submission.sections.accesses.form.date-required": "Du måste ange datum.", // "submission.sections.accesses.form.date-required-from": "Grant access from date is required.", - // TODO New key - Add a translation "submission.sections.accesses.form.date-required-from": "Du måste ange datum från när villkoren skall gälla.", // "submission.sections.accesses.form.date-required-until": "Grant access until date is required.", - // TODO New key - Add a translation "submission.sections.accesses.form.date-required-until": "Du måste ange datum till när villkoren skall gälla.", // "submission.sections.accesses.form.from-label": "Grant access from", - // TODO New key - Add a translation "submission.sections.accesses.form.from-label": "Bevilja åtkomst från", // "submission.sections.accesses.form.from-hint": "Select the date from which the related access condition is applied", - // TODO New key - Add a translation "submission.sections.accesses.form.from-hint": "Välj datum från när villkoren för åtkomst skall gälla", // "submission.sections.accesses.form.from-placeholder": "From", - // TODO New key - Add a translation "submission.sections.accesses.form.from-placeholder": "Från", // "submission.sections.accesses.form.group-label": "Group", - // TODO New key - Add a translation "submission.sections.accesses.form.group-label": "Grupp", // "submission.sections.accesses.form.group-required": "Group is required.", - // TODO New key - Add a translation "submission.sections.accesses.form.group-required": "Du måste välja grupp.", // "submission.sections.accesses.form.until-label": "Grant access until", - // TODO New key - Add a translation "submission.sections.accesses.form.until-label": "Bevilja åtkomst till", // "submission.sections.accesses.form.until-hint": "Select the date until which the related access condition is applied", - // TODO New key - Add a translation "submission.sections.accesses.form.until-hint": "Välj datum till när villkoren för åtkomst skall gälla", // "submission.sections.accesses.form.until-placeholder": "Until", - // TODO New key - Add a translation "submission.sections.accesses.form.until-placeholder": "Till", // "submission.submit.breadcrumbs": "New submission", - // TODO New key - Add a translation "submission.submit.breadcrumbs": "Nytt bidrag", // "submission.submit.title": "New submission", - // TODO New key - Add a translation "submission.submit.title": "Nytt bidrag", // "submission.workflow.generic.delete": "Delete", - // TODO New key - Add a translation "submission.workflow.generic.delete": "Radera", // "submission.workflow.generic.delete-help": "If you would to discard this item, select \"Delete\". You will then be asked to confirm it.", - // TODO New key - Add a translation "submission.workflow.generic.delete-help": "Välj \"Radera\" om du vill ta bort detta bidrag. Du kommer att få bekräfta detta.", // "submission.workflow.generic.edit": "Edit", - // TODO New key - Add a translation "submission.workflow.generic.edit": "Redigera", // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", - // TODO New key - Add a translation "submission.workflow.generic.edit-help": "Redigera postens metadata.", // "submission.workflow.generic.view": "View", - // TODO New key - Add a translation "submission.workflow.generic.view": "Visa", // "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", - // TODO New key - Add a translation "submission.workflow.generic.view-help": "Visa postens metadata.", // "submission.workflow.tasks.claimed.approve": "Approve", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.approve": "Godkänn", // "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.approve_help": "Om du har granskat posten och funnit att den kan ingå i samlingen, välj \"Godkänn\".", // "submission.workflow.tasks.claimed.edit": "Edit", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.edit": "Redigera", // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.edit_help": "Redigera postens metadata.", // "submission.workflow.tasks.claimed.reject.reason.info": "Please enter your reason for rejecting the submission into the box below, indicating whether the submitter may fix a problem and resubmit.", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.reject.reason.info": "Ange orsaken till att du inte godkänner bidraget i rutan nedan, samt om uppladdaren skall ändra något och skicka in igen.", // "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.reject.reason.placeholder": "Beskriv orsak", // "submission.workflow.tasks.claimed.reject.reason.submit": "Reject item", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.reject.reason.submit": "Godkänn inte bidrag", // "submission.workflow.tasks.claimed.reject.reason.title": "Reason", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.reject.reason.title": "Orsak", // "submission.workflow.tasks.claimed.reject.submit": "Reject", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.reject.submit": "Neka", // "submission.workflow.tasks.claimed.reject_help": "If you have reviewed the item and found it is not suitable for inclusion in the collection, select \"Reject\". You will then be asked to enter a message indicating why the item is unsuitable, and whether the submitter should change something and resubmit.", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.reject_help": "Om du har granskat posten och funnit att den inte uppfyller villkoren för att ingå i samlingen, välj \"Neka\". Du kommer du att få ange orsaken till detta, samt om uppladdaren skall ändra något och försöka igen.", // "submission.workflow.tasks.claimed.return": "Return to pool", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.return": "Returnera till uppladdningspoolen", // "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", - // TODO New key - Add a translation "submission.workflow.tasks.claimed.return_help": "Returnera till uppladdningspoolen så att den blir tillgänglig för andra användare.", // "submission.workflow.tasks.generic.error": "Error occurred during operation...", - // TODO New key - Add a translation "submission.workflow.tasks.generic.error": "Ett fel har uppstått...", // "submission.workflow.tasks.generic.processing": "Processing...", - // TODO New key - Add a translation "submission.workflow.tasks.generic.processing": "Bearbetar...", // "submission.workflow.tasks.generic.submitter": "Submitter", - // TODO New key - Add a translation "submission.workflow.tasks.generic.submitter": "Uppladdare", // "submission.workflow.tasks.generic.success": "Operation successful", - // TODO New key - Add a translation "submission.workflow.tasks.generic.success": "Operationen lyckades", @@ -7846,81 +6102,63 @@ "submission.workflow.tasks.pool.claim": "Claim", // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", - // TODO New key - Add a translation "submission.workflow.tasks.pool.claim_help": "Ta denna uppgift själv.", // "submission.workflow.tasks.pool.hide-detail": "Hide detail", - // TODO New key - Add a translation "submission.workflow.tasks.pool.hide-detail": "Göm detaljvy", // "submission.workflow.tasks.pool.show-detail": "Show detail", - // TODO New key - Add a translation "submission.workflow.tasks.pool.show-detail": "Visa detaljvy", // "thumbnail.default.alt": "Thumbnail Image", - // TODO New key - Add a translation "thumbnail.default.alt": "Bild (thumbnail)", // "thumbnail.default.placeholder": "No Thumbnail Available", - // TODO New key - Add a translation "thumbnail.default.placeholder": "Bild saknas", // "thumbnail.project.alt": "Project Logo", - // TODO New key - Add a translation "thumbnail.project.alt": "Projekt logotyp", // "thumbnail.project.placeholder": "Project Placeholder Image", - // TODO New key - Add a translation "thumbnail.project.placeholder": "Projekt bild (platshållare)", // "thumbnail.orgunit.alt": "OrgUnit Logo", - // TODO New key - Add a translation "thumbnail.orgunit.alt": "Organisationens logotyp", // "thumbnail.orgunit.placeholder": "OrgUnit Placeholder Image", - // TODO New key - Add a translation "thumbnail.orgunit.placeholder": "Organisationens bild (platshållare)", // "thumbnail.person.alt": "Profile Picture", - // TODO New key - Add a translation "thumbnail.person.alt": "Profilbild", // "thumbnail.person.placeholder": "No Profile Picture Available", - // TODO New key - Add a translation "thumbnail.person.placeholder": "Profilbild saknas", // "title": "DSpace", - // TODO New key - Add a translation "title": "DSpace", // "vocabulary-treeview.header": "Hierarchical tree view", - // TODO New key - Add a translation "vocabulary-treeview.header": "Hierarkisk trädvy", // "vocabulary-treeview.load-more": "Load more", - // TODO New key - Add a translation "vocabulary-treeview.load-more": "Ladda fler", // "vocabulary-treeview.search.form.reset": "Reset", - // TODO New key - Add a translation "vocabulary-treeview.search.form.reset": "Återställ", // "vocabulary-treeview.search.form.search": "Search", - // TODO New key - Add a translation "vocabulary-treeview.search.form.search": "Sök", // "vocabulary-treeview.search.no-result": "There were no items to show", - // TODO New key - Add a translation "vocabulary-treeview.search.no-result": "Det finns inga poster att visa", // "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", - // TODO New key - Add a translation "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", // "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", @@ -7930,149 +6168,114 @@ // "uploader.browse": "browse", - // TODO New key - Add a translation "uploader.browse": "sök efter filen på din dator", // "uploader.drag-message": "Drag & Drop your files here", - // TODO New key - Add a translation "uploader.drag-message": "Dra och släpp filerna här", // "uploader.delete.btn-title": "Delete", - // TODO New key - Add a translation "uploader.delete.btn-title": "Radera", // "uploader.or": ", or ", - // TODO New key - Add a translation "uploader.or": ", eller ", // "uploader.processing": "Processing", - // TODO New key - Add a translation "uploader.processing": "Bearbetar", // "uploader.queue-length": "Queue length", - // TODO New key - Add a translation "uploader.queue-length": "Kölängd", // "virtual-metadata.delete-item.info": "Select the types for which you want to save the virtual metadata as real metadata", - // TODO New key - Add a translation "virtual-metadata.delete-item.info": "Välj vilka typer ", // "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", - // TODO New key - Add a translation "virtual-metadata.delete-item.modal-head": "Denna relations virtuella metadata", // "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", - // TODO New key - Add a translation "virtual-metadata.delete-relationship.modal-head": "Välj poster som dessa metadata skall sparas för", // "workspace.search.results.head": "Your submissions", - // TODO New key - Add a translation "workspace.search.results.head": "Dina registreringar", // "workflowAdmin.search.results.head": "Administer Workflow", - // TODO New key - Add a translation "workflowAdmin.search.results.head": "Administrera arbetsflöde", // "workflow.search.results.head": "Workflow tasks", - // TODO New key - Add a translation "workflow.search.results.head": "Uppgifter", // "workflow-item.edit.breadcrumbs": "Edit workflowitem", - // TODO New key - Add a translation "workflow-item.edit.breadcrumbs": "Redigera post i arbetsflöde", // "workflow-item.edit.title": "Edit workflowitem", - // TODO New key - Add a translation "workflow-item.edit.title": "Redigera post i arbetsflöde", // "workflow-item.delete.notification.success.title": "Deleted", - // TODO New key - Add a translation "workflow-item.delete.notification.success.title": "Raderad", // "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", - // TODO New key - Add a translation "workflow-item.delete.notification.success.content": "Posten har raderats", // "workflow-item.delete.notification.error.title": "Something went wrong", - // TODO New key - Add a translation "workflow-item.delete.notification.error.title": "Något gick fel", // "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", - // TODO New key - Add a translation "workflow-item.delete.notification.error.content": "Posten kunde inte raderas", // "workflow-item.delete.title": "Delete workflow item", - // TODO New key - Add a translation "workflow-item.delete.title": "Radera post i arbetsflöde", // "workflow-item.delete.header": "Delete workflow item", - // TODO New key - Add a translation "workflow-item.delete.header": "Radera post i arbetsflöde", // "workflow-item.delete.button.cancel": "Cancel", - // TODO New key - Add a translation "workflow-item.delete.button.cancel": "Avbryt", // "workflow-item.delete.button.confirm": "Delete", - // TODO New key - Add a translation "workflow-item.delete.button.confirm": "Radera", // "workflow-item.send-back.notification.success.title": "Sent back to submitter", - // TODO New key - Add a translation "workflow-item.send-back.notification.success.title": "Skicka tillbaka till uppladdare", // "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", - // TODO New key - Add a translation "workflow-item.send-back.notification.success.content": "Posten i arbetsflödet har skickats tillbaka till uppladdaren", // "workflow-item.send-back.notification.error.title": "Something went wrong", - // TODO New key - Add a translation "workflow-item.send-back.notification.error.title": "Något gick fel", // "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", - // TODO New key - Add a translation "workflow-item.send-back.notification.error.content": "Posten i arbetsflödet kunde inte skickas tillbaka", // "workflow-item.send-back.title": "Send workflow item back to submitter", - // TODO New key - Add a translation "workflow-item.send-back.title": "Skicka tillbaka post i arbetsflödet till uppladdare", // "workflow-item.send-back.header": "Send workflow item back to submitter", - // TODO New key - Add a translation "workflow-item.send-back.header": "Skicka tillbaka post i arbetsflödet till uppladdare", // "workflow-item.send-back.button.cancel": "Cancel", - // TODO New key - Add a translation "workflow-item.send-back.button.cancel": "Avbryt", // "workflow-item.send-back.button.confirm": "Send back", - // TODO New key - Add a translation "workflow-item.send-back.button.confirm": "Skicka tillbaka", // "workflow-item.view.breadcrumbs": "Workflow View", - // TODO New key - Add a translation "workflow-item.view.breadcrumbs": "Arbetsflöde", // "idle-modal.header": "Session will expire soon", - // TODO New key - Add a translation "idle-modal.header": "Sessionen kommer att upphöra snart", // "idle-modal.info": "For security reasons, user sessions expire after {{ timeToExpire }} minutes of inactivity. Your session will expire soon. Would you like to extend it or log out?", - // TODO New key - Add a translation "idle-modal.info": "Sessionen kommer att upphöra efter {{ timeToExpire }} minuters inaktivitet. Vill du fortsätta eller logga ut?", // "idle-modal.log-out": "Log out", - // TODO New key - Add a translation "idle-modal.log-out": "Logga ut", // "idle-modal.extend-session": "Extend session" - // TODO New key - Add a translation "idle-modal.extend-session": "Fortsätt" } diff --git a/src/config/browse-by-config.interface.ts b/src/config/browse-by-config.interface.ts index c67d072731..e82edacfdd 100644 --- a/src/config/browse-by-config.interface.ts +++ b/src/config/browse-by-config.interface.ts @@ -23,10 +23,16 @@ export interface BrowseByConfig extends Config { */ defaultLowerLimit: number; + /** + * If true, thumbnail images for items will be added to BOTH search and browse result lists. + */ + showThumbnails: boolean; + /** * Number of entries in the viewport of a paginated browse-by list. * Rounded to the nearest size in the list of selectable sizes on the settings * menu. See pageSizeOptions in 'pagination-component-options.model.ts'. */ pageSize: number; + } diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index fde6d89102..c2c0b308e7 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -210,6 +210,8 @@ export class DefaultAppConfig implements AppConfig { fiveYearLimit: 30, // The absolute lowest year to display in the dropdown (only used when no lowest date can be found for all items) defaultLowerLimit: 1900, + // Whether to add item thumbnail images to BOTH browse and search result lists. + showThumbnails: true, // The number of entries in a paginated browse results list. // Rounded to the nearest size in the list of selectable sizes on the // settings menu. See pageSizeOptions in 'pagination-component-options.model.ts'. diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 8a3492c207..edbf33b79c 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -203,6 +203,8 @@ export const environment: BuildConfig = { fiveYearLimit: 30, // The absolute lowest year to display in the dropdown (only used when no lowest date can be found for all items) defaultLowerLimit: 1900, + // Whether to add item thumbnail images to BOTH browse and search result lists. + showThumbnails: true, // The number of entries in a paginated browse results list. // Rounded to the nearest size in the list of selectable sizes on the // settings menu. See pageSizeOptions in 'pagination-component-options.model.ts'. diff --git a/src/styles/_custom_variables.scss b/src/styles/_custom_variables.scss index 40180d8342..2000e007a0 100644 --- a/src/styles/_custom_variables.scss +++ b/src/styles/_custom_variables.scss @@ -45,7 +45,7 @@ --ds-edit-item-metadata-field-width: 190px; --ds-edit-item-language-field-width: 43px; - --ds-thumbnail-max-width: 175px; + --ds-thumbnail-max-width: 125px; --ds-thumbnail-placeholder-background: #{$gray-100}; --ds-thumbnail-placeholder-border: 1px solid #{$gray-300}; --ds-thumbnail-placeholder-color: #{lighten($gray-800, 7%)}; diff --git a/src/styles/_global-styles.scss b/src/styles/_global-styles.scss index 89d1d76e9a..486b09bc70 100644 --- a/src/styles/_global-styles.scss +++ b/src/styles/_global-styles.scss @@ -138,3 +138,51 @@ ds-dynamic-form-control-container.d-none { .btn-dark { background-color: var(--ds-admin-sidebar-bg); } +/* The font sizes used in "no thumbnail" placeholder */ +.thumb-font-0 { + .thumbnail-placeholder { + @media screen and (max-width: map-get($grid-breakpoints, lg)) { + font-size: 0.7rem; + padding: 0.2rem; + } + @media screen and (max-width: map-get($grid-breakpoints, sm)) { + font-size: 0.6rem; + padding: 0.1rem; + } + font-size: 0.4rem; + padding: 0.1rem; + } +} + +.hide-placeholder-text { + .thumbnail-placeholder { + color: transparent !important; + } +} + +.thumb-font-1 { + .thumbnail-placeholder { + @media screen and (max-width: map-get($grid-breakpoints, sm)) { + font-size: 0.9rem; + padding: 0.1rem; + } + @media screen and (max-width: 950px) { + font-size: 0.4rem; + padding: 0.1rem; + } + font-size: 0.6rem; + padding: 0.125rem; + } +} +.thumb-font-2 { + .thumbnail-placeholder { + font-size: 0.9rem; + padding: 0.125rem; + } +} +.thumb-font-3 { + .thumbnail-placeholder { + font-size: 1.25rem; + padding: 0.5rem; + } +}