From 39c2aa85eca5c94060bb4618c371a896f8b9e1de Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Mon, 18 Jul 2022 15:55:30 +0200 Subject: [PATCH 01/24] 93219: Move APP_INITIALIZER logic into InitService --- src/app/app.module.ts | 25 ++++------ src/app/init.service.ts | 63 +++++++++++++++++++++++++ src/modules/app/browser-app.module.ts | 38 +++------------ src/modules/app/browser-init.service.ts | 54 +++++++++++++++++++++ src/modules/app/server-app.module.ts | 26 ++-------- src/modules/app/server-init.service.ts | 46 ++++++++++++++++++ 6 files changed, 183 insertions(+), 69 deletions(-) create mode 100644 src/app/init.service.ts create mode 100644 src/modules/app/browser-init.service.ts create mode 100644 src/modules/app/server-init.service.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index a1db89b60d..e3f5c46adb 100755 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -7,13 +7,9 @@ import { BrowserModule } from '@angular/platform-browser'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { EffectsModule } from '@ngrx/effects'; import { RouterStateSerializer, StoreRouterConnectingModule } from '@ngrx/router-store'; -import { MetaReducer, Store, StoreModule, USER_PROVIDED_META_REDUCERS } from '@ngrx/store'; +import { MetaReducer, StoreModule, USER_PROVIDED_META_REDUCERS } from '@ngrx/store'; import { StoreDevtoolsModule } from '@ngrx/store-devtools'; -import { - DYNAMIC_ERROR_MESSAGES_MATCHER, - DYNAMIC_MATCHER_PROVIDERS, - DynamicErrorMessagesMatcher -} from '@ng-dynamic-forms/core'; +import { DYNAMIC_ERROR_MESSAGES_MATCHER, DYNAMIC_MATCHER_PROVIDERS, DynamicErrorMessagesMatcher } from '@ng-dynamic-forms/core'; import { TranslateModule } from '@ngx-translate/core'; import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to'; import { AppRoutingModule } from './app-routing.module'; @@ -21,7 +17,6 @@ import { AppComponent } from './app.component'; import { appEffects } from './app.effects'; import { appMetaReducers, debugMetaReducers } from './app.metareducers'; import { appReducers, AppState, storeModuleConfig } from './app.reducer'; -import { CheckAuthenticationTokenAction } from './core/auth/auth.actions'; import { CoreModule } from './core/core.module'; import { ClientCookieService } from './core/services/client-cookie.service'; import { NavbarModule } from './navbar/navbar.module'; @@ -36,6 +31,7 @@ import { EagerThemesModule } from '../themes/eager-themes.module'; import { APP_CONFIG, AppConfig } from '../config/app-config.interface'; import { RootModule } from './root.module'; +import { InitService } from './init.service'; export function getConfig() { return environment; @@ -82,6 +78,12 @@ IMPORTS.push( ); const PROVIDERS = [ + { + provide: APP_INITIALIZER, + useFactory: (initService: InitService) => initService.init(), + deps: [ InitService ], + multi: true, + }, { provide: APP_CONFIG, useFactory: getConfig @@ -101,15 +103,6 @@ const PROVIDERS = [ useClass: DSpaceRouterStateSerializer }, ClientCookieService, - // Check the authentication token when the app initializes - { - provide: APP_INITIALIZER, - useFactory: (store: Store,) => { - return () => store.dispatch(new CheckAuthenticationTokenAction()); - }, - deps: [Store], - multi: true - }, // register AuthInterceptor as HttpInterceptor { provide: HTTP_INTERCEPTORS, diff --git a/src/app/init.service.ts b/src/app/init.service.ts new file mode 100644 index 0000000000..c5bd6dddb0 --- /dev/null +++ b/src/app/init.service.ts @@ -0,0 +1,63 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +import { Store } from '@ngrx/store'; +import { AppState } from './app.reducer'; +import { CheckAuthenticationTokenAction } from './core/auth/auth.actions'; +import { CorrelationIdService } from './correlation-id/correlation-id.service'; +import { DSpaceTransferState } from '../modules/transfer-state/dspace-transfer-state.service'; + +/** + * Performs the initialization of the app. + * + * Should have distinct extensions for server & browser for the specifics. + * Should be provided in AppModule as follows + * ``` + * { + * provide: APP_INITIALIZER + * useFactory: (initService: InitService) => initService.init(), + * deps: [ InitService ], + * multi: true, + * } + * ``` + * + * In order to be injected in the common APP_INITIALIZER, + * concrete subclasses should be provided in their respective app modules as + * ``` + * { provide: InitService, useClass: SpecificInitService } + * ``` + */ +export abstract class InitService { + protected constructor( + protected store: Store, + protected correlationIdService: CorrelationIdService, + protected dspaceTransferState: DSpaceTransferState, + ) { + } + + /** + * Main initialization method, to be used as the APP_INITIALIZER factory. + * + * Note that the body of this method and the callback it returns are called + * at different times. + * This is important to take into account when other providers depend on the + * initialization logic (e.g. APP_BASE_HREF) + */ + abstract init(): () => Promise; + + protected checkAuthenticationToken(): void { + this.store.dispatch(new CheckAuthenticationTokenAction()); + } + + protected initCorrelationId(): void { + this.correlationIdService.initCorrelationId(); + } + + protected async transferAppState(): Promise { + return this.dspaceTransferState.transfer(); + } +} diff --git a/src/modules/app/browser-app.module.ts b/src/modules/app/browser-app.module.ts index 20c68898ae..e50018b51a 100644 --- a/src/modules/app/browser-app.module.ts +++ b/src/modules/app/browser-app.module.ts @@ -1,5 +1,5 @@ import { HttpClient, HttpClientModule } from '@angular/common/http'; -import { APP_INITIALIZER, NgModule } from '@angular/core'; +import { NgModule } from '@angular/core'; import { BrowserModule, makeStateKey, TransferState } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { REQUEST } from '@nguniversal/express-engine/tokens'; @@ -13,7 +13,6 @@ import { AppComponent } from '../../app/app.component'; import { AppModule } from '../../app/app.module'; import { DSpaceBrowserTransferStateModule } from '../transfer-state/dspace-browser-transfer-state.module'; -import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service'; import { ClientCookieService } from '../../app/core/services/client-cookie.service'; import { CookieService } from '../../app/core/services/cookie.service'; import { AuthService } from '../../app/core/auth/auth.service'; @@ -23,21 +22,13 @@ import { StatisticsModule } from '../../app/statistics/statistics.module'; import { BrowserKlaroService } from '../../app/shared/cookies/browser-klaro.service'; import { KlaroService } from '../../app/shared/cookies/klaro.service'; import { HardRedirectService } from '../../app/core/services/hard-redirect.service'; -import { - BrowserHardRedirectService, - locationProvider, - LocationToken -} from '../../app/core/services/browser-hard-redirect.service'; +import { BrowserHardRedirectService, locationProvider, LocationToken } from '../../app/core/services/browser-hard-redirect.service'; import { LocaleService } from '../../app/core/locale/locale.service'; import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.service'; import { AuthRequestService } from '../../app/core/auth/auth-request.service'; import { BrowserAuthRequestService } from '../../app/core/auth/browser-auth-request.service'; -import { AppConfig, APP_CONFIG_STATE } from '../../config/app-config.interface'; -import { DefaultAppConfig } from '../../config/default-app-config'; -import { extendEnvironmentWithAppConfig } from '../../config/config.util'; -import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; - -import { environment } from '../../environments/environment'; +import { InitService } from 'src/app/init.service'; +import { BrowserInitService } from './browser-init.service'; export const REQ_KEY = makeStateKey('req'); @@ -73,25 +64,8 @@ export function getRequest(transferState: TransferState): any { ], providers: [ { - provide: APP_INITIALIZER, - useFactory: ( - transferState: TransferState, - dspaceTransferState: DSpaceTransferState, - correlationIdService: CorrelationIdService - ) => { - if (transferState.hasKey(APP_CONFIG_STATE)) { - const appConfig = transferState.get(APP_CONFIG_STATE, new DefaultAppConfig()); - // extend environment with app config for browser - extendEnvironmentWithAppConfig(environment, appConfig); - } - return () => - dspaceTransferState.transfer().then((b: boolean) => { - correlationIdService.initCorrelationId(); - return b; - }); - }, - deps: [TransferState, DSpaceTransferState, CorrelationIdService], - multi: true + provide: InitService, + useClass: BrowserInitService, }, { provide: REQUEST, diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts new file mode 100644 index 0000000000..1b050af82a --- /dev/null +++ b/src/modules/app/browser-init.service.ts @@ -0,0 +1,54 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +import { InitService } from '../../app/init.service'; +import { Store } from '@ngrx/store'; +import { AppState } from '../../app/app.reducer'; +import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service'; +import { TransferState } from '@angular/platform-browser'; +import { APP_CONFIG_STATE, AppConfig } from '../../config/app-config.interface'; +import { DefaultAppConfig } from '../../config/default-app-config'; +import { extendEnvironmentWithAppConfig } from '../../config/config.util'; +import { environment } from '../../environments/environment'; +import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; +import { Injectable } from '@angular/core'; + +/** + * Performs client-side initialization. + */ +@Injectable() +export class BrowserInitService extends InitService { + constructor( + protected store: Store, + protected correlationIdService: CorrelationIdService, + protected transferState: TransferState, + protected dspaceTransferState: DSpaceTransferState, + ) { + super(store, correlationIdService, dspaceTransferState); + } + + public init(): () => Promise { + // this method must be called before the callback because APP_BASE_HREF depends on it + this.loadAppConfigFromSSR(); + + return async () => { + await this.transferAppState(); + this.checkAuthenticationToken(); + this.initCorrelationId(); + + return true; + }; + } + + private loadAppConfigFromSSR(): void { + if (this.transferState.hasKey(APP_CONFIG_STATE)) { + const appConfig = this.transferState.get(APP_CONFIG_STATE, new DefaultAppConfig()); + // extend environment with app config for browser + extendEnvironmentWithAppConfig(environment, appConfig); + } + } +} diff --git a/src/modules/app/server-app.module.ts b/src/modules/app/server-app.module.ts index 4f8569962c..f61712ccb0 100644 --- a/src/modules/app/server-app.module.ts +++ b/src/modules/app/server-app.module.ts @@ -1,9 +1,8 @@ import { HTTP_INTERCEPTORS } from '@angular/common/http'; -import { APP_INITIALIZER, NgModule } from '@angular/core'; +import { NgModule } from '@angular/core'; import { BrowserModule, TransferState } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ServerModule } from '@angular/platform-server'; -import { RouterModule } from '@angular/router'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; @@ -14,7 +13,6 @@ import { AppComponent } from '../../app/app.component'; import { AppModule } from '../../app/app.module'; import { DSpaceServerTransferStateModule } from '../transfer-state/dspace-server-transfer-state.module'; -import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service'; import { TranslateServerLoader } from '../../ngx-translate-loaders/translate-server.loader'; import { CookieService } from '../../app/core/services/cookie.service'; import { ServerCookieService } from '../../app/core/services/server-cookie.service'; @@ -32,10 +30,8 @@ import { ServerHardRedirectService } from '../../app/core/services/server-hard-r import { Angulartics2Mock } from '../../app/shared/mocks/angulartics2.service.mock'; import { AuthRequestService } from '../../app/core/auth/auth-request.service'; import { ServerAuthRequestService } from '../../app/core/auth/server-auth-request.service'; -import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; -import { AppConfig, APP_CONFIG_STATE } from '../../config/app-config.interface'; - -import { environment } from '../../environments/environment'; +import { InitService } from '../../app/init.service'; +import { ServerInitService } from './server-init.service'; export function createTranslateLoader(transferState: TransferState) { return new TranslateServerLoader(transferState, 'dist/server/assets/i18n/', '.json5'); @@ -60,21 +56,9 @@ export function createTranslateLoader(transferState: TransferState) { AppModule ], providers: [ - // Initialize app config and extend environment { - provide: APP_INITIALIZER, - useFactory: ( - transferState: TransferState, - dspaceTransferState: DSpaceTransferState, - correlationIdService: CorrelationIdService, - ) => { - transferState.set(APP_CONFIG_STATE, environment as AppConfig); - dspaceTransferState.transfer(); - correlationIdService.initCorrelationId(); - return () => true; - }, - deps: [TransferState, DSpaceTransferState, CorrelationIdService], - multi: true + provide: InitService, + useClass: ServerInitService, }, { provide: Angulartics2, diff --git a/src/modules/app/server-init.service.ts b/src/modules/app/server-init.service.ts new file mode 100644 index 0000000000..d5814f10f3 --- /dev/null +++ b/src/modules/app/server-init.service.ts @@ -0,0 +1,46 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +import { InitService } from '../../app/init.service'; +import { Store } from '@ngrx/store'; +import { AppState } from '../../app/app.reducer'; +import { TransferState } from '@angular/platform-browser'; +import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service'; +import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; +import { APP_CONFIG_STATE, AppConfig } from '../../config/app-config.interface'; +import { environment } from '../../environments/environment'; +import { Injectable } from '@angular/core'; + +/** + * Performs server-side initialization. + */ +@Injectable() +export class ServerInitService extends InitService { + constructor( + protected store: Store, + protected correlationIdService: CorrelationIdService, + protected transferState: TransferState, + protected dspaceTransferState: DSpaceTransferState, + ) { + super(store, correlationIdService, dspaceTransferState); + } + + public init(): () => Promise { + return async () => { + this.checkAuthenticationToken(); + this.saveAppConfigForCSR(); + this.transferAppState(); // todo: SSR breaks if we await this (why?) + this.initCorrelationId(); + + return true; + }; + } + + private saveAppConfigForCSR(): void { + this.transferState.set(APP_CONFIG_STATE, environment as AppConfig); + } +} From 372cddfd5e65387fe6714108e9711a6a6467d90e Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Tue, 19 Jul 2022 17:58:19 +0200 Subject: [PATCH 02/24] 93219: Support Router in InitService For Router to work properly, APP_BASE_HREF must be resolved _before_ the APP_INITIALIZER factory is called (otherwise Angular will attempt to initialize APP_BASE_HREF too soon) To fix this we add a pre-initialization hook to APP_CONFIG so BrowserInitService can resolve it before APP_INITIALIZER --- src/app/app.module.ts | 18 +---- src/app/init.service.spec.ts | 83 +++++++++++++++++++++++ src/app/init.service.ts | 87 ++++++++++++++++++------- src/config/app-config.interface.ts | 4 ++ src/modules/app/browser-app.module.ts | 7 +- src/modules/app/browser-init.service.ts | 21 +++--- src/modules/app/server-app.module.ts | 6 +- src/modules/app/server-init.service.ts | 2 +- 8 files changed, 164 insertions(+), 64 deletions(-) create mode 100644 src/app/init.service.spec.ts diff --git a/src/app/app.module.ts b/src/app/app.module.ts index e3f5c46adb..b3a5872722 100755 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,6 +1,6 @@ import { APP_BASE_HREF, CommonModule } from '@angular/common'; import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; -import { APP_INITIALIZER, NgModule } from '@angular/core'; +import { NgModule } from '@angular/core'; import { AbstractControl } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; @@ -28,14 +28,8 @@ import { LocaleInterceptor } from './core/locale/locale.interceptor'; import { XsrfInterceptor } from './core/xsrf/xsrf.interceptor'; import { LogInterceptor } from './core/log/log.interceptor'; import { EagerThemesModule } from '../themes/eager-themes.module'; - import { APP_CONFIG, AppConfig } from '../config/app-config.interface'; import { RootModule } from './root.module'; -import { InitService } from './init.service'; - -export function getConfig() { - return environment; -} export function getBase(appConfig: AppConfig) { return appConfig.ui.nameSpace; @@ -78,16 +72,6 @@ IMPORTS.push( ); const PROVIDERS = [ - { - provide: APP_INITIALIZER, - useFactory: (initService: InitService) => initService.init(), - deps: [ InitService ], - multi: true, - }, - { - provide: APP_CONFIG, - useFactory: getConfig - }, { provide: APP_BASE_HREF, useFactory: getBase, diff --git a/src/app/init.service.spec.ts b/src/app/init.service.spec.ts new file mode 100644 index 0000000000..7bbd50e4b7 --- /dev/null +++ b/src/app/init.service.spec.ts @@ -0,0 +1,83 @@ +import { InitService } from './init.service'; +import { APP_CONFIG } from 'src/config/app-config.interface'; +import { APP_INITIALIZER } from '@angular/core'; +import objectContaining = jasmine.objectContaining; +import createSpyObj = jasmine.createSpyObj; +import SpyObj = jasmine.SpyObj; + +let spy: SpyObj; + +export class ConcreteInitServiceMock extends InitService { + protected static resolveAppConfig() { + spy.resolveAppConfig(); + } + + protected init(): () => Promise { + spy.init(); + return async () => true; + } +} + + +describe('InitService', () => { + describe('providers', () => { + beforeEach(() => { + spy = createSpyObj('ConcreteInitServiceMock', { + resolveAppConfig: null, + init: null, + }); + }); + + it('should throw error when called on abstract InitService', () => { + expect(() => InitService.providers()).toThrow(); + }); + + it('should correctly set up provider dependencies', () => { + const providers = ConcreteInitServiceMock.providers(); + + expect(providers).toContain(objectContaining({ + provide: InitService, + useClass: ConcreteInitServiceMock + })); + + expect(providers).toContain(objectContaining({ + provide: APP_CONFIG, + })); + + expect(providers).toContain(objectContaining({ + provide: APP_INITIALIZER, + deps: [ InitService ], + multi: true, + })); + }); + + it('should call resolveAppConfig() in APP_CONFIG factory', () => { + const factory = ( + ConcreteInitServiceMock.providers() + .find((p: any) => p.provide === APP_CONFIG) as any + ).useFactory; + + // this factory is called _before_ InitService is instantiated + factory(); + expect(spy.resolveAppConfig).toHaveBeenCalled(); + expect(spy.init).not.toHaveBeenCalled(); + }); + + it('should defer to init() in APP_INITIALIZER factory', () => { + const factory = ( + ConcreteInitServiceMock.providers() + .find((p: any) => p.provide === APP_INITIALIZER) as any + ).useFactory; + + // we don't care about the dependencies here + // @ts-ignore + const instance = new ConcreteInitServiceMock(null, null, null); + + // provider ensures that the right concrete instance is passed to the factory + factory(instance); + expect(spy.resolveAppConfig).not.toHaveBeenCalled(); + expect(spy.init).toHaveBeenCalled(); + }); + }); +}); + diff --git a/src/app/init.service.ts b/src/app/init.service.ts index c5bd6dddb0..d8ecf8d23a 100644 --- a/src/app/init.service.ts +++ b/src/app/init.service.ts @@ -6,30 +6,18 @@ * http://www.dspace.org/license/ */ import { Store } from '@ngrx/store'; -import { AppState } from './app.reducer'; import { CheckAuthenticationTokenAction } from './core/auth/auth.actions'; import { CorrelationIdService } from './correlation-id/correlation-id.service'; import { DSpaceTransferState } from '../modules/transfer-state/dspace-transfer-state.service'; +import { APP_INITIALIZER, Provider, Type } from '@angular/core'; +import { TransferState } from '@angular/platform-browser'; +import { APP_CONFIG } from '../config/app-config.interface'; +import { environment } from '../environments/environment'; +import { AppState } from './app.reducer'; /** * Performs the initialization of the app. - * - * Should have distinct extensions for server & browser for the specifics. - * Should be provided in AppModule as follows - * ``` - * { - * provide: APP_INITIALIZER - * useFactory: (initService: InitService) => initService.init(), - * deps: [ InitService ], - * multi: true, - * } - * ``` - * - * In order to be injected in the common APP_INITIALIZER, - * concrete subclasses should be provided in their respective app modules as - * ``` - * { provide: InitService, useClass: SpecificInitService } - * ``` + * Should be extended to implement server- & browser-specific functionality. */ export abstract class InitService { protected constructor( @@ -40,14 +28,63 @@ export abstract class InitService { } /** - * Main initialization method, to be used as the APP_INITIALIZER factory. - * - * Note that the body of this method and the callback it returns are called - * at different times. - * This is important to take into account when other providers depend on the - * initialization logic (e.g. APP_BASE_HREF) + * The initialization providers to use in `*AppModule` + * - this concrete {@link InitService} + * - {@link APP_CONFIG} with optional pre-initialization hook + * - {@link APP_INITIALIZER} + *
+ * Should only be called on concrete subclasses of InitService for the initialization hooks to work */ - abstract init(): () => Promise; + public static providers(): Provider[] { + if (!InitService.isPrototypeOf(this)) { + throw new Error( + 'Initalization providers should only be generated from concrete subclasses of InitService' + ); + } + return [ + { + provide: InitService, + useClass: this as unknown as Type, + }, + { + provide: APP_CONFIG, + useFactory: (transferState: TransferState) => { + this.resolveAppConfig(transferState); + return environment; + }, + deps: [ TransferState ] + }, + { + provide: APP_INITIALIZER, + useFactory: (initService: InitService) => initService.init(), + deps: [ InitService ], + multi: true, + }, + ]; + } + + /** + * Optional pre-initialization method to ensure that {@link APP_CONFIG} is fully resolved before {@link init} is called. + * + * For example, Router depends on APP_BASE_HREF, which in turn depends on APP_CONFIG. + * In production mode, APP_CONFIG is resolved from the TransferState when the app is initialized. + * If we want to use Router within APP_INITIALIZER, we have to make sure APP_BASE_HREF is resolved beforehand. + * In this case that means that we must transfer the configuration from the SSR state during pre-initialization. + * @protected + */ + protected static resolveAppConfig( + transferState: TransferState + ): void { + // overriden in subclasses if applicable + } + + /** + * Main initialization method. + * @protected + */ + protected abstract init(): () => Promise; + + // Common initialization steps protected checkAuthenticationToken(): void { this.store.dispatch(new CheckAuthenticationTokenAction()); diff --git a/src/config/app-config.interface.ts b/src/config/app-config.interface.ts index 62d0be7216..5b2f0b1eeb 100644 --- a/src/config/app-config.interface.ts +++ b/src/config/app-config.interface.ts @@ -36,6 +36,10 @@ interface AppConfig extends Config { mediaViewer: MediaViewerConfig; } +/** + * Injection token for the app configuration. + * Provided in {@link InitService.providers}. + */ const APP_CONFIG = new InjectionToken('APP_CONFIG'); const APP_CONFIG_STATE = makeStateKey('APP_CONFIG_STATE'); diff --git a/src/modules/app/browser-app.module.ts b/src/modules/app/browser-app.module.ts index e50018b51a..cd3feedad8 100644 --- a/src/modules/app/browser-app.module.ts +++ b/src/modules/app/browser-app.module.ts @@ -27,8 +27,8 @@ import { LocaleService } from '../../app/core/locale/locale.service'; import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.service'; import { AuthRequestService } from '../../app/core/auth/auth-request.service'; import { BrowserAuthRequestService } from '../../app/core/auth/browser-auth-request.service'; -import { InitService } from 'src/app/init.service'; import { BrowserInitService } from './browser-init.service'; +import { InitService } from '../../app/init.service'; export const REQ_KEY = makeStateKey('req'); @@ -63,10 +63,7 @@ export function getRequest(transferState: TransferState): any { AppModule ], providers: [ - { - provide: InitService, - useClass: BrowserInitService, - }, + ...BrowserInitService.providers(), { provide: REQUEST, useFactory: getRequest, diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index 1b050af82a..5c55795383 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -31,10 +31,17 @@ export class BrowserInitService extends InitService { super(store, correlationIdService, dspaceTransferState); } - public init(): () => Promise { - // this method must be called before the callback because APP_BASE_HREF depends on it - this.loadAppConfigFromSSR(); + protected static resolveAppConfig( + transferState: TransferState, + ) { + if (transferState.hasKey(APP_CONFIG_STATE)) { + const appConfig = transferState.get(APP_CONFIG_STATE, new DefaultAppConfig()); + // extend environment with app config for browser + extendEnvironmentWithAppConfig(environment, appConfig); + } + } + protected init(): () => Promise { return async () => { await this.transferAppState(); this.checkAuthenticationToken(); @@ -43,12 +50,4 @@ export class BrowserInitService extends InitService { return true; }; } - - private loadAppConfigFromSSR(): void { - if (this.transferState.hasKey(APP_CONFIG_STATE)) { - const appConfig = this.transferState.get(APP_CONFIG_STATE, new DefaultAppConfig()); - // extend environment with app config for browser - extendEnvironmentWithAppConfig(environment, appConfig); - } - } } diff --git a/src/modules/app/server-app.module.ts b/src/modules/app/server-app.module.ts index f61712ccb0..2b0462e9a0 100644 --- a/src/modules/app/server-app.module.ts +++ b/src/modules/app/server-app.module.ts @@ -30,7 +30,6 @@ import { ServerHardRedirectService } from '../../app/core/services/server-hard-r import { Angulartics2Mock } from '../../app/shared/mocks/angulartics2.service.mock'; import { AuthRequestService } from '../../app/core/auth/auth-request.service'; import { ServerAuthRequestService } from '../../app/core/auth/server-auth-request.service'; -import { InitService } from '../../app/init.service'; import { ServerInitService } from './server-init.service'; export function createTranslateLoader(transferState: TransferState) { @@ -56,10 +55,7 @@ export function createTranslateLoader(transferState: TransferState) { AppModule ], providers: [ - { - provide: InitService, - useClass: ServerInitService, - }, + ...ServerInitService.providers(), { provide: Angulartics2, useClass: Angulartics2Mock diff --git a/src/modules/app/server-init.service.ts b/src/modules/app/server-init.service.ts index d5814f10f3..11fcc482ca 100644 --- a/src/modules/app/server-init.service.ts +++ b/src/modules/app/server-init.service.ts @@ -29,7 +29,7 @@ export class ServerInitService extends InitService { super(store, correlationIdService, dspaceTransferState); } - public init(): () => Promise { + protected init(): () => Promise { return async () => { this.checkAuthenticationToken(); this.saveAppConfigForCSR(); From 5cb737c7f236a546d8b3d63b042cdc9d346927bb Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Fri, 22 Jul 2022 10:29:44 +0200 Subject: [PATCH 03/24] 93219: Move general initialization from AppComponent to InitService --- src/app/app.component.spec.ts | 46 +----- src/app/app.component.ts | 75 +-------- src/app/core/auth/auth.service.ts | 6 +- src/app/init.service.spec.ts | 192 +++++++++++++++++++++++- src/app/init.service.ts | 124 ++++++++++++++- src/modules/app/browser-init.service.ts | 52 ++++++- src/modules/app/server-init.service.ts | 44 +++++- 7 files changed, 416 insertions(+), 123 deletions(-) diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index a892e34a5a..4cf3f3b6e7 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -32,7 +32,6 @@ import { storeModuleConfig } from './app.reducer'; import { LocaleService } from './core/locale/locale.service'; import { authReducer } from './core/auth/auth.reducer'; import { provideMockStore } from '@ngrx/store/testing'; -import { GoogleAnalyticsService } from './statistics/google-analytics.service'; import { ThemeService } from './shared/theme-support/theme.service'; import { getMockThemeService } from './shared/mocks/theme-service.mock'; import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service'; @@ -46,16 +45,16 @@ const initialState = { core: { auth: { loading: false } } }; +export function getMockLocaleService(): LocaleService { + return jasmine.createSpyObj('LocaleService', { + setCurrentLanguageCode: jasmine.createSpy('setCurrentLanguageCode') + }); +} + describe('App component', () => { let breadcrumbsServiceSpy; - function getMockLocaleService(): LocaleService { - return jasmine.createSpyObj('LocaleService', { - setCurrentLanguageCode: jasmine.createSpy('setCurrentLanguageCode') - }); - } - const getDefaultTestBedConf = () => { breadcrumbsServiceSpy = jasmine.createSpyObj(['listenForRouteChanges']); @@ -131,39 +130,6 @@ describe('App component', () => { }); - describe('the constructor', () => { - it('should call breadcrumbsService.listenForRouteChanges', () => { - expect(breadcrumbsServiceSpy.listenForRouteChanges).toHaveBeenCalledTimes(1); - }); - }); - - describe('when GoogleAnalyticsService is provided', () => { - let googleAnalyticsSpy; - - beforeEach(() => { - // NOTE: Cannot override providers once components have been compiled, so TestBed needs to be reset - TestBed.resetTestingModule(); - TestBed.configureTestingModule(getDefaultTestBedConf()); - googleAnalyticsSpy = jasmine.createSpyObj('googleAnalyticsService', [ - 'addTrackingIdToPage', - ]); - TestBed.overrideProvider(GoogleAnalyticsService, {useValue: googleAnalyticsSpy}); - fixture = TestBed.createComponent(AppComponent); - comp = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create component', () => { - expect(comp).toBeTruthy(); - }); - - describe('the constructor', () => { - it('should call googleAnalyticsService.addTrackingIdToPage()', () => { - expect(googleAnalyticsSpy.addTrackingIdToPage).toHaveBeenCalledTimes(1); - }); - }); - }); - describe('when ThemeService returns a custom theme', () => { let document; let headSpy; diff --git a/src/app/app.component.ts b/src/app/app.component.ts index ea2fb9fde6..c7b99b42a8 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -18,36 +18,24 @@ import { Router, } from '@angular/router'; -import { isEqual } from 'lodash'; -import { BehaviorSubject, Observable, of } from 'rxjs'; +import { BehaviorSubject, Observable } from 'rxjs'; import { select, Store } from '@ngrx/store'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; -import { Angulartics2GoogleAnalytics } from 'angulartics2/ga'; - -import { MetadataService } from './core/metadata/metadata.service'; import { HostWindowResizeAction } from './shared/host-window.actions'; import { HostWindowState } from './shared/search/host-window.reducer'; import { NativeWindowRef, NativeWindowService } from './core/services/window.service'; import { isAuthenticationBlocking } from './core/auth/selectors'; import { AuthService } from './core/auth/auth.service'; import { CSSVariableService } from './shared/sass-helper/sass-helper.service'; -import { MenuService } from './shared/menu/menu.service'; -import { HostWindowService } from './shared/host-window.service'; -import { HeadTagConfig, ThemeConfig } from '../config/theme.model'; -import { Angulartics2DSpace } from './statistics/angulartics/dspace-provider'; +import { HeadTagConfig } from '../config/theme.model'; import { environment } from '../environments/environment'; import { models } from './core/core.module'; -import { LocaleService } from './core/locale/locale.service'; import { hasNoValue, hasValue, isNotEmpty } from './shared/empty.util'; -import { KlaroService } from './shared/cookies/klaro.service'; -import { GoogleAnalyticsService } from './statistics/google-analytics.service'; import { ThemeService } from './shared/theme-support/theme.service'; import { BASE_THEME_NAME } from './shared/theme-support/theme.constants'; -import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service'; import { IdleModalComponent } from './shared/idle-modal/idle-modal.component'; import { getDefaultThemeConfig } from '../config/config.util'; -import { AppConfig, APP_CONFIG } from 'src/config/app-config.interface'; @Component({ selector: 'ds-app', @@ -56,11 +44,6 @@ import { AppConfig, APP_CONFIG } from 'src/config/app-config.interface'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppComponent implements OnInit, AfterViewInit { - sidebarVisible: Observable; - slideSidebarOver: Observable; - collapsedSidebarWidth: Observable; - totalSidebarWidth: Observable; - theme: Observable = of({} as any); notificationOptions; models; @@ -90,29 +73,14 @@ export class AppComponent implements OnInit, AfterViewInit { @Inject(NativeWindowService) private _window: NativeWindowRef, @Inject(DOCUMENT) private document: any, @Inject(PLATFORM_ID) private platformId: any, - @Inject(APP_CONFIG) private appConfig: AppConfig, private themeService: ThemeService, private translate: TranslateService, private store: Store, - private metadata: MetadataService, - private angulartics2GoogleAnalytics: Angulartics2GoogleAnalytics, - private angulartics2DSpace: Angulartics2DSpace, private authService: AuthService, private router: Router, private cssService: CSSVariableService, - private menuService: MenuService, - private windowService: HostWindowService, - private localeService: LocaleService, - private breadcrumbsService: BreadcrumbsService, private modalService: NgbModal, - @Optional() private cookiesService: KlaroService, - @Optional() private googleAnalyticsService: GoogleAnalyticsService, ) { - - if (!isEqual(environment, this.appConfig)) { - throw new Error('environment does not match app config!'); - } - this.notificationOptions = environment.notifications; /* Use models object so all decorators are actually called */ @@ -136,47 +104,18 @@ export class AppComponent implements OnInit, AfterViewInit { }); if (isPlatformBrowser(this.platformId)) { - this.authService.trackTokenExpiration(); this.trackIdleModal(); } - // Load all the languages that are defined as active from the config file - translate.addLangs(environment.languages.filter((LangConfig) => LangConfig.active === true).map((a) => a.code)); - - // Load the default language from the config file - // translate.setDefaultLang(environment.defaultLanguage); - - // set the current language code - this.localeService.setCurrentLanguageCode(); - - // analytics - if (hasValue(googleAnalyticsService)) { - googleAnalyticsService.addTrackingIdToPage(); - } - angulartics2DSpace.startTracking(); - - metadata.listenForRouteChange(); - breadcrumbsService.listenForRouteChanges(); - - if (environment.debug) { - console.info(environment); - } this.storeCSSVariables(); } ngOnInit() { - this.isAuthBlocking$ = this.store.pipe(select(isAuthenticationBlocking)).pipe( + this.isAuthBlocking$ = this.store.pipe( + select(isAuthenticationBlocking), distinctUntilChanged() ); - this.isAuthBlocking$ - .pipe( - filter((isBlocking: boolean) => isBlocking === false), - take(1) - ).subscribe(() => this.initializeKlaro()); - const env: string = environment.production ? 'Production' : 'Development'; - const color: string = environment.production ? 'red' : 'green'; - console.info(`Environment: %c${env}`, `color: ${color}; font-weight: bold;`); this.dispatchWindowSize(this._window.nativeWindow.innerWidth, this._window.nativeWindow.innerHeight); } @@ -239,12 +178,6 @@ export class AppComponent implements OnInit, AfterViewInit { ); } - private initializeKlaro() { - if (hasValue(this.cookiesService)) { - this.cookiesService.initialize(); - } - } - private loadGlobalThemeConfig(themeName: string): void { this.setThemeCss(themeName); this.setHeadTags(themeName); diff --git a/src/app/core/auth/auth.service.ts b/src/app/core/auth/auth.service.ts index 5738948ebd..95b20a1142 100644 --- a/src/app/core/auth/auth.service.ts +++ b/src/app/core/auth/auth.service.ts @@ -4,7 +4,7 @@ import { HttpHeaders } from '@angular/common/http'; import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens'; import { Observable, of as observableOf } from 'rxjs'; -import { map, startWith, switchMap, take } from 'rxjs/operators'; +import { filter, map, startWith, switchMap, take } from 'rxjs/operators'; import { select, Store } from '@ngrx/store'; import { CookieAttributes } from 'js-cookie'; @@ -88,6 +88,8 @@ export class AuthService { private translateService: TranslateService ) { this.store.pipe( + // when this service is constructed the store is not fully initialized yet + filter((state: any) => state?.core?.auth !== undefined), select(isAuthenticated), startWith(false) ).subscribe((authenticated: boolean) => this._authenticated = authenticated); @@ -325,7 +327,7 @@ export class AuthService { let token: AuthTokenInfo; let currentlyRefreshingToken = false; this.store.pipe(select(getAuthenticationToken)).subscribe((authTokenInfo: AuthTokenInfo) => { - // If new token is undefined an it wasn't previously => Refresh failed + // If new token is undefined and it wasn't previously => Refresh failed if (currentlyRefreshingToken && token !== undefined && authTokenInfo === undefined) { // Token refresh failed => Error notification => 10 second wait => Page reloads & user logged out this.notificationService.error(this.translateService.get('auth.messages.token-refresh-failed')); diff --git a/src/app/init.service.spec.ts b/src/app/init.service.spec.ts index 7bbd50e4b7..7fb555f23c 100644 --- a/src/app/init.service.spec.ts +++ b/src/app/init.service.spec.ts @@ -1,12 +1,42 @@ import { InitService } from './init.service'; import { APP_CONFIG } from 'src/config/app-config.interface'; -import { APP_INITIALIZER } from '@angular/core'; +import { APP_INITIALIZER, Injectable } from '@angular/core'; +import { inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { GoogleAnalyticsService } from './statistics/google-analytics.service'; +import { MetadataService } from './core/metadata/metadata.service'; +import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service'; +import { CommonModule } from '@angular/common'; +import { Store, StoreModule } from '@ngrx/store'; +import { authReducer } from './core/auth/auth.reducer'; +import { storeModuleConfig } from './app.reducer'; +import { AngularticsProviderMock } from './shared/mocks/angulartics-provider.service.mock'; +import { Angulartics2DSpace } from './statistics/angulartics/dspace-provider'; +import { AuthService } from './core/auth/auth.service'; +import { AuthServiceMock } from './shared/mocks/auth.service.mock'; +import { ActivatedRoute, Router } from '@angular/router'; +import { RouterMock } from './shared/mocks/router.mock'; +import { MockActivatedRoute } from './shared/mocks/active-router.mock'; +import { MenuService } from './shared/menu/menu.service'; +import { LocaleService } from './core/locale/locale.service'; +import { environment } from '../environments/environment'; +import { provideMockStore } from '@ngrx/store/testing'; +import { AppComponent } from './app.component'; +import { RouteService } from './core/services/route.service'; +import { getMockLocaleService } from './app.component.spec'; +import { MenuServiceStub } from './shared/testing/menu-service.stub'; +import { CorrelationIdService } from './correlation-id/correlation-id.service'; +import { DSpaceTransferState } from '../modules/transfer-state/dspace-transfer-state.service'; +import { KlaroService } from './shared/cookies/klaro.service'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { TranslateLoaderMock } from './shared/mocks/translate-loader.mock'; +import { getTestScheduler } from 'jasmine-marbles'; import objectContaining = jasmine.objectContaining; import createSpyObj = jasmine.createSpyObj; import SpyObj = jasmine.SpyObj; let spy: SpyObj; +@Injectable() export class ConcreteInitServiceMock extends InitService { protected static resolveAppConfig() { spy.resolveAppConfig(); @@ -18,6 +48,15 @@ export class ConcreteInitServiceMock extends InitService { } } +const initialState = { + core: { + auth: { + loading: false, + blocking: true, + } + } +}; + describe('InitService', () => { describe('providers', () => { @@ -79,5 +118,156 @@ describe('InitService', () => { expect(spy.init).toHaveBeenCalled(); }); }); + + describe('common initialization steps', () => { + let correlationIdServiceSpy; + let dspaceTransferStateSpy; + let transferStateSpy; + let metadataServiceSpy; + let breadcrumbsServiceSpy; + + beforeEach(waitForAsync(() => { + correlationIdServiceSpy = jasmine.createSpyObj('correlationIdServiceSpy', [ + 'initCorrelationId', + ]); + dspaceTransferStateSpy = jasmine.createSpyObj('dspaceTransferStateSpy', [ + 'transfer', + ]); + transferStateSpy = jasmine.createSpyObj('dspaceTransferStateSpy', [ + 'get', 'hasKey' + ]); + breadcrumbsServiceSpy = jasmine.createSpyObj('breadcrumbsServiceSpy', [ + 'listenForRouteChanges', + ]); + metadataServiceSpy = jasmine.createSpyObj('metadataService', [ + 'listenForRouteChange', + ]); + + + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + imports: [ + CommonModule, + StoreModule.forRoot(authReducer, storeModuleConfig), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + ], + providers: [ + { provide: InitService, useClass: ConcreteInitServiceMock }, + { provide: CorrelationIdService, useValue: correlationIdServiceSpy }, + { provide: DSpaceTransferState, useValue: dspaceTransferStateSpy }, + { provide: APP_CONFIG, useValue: environment }, + { provide: LocaleService, useValue: getMockLocaleService() }, + { provide: Angulartics2DSpace, useValue: new AngularticsProviderMock() }, + { provide: MetadataService, useValue: metadataServiceSpy }, + { provide: BreadcrumbsService, useValue: breadcrumbsServiceSpy }, + { provide: AuthService, useValue: new AuthServiceMock() }, + { provide: Router, useValue: new RouterMock() }, + { provide: ActivatedRoute, useValue: new MockActivatedRoute() }, + { provide: MenuService, useValue: new MenuServiceStub() }, + { provide: KlaroService, useValue: undefined }, + { provide: GoogleAnalyticsService, useValue: undefined }, + provideMockStore({ initialState }), + AppComponent, + RouteService, + ] + }); + })); + + describe('initÀnalytics', () => { + describe('when GoogleAnalyticsService is provided', () => { + let googleAnalyticsSpy; + + beforeEach(() => { + googleAnalyticsSpy = jasmine.createSpyObj('googleAnalyticsService', [ + 'addTrackingIdToPage', + ]); + + TestBed.overrideProvider(GoogleAnalyticsService, { useValue: googleAnalyticsSpy }); + }); + + it('should call googleAnalyticsService.addTrackingIdToPage()', inject([InitService], (service) => { + // @ts-ignore + service.initAnalytics(); + expect(googleAnalyticsSpy.addTrackingIdToPage).toHaveBeenCalledTimes(1); + })); + }); + }); + + describe('initRouteListeners', () => { + it('should call listenForRouteChanges', inject([InitService], (service) => { + // @ts-ignore + service.initRouteListeners(); + expect(metadataServiceSpy.listenForRouteChange).toHaveBeenCalledTimes(1); + expect(breadcrumbsServiceSpy.listenForRouteChanges).toHaveBeenCalledTimes(1); + })); + }); + + describe('initKlaro', () => { + const BLOCKING = { + t: { core: { auth: { blocking: true } } }, + f: { core: { auth: { blocking: false } } }, + }; + + it('should not error out if KlaroService is not provided', inject([InitService], (service) => { + // @ts-ignore + service.initKlaro(); + })); + + describe('when KlaroService is provided', () => { + let klaroServiceSpy; + + beforeEach(() => { + klaroServiceSpy = jasmine.createSpyObj('klaroServiceSpy', [ + 'initialize', + ]); + + TestBed.overrideProvider(KlaroService, { useValue: klaroServiceSpy }); + }); + + it('should not initialize Klaro while auth is blocking', () => { + getTestScheduler().run(({ cold, flush}) => { + TestBed.overrideProvider(Store, { useValue: cold('t--t--t--', BLOCKING) }); + const service = TestBed.inject(InitService); + + // @ts-ignore + service.initKlaro(); + flush(); + expect(klaroServiceSpy.initialize).not.toHaveBeenCalled(); + }); + }); + + + it('should only initialize Klaro the first time auth is unblocked', () => { + getTestScheduler().run(({ cold, flush}) => { + TestBed.overrideProvider(Store, { useValue: cold('t--t--f--t--f--', BLOCKING) }); + const service = TestBed.inject(InitService); + + // @ts-ignore + service.initKlaro(); + flush(); + expect(klaroServiceSpy.initialize).toHaveBeenCalledTimes(1); + }); + }); + }); + + describe('when KlaroService is not provided', () => { + it('should not error out when auth is unblocked', () => { + getTestScheduler().run(({ cold, flush}) => { + TestBed.overrideProvider(Store, { useValue: cold('t--t--f--t--f--', BLOCKING) }); + const service = TestBed.inject(InitService); + + // @ts-ignore + service.initKlaro(); + flush(); + }); + }); + }); + }); + }); }); diff --git a/src/app/init.service.ts b/src/app/init.service.ts index d8ecf8d23a..e5b04163c0 100644 --- a/src/app/init.service.ts +++ b/src/app/init.service.ts @@ -5,25 +5,50 @@ * * http://www.dspace.org/license/ */ -import { Store } from '@ngrx/store'; +import { select, Store } from '@ngrx/store'; import { CheckAuthenticationTokenAction } from './core/auth/auth.actions'; import { CorrelationIdService } from './correlation-id/correlation-id.service'; import { DSpaceTransferState } from '../modules/transfer-state/dspace-transfer-state.service'; -import { APP_INITIALIZER, Provider, Type } from '@angular/core'; +import { APP_INITIALIZER, Inject, Optional, Provider, Type } from '@angular/core'; import { TransferState } from '@angular/platform-browser'; -import { APP_CONFIG } from '../config/app-config.interface'; +import { APP_CONFIG, AppConfig } from '../config/app-config.interface'; import { environment } from '../environments/environment'; import { AppState } from './app.reducer'; +import { isEqual } from 'lodash'; +import { TranslateService } from '@ngx-translate/core'; +import { LocaleService } from './core/locale/locale.service'; +import { hasValue } from './shared/empty.util'; +import { Angulartics2DSpace } from './statistics/angulartics/dspace-provider'; +import { GoogleAnalyticsService } from './statistics/google-analytics.service'; +import { MetadataService } from './core/metadata/metadata.service'; +import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service'; +import { distinctUntilChanged, filter, take, tap } from 'rxjs/operators'; +import { isAuthenticationBlocking } from './core/auth/selectors'; +import { KlaroService } from './shared/cookies/klaro.service'; /** * Performs the initialization of the app. + * * Should be extended to implement server- & browser-specific functionality. + * Initialization steps shared between the server and brower implementations + * can be included in this class. + * + * Note that the service cannot (indirectly) depend on injection tokens that are only available _after_ APP_INITIALIZER. + * For example, NgbModal depends on ApplicationRef and can therefore not be used during initialization. */ export abstract class InitService { protected constructor( protected store: Store, protected correlationIdService: CorrelationIdService, protected dspaceTransferState: DSpaceTransferState, + @Inject(APP_CONFIG) protected appConfig: AppConfig, + protected translate: TranslateService, + protected localeService: LocaleService, + protected angulartics2DSpace: Angulartics2DSpace, + @Optional() protected googleAnalyticsService: GoogleAnalyticsService, + protected metadata: MetadataService, + protected breadcrumbsService: BreadcrumbsService, + @Optional() protected klaroService: KlaroService, ) { } @@ -86,15 +111,108 @@ export abstract class InitService { // Common initialization steps + /** + * Dispatch a {@link CheckAuthenticationTokenAction} to start off the chain of + * actions used to determine whether a user is already logged in. + * @protected + */ protected checkAuthenticationToken(): void { this.store.dispatch(new CheckAuthenticationTokenAction()); } + /** + * Initialize the correlation ID (from cookie, NgRx store or random) + * @protected + */ protected initCorrelationId(): void { this.correlationIdService.initCorrelationId(); } + /** + * Transfer the application's NgRx state between server-side and client-side + * @protected + */ protected async transferAppState(): Promise { return this.dspaceTransferState.transfer(); } + + /** + * Make sure the {@link environment} matches {@link APP_CONFIG} and print + * some information about it to the console + * @protected + */ + protected checkEnvironment(): void { + if (!isEqual(environment, this.appConfig)) { + throw new Error('environment does not match app config!'); + } + + if (environment.debug) { + console.info(environment); + } + + const env: string = environment.production ? 'Production' : 'Development'; + const color: string = environment.production ? 'red' : 'green'; + console.info(`Environment: %c${env}`, `color: ${color}; font-weight: bold;`); + } + + /** + * Initialize internationalization services + * - Specify the active languages + * - Set the current locale + * @protected + */ + protected initI18n(): void { + // Load all the languages that are defined as active from the config file + this.translate.addLangs( + environment.languages + .filter((LangConfig) => LangConfig.active === true) + .map((a) => a.code) + ); + + // Load the default language from the config file + // translate.setDefaultLang(environment.defaultLanguage); + + this.localeService.setCurrentLanguageCode(); + } + + /** + * Initialize analytics services + * - Angulartics + * - Google Analytics (if enabled) + * @protected + */ + protected initAnalytics(): void { + if (hasValue(this.googleAnalyticsService)) { + this.googleAnalyticsService.addTrackingIdToPage(); + } + this.angulartics2DSpace.startTracking(); + } + + /** + * Start route-listening subscriptions + * - {@link MetadataService.listenForRouteChange} + * - {@link BreadcrumbsService.listenForRouteChanges} + * @protected + */ + protected initRouteListeners(): void { + this.metadata.listenForRouteChange(); + this.breadcrumbsService.listenForRouteChanges(); + } + + /** + * Initialize Klaro (if enabled) + * @protected + */ + protected initKlaro() { + if (hasValue(this.klaroService)) { + this.store.pipe( + select(isAuthenticationBlocking), + distinctUntilChanged(), + filter((isBlocking: boolean) => isBlocking === false), + take(1) + ).subscribe(() => { + this.klaroService.initialize(); + }); + } + } } diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index 5c55795383..f675c55718 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -10,12 +10,21 @@ import { Store } from '@ngrx/store'; import { AppState } from '../../app/app.reducer'; import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service'; import { TransferState } from '@angular/platform-browser'; -import { APP_CONFIG_STATE, AppConfig } from '../../config/app-config.interface'; +import { APP_CONFIG, APP_CONFIG_STATE, AppConfig } from '../../config/app-config.interface'; import { DefaultAppConfig } from '../../config/default-app-config'; import { extendEnvironmentWithAppConfig } from '../../config/config.util'; import { environment } from '../../environments/environment'; import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; -import { Injectable } from '@angular/core'; +import { Inject, Injectable, Optional } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { LocaleService } from '../../app/core/locale/locale.service'; +import { Angulartics2DSpace } from '../../app/statistics/angulartics/dspace-provider'; +import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.service'; +import { MetadataService } from '../../app/core/metadata/metadata.service'; +import { BreadcrumbsService } from '../../app/breadcrumbs/breadcrumbs.service'; +import { CSSVariableService } from '../../app/shared/sass-helper/sass-helper.service'; +import { KlaroService } from '../../app/shared/cookies/klaro.service'; +import { AuthService } from '../../app/core/auth/auth.service'; /** * Performs client-side initialization. @@ -27,8 +36,30 @@ export class BrowserInitService extends InitService { protected correlationIdService: CorrelationIdService, protected transferState: TransferState, protected dspaceTransferState: DSpaceTransferState, + @Inject(APP_CONFIG) protected appConfig: AppConfig, + protected translate: TranslateService, + protected localeService: LocaleService, + protected angulartics2DSpace: Angulartics2DSpace, + @Optional() protected googleAnalyticsService: GoogleAnalyticsService, + protected metadata: MetadataService, + protected breadcrumbsService: BreadcrumbsService, + protected cssService: CSSVariableService, + @Optional() protected klaroService: KlaroService, + protected authService: AuthService, ) { - super(store, correlationIdService, dspaceTransferState); + super( + store, + correlationIdService, + dspaceTransferState, + appConfig, + translate, + localeService, + angulartics2DSpace, + googleAnalyticsService, + metadata, + breadcrumbsService, + klaroService, + ); } protected static resolveAppConfig( @@ -47,7 +78,22 @@ export class BrowserInitService extends InitService { this.checkAuthenticationToken(); this.initCorrelationId(); + this.checkEnvironment(); + + this.initI18n(); + this.initAnalytics(); + this.initRouteListeners(); + this.trackAuthTokenExpiration(); + + this.initKlaro(); + return true; }; } + + // Browser-only initialization steps + + private trackAuthTokenExpiration(): void { + this.authService.trackTokenExpiration(); + } } diff --git a/src/modules/app/server-init.service.ts b/src/modules/app/server-init.service.ts index 11fcc482ca..fc7fc66bf7 100644 --- a/src/modules/app/server-init.service.ts +++ b/src/modules/app/server-init.service.ts @@ -11,9 +11,17 @@ import { AppState } from '../../app/app.reducer'; import { TransferState } from '@angular/platform-browser'; import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service'; import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; -import { APP_CONFIG_STATE, AppConfig } from '../../config/app-config.interface'; +import { APP_CONFIG, APP_CONFIG_STATE, AppConfig } from '../../config/app-config.interface'; import { environment } from '../../environments/environment'; -import { Injectable } from '@angular/core'; +import { Inject, Injectable, Optional } from '@angular/core'; +import { TranslateService } from '@ngx-translate/core'; +import { LocaleService } from '../../app/core/locale/locale.service'; +import { Angulartics2DSpace } from '../../app/statistics/angulartics/dspace-provider'; +import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.service'; +import { MetadataService } from '../../app/core/metadata/metadata.service'; +import { BreadcrumbsService } from '../../app/breadcrumbs/breadcrumbs.service'; +import { CSSVariableService } from '../../app/shared/sass-helper/sass-helper.service'; +import { KlaroService } from '../../app/shared/cookies/klaro.service'; /** * Performs server-side initialization. @@ -25,8 +33,29 @@ export class ServerInitService extends InitService { protected correlationIdService: CorrelationIdService, protected transferState: TransferState, protected dspaceTransferState: DSpaceTransferState, + @Inject(APP_CONFIG) protected appConfig: AppConfig, + protected translate: TranslateService, + protected localeService: LocaleService, + protected angulartics2DSpace: Angulartics2DSpace, + @Optional() protected googleAnalyticsService: GoogleAnalyticsService, + protected metadata: MetadataService, + protected breadcrumbsService: BreadcrumbsService, + protected cssService: CSSVariableService, + @Optional() protected klaroService: KlaroService, ) { - super(store, correlationIdService, dspaceTransferState); + super( + store, + correlationIdService, + dspaceTransferState, + appConfig, + translate, + localeService, + angulartics2DSpace, + googleAnalyticsService, + metadata, + breadcrumbsService, + klaroService, + ); } protected init(): () => Promise { @@ -36,10 +65,19 @@ export class ServerInitService extends InitService { this.transferAppState(); // todo: SSR breaks if we await this (why?) this.initCorrelationId(); + this.checkEnvironment(); + this.initI18n(); + this.initAnalytics(); + this.initRouteListeners(); + + this.initKlaro(); + return true; }; } + // Server-only initialization steps + private saveAppConfigForCSR(): void { this.transferState.set(APP_CONFIG_STATE, environment as AppConfig); } From bdc004f64dbeae554e97cb45158e90bf5ac7b1f3 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Fri, 22 Jul 2022 12:12:21 +0200 Subject: [PATCH 04/24] 93219: Move theme/route subscriptions from AppComponent to ThemeService --- src/app/app.component.spec.ts | 31 +-- src/app/app.component.ts | 183 +----------------- src/app/core/shared/distinct-next.ts | 18 ++ src/app/init.service.spec.ts | 3 + src/app/init.service.ts | 4 + src/app/navbar/navbar.component.html | 4 +- src/app/shared/mocks/theme-service.mock.ts | 1 + .../theme-support/theme.service.spec.ts | 57 +++++- src/app/shared/theme-support/theme.service.ts | 176 ++++++++++++++++- src/modules/app/browser-init.service.ts | 4 + src/modules/app/server-init.service.ts | 4 + 11 files changed, 268 insertions(+), 217 deletions(-) create mode 100644 src/app/core/shared/distinct-next.ts diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 4cf3f3b6e7..0e86beeedb 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,7 +1,7 @@ import { Store, StoreModule } from '@ngrx/store'; import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { CommonModule, DOCUMENT } from '@angular/common'; +import { CommonModule } from '@angular/common'; import { ActivatedRoute, Router } from '@angular/router'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { Angulartics2GoogleAnalytics } from 'angulartics2/ga'; @@ -129,33 +129,4 @@ describe('App component', () => { }); }); - - describe('when ThemeService returns a custom theme', () => { - let document; - let headSpy; - - beforeEach(() => { - // NOTE: Cannot override providers once components have been compiled, so TestBed needs to be reset - TestBed.resetTestingModule(); - TestBed.configureTestingModule(getDefaultTestBedConf()); - TestBed.overrideProvider(ThemeService, {useValue: getMockThemeService('custom')}); - document = TestBed.inject(DOCUMENT); - headSpy = jasmine.createSpyObj('head', ['appendChild', 'getElementsByClassName']); - headSpy.getElementsByClassName.and.returnValue([]); - spyOn(document, 'getElementsByTagName').and.returnValue([headSpy]); - fixture = TestBed.createComponent(AppComponent); - comp = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should append a link element with the correct attributes to the head element', () => { - const link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('type', 'text/css'); - link.setAttribute('class', 'theme-css'); - link.setAttribute('href', '/custom-theme.css'); - - expect(headSpy.appendChild).toHaveBeenCalledWith(link); - }); - }); }); diff --git a/src/app/app.component.ts b/src/app/app.component.ts index c7b99b42a8..98e91c9c31 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,4 +1,4 @@ -import { distinctUntilChanged, filter, switchMap, take, withLatestFrom } from 'rxjs/operators'; +import { distinctUntilChanged, take, withLatestFrom } from 'rxjs/operators'; import { DOCUMENT, isPlatformBrowser } from '@angular/common'; import { AfterViewInit, @@ -7,14 +7,12 @@ import { HostListener, Inject, OnInit, - Optional, PLATFORM_ID, } from '@angular/core'; import { - ActivatedRouteSnapshot, NavigationCancel, NavigationEnd, - NavigationStart, ResolveEnd, + NavigationStart, Router, } from '@angular/router'; @@ -28,14 +26,11 @@ import { NativeWindowRef, NativeWindowService } from './core/services/window.ser import { isAuthenticationBlocking } from './core/auth/selectors'; import { AuthService } from './core/auth/auth.service'; import { CSSVariableService } from './shared/sass-helper/sass-helper.service'; -import { HeadTagConfig } from '../config/theme.model'; import { environment } from '../environments/environment'; import { models } from './core/core.module'; -import { hasNoValue, hasValue, isNotEmpty } from './shared/empty.util'; import { ThemeService } from './shared/theme-support/theme.service'; -import { BASE_THEME_NAME } from './shared/theme-support/theme.constants'; import { IdleModalComponent } from './shared/idle-modal/idle-modal.component'; -import { getDefaultThemeConfig } from '../config/config.util'; +import { distinctNext } from './core/shared/distinct-next'; @Component({ selector: 'ds-app', @@ -60,9 +55,7 @@ export class AppComponent implements OnInit, AfterViewInit { /** * Whether or not the theme is in the process of being swapped */ - isThemeLoading$: BehaviorSubject = new BehaviorSubject(false); - - isThemeCSSLoading$: BehaviorSubject = new BehaviorSubject(false); + isThemeLoading$: Observable; /** * Whether or not the idle modal is is currently open @@ -86,27 +79,12 @@ export class AppComponent implements OnInit, AfterViewInit { /* Use models object so all decorators are actually called */ this.models = models; - this.themeService.getThemeName$().subscribe((themeName: string) => { - if (isPlatformBrowser(this.platformId)) { - // the theme css will never download server side, so this should only happen on the browser - this.distinctNext(this.isThemeCSSLoading$, true); - } - if (hasValue(themeName)) { - this.loadGlobalThemeConfig(themeName); - } else { - const defaultThemeConfig = getDefaultThemeConfig(); - if (hasValue(defaultThemeConfig)) { - this.loadGlobalThemeConfig(defaultThemeConfig.name); - } else { - this.loadGlobalThemeConfig(BASE_THEME_NAME); - } - } - }); - if (isPlatformBrowser(this.platformId)) { this.trackIdleModal(); } + this.isThemeLoading$ = this.themeService.isThemeLoading$; + this.storeCSSVariables(); } @@ -135,34 +113,14 @@ export class AppComponent implements OnInit, AfterViewInit { } ngAfterViewInit() { - let resolveEndFound = false; this.router.events.subscribe((event) => { if (event instanceof NavigationStart) { - resolveEndFound = false; - this.distinctNext(this.isRouteLoading$, true); - this.distinctNext(this.isThemeLoading$, true); - } else if (event instanceof ResolveEnd) { - resolveEndFound = true; - const activatedRouteSnapShot: ActivatedRouteSnapshot = event.state.root; - this.themeService.updateThemeOnRouteChange$(event.urlAfterRedirects, activatedRouteSnapShot).pipe( - switchMap((changed) => { - if (changed) { - return this.isThemeCSSLoading$; - } else { - return [false]; - } - }) - ).subscribe((changed) => { - this.distinctNext(this.isThemeLoading$, changed); - }); + distinctNext(this.isRouteLoading$, true); } else if ( event instanceof NavigationEnd || event instanceof NavigationCancel ) { - if (!resolveEndFound) { - this.distinctNext(this.isThemeLoading$, false); - } - this.distinctNext(this.isRouteLoading$, false); + distinctNext(this.isRouteLoading$, false); } }); } @@ -178,119 +136,6 @@ export class AppComponent implements OnInit, AfterViewInit { ); } - private loadGlobalThemeConfig(themeName: string): void { - this.setThemeCss(themeName); - this.setHeadTags(themeName); - } - - /** - * Update the theme css file in - * - * @param themeName The name of the new theme - * @private - */ - private setThemeCss(themeName: string): void { - const head = this.document.getElementsByTagName('head')[0]; - if (hasNoValue(head)) { - return; - } - - // Array.from to ensure we end up with an array, not an HTMLCollection, which would be - // automatically updated if we add nodes later - const currentThemeLinks = Array.from(head.getElementsByClassName('theme-css')); - const link = this.document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('type', 'text/css'); - link.setAttribute('class', '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 = () => { - if (isNotEmpty(currentThemeLinks)) { - currentThemeLinks.forEach((currentThemeLink: any) => { - if (hasValue(currentThemeLink)) { - currentThemeLink.remove(); - } - }); - } - // the fact that this callback is used, proves we're on the browser. - this.distinctNext(this.isThemeCSSLoading$, false); - }; - head.appendChild(link); - } - - private setHeadTags(themeName: string): void { - const head = this.document.getElementsByTagName('head')[0]; - if (hasNoValue(head)) { - return; - } - - // clear head tags - const currentHeadTags = Array.from(head.getElementsByClassName('theme-head-tag')); - if (hasValue(currentHeadTags)) { - currentHeadTags.forEach((currentHeadTag: any) => currentHeadTag.remove()); - } - - // create new head tags (not yet added to DOM) - const headTagFragment = this.document.createDocumentFragment(); - this.createHeadTags(themeName) - .forEach(newHeadTag => headTagFragment.appendChild(newHeadTag)); - - // add new head tags to DOM - head.appendChild(headTagFragment); - } - - private createHeadTags(themeName: string): HTMLElement[] { - const themeConfig = this.themeService.getThemeConfigFor(themeName); - const headTagConfigs = themeConfig?.headTags; - - if (hasNoValue(headTagConfigs)) { - const parentThemeName = themeConfig?.extends; - if (hasValue(parentThemeName)) { - // inherit the head tags of the parent theme - return this.createHeadTags(parentThemeName); - } - const defaultThemeConfig = getDefaultThemeConfig(); - const defaultThemeName = defaultThemeConfig.name; - if ( - hasNoValue(defaultThemeName) || - themeName === defaultThemeName || - themeName === BASE_THEME_NAME - ) { - // last resort, use fallback favicon.ico - return [ - this.createHeadTag({ - 'tagName': 'link', - 'attributes': { - 'rel': 'icon', - 'href': 'assets/images/favicon.ico', - 'sizes': 'any', - } - }) - ]; - } - - // inherit the head tags of the default theme - return this.createHeadTags(defaultThemeConfig.name); - } - - return headTagConfigs.map(this.createHeadTag.bind(this)); - } - - private createHeadTag(headTagConfig: HeadTagConfig): HTMLElement { - const tag = this.document.createElement(headTagConfig.tagName); - - if (hasValue(headTagConfig.attributes)) { - Object.entries(headTagConfig.attributes) - .forEach(([key, value]) => tag.setAttribute(key, value)); - } - - // 'class' attribute should always be 'theme-head-tag' for removal - tag.setAttribute('class', 'theme-head-tag'); - - return tag; - } - private trackIdleModal() { const isIdle$ = this.authService.isUserIdle(); const isAuthenticated$ = this.authService.isAuthenticated(); @@ -310,16 +155,4 @@ export class AppComponent implements OnInit, AfterViewInit { }); } - /** - * Use nextValue to update a given BehaviorSubject, only if it differs from its current value - * - * @param bs a BehaviorSubject - * @param nextValue the next value for that BehaviorSubject - * @protected - */ - protected distinctNext(bs: BehaviorSubject, nextValue: T): void { - if (bs.getValue() !== nextValue) { - bs.next(nextValue); - } - } } diff --git a/src/app/core/shared/distinct-next.ts b/src/app/core/shared/distinct-next.ts new file mode 100644 index 0000000000..0ee3d237d4 --- /dev/null +++ b/src/app/core/shared/distinct-next.ts @@ -0,0 +1,18 @@ +/* + * something something atmire + */ + +import { BehaviorSubject } from 'rxjs'; + +/** + * Use nextValue to update a given BehaviorSubject, only if it differs from its current value + * + * @param bs a BehaviorSubject + * @param nextValue the next value for that BehaviorSubject + * @protected + */ +export function distinctNext(bs: BehaviorSubject, nextValue: T): void { + if (bs.getValue() !== nextValue) { + bs.next(nextValue); + } +} diff --git a/src/app/init.service.spec.ts b/src/app/init.service.spec.ts index 7fb555f23c..c046ad5715 100644 --- a/src/app/init.service.spec.ts +++ b/src/app/init.service.spec.ts @@ -33,6 +33,8 @@ import { getTestScheduler } from 'jasmine-marbles'; import objectContaining = jasmine.objectContaining; import createSpyObj = jasmine.createSpyObj; import SpyObj = jasmine.SpyObj; +import { ThemeService } from './shared/theme-support/theme.service'; +import { getMockThemeService } from './shared/mocks/theme-service.mock'; let spy: SpyObj; @@ -171,6 +173,7 @@ describe('InitService', () => { { provide: MenuService, useValue: new MenuServiceStub() }, { provide: KlaroService, useValue: undefined }, { provide: GoogleAnalyticsService, useValue: undefined }, + { provide: ThemeService, useValue: getMockThemeService() }, provideMockStore({ initialState }), AppComponent, RouteService, diff --git a/src/app/init.service.ts b/src/app/init.service.ts index e5b04163c0..62461212d2 100644 --- a/src/app/init.service.ts +++ b/src/app/init.service.ts @@ -25,6 +25,7 @@ import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service'; import { distinctUntilChanged, filter, take, tap } from 'rxjs/operators'; import { isAuthenticationBlocking } from './core/auth/selectors'; import { KlaroService } from './shared/cookies/klaro.service'; +import { ThemeService } from './shared/theme-support/theme.service'; /** * Performs the initialization of the app. @@ -49,6 +50,7 @@ export abstract class InitService { protected metadata: MetadataService, protected breadcrumbsService: BreadcrumbsService, @Optional() protected klaroService: KlaroService, + protected themeService: ThemeService, ) { } @@ -192,11 +194,13 @@ export abstract class InitService { * Start route-listening subscriptions * - {@link MetadataService.listenForRouteChange} * - {@link BreadcrumbsService.listenForRouteChanges} + * - {@link ThemeService.listenForRouteChanges} * @protected */ protected initRouteListeners(): void { this.metadata.listenForRouteChange(); this.breadcrumbsService.listenForRouteChanges(); + this.themeService.listenForRouteChanges(); } /** diff --git a/src/app/navbar/navbar.component.html b/src/app/navbar/navbar.component.html index fc5d1a2ef3..8531543361 100644 --- a/src/app/navbar/navbar.component.html +++ b/src/app/navbar/navbar.component.html @@ -6,10 +6,10 @@
- \ No newline at end of file + diff --git a/src/app/shared/mocks/theme-service.mock.ts b/src/app/shared/mocks/theme-service.mock.ts index 058ba993bc..e3c2960e51 100644 --- a/src/app/shared/mocks/theme-service.mock.ts +++ b/src/app/shared/mocks/theme-service.mock.ts @@ -8,6 +8,7 @@ export function getMockThemeService(themeName = 'base', themes?: ThemeConfig[]): getThemeName: themeName, getThemeName$: observableOf(themeName), getThemeConfigFor: undefined, + listenForRouteChanges: undefined, }); if (isNotEmpty(themes)) { diff --git a/src/app/shared/theme-support/theme.service.spec.ts b/src/app/shared/theme-support/theme.service.spec.ts index 84043369c0..43b5964b8c 100644 --- a/src/app/shared/theme-support/theme.service.spec.ts +++ b/src/app/shared/theme-support/theme.service.spec.ts @@ -2,7 +2,7 @@ import { of as observableOf } from 'rxjs'; import { TestBed } from '@angular/core/testing'; import { provideMockActions } from '@ngrx/effects/testing'; import { LinkService } from '../../core/cache/builders/link.service'; -import { cold, hot } from 'jasmine-marbles'; +import { hot } from 'jasmine-marbles'; import { SetThemeAction } from './theme.actions'; import { Theme } from '../../../config/theme.model'; import { provideMockStore } from '@ngrx/store/testing'; @@ -21,7 +21,9 @@ import { import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; import { ThemeService } from './theme.service'; import { ROUTER_NAVIGATED } from '@ngrx/router-store'; -import { ActivatedRouteSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Router } from '@angular/router'; +import { CommonModule, DOCUMENT } from '@angular/common'; +import { RouterMock } from '../mocks/router.mock'; /** * LinkService able to mock recursively resolving DSO parent links @@ -84,12 +86,16 @@ describe('ThemeService', () => { findById: () => createSuccessfulRemoteDataObject$(mockCommunity) }; TestBed.configureTestingModule({ + imports: [ + CommonModule, + ], providers: [ ThemeService, { provide: LinkService, useValue: linkService }, provideMockStore({ initialState }), provideMockActions(() => mockActions), - { provide: DSpaceObjectDataService, useValue: mockDsoService } + { provide: DSpaceObjectDataService, useValue: mockDsoService }, + { provide: Router, useValue: new RouterMock() }, ] }); @@ -367,4 +373,49 @@ describe('ThemeService', () => { }); }); }); + + describe('listenForThemeChanges', () => { + let document; + let headSpy; + + beforeEach(() => { + const mockDsoService = { + findById: () => createSuccessfulRemoteDataObject$(mockCommunity) + }; + + TestBed.configureTestingModule({ + imports: [ + CommonModule, + ], + providers: [ + ThemeService, + { provide: LinkService, useValue: linkService }, + provideMockStore({ initialState }), + { provide: DSpaceObjectDataService, useValue: mockDsoService }, + { provide: Router, useValue: new RouterMock() }, + ] + }); + + document = TestBed.inject(DOCUMENT); + headSpy = jasmine.createSpyObj('head', ['appendChild', 'getElementsByClassName']); + headSpy.getElementsByClassName.and.returnValue([]); + spyOn(document, 'getElementsByTagName').and.returnValue([headSpy]); + + themeService = TestBed.inject(ThemeService); + spyOn(themeService, 'getThemeName').and.returnValue('custom'); + spyOn(themeService, 'getThemeName$').and.returnValue(observableOf('custom')); + }); + + it('should append a link element with the correct attributes to the head element', () => { + themeService.listenForThemeChanges(true); + + const link = document.createElement('link'); + link.setAttribute('rel', 'stylesheet'); + link.setAttribute('type', 'text/css'); + link.setAttribute('class', '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 4a4f6ae986..7642b7097e 100644 --- a/src/app/shared/theme-support/theme.service.ts +++ b/src/app/shared/theme-support/theme.service.ts @@ -1,10 +1,10 @@ -import { Injectable, Inject } from '@angular/core'; -import { Store, createFeatureSelector, createSelector, select } from '@ngrx/store'; -import { EMPTY, Observable, of as observableOf } from 'rxjs'; +import { Inject, Injectable } from '@angular/core'; +import { createFeatureSelector, createSelector, select, Store } from '@ngrx/store'; +import { BehaviorSubject, EMPTY, Observable, of as observableOf } from 'rxjs'; import { ThemeState } from './theme.reducer'; import { SetThemeAction, ThemeActionTypes } from './theme.actions'; import { expand, filter, map, switchMap, take, toArray } from 'rxjs/operators'; -import { hasValue, isNotEmpty } from '../empty.util'; +import { hasNoValue, hasValue, isNotEmpty } from '../empty.util'; import { RemoteData } from '../../core/data/remote-data'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { @@ -12,14 +12,18 @@ import { getFirstSucceededRemoteData, getRemoteDataPayload } from '../../core/shared/operators'; -import { Theme, ThemeConfig, themeFactory } from '../../../config/theme.model'; +import { HeadTagConfig, Theme, ThemeConfig, themeFactory } from '../../../config/theme.model'; import { NO_OP_ACTION_TYPE, NoOpAction } from '../ngrx/no-op.action'; import { followLink } from '../utils/follow-link-config.model'; import { LinkService } from '../../core/cache/builders/link.service'; import { environment } from '../../../environments/environment'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; -import { ActivatedRouteSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, ResolveEnd, Router } from '@angular/router'; import { GET_THEME_CONFIG_FOR_FACTORY } from '../object-collection/shared/listable-object/listable-object.decorator'; +import { distinctNext } from 'src/app/core/shared/distinct-next'; +import { DOCUMENT } from '@angular/common'; +import { getDefaultThemeConfig } from '../../../config/config.util'; +import { BASE_THEME_NAME } from './theme.constants'; export const themeStateSelector = createFeatureSelector('theme'); @@ -42,11 +46,16 @@ export class ThemeService { */ hasDynamicTheme: boolean; + private _isThemeLoading$ = new BehaviorSubject(false); + private _isThemeCSSLoading$ = new BehaviorSubject(false); + constructor( private store: Store, private linkService: LinkService, private dSpaceObjectDataService: DSpaceObjectDataService, - @Inject(GET_THEME_CONFIG_FOR_FACTORY) private gtcf: (str) => ThemeConfig + @Inject(GET_THEME_CONFIG_FOR_FACTORY) private gtcf: (str) => ThemeConfig, + private router: Router, + @Inject(DOCUMENT) private document: any, ) { // Create objects from the theme configs in the environment file this.themes = environment.themes.map((themeConfig: ThemeConfig) => themeFactory(themeConfig)); @@ -78,6 +87,159 @@ export class ThemeService { ); } + get isThemeLoading$(): Observable { + return this._isThemeLoading$; + } + + listenForThemeChanges(isBrowser: boolean): void { + this.getThemeName$().subscribe((themeName: string) => { + if (isBrowser) { + // the theme css will never download server side, so this should only happen on the browser + distinctNext(this._isThemeCSSLoading$, true); + } + if (hasValue(themeName)) { + this.loadGlobalThemeConfig(themeName); + } else { + const defaultThemeConfig = getDefaultThemeConfig(); + if (hasValue(defaultThemeConfig)) { + this.loadGlobalThemeConfig(defaultThemeConfig.name); + } else { + this.loadGlobalThemeConfig(BASE_THEME_NAME); + } + } + }); + } + + listenForRouteChanges(): void { + this.router.events.pipe( + filter(event => event instanceof ResolveEnd), + switchMap((event: ResolveEnd) => this.updateThemeOnRouteChange$(event.urlAfterRedirects, event.state.root)), + switchMap((changed) => { + if (changed) { + return this._isThemeCSSLoading$; + } else { + return [false]; + } + }) + ).subscribe((changed) => { + distinctNext(this._isThemeLoading$, changed); + }); + } + + private loadGlobalThemeConfig(themeName: string): void { + this.setThemeCss(themeName); + this.setHeadTags(themeName); + } + + /** + * Update the theme css file in + * + * @param themeName The name of the new theme + * @private + */ + private setThemeCss(themeName: string): void { + const head = this.document.getElementsByTagName('head')[0]; + if (hasNoValue(head)) { + return; + } + + // Array.from to ensure we end up with an array, not an HTMLCollection, which would be + // automatically updated if we add nodes later + const currentThemeLinks = Array.from(head.getElementsByClassName('theme-css')); + const link = this.document.createElement('link'); + link.setAttribute('rel', 'stylesheet'); + link.setAttribute('type', 'text/css'); + link.setAttribute('class', '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 = () => { + if (isNotEmpty(currentThemeLinks)) { + currentThemeLinks.forEach((currentThemeLink: any) => { + if (hasValue(currentThemeLink)) { + currentThemeLink.remove(); + } + }); + } + // the fact that this callback is used, proves we're on the browser. + distinctNext(this._isThemeCSSLoading$, false); + }; + head.appendChild(link); + } + + private setHeadTags(themeName: string): void { + const head = this.document.getElementsByTagName('head')[0]; + if (hasNoValue(head)) { + return; + } + + // clear head tags + const currentHeadTags = Array.from(head.getElementsByClassName('theme-head-tag')); + if (hasValue(currentHeadTags)) { + currentHeadTags.forEach((currentHeadTag: any) => currentHeadTag.remove()); + } + + // create new head tags (not yet added to DOM) + const headTagFragment = this.document.createDocumentFragment(); + this.createHeadTags(themeName) + .forEach(newHeadTag => headTagFragment.appendChild(newHeadTag)); + + // add new head tags to DOM + head.appendChild(headTagFragment); + } + + private createHeadTags(themeName: string): HTMLElement[] { + const themeConfig = this.getThemeConfigFor(themeName); + const headTagConfigs = themeConfig?.headTags; + + if (hasNoValue(headTagConfigs)) { + const parentThemeName = themeConfig?.extends; + if (hasValue(parentThemeName)) { + // inherit the head tags of the parent theme + return this.createHeadTags(parentThemeName); + } + const defaultThemeConfig = getDefaultThemeConfig(); + const defaultThemeName = defaultThemeConfig.name; + if ( + hasNoValue(defaultThemeName) || + themeName === defaultThemeName || + themeName === BASE_THEME_NAME + ) { + // last resort, use fallback favicon.ico + return [ + this.createHeadTag({ + 'tagName': 'link', + 'attributes': { + 'rel': 'icon', + 'href': 'assets/images/favicon.ico', + 'sizes': 'any', + } + }) + ]; + } + + // inherit the head tags of the default theme + return this.createHeadTags(defaultThemeConfig.name); + } + + return headTagConfigs.map(this.createHeadTag.bind(this)); + } + + private createHeadTag(headTagConfig: HeadTagConfig): HTMLElement { + const tag = this.document.createElement(headTagConfig.tagName); + + if (hasValue(headTagConfig.attributes)) { + Object.entries(headTagConfig.attributes) + .forEach(([key, value]) => tag.setAttribute(key, value)); + } + + // 'class' attribute should always be 'theme-head-tag' for removal + tag.setAttribute('class', 'theme-head-tag'); + + return tag; + } + + /** * Determine whether or not the theme needs to change depending on the current route's URL and snapshot data * If the snapshot contains a dso, this will be used to match a theme diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index f675c55718..e5718045c6 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -25,6 +25,7 @@ import { BreadcrumbsService } from '../../app/breadcrumbs/breadcrumbs.service'; import { CSSVariableService } from '../../app/shared/sass-helper/sass-helper.service'; import { KlaroService } from '../../app/shared/cookies/klaro.service'; import { AuthService } from '../../app/core/auth/auth.service'; +import { ThemeService } from '../../app/shared/theme-support/theme.service'; /** * Performs client-side initialization. @@ -46,6 +47,7 @@ export class BrowserInitService extends InitService { protected cssService: CSSVariableService, @Optional() protected klaroService: KlaroService, protected authService: AuthService, + protected themeService: ThemeService, ) { super( store, @@ -59,6 +61,7 @@ export class BrowserInitService extends InitService { metadata, breadcrumbsService, klaroService, + themeService, ); } @@ -83,6 +86,7 @@ export class BrowserInitService extends InitService { this.initI18n(); this.initAnalytics(); this.initRouteListeners(); + this.themeService.listenForThemeChanges(true); this.trackAuthTokenExpiration(); this.initKlaro(); diff --git a/src/modules/app/server-init.service.ts b/src/modules/app/server-init.service.ts index fc7fc66bf7..9e23bbeef3 100644 --- a/src/modules/app/server-init.service.ts +++ b/src/modules/app/server-init.service.ts @@ -22,6 +22,7 @@ import { MetadataService } from '../../app/core/metadata/metadata.service'; import { BreadcrumbsService } from '../../app/breadcrumbs/breadcrumbs.service'; import { CSSVariableService } from '../../app/shared/sass-helper/sass-helper.service'; import { KlaroService } from '../../app/shared/cookies/klaro.service'; +import { ThemeService } from '../../app/shared/theme-support/theme.service'; /** * Performs server-side initialization. @@ -42,6 +43,7 @@ export class ServerInitService extends InitService { protected breadcrumbsService: BreadcrumbsService, protected cssService: CSSVariableService, @Optional() protected klaroService: KlaroService, + protected themeService: ThemeService, ) { super( store, @@ -55,6 +57,7 @@ export class ServerInitService extends InitService { metadata, breadcrumbsService, klaroService, + themeService, ); } @@ -69,6 +72,7 @@ export class ServerInitService extends InitService { this.initI18n(); this.initAnalytics(); this.initRouteListeners(); + this.themeService.listenForThemeChanges(false); this.initKlaro(); From 5ff80a8a02e38ddca2e68f9a7ea80faca4eb0d59 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Fri, 22 Jul 2022 13:31:46 +0200 Subject: [PATCH 05/24] 93219: Fold DSpaceTransferState into InitService --- src/app/init.service.spec.ts | 2 -- src/app/init.service.ts | 18 ++++++-------- src/modules/app/browser-app.module.ts | 6 ++--- src/modules/app/browser-init.service.ts | 24 +++++++++++++++---- src/modules/app/server-app.module.ts | 5 ++-- src/modules/app/server-init.service.ts | 21 ++++++++++++---- .../dspace-browser-transfer-state.module.ts | 16 ------------- .../dspace-browser-transfer-state.service.ts | 19 --------------- .../dspace-server-transfer-state.module.ts | 16 ------------- .../dspace-server-transfer-state.service.ts | 20 ---------------- .../dspace-transfer-state.service.ts | 18 -------------- 11 files changed, 48 insertions(+), 117 deletions(-) delete mode 100644 src/modules/transfer-state/dspace-browser-transfer-state.module.ts delete mode 100644 src/modules/transfer-state/dspace-browser-transfer-state.service.ts delete mode 100644 src/modules/transfer-state/dspace-server-transfer-state.module.ts delete mode 100644 src/modules/transfer-state/dspace-server-transfer-state.service.ts delete mode 100644 src/modules/transfer-state/dspace-transfer-state.service.ts diff --git a/src/app/init.service.spec.ts b/src/app/init.service.spec.ts index c046ad5715..181fe58700 100644 --- a/src/app/init.service.spec.ts +++ b/src/app/init.service.spec.ts @@ -25,7 +25,6 @@ import { RouteService } from './core/services/route.service'; import { getMockLocaleService } from './app.component.spec'; import { MenuServiceStub } from './shared/testing/menu-service.stub'; import { CorrelationIdService } from './correlation-id/correlation-id.service'; -import { DSpaceTransferState } from '../modules/transfer-state/dspace-transfer-state.service'; import { KlaroService } from './shared/cookies/klaro.service'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { TranslateLoaderMock } from './shared/mocks/translate-loader.mock'; @@ -161,7 +160,6 @@ describe('InitService', () => { providers: [ { provide: InitService, useClass: ConcreteInitServiceMock }, { provide: CorrelationIdService, useValue: correlationIdServiceSpy }, - { provide: DSpaceTransferState, useValue: dspaceTransferStateSpy }, { provide: APP_CONFIG, useValue: environment }, { provide: LocaleService, useValue: getMockLocaleService() }, { provide: Angulartics2DSpace, useValue: new AngularticsProviderMock() }, diff --git a/src/app/init.service.ts b/src/app/init.service.ts index 62461212d2..ae04b6a82e 100644 --- a/src/app/init.service.ts +++ b/src/app/init.service.ts @@ -8,9 +8,8 @@ import { select, Store } from '@ngrx/store'; import { CheckAuthenticationTokenAction } from './core/auth/auth.actions'; import { CorrelationIdService } from './correlation-id/correlation-id.service'; -import { DSpaceTransferState } from '../modules/transfer-state/dspace-transfer-state.service'; import { APP_INITIALIZER, Inject, Optional, Provider, Type } from '@angular/core'; -import { TransferState } from '@angular/platform-browser'; +import { makeStateKey, TransferState } from '@angular/platform-browser'; import { APP_CONFIG, AppConfig } from '../config/app-config.interface'; import { environment } from '../environments/environment'; import { AppState } from './app.reducer'; @@ -38,10 +37,15 @@ import { ThemeService } from './shared/theme-support/theme.service'; * For example, NgbModal depends on ApplicationRef and can therefore not be used during initialization. */ export abstract class InitService { + /** + * The state transfer key to use for the NgRx store state + * @protected + */ + protected static NGRX_STATE = makeStateKey('NGRX_STATE'); + protected constructor( protected store: Store, protected correlationIdService: CorrelationIdService, - protected dspaceTransferState: DSpaceTransferState, @Inject(APP_CONFIG) protected appConfig: AppConfig, protected translate: TranslateService, protected localeService: LocaleService, @@ -130,14 +134,6 @@ export abstract class InitService { this.correlationIdService.initCorrelationId(); } - /** - * Transfer the application's NgRx state between server-side and client-side - * @protected - */ - protected async transferAppState(): Promise { - return this.dspaceTransferState.transfer(); - } - /** * Make sure the {@link environment} matches {@link APP_CONFIG} and print * some information about it to the console diff --git a/src/modules/app/browser-app.module.ts b/src/modules/app/browser-app.module.ts index cd3feedad8..d857b14dbd 100644 --- a/src/modules/app/browser-app.module.ts +++ b/src/modules/app/browser-app.module.ts @@ -1,6 +1,6 @@ import { HttpClient, HttpClientModule } from '@angular/common/http'; import { NgModule } from '@angular/core'; -import { BrowserModule, makeStateKey, TransferState } from '@angular/platform-browser'; +import { BrowserModule, BrowserTransferStateModule, makeStateKey, TransferState } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { REQUEST } from '@nguniversal/express-engine/tokens'; @@ -12,7 +12,6 @@ import { IdlePreloadModule } from 'angular-idle-preload'; import { AppComponent } from '../../app/app.component'; import { AppModule } from '../../app/app.module'; -import { DSpaceBrowserTransferStateModule } from '../transfer-state/dspace-browser-transfer-state.module'; import { ClientCookieService } from '../../app/core/services/client-cookie.service'; import { CookieService } from '../../app/core/services/cookie.service'; import { AuthService } from '../../app/core/auth/auth.service'; @@ -28,7 +27,6 @@ import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.se import { AuthRequestService } from '../../app/core/auth/auth-request.service'; import { BrowserAuthRequestService } from '../../app/core/auth/browser-auth-request.service'; import { BrowserInitService } from './browser-init.service'; -import { InitService } from '../../app/init.service'; export const REQ_KEY = makeStateKey('req'); @@ -52,7 +50,7 @@ export function getRequest(transferState: TransferState): any { StatisticsModule.forRoot(), Angulartics2RouterlessModule.forRoot(), BrowserAnimationsModule, - DSpaceBrowserTransferStateModule, + BrowserTransferStateModule, TranslateModule.forRoot({ loader: { provide: TranslateLoader, diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index e5718045c6..28d2e0aad5 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -8,7 +8,6 @@ import { InitService } from '../../app/init.service'; import { Store } from '@ngrx/store'; import { AppState } from '../../app/app.reducer'; -import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service'; import { TransferState } from '@angular/platform-browser'; import { APP_CONFIG, APP_CONFIG_STATE, AppConfig } from '../../config/app-config.interface'; import { DefaultAppConfig } from '../../config/default-app-config'; @@ -26,6 +25,10 @@ import { CSSVariableService } from '../../app/shared/sass-helper/sass-helper.ser import { KlaroService } from '../../app/shared/cookies/klaro.service'; import { AuthService } from '../../app/core/auth/auth.service'; import { ThemeService } from '../../app/shared/theme-support/theme.service'; +import { StoreAction, StoreActionTypes } from '../../app/store.actions'; +import { coreSelector } from '../../app/core/core.selectors'; +import { find, map } from 'rxjs/operators'; +import { isNotEmpty } from '../../app/shared/empty.util'; /** * Performs client-side initialization. @@ -36,7 +39,6 @@ export class BrowserInitService extends InitService { protected store: Store, protected correlationIdService: CorrelationIdService, protected transferState: TransferState, - protected dspaceTransferState: DSpaceTransferState, @Inject(APP_CONFIG) protected appConfig: AppConfig, protected translate: TranslateService, protected localeService: LocaleService, @@ -52,7 +54,6 @@ export class BrowserInitService extends InitService { super( store, correlationIdService, - dspaceTransferState, appConfig, translate, localeService, @@ -77,7 +78,7 @@ export class BrowserInitService extends InitService { protected init(): () => Promise { return async () => { - await this.transferAppState(); + await this.loadAppState(); this.checkAuthenticationToken(); this.initCorrelationId(); @@ -97,6 +98,21 @@ export class BrowserInitService extends InitService { // Browser-only initialization steps + /** + * Retrieve server-side application state from the {@link NGRX_STATE} key and rehydrate the store. + * Resolves once the store is no longer empty. + * @private + */ + private async loadAppState(): Promise { + const state = this.transferState.get(InitService.NGRX_STATE, null); + this.transferState.remove(InitService.NGRX_STATE); + this.store.dispatch(new StoreAction(StoreActionTypes.REHYDRATE, state)); + return this.store.select(coreSelector).pipe( + find((core: any) => isNotEmpty(core)), + map(() => true) + ).toPromise(); + } + private trackAuthTokenExpiration(): void { this.authService.trackTokenExpiration(); } diff --git a/src/modules/app/server-app.module.ts b/src/modules/app/server-app.module.ts index 2b0462e9a0..c87963b2f8 100644 --- a/src/modules/app/server-app.module.ts +++ b/src/modules/app/server-app.module.ts @@ -2,7 +2,7 @@ import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { NgModule } from '@angular/core'; import { BrowserModule, TransferState } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { ServerModule } from '@angular/platform-server'; +import { ServerModule, ServerTransferStateModule } from '@angular/platform-server'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; @@ -12,7 +12,6 @@ import { Angulartics2GoogleAnalytics } from 'angulartics2/ga'; import { AppComponent } from '../../app/app.component'; import { AppModule } from '../../app/app.module'; -import { DSpaceServerTransferStateModule } from '../transfer-state/dspace-server-transfer-state.module'; import { TranslateServerLoader } from '../../ngx-translate-loaders/translate-server.loader'; import { CookieService } from '../../app/core/services/cookie.service'; import { ServerCookieService } from '../../app/core/services/server-cookie.service'; @@ -43,7 +42,7 @@ export function createTranslateLoader(transferState: TransferState) { appId: 'dspace-angular' }), NoopAnimationsModule, - DSpaceServerTransferStateModule, + ServerTransferStateModule, TranslateModule.forRoot({ loader: { provide: TranslateLoader, diff --git a/src/modules/app/server-init.service.ts b/src/modules/app/server-init.service.ts index 9e23bbeef3..a0e0b84769 100644 --- a/src/modules/app/server-init.service.ts +++ b/src/modules/app/server-init.service.ts @@ -9,7 +9,6 @@ import { InitService } from '../../app/init.service'; import { Store } from '@ngrx/store'; import { AppState } from '../../app/app.reducer'; import { TransferState } from '@angular/platform-browser'; -import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service'; import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; import { APP_CONFIG, APP_CONFIG_STATE, AppConfig } from '../../config/app-config.interface'; import { environment } from '../../environments/environment'; @@ -23,6 +22,7 @@ import { BreadcrumbsService } from '../../app/breadcrumbs/breadcrumbs.service'; import { CSSVariableService } from '../../app/shared/sass-helper/sass-helper.service'; import { KlaroService } from '../../app/shared/cookies/klaro.service'; import { ThemeService } from '../../app/shared/theme-support/theme.service'; +import { take } from 'rxjs/operators'; /** * Performs server-side initialization. @@ -33,7 +33,6 @@ export class ServerInitService extends InitService { protected store: Store, protected correlationIdService: CorrelationIdService, protected transferState: TransferState, - protected dspaceTransferState: DSpaceTransferState, @Inject(APP_CONFIG) protected appConfig: AppConfig, protected translate: TranslateService, protected localeService: LocaleService, @@ -48,7 +47,6 @@ export class ServerInitService extends InitService { super( store, correlationIdService, - dspaceTransferState, appConfig, translate, localeService, @@ -65,7 +63,7 @@ export class ServerInitService extends InitService { return async () => { this.checkAuthenticationToken(); this.saveAppConfigForCSR(); - this.transferAppState(); // todo: SSR breaks if we await this (why?) + this.saveAppState(); this.initCorrelationId(); this.checkEnvironment(); @@ -82,6 +80,21 @@ export class ServerInitService extends InitService { // Server-only initialization steps + /** + * Set the {@link NGRX_STATE} key when state is serialized to be transfered + * @private + */ + private saveAppState() { + this.transferState.onSerialize(InitService.NGRX_STATE, () => { + let state; + this.store.pipe(take(1)).subscribe((saveState: any) => { + state = saveState; + }); + + return state; + }); + } + private saveAppConfigForCSR(): void { this.transferState.set(APP_CONFIG_STATE, environment as AppConfig); } diff --git a/src/modules/transfer-state/dspace-browser-transfer-state.module.ts b/src/modules/transfer-state/dspace-browser-transfer-state.module.ts deleted file mode 100644 index e251d0b3b2..0000000000 --- a/src/modules/transfer-state/dspace-browser-transfer-state.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { BrowserTransferStateModule } from '@angular/platform-browser'; -import { DSpaceBrowserTransferState } from './dspace-browser-transfer-state.service'; -import { DSpaceTransferState } from './dspace-transfer-state.service'; - -@NgModule({ - imports: [ - BrowserTransferStateModule - ], - providers: [ - { provide: DSpaceTransferState, useClass: DSpaceBrowserTransferState } - ] -}) -export class DSpaceBrowserTransferStateModule { - -} diff --git a/src/modules/transfer-state/dspace-browser-transfer-state.service.ts b/src/modules/transfer-state/dspace-browser-transfer-state.service.ts deleted file mode 100644 index 512d6aeb71..0000000000 --- a/src/modules/transfer-state/dspace-browser-transfer-state.service.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Injectable } from '@angular/core'; -import { coreSelector } from 'src/app/core/core.selectors'; -import { StoreAction, StoreActionTypes } from '../../app/store.actions'; -import { DSpaceTransferState } from './dspace-transfer-state.service'; -import { find, map } from 'rxjs/operators'; -import { isNotEmpty } from '../../app/shared/empty.util'; - -@Injectable() -export class DSpaceBrowserTransferState extends DSpaceTransferState { - transfer(): Promise { - const state = this.transferState.get(DSpaceTransferState.NGRX_STATE, null); - this.transferState.remove(DSpaceTransferState.NGRX_STATE); - this.store.dispatch(new StoreAction(StoreActionTypes.REHYDRATE, state)); - return this.store.select(coreSelector).pipe( - find((core: any) => isNotEmpty(core)), - map(() => true) - ).toPromise(); - } -} diff --git a/src/modules/transfer-state/dspace-server-transfer-state.module.ts b/src/modules/transfer-state/dspace-server-transfer-state.module.ts deleted file mode 100644 index f8f2631cd0..0000000000 --- a/src/modules/transfer-state/dspace-server-transfer-state.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { ServerTransferStateModule } from '@angular/platform-server'; -import { DSpaceServerTransferState } from './dspace-server-transfer-state.service'; -import { DSpaceTransferState } from './dspace-transfer-state.service'; - -@NgModule({ - imports: [ - ServerTransferStateModule - ], - providers: [ - { provide: DSpaceTransferState, useClass: DSpaceServerTransferState } - ] -}) -export class DSpaceServerTransferStateModule { - -} diff --git a/src/modules/transfer-state/dspace-server-transfer-state.service.ts b/src/modules/transfer-state/dspace-server-transfer-state.service.ts deleted file mode 100644 index 96b1e4be38..0000000000 --- a/src/modules/transfer-state/dspace-server-transfer-state.service.ts +++ /dev/null @@ -1,20 +0,0 @@ - -import {take} from 'rxjs/operators'; -import { Injectable } from '@angular/core'; -import { DSpaceTransferState } from './dspace-transfer-state.service'; - -@Injectable() -export class DSpaceServerTransferState extends DSpaceTransferState { - transfer(): Promise { - this.transferState.onSerialize(DSpaceTransferState.NGRX_STATE, () => { - let state; - this.store.pipe(take(1)).subscribe((saveState: any) => { - state = saveState; - }); - - return state; - }); - - return new Promise(() => true); - } -} diff --git a/src/modules/transfer-state/dspace-transfer-state.service.ts b/src/modules/transfer-state/dspace-transfer-state.service.ts deleted file mode 100644 index 32761866fb..0000000000 --- a/src/modules/transfer-state/dspace-transfer-state.service.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Injectable } from '@angular/core'; -import { makeStateKey, TransferState } from '@angular/platform-browser'; -import { Store } from '@ngrx/store'; -import { AppState } from '../../app/app.reducer'; - -@Injectable() -export abstract class DSpaceTransferState { - - protected static NGRX_STATE = makeStateKey('NGRX_STATE'); - - constructor( - protected transferState: TransferState, - protected store: Store - ) { - } - - abstract transfer(): Promise; -} From 67b4cce25d0b2adae8cb3c803aa886632f26df66 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Tue, 26 Jul 2022 09:50:39 +0200 Subject: [PATCH 06/24] 92319: Move Klaro & GA steps to BrowserInitService --- src/app/init.service.ts | 33 ++--------------------- src/modules/app/browser-init.service.ts | 35 +++++++++++++++++++------ src/modules/app/server-init.service.ts | 12 ++------- 3 files changed, 31 insertions(+), 49 deletions(-) diff --git a/src/app/init.service.ts b/src/app/init.service.ts index ae04b6a82e..30630e1d84 100644 --- a/src/app/init.service.ts +++ b/src/app/init.service.ts @@ -16,14 +16,9 @@ import { AppState } from './app.reducer'; import { isEqual } from 'lodash'; import { TranslateService } from '@ngx-translate/core'; import { LocaleService } from './core/locale/locale.service'; -import { hasValue } from './shared/empty.util'; import { Angulartics2DSpace } from './statistics/angulartics/dspace-provider'; -import { GoogleAnalyticsService } from './statistics/google-analytics.service'; import { MetadataService } from './core/metadata/metadata.service'; import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service'; -import { distinctUntilChanged, filter, take, tap } from 'rxjs/operators'; -import { isAuthenticationBlocking } from './core/auth/selectors'; -import { KlaroService } from './shared/cookies/klaro.service'; import { ThemeService } from './shared/theme-support/theme.service'; /** @@ -50,10 +45,8 @@ export abstract class InitService { protected translate: TranslateService, protected localeService: LocaleService, protected angulartics2DSpace: Angulartics2DSpace, - @Optional() protected googleAnalyticsService: GoogleAnalyticsService, protected metadata: MetadataService, protected breadcrumbsService: BreadcrumbsService, - @Optional() protected klaroService: KlaroService, protected themeService: ThemeService, ) { } @@ -174,15 +167,10 @@ export abstract class InitService { } /** - * Initialize analytics services - * - Angulartics - * - Google Analytics (if enabled) + * Initialize Angulartics * @protected */ - protected initAnalytics(): void { - if (hasValue(this.googleAnalyticsService)) { - this.googleAnalyticsService.addTrackingIdToPage(); - } + protected initAngulartics(): void { this.angulartics2DSpace.startTracking(); } @@ -198,21 +186,4 @@ export abstract class InitService { this.breadcrumbsService.listenForRouteChanges(); this.themeService.listenForRouteChanges(); } - - /** - * Initialize Klaro (if enabled) - * @protected - */ - protected initKlaro() { - if (hasValue(this.klaroService)) { - this.store.pipe( - select(isAuthenticationBlocking), - distinctUntilChanged(), - filter((isBlocking: boolean) => isBlocking === false), - take(1) - ).subscribe(() => { - this.klaroService.initialize(); - }); - } - } } diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index 28d2e0aad5..733a776a73 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -6,7 +6,7 @@ * http://www.dspace.org/license/ */ import { InitService } from '../../app/init.service'; -import { Store } from '@ngrx/store'; +import { select, Store } from '@ngrx/store'; import { AppState } from '../../app/app.reducer'; import { TransferState } from '@angular/platform-browser'; import { APP_CONFIG, APP_CONFIG_STATE, AppConfig } from '../../config/app-config.interface'; @@ -14,7 +14,7 @@ import { DefaultAppConfig } from '../../config/default-app-config'; import { extendEnvironmentWithAppConfig } from '../../config/config.util'; import { environment } from '../../environments/environment'; import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; -import { Inject, Injectable, Optional } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { LocaleService } from '../../app/core/locale/locale.service'; import { Angulartics2DSpace } from '../../app/statistics/angulartics/dspace-provider'; @@ -27,8 +27,9 @@ import { AuthService } from '../../app/core/auth/auth.service'; import { ThemeService } from '../../app/shared/theme-support/theme.service'; import { StoreAction, StoreActionTypes } from '../../app/store.actions'; import { coreSelector } from '../../app/core/core.selectors'; -import { find, map } from 'rxjs/operators'; +import { distinctUntilChanged, filter, find, map, take } from 'rxjs/operators'; import { isNotEmpty } from '../../app/shared/empty.util'; +import { isAuthenticationBlocking } from '../../app/core/auth/selectors'; /** * Performs client-side initialization. @@ -43,11 +44,11 @@ export class BrowserInitService extends InitService { protected translate: TranslateService, protected localeService: LocaleService, protected angulartics2DSpace: Angulartics2DSpace, - @Optional() protected googleAnalyticsService: GoogleAnalyticsService, + protected googleAnalyticsService: GoogleAnalyticsService, protected metadata: MetadataService, protected breadcrumbsService: BreadcrumbsService, protected cssService: CSSVariableService, - @Optional() protected klaroService: KlaroService, + protected klaroService: KlaroService, protected authService: AuthService, protected themeService: ThemeService, ) { @@ -58,10 +59,8 @@ export class BrowserInitService extends InitService { translate, localeService, angulartics2DSpace, - googleAnalyticsService, metadata, breadcrumbsService, - klaroService, themeService, ); } @@ -85,7 +84,8 @@ export class BrowserInitService extends InitService { this.checkEnvironment(); this.initI18n(); - this.initAnalytics(); + this.initAngulartics(); + this.initGoogleAnalytics(); this.initRouteListeners(); this.themeService.listenForThemeChanges(true); this.trackAuthTokenExpiration(); @@ -116,4 +116,23 @@ export class BrowserInitService extends InitService { private trackAuthTokenExpiration(): void { this.authService.trackTokenExpiration(); } + + /** + * Initialize Klaro + * @protected + */ + protected initKlaro() { + this.store.pipe( + select(isAuthenticationBlocking), + distinctUntilChanged(), + filter((isBlocking: boolean) => isBlocking === false), + take(1) + ).subscribe(() => { + this.klaroService.initialize(); + }); + } + + protected initGoogleAnalytics() { + this.googleAnalyticsService.addTrackingIdToPage(); + } } diff --git a/src/modules/app/server-init.service.ts b/src/modules/app/server-init.service.ts index a0e0b84769..803dc7a75a 100644 --- a/src/modules/app/server-init.service.ts +++ b/src/modules/app/server-init.service.ts @@ -12,15 +12,13 @@ import { TransferState } from '@angular/platform-browser'; import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; import { APP_CONFIG, APP_CONFIG_STATE, AppConfig } from '../../config/app-config.interface'; import { environment } from '../../environments/environment'; -import { Inject, Injectable, Optional } from '@angular/core'; +import { Inject, Injectable } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { LocaleService } from '../../app/core/locale/locale.service'; import { Angulartics2DSpace } from '../../app/statistics/angulartics/dspace-provider'; -import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.service'; import { MetadataService } from '../../app/core/metadata/metadata.service'; import { BreadcrumbsService } from '../../app/breadcrumbs/breadcrumbs.service'; import { CSSVariableService } from '../../app/shared/sass-helper/sass-helper.service'; -import { KlaroService } from '../../app/shared/cookies/klaro.service'; import { ThemeService } from '../../app/shared/theme-support/theme.service'; import { take } from 'rxjs/operators'; @@ -37,11 +35,9 @@ export class ServerInitService extends InitService { protected translate: TranslateService, protected localeService: LocaleService, protected angulartics2DSpace: Angulartics2DSpace, - @Optional() protected googleAnalyticsService: GoogleAnalyticsService, protected metadata: MetadataService, protected breadcrumbsService: BreadcrumbsService, protected cssService: CSSVariableService, - @Optional() protected klaroService: KlaroService, protected themeService: ThemeService, ) { super( @@ -51,10 +47,8 @@ export class ServerInitService extends InitService { translate, localeService, angulartics2DSpace, - googleAnalyticsService, metadata, breadcrumbsService, - klaroService, themeService, ); } @@ -68,12 +62,10 @@ export class ServerInitService extends InitService { this.checkEnvironment(); this.initI18n(); - this.initAnalytics(); + this.initAngulartics(); this.initRouteListeners(); this.themeService.listenForThemeChanges(false); - this.initKlaro(); - return true; }; } From ca87f0962533910653d9bcf524b212462372fd71 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Fri, 29 Jul 2022 15:51:23 +0200 Subject: [PATCH 07/24] Update specs --- src/app/init.service.spec.ts | 93 +---------- src/modules/app/browser-init.service.spec.ts | 155 +++++++++++++++++++ src/modules/app/browser-init.service.ts | 1 - 3 files changed, 158 insertions(+), 91 deletions(-) create mode 100644 src/modules/app/browser-init.service.spec.ts diff --git a/src/app/init.service.spec.ts b/src/app/init.service.spec.ts index 181fe58700..2c9edfd4e0 100644 --- a/src/app/init.service.spec.ts +++ b/src/app/init.service.spec.ts @@ -2,11 +2,10 @@ import { InitService } from './init.service'; import { APP_CONFIG } from 'src/config/app-config.interface'; import { APP_INITIALIZER, Injectable } from '@angular/core'; import { inject, TestBed, waitForAsync } from '@angular/core/testing'; -import { GoogleAnalyticsService } from './statistics/google-analytics.service'; import { MetadataService } from './core/metadata/metadata.service'; import { BreadcrumbsService } from './breadcrumbs/breadcrumbs.service'; import { CommonModule } from '@angular/common'; -import { Store, StoreModule } from '@ngrx/store'; +import { StoreModule } from '@ngrx/store'; import { authReducer } from './core/auth/auth.reducer'; import { storeModuleConfig } from './app.reducer'; import { AngularticsProviderMock } from './shared/mocks/angulartics-provider.service.mock'; @@ -25,15 +24,13 @@ import { RouteService } from './core/services/route.service'; import { getMockLocaleService } from './app.component.spec'; import { MenuServiceStub } from './shared/testing/menu-service.stub'; import { CorrelationIdService } from './correlation-id/correlation-id.service'; -import { KlaroService } from './shared/cookies/klaro.service'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { TranslateLoaderMock } from './shared/mocks/translate-loader.mock'; -import { getTestScheduler } from 'jasmine-marbles'; +import { ThemeService } from './shared/theme-support/theme.service'; +import { getMockThemeService } from './shared/mocks/theme-service.mock'; import objectContaining = jasmine.objectContaining; import createSpyObj = jasmine.createSpyObj; import SpyObj = jasmine.SpyObj; -import { ThemeService } from './shared/theme-support/theme.service'; -import { getMockThemeService } from './shared/mocks/theme-service.mock'; let spy: SpyObj; @@ -169,8 +166,6 @@ describe('InitService', () => { { provide: Router, useValue: new RouterMock() }, { provide: ActivatedRoute, useValue: new MockActivatedRoute() }, { provide: MenuService, useValue: new MenuServiceStub() }, - { provide: KlaroService, useValue: undefined }, - { provide: GoogleAnalyticsService, useValue: undefined }, { provide: ThemeService, useValue: getMockThemeService() }, provideMockStore({ initialState }), AppComponent, @@ -179,26 +174,6 @@ describe('InitService', () => { }); })); - describe('initÀnalytics', () => { - describe('when GoogleAnalyticsService is provided', () => { - let googleAnalyticsSpy; - - beforeEach(() => { - googleAnalyticsSpy = jasmine.createSpyObj('googleAnalyticsService', [ - 'addTrackingIdToPage', - ]); - - TestBed.overrideProvider(GoogleAnalyticsService, { useValue: googleAnalyticsSpy }); - }); - - it('should call googleAnalyticsService.addTrackingIdToPage()', inject([InitService], (service) => { - // @ts-ignore - service.initAnalytics(); - expect(googleAnalyticsSpy.addTrackingIdToPage).toHaveBeenCalledTimes(1); - })); - }); - }); - describe('initRouteListeners', () => { it('should call listenForRouteChanges', inject([InitService], (service) => { // @ts-ignore @@ -207,68 +182,6 @@ describe('InitService', () => { expect(breadcrumbsServiceSpy.listenForRouteChanges).toHaveBeenCalledTimes(1); })); }); - - describe('initKlaro', () => { - const BLOCKING = { - t: { core: { auth: { blocking: true } } }, - f: { core: { auth: { blocking: false } } }, - }; - - it('should not error out if KlaroService is not provided', inject([InitService], (service) => { - // @ts-ignore - service.initKlaro(); - })); - - describe('when KlaroService is provided', () => { - let klaroServiceSpy; - - beforeEach(() => { - klaroServiceSpy = jasmine.createSpyObj('klaroServiceSpy', [ - 'initialize', - ]); - - TestBed.overrideProvider(KlaroService, { useValue: klaroServiceSpy }); - }); - - it('should not initialize Klaro while auth is blocking', () => { - getTestScheduler().run(({ cold, flush}) => { - TestBed.overrideProvider(Store, { useValue: cold('t--t--t--', BLOCKING) }); - const service = TestBed.inject(InitService); - - // @ts-ignore - service.initKlaro(); - flush(); - expect(klaroServiceSpy.initialize).not.toHaveBeenCalled(); - }); - }); - - - it('should only initialize Klaro the first time auth is unblocked', () => { - getTestScheduler().run(({ cold, flush}) => { - TestBed.overrideProvider(Store, { useValue: cold('t--t--f--t--f--', BLOCKING) }); - const service = TestBed.inject(InitService); - - // @ts-ignore - service.initKlaro(); - flush(); - expect(klaroServiceSpy.initialize).toHaveBeenCalledTimes(1); - }); - }); - }); - - describe('when KlaroService is not provided', () => { - it('should not error out when auth is unblocked', () => { - getTestScheduler().run(({ cold, flush}) => { - TestBed.overrideProvider(Store, { useValue: cold('t--t--f--t--f--', BLOCKING) }); - const service = TestBed.inject(InitService); - - // @ts-ignore - service.initKlaro(); - flush(); - }); - }); - }); - }); }); }); diff --git a/src/modules/app/browser-init.service.spec.ts b/src/modules/app/browser-init.service.spec.ts new file mode 100644 index 0000000000..05da7d9d36 --- /dev/null +++ b/src/modules/app/browser-init.service.spec.ts @@ -0,0 +1,155 @@ +import { InitService } from '../../app/init.service'; +import { APP_CONFIG } from 'src/config/app-config.interface'; +import { inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.service'; +import { MetadataService } from '../../app/core/metadata/metadata.service'; +import { BreadcrumbsService } from '../../app/breadcrumbs/breadcrumbs.service'; +import { CommonModule } from '@angular/common'; +import { Store, StoreModule } from '@ngrx/store'; +import { authReducer } from '../../app/core/auth/auth.reducer'; +import { storeModuleConfig } from '../../app/app.reducer'; +import { AngularticsProviderMock } from '../../app/shared/mocks/angulartics-provider.service.mock'; +import { Angulartics2DSpace } from '../../app/statistics/angulartics/dspace-provider'; +import { AuthService } from '../../app/core/auth/auth.service'; +import { AuthServiceMock } from '../../app/shared/mocks/auth.service.mock'; +import { ActivatedRoute, Router } from '@angular/router'; +import { RouterMock } from '../../app/shared/mocks/router.mock'; +import { MockActivatedRoute } from '../../app/shared/mocks/active-router.mock'; +import { MenuService } from '../../app/shared/menu/menu.service'; +import { LocaleService } from '../../app/core/locale/locale.service'; +import { environment } from '../../environments/environment'; +import { provideMockStore } from '@ngrx/store/testing'; +import { AppComponent } from '../../app/app.component'; +import { RouteService } from '../../app/core/services/route.service'; +import { getMockLocaleService } from '../../app/app.component.spec'; +import { MenuServiceStub } from '../../app/shared/testing/menu-service.stub'; +import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; +import { KlaroService } from '../../app/shared/cookies/klaro.service'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { TranslateLoaderMock } from '../../app/shared/mocks/translate-loader.mock'; +import { getTestScheduler } from 'jasmine-marbles'; +import { ThemeService } from '../../app/shared/theme-support/theme.service'; +import { getMockThemeService } from '../../app/shared/mocks/theme-service.mock'; +import { BrowserInitService } from './browser-init.service'; +import { TransferState } from '@angular/platform-browser'; + +const initialState = { + core: { + auth: { + loading: false, + blocking: true, + } + } +}; + +describe('BrowserInitService', () => { + describe('browser-specific initialization steps', () => { + let correlationIdServiceSpy; + let dspaceTransferStateSpy; + let transferStateSpy; + let metadataServiceSpy; + let breadcrumbsServiceSpy; + let klaroServiceSpy; + let googleAnalyticsSpy; + + beforeEach(waitForAsync(() => { + correlationIdServiceSpy = jasmine.createSpyObj('correlationIdServiceSpy', [ + 'initCorrelationId', + ]); + dspaceTransferStateSpy = jasmine.createSpyObj('dspaceTransferStateSpy', [ + 'transfer', + ]); + transferStateSpy = jasmine.createSpyObj('dspaceTransferStateSpy', [ + 'get', 'hasKey' + ]); + breadcrumbsServiceSpy = jasmine.createSpyObj('breadcrumbsServiceSpy', [ + 'listenForRouteChanges', + ]); + metadataServiceSpy = jasmine.createSpyObj('metadataService', [ + 'listenForRouteChange', + ]); + klaroServiceSpy = jasmine.createSpyObj('klaroServiceSpy', [ + 'initialize', + ]); + googleAnalyticsSpy = jasmine.createSpyObj('googleAnalyticsService', [ + 'addTrackingIdToPage', + ]); + + + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + imports: [ + CommonModule, + StoreModule.forRoot(authReducer, storeModuleConfig), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + ], + providers: [ + { provide: InitService, useClass: BrowserInitService }, + { provide: CorrelationIdService, useValue: correlationIdServiceSpy }, + { provide: APP_CONFIG, useValue: environment }, + { provide: LocaleService, useValue: getMockLocaleService() }, + { provide: Angulartics2DSpace, useValue: new AngularticsProviderMock() }, + { provide: MetadataService, useValue: metadataServiceSpy }, + { provide: BreadcrumbsService, useValue: breadcrumbsServiceSpy }, + { provide: AuthService, useValue: new AuthServiceMock() }, + { provide: Router, useValue: new RouterMock() }, + { provide: ActivatedRoute, useValue: new MockActivatedRoute() }, + { provide: MenuService, useValue: new MenuServiceStub() }, + { provide: KlaroService, useValue: klaroServiceSpy }, + { provide: GoogleAnalyticsService, useValue: googleAnalyticsSpy }, + { provide: ThemeService, useValue: getMockThemeService() }, + provideMockStore({ initialState }), + AppComponent, + RouteService, + { provide: TransferState, useValue: undefined }, + ] + }); + })); + + describe('initGoogleÀnalytics', () => { + it('should call googleAnalyticsService.addTrackingIdToPage()', inject([InitService], (service) => { + // @ts-ignore + service.initGoogleAnalytics(); + expect(googleAnalyticsSpy.addTrackingIdToPage).toHaveBeenCalledTimes(1); + })); + }); + + describe('initKlaro', () => { + const BLOCKING = { + t: { core: { auth: { blocking: true } } }, + f: { core: { auth: { blocking: false } } }, + }; + + it('should not initialize Klaro while auth is blocking', () => { + getTestScheduler().run(({ cold, flush}) => { + TestBed.overrideProvider(Store, { useValue: cold('t--t--t--', BLOCKING) }); + const service = TestBed.inject(InitService); + + // @ts-ignore + service.initKlaro(); + flush(); + expect(klaroServiceSpy.initialize).not.toHaveBeenCalled(); + }); + }); + + + it('should only initialize Klaro the first time auth is unblocked', () => { + getTestScheduler().run(({ cold, flush}) => { + TestBed.overrideProvider(Store, { useValue: cold('t--t--f--t--f--', BLOCKING) }); + const service = TestBed.inject(InitService); + + // @ts-ignore + service.initKlaro(); + flush(); + expect(klaroServiceSpy.initialize).toHaveBeenCalledTimes(1); + }); + }); + }); + }); +}); + diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index 733a776a73..3980b8bc28 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -47,7 +47,6 @@ export class BrowserInitService extends InitService { protected googleAnalyticsService: GoogleAnalyticsService, protected metadata: MetadataService, protected breadcrumbsService: BreadcrumbsService, - protected cssService: CSSVariableService, protected klaroService: KlaroService, protected authService: AuthService, protected themeService: ThemeService, From 250043fde8d8023f71310f6940d7183e9ef28052 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Fri, 29 Jul 2022 16:58:11 +0200 Subject: [PATCH 08/24] Fix LGTM issues --- src/app/init.service.ts | 4 ++-- src/modules/app/browser-init.service.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/app/init.service.ts b/src/app/init.service.ts index 30630e1d84..d91f6b2dd9 100644 --- a/src/app/init.service.ts +++ b/src/app/init.service.ts @@ -5,10 +5,10 @@ * * http://www.dspace.org/license/ */ -import { select, Store } from '@ngrx/store'; +import { Store } from '@ngrx/store'; import { CheckAuthenticationTokenAction } from './core/auth/auth.actions'; import { CorrelationIdService } from './correlation-id/correlation-id.service'; -import { APP_INITIALIZER, Inject, Optional, Provider, Type } from '@angular/core'; +import { APP_INITIALIZER, Inject, Provider, Type } from '@angular/core'; import { makeStateKey, TransferState } from '@angular/platform-browser'; import { APP_CONFIG, AppConfig } from '../config/app-config.interface'; import { environment } from '../environments/environment'; diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index 3980b8bc28..80619800fb 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -21,7 +21,6 @@ import { Angulartics2DSpace } from '../../app/statistics/angulartics/dspace-prov import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.service'; import { MetadataService } from '../../app/core/metadata/metadata.service'; import { BreadcrumbsService } from '../../app/breadcrumbs/breadcrumbs.service'; -import { CSSVariableService } from '../../app/shared/sass-helper/sass-helper.service'; import { KlaroService } from '../../app/shared/cookies/klaro.service'; import { AuthService } from '../../app/core/auth/auth.service'; import { ThemeService } from '../../app/shared/theme-support/theme.service'; From 4870d818f685b83aae5fcd9484f6366f4639bdf4 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Tue, 9 Aug 2022 15:47:19 +0200 Subject: [PATCH 09/24] Fix license header --- src/app/core/shared/distinct-next.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/app/core/shared/distinct-next.ts b/src/app/core/shared/distinct-next.ts index 0ee3d237d4..6c629867a4 100644 --- a/src/app/core/shared/distinct-next.ts +++ b/src/app/core/shared/distinct-next.ts @@ -1,5 +1,9 @@ -/* - * something something atmire +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ */ import { BehaviorSubject } from 'rxjs'; From ba7ecf432b77975cdbb8203ada739cfd80aa5007 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Tue, 9 Aug 2022 16:03:30 +0200 Subject: [PATCH 10/24] Add TypeDocs to ThemeService --- src/app/shared/theme-support/theme.service.ts | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/app/shared/theme-support/theme.service.ts b/src/app/shared/theme-support/theme.service.ts index 7642b7097e..6d9bffc44e 100644 --- a/src/app/shared/theme-support/theme.service.ts +++ b/src/app/shared/theme-support/theme.service.ts @@ -66,10 +66,17 @@ export class ThemeService { ); } + /** + * Set the current theme + * @param newName + */ setTheme(newName: string) { this.store.dispatch(new SetThemeAction(newName)); } + /** + * The name of the current theme (synchronous) + */ getThemeName(): string { let currentTheme: string; this.store.pipe( @@ -81,16 +88,29 @@ export class ThemeService { return currentTheme; } + /** + * The name of the current theme (asynchronous, tracks changes) + */ getThemeName$(): Observable { return this.store.pipe( select(currentThemeSelector) ); } + /** + * Whether the theme is currently loading + */ get isThemeLoading$(): Observable { return this._isThemeLoading$; } + /** + * Every time the theme is changed + * - if the theme name is valid, load it (CSS + tags) + * - otherwise fall back to {@link getDefaultThemeConfig} or {@link BASE_THEME_NAME} + * Should be called when initializing the app. + * @param isBrowser + */ listenForThemeChanges(isBrowser: boolean): void { this.getThemeName$().subscribe((themeName: string) => { if (isBrowser) { @@ -110,6 +130,10 @@ export class ThemeService { }); } + /** + * For every resolved route, check if it matches a dynamic theme. If it does, load that theme. + * Should be called when initializing the app. + */ listenForRouteChanges(): void { this.router.events.pipe( filter(event => event instanceof ResolveEnd), @@ -126,6 +150,13 @@ export class ThemeService { }); } + /** + * Load a theme's configuration + * - CSS + * - tags + * @param themeName + * @private + */ private loadGlobalThemeConfig(themeName: string): void { this.setThemeCss(themeName); this.setHeadTags(themeName); @@ -167,6 +198,11 @@ export class ThemeService { head.appendChild(link); } + /** + * Update the page to add a theme's tags + * @param themeName the theme in question + * @private + */ private setHeadTags(themeName: string): void { const head = this.document.getElementsByTagName('head')[0]; if (hasNoValue(head)) { @@ -188,6 +224,12 @@ export class ThemeService { head.appendChild(headTagFragment); } + /** + * Create HTML elements for a theme's tags + * (including those defined in the parent theme, if applicable) + * @param themeName the theme in question + * @private + */ private createHeadTags(themeName: string): HTMLElement[] { const themeConfig = this.getThemeConfigFor(themeName); const headTagConfigs = themeConfig?.headTags; @@ -225,6 +267,11 @@ export class ThemeService { return headTagConfigs.map(this.createHeadTag.bind(this)); } + /** + * Create a single tag element + * @param headTagConfig the configuration for this tag + * @private + */ private createHeadTag(headTagConfig: HeadTagConfig): HTMLElement { const tag = this.document.createElement(headTagConfig.tagName); From 967f4a99b9262642c77ca2d3ba295e67f7b9c059 Mon Sep 17 00:00:00 2001 From: nikunj59 Date: Mon, 4 Jul 2022 18:29:42 +0200 Subject: [PATCH 11/24] CST-6035 handled import query error --- .../submission-import-external.component.html | 5 +- ...bmission-import-external.component.spec.ts | 332 +++++++++++++++++- src/assets/i18n/en.json5 | 1 + 3 files changed, 335 insertions(+), 3 deletions(-) diff --git a/src/app/submission/import-external/submission-import-external.component.html b/src/app/submission/import-external/submission-import-external.component.html index 19499b4be8..dc46e6758f 100644 --- a/src/app/submission/import-external/submission-import-external.component.html +++ b/src/app/submission/import-external/submission-import-external.component.html @@ -24,9 +24,12 @@ -
+
{{ 'search.results.empty' | translate }}
+
+ {{ 'search.results.response.500' | translate }} +
diff --git a/src/app/submission/import-external/submission-import-external.component.spec.ts b/src/app/submission/import-external/submission-import-external.component.spec.ts index dc53b2e45f..dbf665e297 100644 --- a/src/app/submission/import-external/submission-import-external.component.spec.ts +++ b/src/app/submission/import-external/submission-import-external.component.spec.ts @@ -19,9 +19,15 @@ import { VarDirective } from '../../shared/utils/var.directive'; import { routeServiceStub } from '../../shared/testing/route-service.stub'; import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { + createFailedRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$ +} from '../../shared/remote-data.utils'; import { ExternalSourceEntry } from '../../core/shared/external-source-entry.model'; import { SubmissionImportExternalPreviewComponent } from './import-external-preview/submission-import-external-preview.component'; +import { By } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; describe('SubmissionImportExternalComponent test suite', () => { let comp: SubmissionImportExternalComponent; @@ -44,7 +50,8 @@ describe('SubmissionImportExternalComponent test suite', () => { beforeEach(waitForAsync (() => { TestBed.configureTestingModule({ imports: [ - TranslateModule.forRoot() + TranslateModule.forRoot(), + BrowserAnimationsModule ], declarations: [ SubmissionImportExternalComponent, @@ -177,6 +184,327 @@ describe('SubmissionImportExternalComponent test suite', () => { }); }); + describe('handle BE response for search query', () => { + const paginatedData: any = { + 'timeCompleted': 1657009282990, + 'msToLive': 900000, + 'lastUpdated': 1657009282990, + 'state': 'Success', + 'errorMessage': null, + 'payload': { + 'type': { + 'value': 'paginated-list' + }, + 'pageInfo': { + 'elementsPerPage': 10, + 'totalElements': 11971608, + 'totalPages': 1197161, + 'currentPage': 1 + }, + '_links': { + 'first': { + 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entries?query=test&page=0&size=10&sort=id,asc' + }, + 'self': { + 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entries?sort=id,ASC&page=0&size=10&query=test' + }, + 'next': { + 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entries?query=test&page=1&size=10&sort=id,asc' + }, + 'last': { + 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entries?query=test&page=1197160&size=10&sort=id,asc' + }, + 'page': [ + { + 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entryValues/2-s2.0-85130258665' + } + ] + }, + 'page': [ + { + 'id': '2-s2.0-85130258665', + 'type': 'externalSourceEntry', + 'display': 'Biological activities of endophytic fungi isolated from Annona muricata Linnaeus: a systematic review', + 'value': 'Biological activities of endophytic fungi isolated from Annona muricata Linnaeus: a systematic review', + 'externalSource': 'scopus', + 'metadata': { + 'dc.contributor.author': [ + { + 'uuid': 'cbceba09-4c12-4968-ab02-2f77a985b422', + 'language': null, + 'value': 'Silva I.M.M.', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.date.issued': [ + { + 'uuid': 'e8d3c306-ce21-43e2-8a80-5f257cc3b7ea', + 'language': null, + 'value': '2024-01-01', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.description.abstract': [ + { + 'uuid': 'c9ee4076-c602-4c1d-ab1a-60bbdd0dd511', + 'language': null, + 'value': 'This systematic review integrates the data available in the literature regarding the biological activities of the extracts of endophytic fungi isolated from Annona muricata and their secondary metabolites. The search was performed using four electronic databases, and studies’ quality was evaluated using an adapted assessment tool. The initial database search yielded 436 results; ten studies were selected for inclusion. The leaf was the most studied part of the plant (in nine studies); Periconia sp. was the most tested fungus (n = 4); the most evaluated biological activity was anticancer (n = 6), followed by antiviral (n = 3). Antibacterial, antifungal, and antioxidant activities were also tested. Terpenoids or terpenoid hybrid compounds were the most abundant chemical metabolites. Phenolic compounds, esters, alkaloids, saturated and unsaturated fatty acids, aromatic compounds, and peptides were also reported. The selected studies highlighted the biotechnological potentiality of the endophytic fungi extracts from A. muricata. Consequently, it can be considered a promising source of biological compounds with antioxidant effects and active against different microorganisms and cancer cells. Further research is needed involving different plant tissues, other microorganisms, such as SARS-CoV-2, and different cancer cells.', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.identifier.doi': [ + { + 'uuid': '95ec26be-c1b4-4c4a-b12d-12421a4f181d', + 'language': null, + 'value': '10.1590/1519-6984.259525', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.identifier.pmid': [ + { + 'uuid': 'd6913cd6-1007-4013-b486-3f07192bc739', + 'language': null, + 'value': '35588520', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.identifier.scopus': [ + { + 'uuid': '6386a1f6-84ba-431d-a583-e16d19af8db0', + 'language': null, + 'value': '2-s2.0-85130258665', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.relation.grantno': [ + { + 'uuid': 'bcafd7b0-827d-4abb-8608-95dc40a8e58a', + 'language': null, + 'value': 'undefined', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.relation.ispartof': [ + { + 'uuid': '680819c8-c143-405f-9d09-f84d2d5cd338', + 'language': null, + 'value': 'Brazilian Journal of Biology', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.relation.ispartofseries': [ + { + 'uuid': '06634104-127b-44f6-9dcc-efae24b74bd1', + 'language': null, + 'value': 'Brazilian Journal of Biology', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.relation.issn': [ + { + 'uuid': '5f6cce46-2538-49e9-8ed0-a3988dcac6c5', + 'language': null, + 'value': '15196984', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.subject': [ + { + 'uuid': '0b6fbc77-de54-4f4a-b317-3d74a429f22a', + 'language': null, + 'value': 'biological products | biotechnology | mycology | soursop', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.title': [ + { + 'uuid': '4c0fa3d3-1a8c-4302-a772-4a4d0408df35', + 'language': null, + 'value': 'Biological activities of endophytic fungi isolated from Annona muricata Linnaeus: a systematic review', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'dc.type': [ + { + 'uuid': '5b6e0337-6f79-4574-a720-536816d1dc6e', + 'language': null, + 'value': 'Journal', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'oaire.citation.volume': [ + { + 'uuid': 'b88b0246-61a9-4aca-917f-68afc8ead7d8', + 'language': null, + 'value': '84', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'oairecerif.affiliation.orgunit': [ + { + 'uuid': '487c0fbc-3622-4cc7-a5fa-4edf780c6a21', + 'language': null, + 'value': 'Universidade Federal do Reconcavo da Bahia', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'oairecerif.citation.number': [ + { + 'uuid': '90808bdd-f456-4ba3-91aa-b82fb3c453f6', + 'language': null, + 'value': 'e259525', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'person.identifier.orcid': [ + { + 'uuid': 'e533d0d2-cf26-4c3e-b5ae-cabf497dfb6b', + 'language': null, + 'value': '#PLACEHOLDER_PARENT_METADATA_VALUE#', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ], + 'person.identifier.scopus-author-id': [ + { + 'uuid': '4faf0be5-0226-4d4f-92a0-938397c4ec02', + 'language': null, + 'value': '42561627000', + 'place': -1, + 'authority': null, + 'confidence': -1 + } + ] + }, + '_links': { + 'self': { + 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entryValues/2-s2.0-85130258665' + } + } + } + ] + }, + 'statusCode': 200 + }; + const errorObj = { + errorMessage: 'Http failure response for ' + + 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/pubmed/entries?sort=id,ASC&page=0&size=10&query=test: 500 OK', + statusCode: 500, + timeCompleted: 1656950434666, + errors: [{ + 'message': 'Internal Server Error', 'paths': ['/server/api/integration/externalsources/pubmed/entries'] + }] + }; + beforeEach(() => { + fixture = TestBed.createComponent(SubmissionImportExternalComponent); + comp = fixture.componentInstance; + compAsAny = comp; + scheduler = getTestScheduler(); + }); + + afterEach(() => { + fixture.destroy(); + comp = null; + compAsAny = null; + }); + + it('REST endpoint returns a 200 response with valid content', () => { + mockExternalSourceService.getExternalSourceEntries.and.returnValue(createSuccessfulRemoteDataObject$(paginatedData.payload)); + const expectedEntries = createSuccessfulRemoteDataObject(paginatedData.payload); + spyOn(routeServiceStub, 'getQueryParameterValue').and.callFake((param) => { + if (param === 'entity') { + return observableOf('Publication'); + } else if (param === 'sourceId') { + return observableOf('scopus'); + } else if (param === 'query') { + return observableOf('test'); + } + return observableOf({}); + }); + fixture.detectChanges(); + + expect(comp.isLoading$.value).toBe(false); + expect(comp.entriesRD$.value).toEqual(expectedEntries); + const viewableCollection = fixture.debugElement.query(By.css('ds-viewable-collection')); + expect(viewableCollection).toBeTruthy(); + }); + + it('REST endpoint returns a 200 response with no results', () => { + mockExternalSourceService.getExternalSourceEntries.and.returnValue(createSuccessfulRemoteDataObject$(createPaginatedList([]))); + const expectedEntries = createSuccessfulRemoteDataObject(createPaginatedList([])); + spyOn(routeServiceStub, 'getQueryParameterValue').and.callFake((param) => { + if (param === 'entity') { + return observableOf('Publication'); + } + return observableOf({}); + }); + fixture.detectChanges(); + + expect(comp.isLoading$.value).toBe(false); + expect(comp.entriesRD$.value).toEqual(expectedEntries); + const noDataAlert = fixture.debugElement.query(By.css('[data-test="empty-external-entry-list"]')); + expect(noDataAlert).toBeTruthy(); + }); + + it('REST endpoint returns a 500 error', () => { + mockExternalSourceService.getExternalSourceEntries.and.returnValue(createFailedRemoteDataObject$( + errorObj.errorMessage, + errorObj.statusCode, + errorObj.timeCompleted, + errorObj.errors + )); + spyOn(routeServiceStub, 'getQueryParameterValue').and.callFake((param) => { + if (param === 'entity') { + return observableOf('Publication'); + } else if (param === 'sourceId') { + return observableOf('pubmed'); + } else if (param === 'query') { + return observableOf('test'); + } + return observableOf({}); + }); + fixture.detectChanges(); + + expect(comp.isLoading$.value).toBe(false); + expect(comp.entriesRD$.value.statusCode).toEqual(500); + const noDataAlert = fixture.debugElement.query(By.css('[data-test="empty-external-error-500"]')); + expect(noDataAlert).toBeTruthy(); + }); + }); + }); // declare a test component diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 57863b3a69..02fbf9dabe 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -3583,6 +3583,7 @@ "search.results.view-result": "View", + "search.results.response.500": "An error occurred during query execution, please try again later", "default.search.results.head": "Search Results", From a2e8b2a61c059415669e9686b6e0df1e92a22441 Mon Sep 17 00:00:00 2001 From: corrado lombardi Date: Wed, 10 Aug 2022 18:49:01 +0200 Subject: [PATCH 12/24] CST-6035 updated test --- .../submission-import-external.component.spec.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/submission/import-external/submission-import-external.component.spec.ts b/src/app/submission/import-external/submission-import-external.component.spec.ts index dbf665e297..7a9c71f342 100644 --- a/src/app/submission/import-external/submission-import-external.component.spec.ts +++ b/src/app/submission/import-external/submission-import-external.component.spec.ts @@ -483,8 +483,7 @@ describe('SubmissionImportExternalComponent test suite', () => { mockExternalSourceService.getExternalSourceEntries.and.returnValue(createFailedRemoteDataObject$( errorObj.errorMessage, errorObj.statusCode, - errorObj.timeCompleted, - errorObj.errors + errorObj.timeCompleted )); spyOn(routeServiceStub, 'getQueryParameterValue').and.callFake((param) => { if (param === 'entity') { From f8e1db49874762455041974391be3ccc51c1a5d3 Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Thu, 18 Aug 2022 14:04:59 +0200 Subject: [PATCH 13/24] 93914: Add the ability to delete processes --- .../detail/process-detail.component.html | 92 ++++++++--- .../detail/process-detail.component.spec.ts | 60 ++++++- .../detail/process-detail.component.ts | 51 +++++- .../process-bulk-delete.service.spec.ts | 149 ++++++++++++++++++ .../overview/process-bulk-delete.service.ts | 118 ++++++++++++++ .../overview/process-overview.component.html | 58 ++++++- .../process-overview.component.spec.ts | 104 +++++++++++- .../overview/process-overview.component.ts | 60 ++++++- src/assets/i18n/en.json5 | 35 ++++ 9 files changed, 685 insertions(+), 42 deletions(-) create mode 100644 src/app/process-page/overview/process-bulk-delete.service.spec.ts create mode 100644 src/app/process-page/overview/process-bulk-delete.service.ts diff --git a/src/app/process-page/detail/process-detail.component.html b/src/app/process-page/detail/process-detail.component.html index 995e56e081..ae3418eafa 100644 --- a/src/app/process-page/detail/process-detail.component.html +++ b/src/app/process-page/detail/process-detail.component.html @@ -1,53 +1,99 @@
-

{{'process.detail.title' | translate:{id: process?.processId, name: process?.scriptName} }}

-
- -
+

{{'process.detail.title' | translate:{ + id: process?.processId, + name: process?.scriptName + } }}

{{ process?.scriptName }}
- +
{{ argument?.name }} {{ argument?.value }}
- - - {{getFileName(file)}} - ({{(file?.sizeBytes) | dsFileSize }}) - + + + {{getFileName(file)}} + ({{(file?.sizeBytes) | dsFileSize }}) +
- +
{{ process.startTime | date:dateFormat:'UTC' }}
- +
{{ process.endTime | date:dateFormat:'UTC' }}
- +
{{ process.processStatus }}
- - -
{{ (outputLogs$ | async) }}
-

+ {{ 'process.detail.logs.button' | translate }} + + +

{{ (outputLogs$ | async) }}
+

- {{ 'process.detail.logs.none' | translate }} -

+ {{ 'process.detail.logs.none' | translate }} +

+
+ + + +
+ + + +
+ + + + + + +
+ +
+ diff --git a/src/app/process-page/detail/process-detail.component.spec.ts b/src/app/process-page/detail/process-detail.component.spec.ts index 4a85c75f81..53e65e62eb 100644 --- a/src/app/process-page/detail/process-detail.component.spec.ts +++ b/src/app/process-page/detail/process-detail.component.spec.ts @@ -19,15 +19,23 @@ import { RouterTestingModule } from '@angular/router/testing'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { ProcessDetailFieldComponent } from './process-detail-field/process-detail-field.component'; import { Process } from '../processes/process.model'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { of as observableOf } from 'rxjs'; import { By } from '@angular/platform-browser'; import { FileSizePipe } from '../../shared/utils/file-size-pipe'; import { Bitstream } from '../../core/shared/bitstream.model'; import { ProcessDataService } from '../../core/data/processes/process-data.service'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { + createFailedRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$ +} from '../../shared/remote-data.utils'; import { createPaginatedList } from '../../shared/testing/utils.test'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { getProcessListRoute } from '../process-page-routing.paths'; describe('ProcessDetailComponent', () => { let component: ProcessDetailComponent; @@ -44,6 +52,11 @@ describe('ProcessDetailComponent', () => { let processOutput; + let modalService; + let notificationsService; + + let router; + function init() { processOutput = 'Process Started'; process = Object.assign(new Process(), { @@ -93,7 +106,8 @@ describe('ProcessDetailComponent', () => { } }); processService = jasmine.createSpyObj('processService', { - getFiles: createSuccessfulRemoteDataObject$(createPaginatedList(files)) + getFiles: createSuccessfulRemoteDataObject$(createPaginatedList(files)), + delete: createSuccessfulRemoteDataObject$(null) }); bitstreamDataService = jasmine.createSpyObj('bitstreamDataService', { findByHref: createSuccessfulRemoteDataObject$(logBitstream) @@ -104,13 +118,23 @@ describe('ProcessDetailComponent', () => { httpClient = jasmine.createSpyObj('httpClient', { get: observableOf(processOutput) }); + + modalService = jasmine.createSpyObj('modalService', { + open: {} + }); + + notificationsService = new NotificationsServiceStub(); + + router = jasmine.createSpyObj('router', { + navigateByUrl:{} + }); } beforeEach(waitForAsync(() => { init(); TestBed.configureTestingModule({ declarations: [ProcessDetailComponent, ProcessDetailFieldComponent, VarDirective, FileSizePipe], - imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([])], + imports: [TranslateModule.forRoot()], providers: [ { provide: ActivatedRoute, @@ -121,6 +145,9 @@ describe('ProcessDetailComponent', () => { { provide: DSONameService, useValue: nameService }, { provide: AuthService, useValue: new AuthServiceMock() }, { provide: HttpClient, useValue: httpClient }, + { provide: NgbModal, useValue: modalService }, + { provide: NotificationsService, useValue: notificationsService }, + { provide: Router, useValue: router }, ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }).compileComponents(); @@ -207,4 +234,29 @@ describe('ProcessDetailComponent', () => { }); }); + describe('openDeleteModal', () => { + it('should open the modal', () => { + component.openDeleteModal({}); + expect(modalService.open).toHaveBeenCalledWith({}); + }); + }); + + describe('deleteProcess', () => { + it('should delete the process and navigate back to the overview page on success', () => { + component.deleteProcess(process); + + expect(processService.delete).toHaveBeenCalledWith(process.processId); + expect(notificationsService.success).toHaveBeenCalled(); + expect(router.navigateByUrl).toHaveBeenCalledWith(getProcessListRoute()); + }); + it('should delete the process and not navigate on error', () => { + (processService.delete as jasmine.Spy).and.returnValue(createFailedRemoteDataObject$()); + component.deleteProcess(process); + + expect(processService.delete).toHaveBeenCalledWith(process.processId); + expect(notificationsService.error).toHaveBeenCalled(); + expect(router.navigateByUrl).not.toHaveBeenCalled(); + }); + }); + }); diff --git a/src/app/process-page/detail/process-detail.component.ts b/src/app/process-page/detail/process-detail.component.ts index 8a05288eb2..f9151d27b8 100644 --- a/src/app/process-page/detail/process-detail.component.ts +++ b/src/app/process-page/detail/process-detail.component.ts @@ -12,8 +12,9 @@ import { RemoteData } from '../../core/data/remote-data'; import { Bitstream } from '../../core/shared/bitstream.model'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { - getFirstSucceededRemoteDataPayload, - getFirstSucceededRemoteData + getFirstCompletedRemoteData, + getFirstSucceededRemoteData, + getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; import { URLCombiner } from '../../core/url-combiner/url-combiner'; import { AlertType } from '../../shared/alert/aletr-type'; @@ -21,6 +22,10 @@ import { hasValue } from '../../shared/empty.util'; import { ProcessStatus } from '../processes/process-status.model'; import { Process } from '../processes/process.model'; import { redirectOn4xx } from '../../core/shared/authorized.operators'; +import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; +import { getProcessListRoute } from '../process-page-routing.paths'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'ds-process-detail', @@ -71,6 +76,11 @@ export class ProcessDetailComponent implements OnInit { */ dateFormat = 'yyyy-MM-dd HH:mm:ss ZZZZ'; + /** + * Reference to NgbModal + */ + protected modalRef: NgbModalRef; + constructor(protected route: ActivatedRoute, protected router: Router, protected processService: ProcessDataService, @@ -78,7 +88,11 @@ export class ProcessDetailComponent implements OnInit { protected nameService: DSONameService, private zone: NgZone, protected authService: AuthService, - protected http: HttpClient) { + protected http: HttpClient, + protected modalService: NgbModal, + protected notificationsService: NotificationsService, + protected translateService: TranslateService + ) { } /** @@ -172,4 +186,35 @@ export class ProcessDetailComponent implements OnInit { || process.processStatus.toString() === ProcessStatus[ProcessStatus.FAILED].toString())); } + /** + * Delete the current process + * @param process + */ + deleteProcess(process: Process) { + this.processService.delete(process.processId).pipe( + getFirstCompletedRemoteData() + ).subscribe((rd) => { + if (rd.hasSucceeded) { + this.notificationsService.success(this.translateService.get('process.detail.delete.success')); + this.router.navigateByUrl(getProcessListRoute()); + } else { + this.notificationsService.error(this.translateService.get('process.detail.delete.error')); + } + }); + } + + /** + * Open a given modal. + * @param content - the modal content. + */ + openDeleteModal(content) { + this.modalRef = this.modalService.open(content); + } + /** + * Close the modal. + */ + closeModal() { + this.modalRef.close(); + } + } diff --git a/src/app/process-page/overview/process-bulk-delete.service.spec.ts b/src/app/process-page/overview/process-bulk-delete.service.spec.ts new file mode 100644 index 0000000000..5139048dd1 --- /dev/null +++ b/src/app/process-page/overview/process-bulk-delete.service.spec.ts @@ -0,0 +1,149 @@ +import { ProcessBulkDeleteService } from './process-bulk-delete.service'; +import { waitForAsync } from '@angular/core/testing'; +import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub'; +import { getMockTranslateService } from '../../shared/mocks/translate.service.mock'; + +describe('ProcessBulkDeleteService', () => { + + let service: ProcessBulkDeleteService; + let processDataService; + let notificationsService; + let mockTranslateService; + + beforeEach(waitForAsync(() => { + processDataService = jasmine.createSpyObj('processDataService', { + delete: createSuccessfulRemoteDataObject$(null) + }); + notificationsService = new NotificationsServiceStub(); + mockTranslateService = getMockTranslateService(); + service = new ProcessBulkDeleteService(processDataService, notificationsService, mockTranslateService); + })); + + describe('toggleDelete', () => { + it('should add a new value to the processesToDelete list when not yet present', () => { + service.toggleDelete('test-id-1'); + service.toggleDelete('test-id-2'); + + expect(service.processesToDelete).toEqual(['test-id-1', 'test-id-2']); + }); + it('should remove a value from the processesToDelete list when already present', () => { + service.toggleDelete('test-id-1'); + service.toggleDelete('test-id-2'); + + expect(service.processesToDelete).toEqual(['test-id-1', 'test-id-2']); + + service.toggleDelete('test-id-1'); + expect(service.processesToDelete).toEqual(['test-id-2']); + }); + }); + + describe('isToBeDeleted', () => { + it('should return true when the provided process id is present in the list', () => { + service.toggleDelete('test-id-1'); + service.toggleDelete('test-id-2'); + + expect(service.isToBeDeleted('test-id-1')).toBeTrue(); + }); + it('should return false when the provided process id is not present in the list', () => { + service.toggleDelete('test-id-1'); + service.toggleDelete('test-id-2'); + + expect(service.isToBeDeleted('test-id-3')).toBeFalse(); + }); + }); + + describe('clearAllProcesses', () => { + it('should clear the list of to be deleted processes', () => { + service.toggleDelete('test-id-1'); + service.toggleDelete('test-id-2'); + + expect(service.processesToDelete).toEqual(['test-id-1', 'test-id-2']); + + service.clearAllProcesses(); + expect(service.processesToDelete).toEqual([]); + }); + }); + describe('getAmountOfSelectedProcesses', () => { + it('should return the amount of the currently selected processes for deletion', () => { + service.toggleDelete('test-id-1'); + service.toggleDelete('test-id-2'); + + expect(service.getAmountOfSelectedProcesses()).toEqual(2); + }); + }); + describe('isProcessing$', () => { + it('should return a behavior subject containing whether a delete is currently processing or not', () => { + const result = service.isProcessing$(); + expect(result.getValue()).toBeFalse(); + + result.next(true); + expect(result.getValue()).toBeTrue(); + }); + }); + describe('hasSelected', () => { + it('should return if the list of selected processes has values', () => { + expect(service.hasSelected()).toBeFalse(); + + service.toggleDelete('test-id-1'); + service.toggleDelete('test-id-2'); + + expect(service.hasSelected()).toBeTrue(); + }); + }); + describe('deleteSelectedProcesses', () => { + it('should delete all selected processes, show an error for each failed one and a notification at the end with the amount of succeeded deletions', () => { + (processDataService.delete as jasmine.Spy).and.callFake((processId: string) => { + if (processId.includes('error')) { + return createFailedRemoteDataObject$(); + } else { + return createSuccessfulRemoteDataObject$(null); + } + }); + + service.toggleDelete('test-id-1'); + service.toggleDelete('test-id-2'); + service.toggleDelete('error-id-3'); + service.toggleDelete('test-id-4'); + service.toggleDelete('error-id-5'); + service.toggleDelete('error-id-6'); + service.toggleDelete('test-id-7'); + + + service.deleteSelectedProcesses(); + + expect(processDataService.delete).toHaveBeenCalledWith('test-id-1'); + + + expect(processDataService.delete).toHaveBeenCalledWith('test-id-2'); + + + expect(processDataService.delete).toHaveBeenCalledWith('error-id-3'); + expect(notificationsService.error).toHaveBeenCalled(); + expect(mockTranslateService.get).toHaveBeenCalledWith('process.bulk.delete.error.body', {processId: 'error-id-3'}); + + + expect(processDataService.delete).toHaveBeenCalledWith('test-id-4'); + + + expect(processDataService.delete).toHaveBeenCalledWith('error-id-5'); + expect(notificationsService.error).toHaveBeenCalled(); + expect(mockTranslateService.get).toHaveBeenCalledWith('process.bulk.delete.error.body', {processId: 'error-id-5'}); + + + expect(processDataService.delete).toHaveBeenCalledWith('error-id-6'); + expect(notificationsService.error).toHaveBeenCalled(); + expect(mockTranslateService.get).toHaveBeenCalledWith('process.bulk.delete.error.body', {processId: 'error-id-6'}); + + + expect(processDataService.delete).toHaveBeenCalledWith('test-id-7'); + + expect(notificationsService.success).toHaveBeenCalled(); + expect(mockTranslateService.get).toHaveBeenCalledWith('process.bulk.delete.success', {count: 4}); + + expect(service.processesToDelete).toEqual(['error-id-3', 'error-id-5', 'error-id-6']); + + + }); + }); +}); diff --git a/src/app/process-page/overview/process-bulk-delete.service.ts b/src/app/process-page/overview/process-bulk-delete.service.ts new file mode 100644 index 0000000000..c0943fb615 --- /dev/null +++ b/src/app/process-page/overview/process-bulk-delete.service.ts @@ -0,0 +1,118 @@ +import { Process } from '../processes/process.model'; +import { Injectable } from '@angular/core'; +import { ProcessDataService } from '../../core/data/processes/process-data.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { isNotEmpty } from '../../shared/empty.util'; +import { BehaviorSubject, count, from } from 'rxjs'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { concatMap, filter, tap } from 'rxjs/operators'; +import { RemoteData } from '../../core/data/remote-data'; +import { TranslateService } from '@ngx-translate/core'; + +@Injectable({ + providedIn: 'root' +}) +/** + * Service to facilitate removing processes in bulk. + */ +export class ProcessBulkDeleteService { + + /** + * Array to track the processes to be deleted + */ + processesToDelete: string[] = []; + + /** + * Behavior subject to track whether the delete is processing + * @protected + */ + protected isProcessingBehaviorSubject: BehaviorSubject = new BehaviorSubject(false); + + constructor( + protected processDataService: ProcessDataService, + protected notificationsService: NotificationsService, + protected translateService: TranslateService + ) { + } + + /** + * Add or remove a process id to/from the list + * If the id is already present it will be removed, otherwise it will be added. + * + * @param processId - The process id to add or remove + */ + toggleDelete(processId: string) { + if (this.isToBeDeleted(processId)) { + this.processesToDelete.splice(this.processesToDelete.indexOf(processId), 1); + } else { + this.processesToDelete.push(processId); + } + } + + /** + * Checks if the provided process id is present in the to be deleted list + * @param processId + */ + isToBeDeleted(processId: string) { + return this.processesToDelete.includes(processId); + } + + /** + * Clear the list of processes to be deleted + */ + clearAllProcesses() { + this.processesToDelete.splice(0); + } + + /** + * Get the amount of processes selected for deletion + */ + getAmountOfSelectedProcesses() { + return this.processesToDelete.length; + } + + /** + * Returns a behavior subject to indicate whether the bulk delete is processing + */ + isProcessing$() { + return this.isProcessingBehaviorSubject; + } + + /** + * Returns whether there currently are values selected for deletion + */ + hasSelected(): boolean { + return isNotEmpty(this.processesToDelete); + } + + /** + * Delete all selected processes one by one + * When the deletion for a process fails, an error notification will be shown with the process id, + * but it will continue deleting the other processes. + * At the end it will show a notification stating the amount of successful deletes + * The successfully deleted processes will be removed from the list of selected values, the failed ones will be retained. + */ + deleteSelectedProcesses() { + this.isProcessingBehaviorSubject.next(true); + + from([...this.processesToDelete]).pipe( + concatMap((processId) => { + return this.processDataService.delete(processId).pipe( + getFirstCompletedRemoteData(), + tap((rd: RemoteData) => { + if (rd.hasFailed) { + this.notificationsService.error(this.translateService.get('process.bulk.delete.error.head'), this.translateService.get('process.bulk.delete.error.body', {processId: processId})); + } else { + this.toggleDelete(processId); + } + }) + ); + }), + filter((rd: RemoteData) => rd.hasSucceeded), + count(), + ).subscribe((value) => { + this.notificationsService.success(this.translateService.get('process.bulk.delete.success', {count: value})); + this.isProcessingBehaviorSubject.next(false); + }); + } +} diff --git a/src/app/process-page/overview/process-overview.component.html b/src/app/process-page/overview/process-overview.component.html index 7d3f15f074..5bf5fee79f 100644 --- a/src/app/process-page/overview/process-overview.component.html +++ b/src/app/process-page/overview/process-overview.component.html @@ -1,7 +1,19 @@

{{'process.overview.title' | translate}}

- +
+
+ + + +
{{'process.overview.table.start' | translate}} {{'process.overview.table.finish' | translate}} {{'process.overview.table.status' | translate}} + {{'process.overview.table.actions' | translate}} - + {{process.processId}} {{process.scriptName}} {{ePersonName}} {{process.startTime | date:dateFormat:'UTC'}} {{process.endTime | date:dateFormat:'UTC'}} {{process.processStatus}} + + +
+ + + +
+ + + + +
+ + +
+ diff --git a/src/app/process-page/overview/process-overview.component.spec.ts b/src/app/process-page/overview/process-overview.component.spec.ts index c147ed00ca..94071c0e59 100644 --- a/src/app/process-page/overview/process-overview.component.spec.ts +++ b/src/app/process-page/overview/process-overview.component.spec.ts @@ -1,5 +1,5 @@ import { ProcessOverviewComponent } from './process-overview.component'; -import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { VarDirective } from '../../shared/utils/var.directive'; import { TranslateModule } from '@ngx-translate/core'; import { RouterTestingModule } from '@angular/router/testing'; @@ -13,11 +13,11 @@ import { ProcessStatus } from '../processes/process-status.model'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { createPaginatedList } from '../../shared/testing/utils.test'; import { PaginationService } from '../../core/pagination/pagination.service'; -import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; -import { FindListOptions } from '../../core/data/find-list-options.model'; import { DatePipe } from '@angular/common'; +import { BehaviorSubject } from 'rxjs'; +import { ProcessBulkDeleteService } from './process-bulk-delete.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; describe('ProcessOverviewComponent', () => { let component: ProcessOverviewComponent; @@ -30,6 +30,9 @@ describe('ProcessOverviewComponent', () => { let processes: Process[]; let ePerson: EPerson; + let processBulkDeleteService; + let modalService; + const pipe = new DatePipe('en-US'); function init() { @@ -80,6 +83,29 @@ describe('ProcessOverviewComponent', () => { }); paginationService = new PaginationServiceStub(); + + processBulkDeleteService = jasmine.createSpyObj('processBulkDeleteService', { + clearAllProcesses: {}, + deleteSelectedProcesses: {}, + isProcessing$: new BehaviorSubject(false), + hasSelected: true, + isToBeDeleted: true, + toggleDelete: {}, + getAmountOfSelectedProcesses: 5 + + }); + + (processBulkDeleteService.isToBeDeleted as jasmine.Spy).and.callFake((id) => { + if (id === 2) { + return true; + } else { + return false; + } + }); + + modalService = jasmine.createSpyObj('modalService', { + open: {} + }); } beforeEach(waitForAsync(() => { @@ -90,7 +116,9 @@ describe('ProcessOverviewComponent', () => { providers: [ { provide: ProcessDataService, useValue: processService }, { provide: EPersonDataService, useValue: ePersonService }, - { provide: PaginationService, useValue: paginationService } + { provide: PaginationService, useValue: paginationService }, + { provide: ProcessBulkDeleteService, useValue: processBulkDeleteService }, + { provide: NgbModal, useValue: modalService }, ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); @@ -154,5 +182,71 @@ describe('ProcessOverviewComponent', () => { expect(el.textContent).toContain(processes[index].processStatus); }); }); + it('should display a delete button in the seventh column', () => { + rowElements.forEach((rowElement, index) => { + const el = rowElement.query(By.css('td:nth-child(7)')); + expect(el.nativeElement.innerHTML).toContain('fas fa-trash'); + + el.query(By.css('button')).triggerEventHandler('click', null); + expect(processBulkDeleteService.toggleDelete).toHaveBeenCalledWith(processes[index].processId); + }); + }); + it('should indicate a row that has been selected for deletion', () => { + const deleteRow = fixture.debugElement.query(By.css('.table-danger')); + expect(deleteRow.nativeElement.innerHTML).toContain('/processes/' + processes[1].processId); + }); + }); + + describe('overview buttons', () => { + it('should show a button to clear selected processes when there are selected processes', () => { + const clearButton = fixture.debugElement.query(By.css('.btn-primary')); + expect(clearButton.nativeElement.innerHTML).toContain('process.overview.delete.clear'); + + clearButton.triggerEventHandler('click', null); + expect(processBulkDeleteService.clearAllProcesses).toHaveBeenCalled(); + }); + it('should not show a button to clear selected processes when there are no selected processes', () => { + (processBulkDeleteService.hasSelected as jasmine.Spy).and.returnValue(false); + fixture.detectChanges(); + + const clearButton = fixture.debugElement.query(By.css('.btn-primary')); + expect(clearButton).toBeNull(); + }); + it('should show a button to open the delete modal when there are selected processes', () => { + spyOn(component, 'openDeleteModal'); + + const deleteButton = fixture.debugElement.query(By.css('.btn-danger')); + expect(deleteButton.nativeElement.innerHTML).toContain('process.overview.delete'); + + deleteButton.triggerEventHandler('click', null); + expect(component.openDeleteModal).toHaveBeenCalled(); + }); + it('should not show a button to clear selected processes when there are no selected processes', () => { + (processBulkDeleteService.hasSelected as jasmine.Spy).and.returnValue(false); + fixture.detectChanges(); + + const deleteButton = fixture.debugElement.query(By.css('.btn-danger')); + expect(deleteButton).toBeNull(); + }); + }); + + describe('openDeleteModal', () => { + it('should open the modal', () => { + component.openDeleteModal({}); + expect(modalService.open).toHaveBeenCalledWith({}); + }); + }); + + describe('deleteSelected', () => { + it('should call the deleteSelectedProcesses method on the processBulkDeleteService and close the modal when processing is done', () => { + spyOn(component, 'closeModal'); + spyOn(component, 'setProcesses'); + + component.deleteSelected(); + + expect(processBulkDeleteService.deleteSelectedProcesses).toHaveBeenCalled(); + expect(component.closeModal).toHaveBeenCalled(); + expect(component.setProcesses).toHaveBeenCalled(); + }); }); }); diff --git a/src/app/process-page/overview/process-overview.component.ts b/src/app/process-page/overview/process-overview.component.ts index 7afcd9cb76..749f76b1a6 100644 --- a/src/app/process-page/overview/process-overview.component.ts +++ b/src/app/process-page/overview/process-overview.component.ts @@ -1,5 +1,5 @@ -import { Component, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { BehaviorSubject, Observable, skipWhile, Subscription } from 'rxjs'; import { RemoteData } from '../../core/data/remote-data'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { Process } from '../processes/process.model'; @@ -11,6 +11,9 @@ import { map, switchMap } from 'rxjs/operators'; import { ProcessDataService } from '../../core/data/processes/process-data.service'; import { PaginationService } from '../../core/pagination/pagination.service'; import { FindListOptions } from '../../core/data/find-list-options.model'; +import { ProcessBulkDeleteService } from './process-bulk-delete.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { hasValue } from '../../shared/empty.util'; @Component({ selector: 'ds-process-overview', @@ -19,7 +22,7 @@ import { FindListOptions } from '../../core/data/find-list-options.model'; /** * Component displaying a list of all processes in a paginated table */ -export class ProcessOverviewComponent implements OnInit { +export class ProcessOverviewComponent implements OnInit, OnDestroy { /** * List of all processes @@ -46,13 +49,22 @@ export class ProcessOverviewComponent implements OnInit { */ dateFormat = 'yyyy-MM-dd HH:mm:ss'; + processesToDelete: string[] = []; + private modalRef: any; + + isProcessingSub: Subscription; + constructor(protected processService: ProcessDataService, protected paginationService: PaginationService, - protected ePersonService: EPersonDataService) { + protected ePersonService: EPersonDataService, + protected modalService: NgbModal, + public processBulkDeleteService: ProcessBulkDeleteService, + ) { } ngOnInit(): void { this.setProcesses(); + this.processBulkDeleteService.clearAllProcesses(); } /** @@ -60,7 +72,7 @@ export class ProcessOverviewComponent implements OnInit { */ setProcesses() { this.processesRD$ = this.paginationService.getFindListOptions(this.pageConfig.id, this.config).pipe( - switchMap((config) => this.processService.findAll(config)) + switchMap((config) => this.processService.findAll(config, true, false)) ); } @@ -74,8 +86,46 @@ export class ProcessOverviewComponent implements OnInit { map((eperson: EPerson) => eperson.name) ); } + ngOnDestroy(): void { this.paginationService.clearPagination(this.pageConfig.id); + if (hasValue(this.isProcessingSub)) { + this.isProcessingSub.unsubscribe(); + } } + /** + * Open a given modal. + * @param content - the modal content. + */ + openDeleteModal(content) { + this.modalRef = this.modalService.open(content); + } + + /** + * Close the modal. + */ + closeModal() { + this.modalRef.close(); + } + + /** + * Delete the previously selected processes using the processBulkDeleteService + * After the deletion has started, subscribe to the isProcessing$ and when it is set + * to false after the processing is done, close the modal and reinitialise the processes + */ + deleteSelected() { + this.processBulkDeleteService.deleteSelectedProcesses(); + + if (hasValue(this.isProcessingSub)) { + this.isProcessingSub.unsubscribe(); + } + this.isProcessingSub = this.processBulkDeleteService.isProcessing$() + .subscribe((isProcessing) => { + if (!isProcessing) { + this.closeModal(); + this.setProcesses(); + } + }); + } } diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 57863b3a69..31a32e11b7 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2983,6 +2983,22 @@ "process.detail.create" : "Create similar process", + "process.detail.actions": "Actions", + + "process.detail.delete.button": "Delete process", + + "process.detail.delete.header": "Delete process", + + "process.detail.delete.body": "Are you sure you want to delete the current process?", + + "process.detail.delete.cancel": "Cancel", + + "process.detail.delete.confirm": "Delete process", + + "process.detail.delete.success": "The process was successfully deleted.", + + "process.detail.delete.error": "Something went wrong when deleting the process", + "process.overview.table.finish" : "Finish time (UTC)", @@ -3003,6 +3019,25 @@ "process.overview.new": "New", + "process.overview.table.actions": "Actions", + + "process.overview.delete": "Delete {{count}} processes", + + "process.overview.delete.clear": "Clear delete selection", + + "process.overview.delete.processing": "{{count}} process(es) are being deleted. Please wait for the deletion to fully complete. Note that this can take a while.", + + "process.overview.delete.body": "Are you sure you want to delete {{count}} process(es)?", + + "process.overview.delete.header": "Delete processes", + + "process.bulk.delete.error.head": "Error on deleteing process", + + "process.bulk.delete.error.body": "The process with ID {{processId}} could not be deleted. The remaining processes will continue being deleted. ", + + "process.bulk.delete.success": "{{count}} process(es) have been succesfully deleted", + + "profile.breadcrumbs": "Update Profile", From 5ed369d097e07aab0fd5a128005a57bde6d1b280 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 19 Aug 2022 16:23:20 -0400 Subject: [PATCH 14/24] Make create, edit community/collection/item dialogs theme-able. --- src/app/menu.resolver.ts | 36 +++++++++---------- ...te-collection-parent-selector.component.ts | 28 +++++++++++++++ ...ate-community-parent-selector.component.ts | 27 ++++++++++++++ ...d-create-item-parent-selector.component.ts | 31 ++++++++++++++++ ...emed-edit-collection-selector.component.ts | 27 ++++++++++++++ ...hemed-edit-community-selector.component.ts | 27 ++++++++++++++ .../themed-edit-item-selector.component.ts | 27 ++++++++++++++ 7 files changed, 185 insertions(+), 18 deletions(-) create mode 100644 src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component.ts create mode 100644 src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component.ts create mode 100644 src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts create mode 100644 src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component.ts create mode 100644 src/app/shared/dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component.ts create mode 100644 src/app/shared/dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component.ts diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index 4c97d3d1b3..f12079f737 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -16,24 +16,24 @@ import { filter, find, map, take } from 'rxjs/operators'; import { hasValue } from './shared/empty.util'; import { FeatureID } from './core/data/feature-authorization/feature-id'; import { - CreateCommunityParentSelectorComponent -} from './shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component'; + ThemedCreateCommunityParentSelectorComponent +} from './shared/dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component'; import { OnClickMenuItemModel } from './shared/menu/menu-item/models/onclick.model'; import { - CreateCollectionParentSelectorComponent -} from './shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component'; + ThemedCreateCollectionParentSelectorComponent +} from './shared/dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component'; import { - CreateItemParentSelectorComponent -} from './shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; + ThemedCreateItemParentSelectorComponent +} from './shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component'; import { - EditCommunitySelectorComponent -} from './shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component'; + ThemedEditCommunitySelectorComponent +} from './shared/dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component'; import { - EditCollectionSelectorComponent -} from './shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component'; + ThemedEditCollectionSelectorComponent +} from './shared/dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component'; import { - EditItemSelectorComponent -} from './shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component'; + ThemedEditItemSelectorComponent +} from './shared/dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component'; import { ExportMetadataSelectorComponent } from './shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component'; @@ -188,7 +188,7 @@ export class MenuResolver implements Resolve { type: MenuItemType.ONCLICK, text: 'menu.section.new_community', function: () => { - this.modalService.open(CreateCommunityParentSelectorComponent); + this.modalService.open(ThemedCreateCommunityParentSelectorComponent); } } as OnClickMenuItemModel, }, @@ -201,7 +201,7 @@ export class MenuResolver implements Resolve { type: MenuItemType.ONCLICK, text: 'menu.section.new_collection', function: () => { - this.modalService.open(CreateCollectionParentSelectorComponent); + this.modalService.open(ThemedCreateCollectionParentSelectorComponent); } } as OnClickMenuItemModel, }, @@ -214,7 +214,7 @@ export class MenuResolver implements Resolve { type: MenuItemType.ONCLICK, text: 'menu.section.new_item', function: () => { - this.modalService.open(CreateItemParentSelectorComponent); + this.modalService.open(ThemedCreateItemParentSelectorComponent); } } as OnClickMenuItemModel, }, @@ -263,7 +263,7 @@ export class MenuResolver implements Resolve { type: MenuItemType.ONCLICK, text: 'menu.section.edit_community', function: () => { - this.modalService.open(EditCommunitySelectorComponent); + this.modalService.open(ThemedEditCommunitySelectorComponent); } } as OnClickMenuItemModel, }, @@ -276,7 +276,7 @@ export class MenuResolver implements Resolve { type: MenuItemType.ONCLICK, text: 'menu.section.edit_collection', function: () => { - this.modalService.open(EditCollectionSelectorComponent); + this.modalService.open(ThemedEditCollectionSelectorComponent); } } as OnClickMenuItemModel, }, @@ -289,7 +289,7 @@ export class MenuResolver implements Resolve { type: MenuItemType.ONCLICK, text: 'menu.section.edit_item', function: () => { - this.modalService.open(EditItemSelectorComponent); + this.modalService.open(ThemedEditItemSelectorComponent); } } as OnClickMenuItemModel, }, diff --git a/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component.ts new file mode 100644 index 0000000000..f6598aec99 --- /dev/null +++ b/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component.ts @@ -0,0 +1,28 @@ +import {Component} from "@angular/core"; +import {CreateCollectionParentSelectorComponent} from "./create-collection-parent-selector.component"; +import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; + +/** + * Themed wrapper for CreateCollectionParentSelectorComponent + */ +@Component({ + selector: 'ds-themed-create-collection-parent-selector', + styleUrls: [], + templateUrl: '../../../theme-support/themed.component.html' +}) +export class ThemedCreateCollectionParentSelectorComponent + extends ThemedComponent { + + protected getComponentName(): string { + return 'CreateCollectionParentSelectorComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../../themes/${themeName}/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./create-collection-parent-selector.component'); + } + +} diff --git a/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component.ts new file mode 100644 index 0000000000..92621978b8 --- /dev/null +++ b/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component.ts @@ -0,0 +1,27 @@ +import {Component} from "@angular/core"; +import {CreateCommunityParentSelectorComponent} from "./create-community-parent-selector.component"; +import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; + +/** + * Themed wrapper for CreateCommunityParentSelectorComponent + */ +@Component({ + selector: 'ds-themed-create-community-parent-selector', + styleUrls: [], + templateUrl: '../../../theme-support/themed.component.html' +}) +export class ThemedCreateCommunityParentSelectorComponent + extends ThemedComponent { + protected getComponentName(): string { + return 'CreateCommunityParentSelectorComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../../themes/${themeName}/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./create-community-parent-selector.component'); + } + +} diff --git a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts new file mode 100644 index 0000000000..70ab0d76ee --- /dev/null +++ b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts @@ -0,0 +1,31 @@ +import {Component, Input} from "@angular/core"; +import {CreateItemParentSelectorComponent} from "./create-item-parent-selector.component"; +import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; + +/** + * Themed wrapper for CreateItemParentSelectorComponent + */ +@Component({ + selector: 'ds-themed-create-item-parent-selector', + styleUrls: [], + templateUrl: '../../../theme-support/themed.component.html' +}) +export class ThemedCreateItemParentSelectorComponent + extends ThemedComponent { + @Input() entityType: string; + + protected inAndOutputNames: (keyof CreateItemParentSelectorComponent & keyof this)[] = ['entityType']; + + protected getComponentName(): string { + return 'CreateItemParentSelectorComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../../themes/${themeName}/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./create-item-parent-selector.component'); + } + +} diff --git a/src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component.ts new file mode 100644 index 0000000000..4e3191d03b --- /dev/null +++ b/src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component.ts @@ -0,0 +1,27 @@ +import {Component} from "@angular/core"; +import {EditCollectionSelectorComponent} from "./edit-collection-selector.component"; +import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; + +/** + * Themed wrapper for EditCollectionSelectorComponent + */ +@Component({ + selector: 'ds-themed-edit-collection-selector', + styleUrls: [], + templateUrl: '../../../theme-support/themed.component.html' +}) +export class ThemedEditCollectionSelectorComponent + extends ThemedComponent { + protected getComponentName(): string { + return 'EditCollectionSelectorComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../../themes/${themeName}/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./edit-collection-selector.component'); + } + +} diff --git a/src/app/shared/dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component.ts new file mode 100644 index 0000000000..d8232abcdb --- /dev/null +++ b/src/app/shared/dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component.ts @@ -0,0 +1,27 @@ +import {Component} from "@angular/core"; +import {EditCommunitySelectorComponent} from "./edit-community-selector.component"; +import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; + +/** + * Themed wrapper for EditCommunitySelectorComponent + */ +@Component({ + selector: 'ds-themed-edit-community-selector', + styleUrls: [], + templateUrl: '../../../theme-support/themed.component.html' +}) +export class ThemedEditCommunitySelectorComponent + extends ThemedComponent { + protected getComponentName(): string { + return 'EditCommunitySelectorComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../../themes/${themeName}/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./edit-community-selector.component'); + } + +} diff --git a/src/app/shared/dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component.ts new file mode 100644 index 0000000000..e1377e7fb4 --- /dev/null +++ b/src/app/shared/dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component.ts @@ -0,0 +1,27 @@ +import {Component} from "@angular/core"; +import {EditItemSelectorComponent} from "./edit-item-selector.component"; +import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; + +/** + * Themed wrapper for EditItemSelectorComponent + */ +@Component({ + selector: 'ds-themed-edit-item-selector', + styleUrls: [], + templateUrl: '../../../theme-support/themed.component.html' +}) +export class ThemedEditItemSelectorComponent + extends ThemedComponent { + protected getComponentName(): string { + return 'EditItemSelectorComponent'; + } + + protected importThemedComponent(themeName: string): Promise { + return import(`../../../../../themes/${themeName}/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component`); + } + + protected importUnthemedComponent(): Promise { + return import('./edit-item-selector.component'); + } + +} From b2feadc290c5b60dd45ac78b174902b187aae4e5 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 19 Aug 2022 16:47:10 -0400 Subject: [PATCH 15/24] Satisfy lint. --- .../themed-create-collection-parent-selector.component.ts | 6 +++--- .../themed-create-community-parent-selector.component.ts | 6 +++--- .../themed-create-item-parent-selector.component.ts | 6 +++--- .../themed-edit-collection-selector.component.ts | 6 +++--- .../themed-edit-community-selector.component.ts | 6 +++--- .../themed-edit-item-selector.component.ts | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component.ts index f6598aec99..d90cd0ac0d 100644 --- a/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component.ts @@ -1,6 +1,6 @@ -import {Component} from "@angular/core"; -import {CreateCollectionParentSelectorComponent} from "./create-collection-parent-selector.component"; -import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; +import {Component} from '@angular/core'; +import {CreateCollectionParentSelectorComponent} from './create-collection-parent-selector.component'; +import {ThemedComponent} from 'src/app/shared/theme-support/themed.component'; /** * Themed wrapper for CreateCollectionParentSelectorComponent diff --git a/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component.ts index 92621978b8..24bff97254 100644 --- a/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component.ts @@ -1,6 +1,6 @@ -import {Component} from "@angular/core"; -import {CreateCommunityParentSelectorComponent} from "./create-community-parent-selector.component"; -import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; +import {Component} from '@angular/core'; +import {CreateCommunityParentSelectorComponent} from './create-community-parent-selector.component'; +import {ThemedComponent} from 'src/app/shared/theme-support/themed.component'; /** * Themed wrapper for CreateCommunityParentSelectorComponent diff --git a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts index 70ab0d76ee..49209ea63b 100644 --- a/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component.ts @@ -1,6 +1,6 @@ -import {Component, Input} from "@angular/core"; -import {CreateItemParentSelectorComponent} from "./create-item-parent-selector.component"; -import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; +import {Component, Input} from '@angular/core'; +import {CreateItemParentSelectorComponent} from './create-item-parent-selector.component'; +import {ThemedComponent} from 'src/app/shared/theme-support/themed.component'; /** * Themed wrapper for CreateItemParentSelectorComponent diff --git a/src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component.ts index 4e3191d03b..999f466e75 100644 --- a/src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component.ts @@ -1,6 +1,6 @@ -import {Component} from "@angular/core"; -import {EditCollectionSelectorComponent} from "./edit-collection-selector.component"; -import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; +import {Component} from '@angular/core'; +import {EditCollectionSelectorComponent} from './edit-collection-selector.component'; +import {ThemedComponent} from 'src/app/shared/theme-support/themed.component'; /** * Themed wrapper for EditCollectionSelectorComponent diff --git a/src/app/shared/dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component.ts index d8232abcdb..e067803444 100644 --- a/src/app/shared/dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component.ts @@ -1,6 +1,6 @@ -import {Component} from "@angular/core"; -import {EditCommunitySelectorComponent} from "./edit-community-selector.component"; -import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; +import {Component} from '@angular/core'; +import {EditCommunitySelectorComponent} from './edit-community-selector.component'; +import {ThemedComponent} from 'src/app/shared/theme-support/themed.component'; /** * Themed wrapper for EditCommunitySelectorComponent diff --git a/src/app/shared/dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component.ts index e1377e7fb4..6d3b5691c1 100644 --- a/src/app/shared/dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component.ts @@ -1,6 +1,6 @@ -import {Component} from "@angular/core"; -import {EditItemSelectorComponent} from "./edit-item-selector.component"; -import {ThemedComponent} from "src/app/shared/theme-support/themed.component"; +import {Component} from '@angular/core'; +import {EditItemSelectorComponent} from './edit-item-selector.component'; +import {ThemedComponent} from 'src/app/shared/theme-support/themed.component'; /** * Themed wrapper for EditItemSelectorComponent From ca341e53b44210b3b189bb91743dc8dfd3e88968 Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Thu, 25 Aug 2022 15:33:23 +0200 Subject: [PATCH 16/24] Close modal on process delete success --- src/app/process-page/detail/process-detail.component.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/process-page/detail/process-detail.component.ts b/src/app/process-page/detail/process-detail.component.ts index f9151d27b8..9d92dece61 100644 --- a/src/app/process-page/detail/process-detail.component.ts +++ b/src/app/process-page/detail/process-detail.component.ts @@ -196,6 +196,7 @@ export class ProcessDetailComponent implements OnInit { ).subscribe((rd) => { if (rd.hasSucceeded) { this.notificationsService.success(this.translateService.get('process.detail.delete.success')); + this.closeModal(); this.router.navigateByUrl(getProcessListRoute()); } else { this.notificationsService.error(this.translateService.get('process.detail.delete.error')); From 72852dd031060887a7112d769f51be449157ce24 Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Thu, 25 Aug 2022 17:05:34 +0200 Subject: [PATCH 17/24] Fix test --- src/app/process-page/detail/process-detail.component.spec.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/process-page/detail/process-detail.component.spec.ts b/src/app/process-page/detail/process-detail.component.spec.ts index 53e65e62eb..e4ab7d1082 100644 --- a/src/app/process-page/detail/process-detail.component.spec.ts +++ b/src/app/process-page/detail/process-detail.component.spec.ts @@ -243,18 +243,23 @@ describe('ProcessDetailComponent', () => { describe('deleteProcess', () => { it('should delete the process and navigate back to the overview page on success', () => { + spyOn(component, 'closeModal'); component.deleteProcess(process); expect(processService.delete).toHaveBeenCalledWith(process.processId); expect(notificationsService.success).toHaveBeenCalled(); + expect(component.closeModal).toHaveBeenCalled(); expect(router.navigateByUrl).toHaveBeenCalledWith(getProcessListRoute()); }); it('should delete the process and not navigate on error', () => { (processService.delete as jasmine.Spy).and.returnValue(createFailedRemoteDataObject$()); + spyOn(component, 'closeModal'); + component.deleteProcess(process); expect(processService.delete).toHaveBeenCalledWith(process.processId); expect(notificationsService.error).toHaveBeenCalled(); + expect(component.closeModal).not.toHaveBeenCalled(); expect(router.navigateByUrl).not.toHaveBeenCalled(); }); }); From 154d66f1e8de1c09996f4775495d2aadacb354a0 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Fri, 26 Aug 2022 11:25:07 +0200 Subject: [PATCH 18/24] remove unused imports --- src/app/process-page/overview/process-overview.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/process-page/overview/process-overview.component.ts b/src/app/process-page/overview/process-overview.component.ts index 749f76b1a6..1ca29693cb 100644 --- a/src/app/process-page/overview/process-overview.component.ts +++ b/src/app/process-page/overview/process-overview.component.ts @@ -1,5 +1,5 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { BehaviorSubject, Observable, skipWhile, Subscription } from 'rxjs'; +import { Observable, Subscription } from 'rxjs'; import { RemoteData } from '../../core/data/remote-data'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { Process } from '../processes/process.model'; From 795870d7122c29fc8f1e9b06b6d755accb41a017 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 26 Aug 2022 11:35:44 -0500 Subject: [PATCH 19/24] Update gitattributes to force LF line endings for code --- .gitattributes | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index dfe0770424..406640bfcc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,16 @@ -# Auto detect text files and perform LF normalization +# By default, auto detect text files and perform LF normalization +# This ensures code is always checked in with LF line endings * text=auto + +# JS and TS files must always use LF for Angular tools to work +# Some Angular tools expect LF line endings, even on Windows. +# This ensures Windows always checks out these files with LF line endings +# We've copied many of these rules from https://github.com/angular/angular-cli/ +*.js eol=lf +*.ts eol=lf +*.json eol=lf +*.json5 eol=lf +*.css eol=lf +*.scss eol=lf +*.html eol=lf +*.svg eol=lf \ No newline at end of file From b891ae0237738e42a1557393cb3212b041c1d93c Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 26 Aug 2022 11:36:51 -0500 Subject: [PATCH 20/24] End-of-line normalization for some files --- scripts/sync-i18n-files.ts | 0 src/app/app.module.ts | 0 src/assets/i18n/tr.json5 | 10252 +++++++++++++++++------------------ 3 files changed, 5126 insertions(+), 5126 deletions(-) mode change 100755 => 100644 scripts/sync-i18n-files.ts mode change 100755 => 100644 src/app/app.module.ts diff --git a/scripts/sync-i18n-files.ts b/scripts/sync-i18n-files.ts old mode 100755 new mode 100644 diff --git a/src/app/app.module.ts b/src/app/app.module.ts old mode 100755 new mode 100644 diff --git a/src/assets/i18n/tr.json5 b/src/assets/i18n/tr.json5 index 7d658ee20f..d04a6eda2a 100644 --- a/src/assets/i18n/tr.json5 +++ b/src/assets/i18n/tr.json5 @@ -1,5126 +1,5126 @@ -{ - - // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", - "401.help": "Bu sayfaya erişim yetkiniz bulunmamaktadır. Ana sayfaya dönmek için aşağıdaki butonu kullanabilirsiniz.", - - // "401.link.home-page": "Take me to the home page", - "401.link.home-page": "Beni ana sayfaya götür", - - // "401.unauthorized": "unauthorized", - "401.unauthorized": "yetkisiz", - - - - // "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", - "403.help": "Bu sayfaya erişim yetkiniz bulunmamaktadır. Ana sayfaya dönmek için aşağıdaki butonu kullanabilirsiniz.", - - // "403.link.home-page": "Take me to the home page", - "403.link.home-page": "Beni ana sayfaya götür", - - // "403.forbidden": "forbidden", - "403.forbidden": "yasaklı", - - - - // "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. ", - "404.help": "Aradığınız sayfayı bulamıyoruz. Sayfa taşınmış veya silinmiş olabilir. Ana sayfaya geri dönmek için aşağıdaki butonu kullanabilirsiniz. ", - - // "404.link.home-page": "Take me to the home page", - "404.link.home-page": "Beni ana sayfaya götür", - - // "404.page-not-found": "page not found", - "404.page-not-found": "sayfa bulunamadı", - - // "admin.curation-tasks.breadcrumbs": "System curation tasks", - "admin.curation-tasks.breadcrumbs": "Sistem iyileştirme görevleri", - - // "admin.curation-tasks.title": "System curation tasks", - "admin.curation-tasks.title": "Sistem iyileştirme görevleri", - - // "admin.curation-tasks.header": "System curation tasks", - "admin.curation-tasks.header": "Sistem iyileştirme görevleri", - - // "admin.registries.bitstream-formats.breadcrumbs": "Format registry", - "admin.registries.bitstream-formats.breadcrumbs": "Kayıt defterini biçimlendir", - - // "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", - "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream biçimi", - - // "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", - "admin.registries.bitstream-formats.create.failure.content": "Yeni bitstream biçimi oluşturulurken bir hata oluştu.", - - // "admin.registries.bitstream-formats.create.failure.head": "Failure", - "admin.registries.bitstream-formats.create.failure.head": "Aksama", - - // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", - "admin.registries.bitstream-formats.create.head": "Vit akışı biçimi oluştur", - - // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", - "admin.registries.bitstream-formats.create.new": "Yeni bir bitstream biçimi ekleyin", - - // "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", - "admin.registries.bitstream-formats.create.success.content": "Yeni bitstream biçimi başarıyla oluşturuldu.", - - // "admin.registries.bitstream-formats.create.success.head": "Success", - "admin.registries.bitstream-formats.create.success.head": "Başarılı", - - // "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", - "admin.registries.bitstream-formats.delete.failure.amount": "{{ amount }} biçim(ler) kaldırılamadı", - - // "admin.registries.bitstream-formats.delete.failure.head": "Failure", - "admin.registries.bitstream-formats.delete.failure.head": "Aksama", - - // "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", - "admin.registries.bitstream-formats.delete.success.amount": "{{ amount }} biçim(ler) başarıyla kaldırıldı", - - // "admin.registries.bitstream-formats.delete.success.head": "Success", - "admin.registries.bitstream-formats.delete.success.head": "Başarılı", - - // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", - "admin.registries.bitstream-formats.description": "Bu bitstream biçimleri listesi, bilinen biçimler ve destek düzeyleri hakkında bilgi sağlar.", - - // "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", - "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream biçimi", - - // "admin.registries.bitstream-formats.edit.description.hint": "", - "admin.registries.bitstream-formats.edit.description.hint": "", - - // "admin.registries.bitstream-formats.edit.description.label": "Description", - "admin.registries.bitstream-formats.edit.description.label": "Tanımlama", - - // "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.hint": "Uzantılar, yüklenen dosyaların biçimini otomatik olarak tanımlamak için kullanılan dosya uzantılarıdır. Her biçim için birkaç uzantı girebilirsiniz.", - - // "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", - "admin.registries.bitstream-formats.edit.extensions.label": "Dosya uzantıları", - - // "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", - "admin.registries.bitstream-formats.edit.extensions.placeholder": "Nokta olmadan bir dosya uzantısı girin", - - // "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", - "admin.registries.bitstream-formats.edit.failure.content": "Bitstream biçimi düzenlenirken bir hata oluştu.", - - // "admin.registries.bitstream-formats.edit.failure.head": "Failure", - "admin.registries.bitstream-formats.edit.failure.head": "Aksama", - - // "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", - "admin.registries.bitstream-formats.edit.head": "Bitstream biçimi: {{ format }}", - - // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", - "admin.registries.bitstream-formats.edit.internal.hint": "Dahili olarak işaretlenen biçimler, kullanıcıdan gizlenir ve yönetim amacıyla kullanılır.", - - // "admin.registries.bitstream-formats.edit.internal.label": "Internal", - "admin.registries.bitstream-formats.edit.internal.label": "Dahili", - - // "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", - "admin.registries.bitstream-formats.edit.mimetype.hint": "Bu biçimle ilişkili MIME biçimi benzersiz olması gerekmez.", - - // "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", - "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Biçimi", - - // "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", - "admin.registries.bitstream-formats.edit.shortDescription.hint": "Bu biçim için benzersiz bir ad (ör. Microsoft Word XP veya Microsoft Word 2000)", - - // "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", - "admin.registries.bitstream-formats.edit.shortDescription.label": "İsim", - - // "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", - "admin.registries.bitstream-formats.edit.success.content": "Bitstream biçimi başarıyla düzenlendi.", - - // "admin.registries.bitstream-formats.edit.success.head": "Success", - "admin.registries.bitstream-formats.edit.success.head": "Başarılı", - - // "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", - "admin.registries.bitstream-formats.edit.supportLevel.hint": "Kurumunuzun bu biçim için taahhüt ettiği destek düzeyi.", - - // "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", - "admin.registries.bitstream-formats.edit.supportLevel.label": "Destek seviyesi", - - // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", - "admin.registries.bitstream-formats.head": "Bitstream Biçimi Kayıt Defteri", - - // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", - "admin.registries.bitstream-formats.no-items": "Gösterilecek bitstream biçimi yok.", - - // "admin.registries.bitstream-formats.table.delete": "Delete selected", - "admin.registries.bitstream-formats.table.delete": "Silme seçildi", - - // "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", - "admin.registries.bitstream-formats.table.deselect-all": "Tüm seçimleri kaldır", - - // "admin.registries.bitstream-formats.table.internal": "internal", - "admin.registries.bitstream-formats.table.internal": "dahili", - - // "admin.registries.bitstream-formats.table.mimetype": "MIME Type", - "admin.registries.bitstream-formats.table.mimetype": "MIME Biçimi", - - // "admin.registries.bitstream-formats.table.name": "Name", - "admin.registries.bitstream-formats.table.name": "İsim", - - // "admin.registries.bitstream-formats.table.return": "Return", - "admin.registries.bitstream-formats.table.return": "Geri Dön", - - // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", - "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Biliniyor", - - // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", - "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Destekleniyor", - - // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", - "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Bilinmiyor", - - // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", - "admin.registries.bitstream-formats.table.supportLevel.head": "Destek Seviyesi", - - // "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Format Registry", - "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Biçimi Kayıt Defteri ", - - - - // "admin.registries.metadata.breadcrumbs": "Metadata registry", - "admin.registries.metadata.breadcrumbs": "Metadata kayıt defteri", - - // "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.", - "admin.registries.metadata.description": "Metadata kayıt defteri, veri havuzda bulunan tüm metadata alanlarının bir listesini tutar. Bu alanlar birden çok şema arasında bölünebilir. Ancak, DSpace nitelikli Dublin Core şemasını gerektirir.", - - // "admin.registries.metadata.form.create": "Create metadata schema", - "admin.registries.metadata.form.create": "Metadata şeması oluştur", - - // "admin.registries.metadata.form.edit": "Edit metadata schema", - "admin.registries.metadata.form.edit": "Metadata şemasını düzenle", - - // "admin.registries.metadata.form.name": "Name", - "admin.registries.metadata.form.name": "İsim", - - // "admin.registries.metadata.form.namespace": "Namespace", - "admin.registries.metadata.form.namespace": "Ad Alanı", - - // "admin.registries.metadata.head": "Metadata Registry", - "admin.registries.metadata.head": "Metadata Kayıt Defteri", - - // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", - "admin.registries.metadata.schemas.no-items": "Gösterilecek metadata alanı yok.", - - // "admin.registries.metadata.schemas.table.delete": "Delete selected", - "admin.registries.metadata.schemas.table.delete": "Silme Seçildi", - - // "admin.registries.metadata.schemas.table.id": "ID", - "admin.registries.metadata.schemas.table.id": "Kimlik", - - // "admin.registries.metadata.schemas.table.name": "Name", - "admin.registries.metadata.schemas.table.name": "İsim", - - // "admin.registries.metadata.schemas.table.namespace": "Namespace", - "admin.registries.metadata.schemas.table.namespace": "Ad Alanı", - - // "admin.registries.metadata.title": "DSpace Angular :: Metadata Registry", - "admin.registries.metadata.title": "DSpace Angular :: Metadata Kayıt Defteri", - - - - // "admin.registries.schema.breadcrumbs": "Metadata schema", - "admin.registries.schema.breadcrumbs": "Metadata şeması", - - // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", - "admin.registries.schema.description": "Bu, \"{{namesapce}}\" için metadata şemasıdır.", - - // "admin.registries.schema.fields.head": "Schema metadata fields", - "admin.registries.schema.fields.head": "Şema metadata alanları", - - // "admin.registries.schema.fields.no-items": "No metadata fields to show.", - "admin.registries.schema.fields.no-items": "Gösterilecek metadata alanı yok.", - - // "admin.registries.schema.fields.table.delete": "Delete selected", - "admin.registries.schema.fields.table.delete": "Silme Seçildi", - - // "admin.registries.schema.fields.table.field": "Field", - "admin.registries.schema.fields.table.field": "Alan", - - // "admin.registries.schema.fields.table.scopenote": "Scope Note", - "admin.registries.schema.fields.table.scopenote": "Kapsam Notu", - - // "admin.registries.schema.form.create": "Create metadata field", - "admin.registries.schema.form.create": "Metadata alanı oluştur", - - // "admin.registries.schema.form.edit": "Edit metadata field", - "admin.registries.schema.form.edit": "Metadata alanını düzenle", - - // "admin.registries.schema.form.element": "Element", - "admin.registries.schema.form.element": "Element", - - // "admin.registries.schema.form.qualifier": "Qualifier", - "admin.registries.schema.form.qualifier": "Niteleyici", - - // "admin.registries.schema.form.scopenote": "Scope Note", - "admin.registries.schema.form.scopenote": "Kapsam Notu", - - // "admin.registries.schema.head": "Metadata Schema", - "admin.registries.schema.head": "Metadata Şeması", - - // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", - "admin.registries.schema.notification.created": "Metadata şeması \"{{prefix}}\" başarıyla oluşturuldu", - - // "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", - "admin.registries.schema.notification.deleted.failure": "{{amount}} metadata şeması silinemedi", - - // "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", - "admin.registries.schema.notification.deleted.success": "{{amount}} metadata şeması başarıyla silindi", - - // "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", - "admin.registries.schema.notification.edited": "Metadata şeması \"{{prefix}}\" başarıyla düzenlendi", - - // "admin.registries.schema.notification.failure": "Error", - "admin.registries.schema.notification.failure": "Hata", - - // "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", - "admin.registries.schema.notification.field.created": "\"{{field}}\" metadata alanı başarıyla oluşturuldu", - - // "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", - "admin.registries.schema.notification.field.deleted.failure": "{{amount}} metadata alanı silinemedi", - - // "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", - "admin.registries.schema.notification.field.deleted.success": "{{amount}} metadata alanı başarıyla silindi", - - // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", - "admin.registries.schema.notification.field.edited": "Metadata alanı \"{{field}}\" başarıyla düzenlendi", - - // "admin.registries.schema.notification.success": "Success", - "admin.registries.schema.notification.success": "Başarılı", - - // "admin.registries.schema.return": "Return", - "admin.registries.schema.return": "Geri Dön", - - // "admin.registries.schema.title": "DSpace Angular :: Metadata Schema Registry", - "admin.registries.schema.title": "DSpace Angular :: Metadata Şeması Kayıt Defteri", - - - - // "admin.access-control.epeople.actions.delete": "Delete EPerson", - "admin.access-control.epeople.actions.delete": "E-Kişiyi Sil", - - // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", - "admin.access-control.epeople.actions.impersonate": "E-Kişinin Kimliğine Bürün", - - // "admin.access-control.epeople.actions.reset": "Reset password", - "admin.access-control.epeople.actions.reset": "Parolayı sıfırla", - - // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", - "admin.access-control.epeople.actions.stop-impersonating": "E-Kişilerin kimliğine bürünmeyi durdurun", - - // "admin.access-control.epeople.title": "DSpace Angular :: EPeople", - "admin.access-control.epeople.title": "DSpace Angular :: E-kişiler", - - // "admin.access-control.epeople.head": "EPeople", - "admin.access-control.epeople.head": "E-Kişiler", - - // "admin.access-control.epeople.search.head": "Search", - "admin.access-control.epeople.search.head": "Ara", - - // "admin.access-control.epeople.button.see-all": "Tümüne Gözat", - "admin.access-control.epeople.button.see-all": "Browse All", - - // "admin.access-control.epeople.search.scope.metadata": "Metadata", - "admin.access-control.epeople.search.scope.metadata": "Metadata", - - // "admin.access-control.epeople.search.scope.email": "E-mail (exact)", - "admin.access-control.epeople.search.scope.email": "E-posta (tam)", - - // "admin.access-control.epeople.search.button": "Search", - "admin.access-control.epeople.search.button": "Ara", - - // "admin.access-control.epeople.button.add": "Add EPerson", - "admin.access-control.epeople.button.add": "E-Kişi Ekle", - - // "admin.access-control.epeople.table.id": "ID", - "admin.access-control.epeople.table.id": "Kimlik", - - // "admin.access-control.epeople.table.name": "Name", - "admin.access-control.epeople.table.name": "İsim", - - // "admin.access-control.epeople.table.email": "E-mail (exact)", - "admin.access-control.epeople.table.email": "E-posta (tam)", - - // "admin.access-control.epeople.table.edit": "Edit", - "admin.access-control.epeople.table.edit": "Düzenle", - - // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", - "admin.access-control.epeople.table.edit.buttons.edit": "Düzenle \"{{name}}\"", - - // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", - "admin.access-control.epeople.table.edit.buttons.remove": "Sil \"{{name}}\"", - - // "admin.access-control.epeople.no-items": "No EPeople to show.", - "admin.access-control.epeople.no-items": "Gösterilecek E-Kişiler yok.", - - // "admin.access-control.epeople.form.create": "Create EPerson", - "admin.access-control.epeople.form.create": "E-Kişi Oluştur", - - // "admin.access-control.epeople.form.edit": "Edit EPerson", - "admin.access-control.epeople.form.edit": "E-Kişiyi Düzenle", - - // "admin.access-control.epeople.form.firstName": "First name", - "admin.access-control.epeople.form.firstName": "İsim", - - // "admin.access-control.epeople.form.lastName": "Last name", - "admin.access-control.epeople.form.lastName": "Soyadı", - - // "admin.access-control.epeople.form.email": "E-mail", - "admin.access-control.epeople.form.email": "E-posta", - - // "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", - "admin.access-control.epeople.form.emailHint": "Geçerli bir e-posta adresi olmalı", - - // "admin.access-control.epeople.form.canLogIn": "Can log in", - "admin.access-control.epeople.form.canLogIn": "Giriş yapabilir", - - // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", - "admin.access-control.epeople.form.requireCertificate": "Sertifika gerektirir", - - // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", - "admin.access-control.epeople.form.notification.created.success": "E-Kişi \"{{name}}\" başarıyla oluşturuldu", - - // "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", - "admin.access-control.epeople.form.notification.created.failure": "E-Kişi \"{{name}}\" oluşturulamadı", - - // "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", - "admin.access-control.epeople.form.notification.created.failure.emailInUse": "E-Kişi \"{{name}}\" oluşturulamadı, e-posta \"{{email}}\" zaten kullanımda.", - - // "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", - "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "E-Kişi \"{{name}}\" düzenlenemedi, e-posta \"{{email}}\" zaten kullanımda.", - - // "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", - "admin.access-control.epeople.form.notification.edited.success": "E-kişi \"{{name}}\" başarıyla düzenlendi", - - // "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", - "admin.access-control.epeople.form.notification.edited.failure": "E-Kişi \"{{name}}\" düzenlenemedi", - - // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", - "admin.access-control.epeople.form.notification.deleted.success": "E-Kişi \"{{name}}\" başarıyla silindi", - - // "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", - "admin.access-control.epeople.form.notification.deleted.failure": "E-Kişi \"{{name}}\" silinemedi", - - // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", - "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Bu grupların üyesi:", - - // "admin.access-control.epeople.form.table.id": "ID", - "admin.access-control.epeople.form.table.id": "Kimlik", - - // "admin.access-control.epeople.form.table.name": "Name", - "admin.access-control.epeople.form.table.name": "İsim", - - // "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", - "admin.access-control.epeople.form.memberOfNoGroups": "Bu E-Kişi herhangi bir grubun üyesi değil", - - // "admin.access-control.epeople.form.goToGroups": "Add to groups", - "admin.access-control.epeople.form.goToGroups": "Gruplar ekle", - - // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", - "admin.access-control.epeople.notification.deleted.failure": "E-Kişi silinemedi: \"{{name}}\"", - - // "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", - "admin.access-control.epeople.notification.deleted.success": "E-Kişiler başarıyla silindi: \"{{name}}\"", - - - - // "admin.access-control.groups.title": "DSpace Angular :: Groups", - "admin.access-control.groups.title": "DSpace Angular :: Gruplar", - - // "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Edit Group", - "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Grubu Düzenle", - - // "admin.access-control.groups.title.addGroup": "DSpace Angular :: New Group", - "admin.access-control.groups.title.addGroup": "DSpace Angular :: Yeni Grup", - - // "admin.access-control.groups.head": "Groups", - "admin.access-control.groups.head": "Gruplar", - - // "admin.access-control.groups.button.add": "Add group", - "admin.access-control.groups.button.add": "Grup ekle", - - // "admin.access-control.groups.search.head": "Search groups", - "admin.access-control.groups.search.head": "Grupları ara", - - // "admin.access-control.groups.button.see-all": "Browse all", - "admin.access-control.groups.button.see-all": "Tümüne göz at", - - // "admin.access-control.groups.search.button": "Search", - "admin.access-control.groups.search.button": "Ara", - - // "admin.access-control.groups.table.id": "ID", - "admin.access-control.groups.table.id": "Kimlik", - - // "admin.access-control.groups.table.name": "Name", - "admin.access-control.groups.table.name": "İsim", - - // "admin.access-control.groups.table.members": "Members", - "admin.access-control.groups.table.members": "Üyeler", - - // "admin.access-control.groups.table.edit": "Edit", - "admin.access-control.groups.table.edit": "Düzenle", - - // "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", - "admin.access-control.groups.table.edit.buttons.edit": "Düzenle \"{{name}}\"", - - // "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", - "admin.access-control.groups.table.edit.buttons.remove": "Sil \"{{name}}\"", - - // "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", - "admin.access-control.groups.no-items": "Bu adla veya bu UUID olarak hiçbir grup bulunamadı", - - // "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", - "admin.access-control.groups.notification.deleted.success": "\"{{name}}\" grubu başarıyla silindi", - - // "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", - "admin.access-control.groups.notification.deleted.failure.title": "\"{{name}}\" grubu silinemedi", - - // "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", - "admin.access-control.groups.notification.deleted.failure.content": "Sorun: \"{{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.", - "admin.access-control.groups.form.alert.permanent": "Bu grup kalıcıdır, bu nedenle düzenlenemez veya silinemez. Yine de bu sayfayı kullanarak grup üyeleri ekleyip kaldırabilirsiniz.", - - // "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.", - "admin.access-control.groups.form.alert.workflowGroup": "Bu grup, \"{{name}}\" {{comcol}} içindeki gönderim ve iş akışı sürecindeki bir role karşılık geldiği için değiştirilemez veya silinemez. Bunu, {{comcol}} düzenleme sayfasındaki \"rol ata\" sekmesinden silebilirsiniz. Yine de bu sayfayı kullanarak grup üyeleri ekleyip kaldırabilirsiniz.", - - // "admin.access-control.groups.form.head.create": "Create group", - "admin.access-control.groups.form.head.create": "Grup oluştur", - - // "admin.access-control.groups.form.head.edit": "Edit group", - "admin.access-control.groups.form.head.edit": "Grubu düzenle", - - // "admin.access-control.groups.form.groupName": "Group name", - "admin.access-control.groups.form.groupName": "Grup adı", - - // "admin.access-control.groups.form.groupDescription": "Description", - "admin.access-control.groups.form.groupDescription": "Açıklama", - - // "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", - "admin.access-control.groups.form.notification.created.success": "Grup \"{{name}}\" başarıyla oluşturuldu", - - // "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", - "admin.access-control.groups.form.notification.created.failure": "\"{{name}}\" Grubu oluşturulamadı", - - // "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.", - "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Şu ada sahip Grup oluşturulamadı: \"{{name}}\", adın halihazırda kullanımda olmadığından emin olun.", - - // "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", - "admin.access-control.groups.form.notification.edited.failure": "\"{{name}}\" Grubu düzenlenemedi", - - // "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", - "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "\"{{name}}\" adı zaten kullanılıyor!", - - // "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", - "admin.access-control.groups.form.notification.edited.success": "\"{{name}}\" Grubu başarıyla düzenlendi", - - // "admin.access-control.groups.form.actions.delete": "Delete Group", - "admin.access-control.groups.form.actions.delete": "Grubu Sil", - - // "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", - "admin.access-control.groups.form.delete-group.modal.header": "\"{{ dsoName }}\" Grubunu Sil", - - // "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", - "admin.access-control.groups.form.delete-group.modal.info": "\"{{ dsoName }}\" Grubunu silmek istediğinizden emin misiniz?", - - // "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", - "admin.access-control.groups.form.delete-group.modal.cancel": "İptal", - - // "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", - "admin.access-control.groups.form.delete-group.modal.confirm": "Sil", - - // "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", - "admin.access-control.groups.form.notification.deleted.success": "\"{{ name }}\" grubu başarıyla silindi", - - // "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", - "admin.access-control.groups.form.notification.deleted.failure.title": "\"{{ name }}\" grubu silinemedi", - - // "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", - "admin.access-control.groups.form.notification.deleted.failure.content": "Sorun: \"{{ cause }}\"", - - // "admin.access-control.groups.form.members-list.head": "EPeople", - "admin.access-control.groups.form.members-list.head": "E-Kişiler", - - // "admin.access-control.groups.form.members-list.search.head": "Add EPeople", - "admin.access-control.groups.form.members-list.search.head": "E-Kişiler Ekle", - - // "admin.access-control.groups.form.members-list.button.see-all": "Browse All", - "admin.access-control.groups.form.members-list.button.see-all": "Tümüne Gözat", - - // "admin.access-control.groups.form.members-list.headMembers": "Current Members", - "admin.access-control.groups.form.members-list.headMembers": "Mevcut Üyeler", - - // "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", - "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", - - // "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", - "admin.access-control.groups.form.members-list.search.scope.email": "E-posta (tam)", - - // "admin.access-control.groups.form.members-list.search.button": "Search", - "admin.access-control.groups.form.members-list.search.button": "Ara", - - // "admin.access-control.groups.form.members-list.table.id": "ID", - "admin.access-control.groups.form.members-list.table.id": "Kimlik", - - // "admin.access-control.groups.form.members-list.table.name": "Name", - "admin.access-control.groups.form.members-list.table.name": "İsim", - - // "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", - "admin.access-control.groups.form.members-list.table.edit": "Kaldır / Ekle", - - // "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", - "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "\"{{name}}\" adlı üyeyi kaldırın", - - // "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", - "admin.access-control.groups.form.members-list.notification.success.addMember": "Üye başarıyla eklendi: \"{{name}}\"", - - // "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", - "admin.access-control.groups.form.members-list.notification.failure.addMember": "Üye eklenemedi: \"{{name}}\"", - - // "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", - "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Üye başarıyla silindi: \"{{name}}\"", - - // "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", - "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Üye silinemedi: \"{{name}}\"", - - // "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", - "admin.access-control.groups.form.members-list.table.edit.buttons.add": "\"{{name}}\" adlı üye ekleyin", - - // "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", - "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "Mevcut aktif grup yok, önce bir isim gönderin.", - - // "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", - "admin.access-control.groups.form.members-list.no-members-yet": "Henüz grupta üye yok, arayın ve ekleyin.", - - // "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", - "admin.access-control.groups.form.members-list.no-items": "Bu aramada E-Kişiler bulunamadı", - - // "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", - "admin.access-control.groups.form.subgroups-list.notification.failure": "Bir şeyler yanlış gitti: \"{{cause}}\"", - - // "admin.access-control.groups.form.subgroups-list.head": "Groups", - "admin.access-control.groups.form.subgroups-list.head": "Gruplar", - - // "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", - "admin.access-control.groups.form.subgroups-list.search.head": "Alt Grup Ekle", - - // "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", - "admin.access-control.groups.form.subgroups-list.button.see-all": "Tümüne Gözat", - - // "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", - "admin.access-control.groups.form.subgroups-list.headSubgroups": "Mevcut Alt Gruplar", - - // "admin.access-control.groups.form.subgroups-list.search.button": "Search", - "admin.access-control.groups.form.subgroups-list.search.button": "Ara", - - // "admin.access-control.groups.form.subgroups-list.table.id": "ID", - "admin.access-control.groups.form.subgroups-list.table.id": "Kimlik", - - // "admin.access-control.groups.form.subgroups-list.table.name": "Name", - "admin.access-control.groups.form.subgroups-list.table.name": "İsim", - - // "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", - "admin.access-control.groups.form.subgroups-list.table.edit": "Kaldır / Ekle", - - // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "\"{{name}}\" adlı alt grubu kaldırın", - - // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "\"{{name}}\" adlı alt grup ekleyin", - - // "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", - "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Mevcut grup", - - // "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Alt grup başarıyla eklendi: \"{{name}}\"", - - // "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Alt grup eklenemedi: \"{{name}}\"", - - // "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Alt grup başarıyla silindi: \"{{name}}\"", - - // "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", - "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Alt grup silinemedi: \"{{name}}\"", - - // "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", - "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Aktif grup mevcut değil, önce bir isim gönderin.", - - // "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", - "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "Bu grup mevcut, eklenemez.", - - // "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", - "admin.access-control.groups.form.subgroups-list.no-items": "Bu adla veya bu UUID olarak hiçbir grup bulunamadı", - - // "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", - "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Henüz grupta alt grup yok.", - - // "admin.access-control.groups.form.return": "Return to groups", - "admin.access-control.groups.form.return": "Gruplara dön", - - - - // "admin.search.breadcrumbs": "Administrative Search", - "admin.search.breadcrumbs": "Yönetimsel Arama", - - // "admin.search.collection.edit": "Edit", - "admin.search.collection.edit": "Düzenle", - - // "admin.search.community.edit": "Edit", - "admin.search.community.edit": "Düzenle", - - // "admin.search.item.delete": "Delete", - "admin.search.item.delete": "Sil", - - // "admin.search.item.edit": "Edit", - "admin.search.item.edit": "Düzenle", - - // "admin.search.item.make-private": "Make Private", - "admin.search.item.make-private": "Özel yap", - - // "admin.search.item.make-public": "Make Public", - "admin.search.item.make-public": "Ortak yap", - - // "admin.search.item.move": "Move", - "admin.search.item.move": "Taşı", - - // "admin.search.item.reinstate": "Reinstate", - "admin.search.item.reinstate": "Eski durumuna getir", - - // "admin.search.item.withdraw": "Withdraw", - "admin.search.item.withdraw": "Çekil", - - // "admin.search.title": "Administrative Search", - "admin.search.title": "Yönetimsel Arama", - - // "administrativeView.search.results.head": "Administrative Search", - "administrativeView.search.results.head": "Yönetimsel Arama", - - - - - // "admin.workflow.breadcrumbs": "Administer Workflow", - "admin.workflow.breadcrumbs": "İş Akışını Yönet", - - // "admin.workflow.title": "Administer Workflow", - "admin.workflow.title": "İş Akışını Yönet", - - // "admin.workflow.item.workflow": "Workflow", - "admin.workflow.item.workflow": "İş akışı", - - // "admin.workflow.item.delete": "Delete", - "admin.workflow.item.delete": "Sil", - - // "admin.workflow.item.send-back": "Send back", - "admin.workflow.item.send-back": "Geri gönder", - - - - // "admin.metadata-import.breadcrumbs": "Import Metadata", - "admin.metadata-import.breadcrumbs": "Metadataları İçe Aktar", - - // "admin.metadata-import.title": "Import Metadata", - "admin.metadata-import.title": "Metadataları İçe Aktar", - - // "admin.metadata-import.page.header": "Import Metadata", - "admin.metadata-import.page.header": "Metadataları İçe Aktar", - - // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", - "admin.metadata-import.page.help": "Dosyalarda toplu metadata işlemleri içeren CSV dosyalarını buraya bırakabilir veya bunlara göz atabilirsiniz.", - - // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", - "admin.metadata-import.page.dropMsg": "İçe aktarmak için bir metadata CSV'si bırakın", - - // "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", - "admin.metadata-import.page.dropMsgReplace": "İçe aktarılacak CSV metadatalarını değiştirmek için bırakın", - - // "admin.metadata-import.page.button.return": "Return", - "admin.metadata-import.page.button.return": "Geri Dön", - - // "admin.metadata-import.page.button.proceed": "Proceed", - "admin.metadata-import.page.button.proceed": "Devam Et", - - // "admin.metadata-import.page.error.addFile": "Select file first!", - "admin.metadata-import.page.error.addFile": "Önce dosyayı seçin!", - - - - - // "auth.errors.invalid-user": "Invalid email address or password.", - "auth.errors.invalid-user": "Geçersiz e-posta adresi veya parola.", - - // "auth.messages.expired": "Your session has expired. Please log in again.", - "auth.messages.expired": "Oturumunuz sona erdi. Lütfen tekrar giriş yapın.", - - - - // "bitstream.edit.bitstream": "Bitstream: ", - "bitstream.edit.bitstream": "Bitstream: ", - - // "bitstream.edit.form.description.hint": "Optionally, provide a brief description of the file, for example \"Main article\" or \"Experiment data readings\".", - "bitstream.edit.form.description.hint": "İsteğe bağlı olarak, dosyanın kısa bir açıklamasını sağlayın, örneğin \"Ana makale\" veya \"Deneme veri okumaları\".", - - // "bitstream.edit.form.description.label": "Description", - "bitstream.edit.form.description.label": "Açıklama", - - // "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.", - "bitstream.edit.form.embargo.hint": "Erişime izin verilen ilk gün. Bu tarih bu formda değiştirilemez. Bir bitstream için bir ambargo tarihi ayarlamak için Öğe Durumu sekmesine gidin, Yetkiler...'i tıklayın., bitstreamın OKU politikasını oluşturun veya düzenleyin ve Başlangıç ​​Tarihi'ni istediğiniz gibi ayarlayın.", - - // "bitstream.edit.form.embargo.label": "Embargo until specific date", - "bitstream.edit.form.embargo.label": "Belirli bir tarihe kadar ambargo", - - // "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.", - "bitstream.edit.form.fileName.hint": "Bitstreamın dosya adını değiştirin. Bunun görünen bitstream URL'sini değiştireceğini, ancak dizi kimliği değişmediği sürece eski bağlantıların çözüleceğini unutmayın.", - - // "bitstream.edit.form.fileName.label": "Filename", - "bitstream.edit.form.fileName.label": "Dosya adı", - - // "bitstream.edit.form.newFormat.label": "Describe new format", - "bitstream.edit.form.newFormat.label": "Yeni biçimi tanımla", - - // "bitstream.edit.form.newFormat.hint": "The application you used to create the file, and the version number (for example, \"ACMESoft SuperApp version 1.5\").", - "bitstream.edit.form.newFormat.hint": "Dosyayı oluşturmak için kullandığınız uygulama ve sürüm numarası (örneğin, \"ACMESoft SuperApp versiyon 1.5\").", - - // "bitstream.edit.form.primaryBitstream.label": "Primary bitstream", - "bitstream.edit.form.primaryBitstream.label": "Birincil bitstream", - - // "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\".", - "bitstream.edit.form.selectedFormat.hint": "Biçim yukarıdaki listede yoksa, select \"listede olmayan biçim\"i above ve \"Yeni biçimi tanımla\" altında açıklayın.", - - // "bitstream.edit.form.selectedFormat.label": "Selected Format", - "bitstream.edit.form.selectedFormat.label": "Seçilen Biçim", - - // "bitstream.edit.form.selectedFormat.unknown": "Format not in list", - "bitstream.edit.form.selectedFormat.unknown": "Listede olmayan biçim", - - // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", - "bitstream.edit.notifications.error.format.title": "Bitstreamın biçimi kaydedilirken bir hata oluştu", - - // "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", - "bitstream.edit.notifications.saved.content": "Bu bitstreamda yaptığınız değişiklikler kaydedildi.", - - // "bitstream.edit.notifications.saved.title": "Bitstream saved", - "bitstream.edit.notifications.saved.title": "Bitstream kaydedildi", - - // "bitstream.edit.title": "Edit bitstream", - "bitstream.edit.title": "Bitstreamı düzenle", - - - - // "browse.comcol.by.author": "By Author", - "browse.comcol.by.author": "Yazara Göre", - - // "browse.comcol.by.dateissued": "By Issue Date", - "browse.comcol.by.dateissued": "Yayın Tarihine Göre", - - // "browse.comcol.by.subject": "By Subject", - "browse.comcol.by.subject": "Konuya Göre", - - // "browse.comcol.by.title": "By Title", - "browse.comcol.by.title": "Başlığa Göre", - - // "browse.comcol.head": "Browse", - "browse.comcol.head": "Gözat", - - // "browse.empty": "No items to show.", - "browse.empty": "Gösterilecek öğe yok.", - - // "browse.metadata.author": "Author", - "browse.metadata.author": "Yazar", - - // "browse.metadata.dateissued": "Issue Date", - "browse.metadata.dateissued": "Yayın Tarihi", - - // "browse.metadata.subject": "Subject", - "browse.metadata.subject": "Konu", - - // "browse.metadata.title": "Title", - "browse.metadata.title": "Başlık", - - // "browse.metadata.author.breadcrumbs": "Browse by Author", - "browse.metadata.author.breadcrumbs": "Yazara Göre Gözat", - - // "browse.metadata.dateissued.breadcrumbs": "Browse by Date", - "browse.metadata.dateissued.breadcrumbs": "Tarihe Göre Gözat", - - // "browse.metadata.subject.breadcrumbs": "Browse by Subject", - "browse.metadata.subject.breadcrumbs": "Konuya Göre Gözat", - - // "browse.metadata.title.breadcrumbs": "Browse by Title", - "browse.metadata.title.breadcrumbs": "Başlığa göre göz atın", - - // "browse.startsWith.choose_start": "(Choose start)", - "browse.startsWith.choose_start": "(Başlangıç seç)", - - // "browse.startsWith.choose_year": "(Choose year)", - "browse.startsWith.choose_year": "(Yıl seç)", - - // "browse.startsWith.jump": "Jump to a point in the index:", - "browse.startsWith.jump": "Dizinde bir noktaya atla:", - - // "browse.startsWith.months.april": "April", - "browse.startsWith.months.april": "Nisan", - - // "browse.startsWith.months.august": "August", - "browse.startsWith.months.august": "Ağustos", - - // "browse.startsWith.months.december": "December", - "browse.startsWith.months.december": "Aralık", - - // "browse.startsWith.months.february": "February", - "browse.startsWith.months.february": "Şubat", - - // "browse.startsWith.months.january": "January", - "browse.startsWith.months.january": "Ocak", - - // "browse.startsWith.months.july": "July", - "browse.startsWith.months.july": "Temmuz", - - // "browse.startsWith.months.june": "June", - "browse.startsWith.months.june": "Haziran", - - // "browse.startsWith.months.march": "March", - "browse.startsWith.months.march": "Mart", - - // "browse.startsWith.months.may": "May", - "browse.startsWith.months.may": "Mayıs", - - // "browse.startsWith.months.none": "(Choose month)", - "browse.startsWith.months.none": "(Ay seçin)", - - // "browse.startsWith.months.november": "November", - "browse.startsWith.months.november": "Kasım", - - // "browse.startsWith.months.october": "October", - "browse.startsWith.months.october": "Ekim", - - // "browse.startsWith.months.september": "September", - "browse.startsWith.months.september": "Eylül", - - // "browse.startsWith.submit": "Go", - "browse.startsWith.submit": "Git", - - // "browse.startsWith.type_date": "Or type in a date (year-month):", - "browse.startsWith.type_date": "Veya bir tarih yazın (yıl-ay):", - - // "browse.startsWith.type_text": "Or enter first few letters:", - "browse.startsWith.type_text": "Veya ilk birkaç harfi girin:", - - // "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", - "browse.title": "{{ field }} {{ value }} ile {{ collection }}'a göz atma", - - - // "chips.remove": "Remove chip", - "chips.remove": "Çipi kaldır", - - - - // "collection.create.head": "Create a Collection", - "collection.create.head": "Koleksiyon Oluştur", - - // "collection.create.notifications.success": "Successfully created the Collection", - "collection.create.notifications.success": "Koleksiyon başarıyla oluşturuldu", - - // "collection.create.sub-head": "Create a Collection for Community {{ parent }}", - "collection.create.sub-head": "Komünite için Koleksiyon Oluşturun {{ parent }}", - - // "collection.curate.header": "Curate Collection: {{collection}}", - "collection.curate.header": "Koleksiyonu Düzenle: {{collection}}", - - // "collection.delete.cancel": "Cancel", - "collection.delete.cancel": "İptal", - - // "collection.delete.confirm": "Confirm", - "collection.delete.confirm": "Onayla", - - // "collection.delete.head": "Delete Collection", - "collection.delete.head": "Koleksiyonu sil", - - // "collection.delete.notification.fail": "Collection could not be deleted", - "collection.delete.notification.fail": "Koleksiyon silinemedi", - - // "collection.delete.notification.success": "Successfully deleted collection", - "collection.delete.notification.success": "Koleksiyon başarıyla silindi", - - // "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", - "collection.delete.text": "\"{{ dso }}\" koleksiyonunu silmek istediğinizden emin misiniz?", - - - - // "collection.edit.delete": "Delete this collection", - "collection.edit.delete": "Bu koleksiyonu sil", - - // "collection.edit.head": "Edit Collection", - "collection.edit.head": "Koleksiyonu Düzenle", - - // "collection.edit.breadcrumbs": "Edit Collection", - "collection.edit.breadcrumbs": "Koleksiyonu Düzenle", - - - - // "collection.edit.tabs.mapper.head": "Item Mapper", - "collection.edit.tabs.mapper.head": "Öğe eşleştirici", - - // "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", - "collection.edit.tabs.item-mapper.title": "Koleksiyon Düzenleme - Öğe Eşleştirici", - - // "collection.edit.item-mapper.cancel": "Cancel", - "collection.edit.item-mapper.cancel": "İptal", - - // "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", - "collection.edit.item-mapper.collection": "Koleksiyon: \"{{name}}\"", - - // "collection.edit.item-mapper.confirm": "Map selected items", - "collection.edit.item-mapper.confirm": "Seçilen öğeleri eşle", - - // "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.", - "collection.edit.item-mapper.description": "Bu, koleksiyon yöneticilerinin diğer koleksiyonlardaki öğeleri bu koleksiyona eşlemelerine olanak tanıyan öğe eşleyici aracıdır. Diğer koleksiyonlardaki öğeleri arayabilir ve bunları eşleyebilir veya şu anda eşlenmiş öğelerin listesine göz atabilirsiniz.", - - // "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", - "collection.edit.item-mapper.head": "Öğe Eşleştirici - Diğer Koleksiyonlardaki Öğeleri Eşle", - - // "collection.edit.item-mapper.no-search": "Please enter a query to search", - "collection.edit.item-mapper.no-search": "Lütfen aramak için bir sorgu girin", - - // "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", - "collection.edit.item-mapper.notifications.map.error.content": "{{amount}} öğenin eşlenmesinde hatalar oluştu.", - - // "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", - "collection.edit.item-mapper.notifications.map.error.head": "Eşleme hataları", - - // "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", - "collection.edit.item-mapper.notifications.map.success.content": "{{amount}} öğe başarıyla eşlendi.", - - // "collection.edit.item-mapper.notifications.map.success.head": "Mapping completed", - "collection.edit.item-mapper.notifications.map.success.head": "Eşleme tamamlandı", - - // "collection.edit.item-mapper.notifications.unmap.error.content": "Errors occurred for removing the mappings of {{amount}} items.", - "collection.edit.item-mapper.notifications.unmap.error.content": "{{amount}} öğenin eşlemeleri kaldırılırken hatalar oluştu.", - - // "collection.edit.item-mapper.notifications.unmap.error.head": "Remove mapping errors", - "collection.edit.item-mapper.notifications.unmap.error.head": "Eşleme hatalarını kaldır", - - // "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", - "collection.edit.item-mapper.notifications.unmap.success.content": "{{amount}} öğenin eşlemeleri başarıyla kaldırıldı.", - - // "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", - "collection.edit.item-mapper.notifications.unmap.success.head": "Eşlemeyi kaldır tamamlandı", - - // "collection.edit.item-mapper.remove": "Remove selected item mappings", - "collection.edit.item-mapper.remove": "Seçili öğe eşlemelerini kaldır", - - // "collection.edit.item-mapper.tabs.browse": "Browse mapped items", - "collection.edit.item-mapper.tabs.browse": "Eşlenen öğelere göz atın", - - // "collection.edit.item-mapper.tabs.map": "Map new items", - "collection.edit.item-mapper.tabs.map": "Yeni öğeleri işle", - - - - // "collection.edit.logo.label": "Collection logo", - "collection.edit.logo.label": "Koleksiyon logosu", - - // "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", - "collection.edit.logo.notifications.add.error": "Koleksiyon logosu yüklemesi başarısız. Lütfen yeniden denemeden önce içeriği doğrulayın.", - - // "collection.edit.logo.notifications.add.success": "Upload Collection logo successful.", - "collection.edit.logo.notifications.add.success": "Koleksiyon logosu yüklemesi başarılı.", - - // "collection.edit.logo.notifications.delete.success.title": "Logo deleted", - "collection.edit.logo.notifications.delete.success.title": "Logo silindi", - - // "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", - "collection.edit.logo.notifications.delete.success.content": "Koleksiyonun logosunu başarıyla silindi", - - // "collection.edit.logo.notifications.delete.error.title": "Error deleting logo", - "collection.edit.logo.notifications.delete.error.title": "Logo silinirken hata", - - // "collection.edit.logo.upload": "Drop a Collection Logo to upload", - "collection.edit.logo.upload": "Yüklenecek bir koleksiyon logosu bırakın", - - - - // "collection.edit.notifications.success": "Successfully edited the Collection", - "collection.edit.notifications.success": "Koleksiyon başarıyla düzenlendi.", - - // "collection.edit.return": "Return", - "collection.edit.return": "Dönüş", - - - - // "collection.edit.tabs.curate.head": "Curate", - "collection.edit.tabs.curate.head": "Kuratör", - - // "collection.edit.tabs.curate.title": "Collection Edit - Curate", - "collection.edit.tabs.curate.title": "Koleksiyon düzenleme - Küratör", - - // "collection.edit.tabs.authorizations.head": "Authorizations", - "collection.edit.tabs.authorizations.head": "Yetkilendirmeler", - - // "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", - "collection.edit.tabs.authorizations.title": "Koleksiyon düzenleme - Yetkilendirmeler", - - // "collection.edit.tabs.metadata.head": "Edit Metadata", - "collection.edit.tabs.metadata.head": "Metadataları Düzenle", - - // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", - "collection.edit.tabs.metadata.title": "Koleksiyon Düzenle - Metadatalar", - - // "collection.edit.tabs.roles.head": "Assign Roles", - "collection.edit.tabs.roles.head": "Rol atamak", - - // "collection.edit.tabs.roles.title": "Collection Edit - Roles", - "collection.edit.tabs.roles.title": "Koleksiyon düzenleme - Roller", - - // "collection.edit.tabs.source.external": "This collection harvests its content from an external source", - "collection.edit.tabs.source.external": "Bu koleksiyon içeriğini harici bir kaynaktan toplar", - - // "collection.edit.tabs.source.form.errors.oaiSource.required": "You must provide a set id of the target collection.", - "collection.edit.tabs.source.form.errors.oaiSource.required": "Hedef koleksiyonuna bir set kimliği sağlamalısınız.", - - // "collection.edit.tabs.source.form.harvestType": "Content being harvested", - "collection.edit.tabs.source.form.harvestType": "İçerik harmanlanıyor", - - // "collection.edit.tabs.source.form.head": "Configure an external source", - "collection.edit.tabs.source.form.head": "Harici bir kaynak yapılandır", - - // "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", - "collection.edit.tabs.source.form.metadataConfigId": "Metadata formatı", - - // "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", - "collection.edit.tabs.source.form.oaiSetId": "OAI'ya Özel Set Kimliği", - - // "collection.edit.tabs.source.form.oaiSource": "OAI Provider", - "collection.edit.tabs.source.form.oaiSource": "OAI Sağlayıcısı", - - // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Harvest metadata and bitstreams (requires ORE support)", - "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Metadatalarını ve bitstreamı topla (ORE desteği gerektirir)", - - // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest metadata and references to bitstreams (ORE desteği gerektirir)", - "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Metadatalarını ve referansları topla (ORE desteği gerektirir)", - - // "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvest metadata only", - "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Sadece metadatalarını topla", - - // "collection.edit.tabs.source.head": "Content Source", - "collection.edit.tabs.source.head": "İçerik Kaynağı", - - // "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.content": "Değişiklikleriniz silindi. Değişikliklerinizi eski haline getirmek için 'Geri Al' düğmesine tıklayın.", - - // "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", - "collection.edit.tabs.source.notifications.discarded.title": "Silinenler değiştirildi.", - - // "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", - "collection.edit.tabs.source.notifications.invalid.content": "Değişiklikleriniz kaydedilmedi. Lütfen kaydetmeden önce tüm alanların geçerli olduğundan emin olun.", - - // "collection.edit.tabs.source.notifications.invalid.title": "Metadata invalid", - "collection.edit.tabs.source.notifications.invalid.title": "Metadata geçersiz", - - // "collection.edit.tabs.source.notifications.saved.content": "Your changes to this collection's content source were saved.", - "collection.edit.tabs.source.notifications.saved.content": "Bu koleksiyonun içerik kaynağındaki değişiklikleriniz kaydedildi.", - - // "collection.edit.tabs.source.notifications.saved.title": "Content Source saved", - "collection.edit.tabs.source.notifications.saved.title": "İçerik Kaynağı kaydedildi", - - // "collection.edit.tabs.source.title": "Collection Edit - Content Source", - "collection.edit.tabs.source.title": "Koleksiyon düzenleme - İçerik Kaynağı", - - - - // "collection.edit.template.add-button": "Add", - "collection.edit.template.add-button": "Ekle", - - // "collection.edit.template.breadcrumbs": "Item template", - "collection.edit.template.breadcrumbs": "Öğe şablonu", - - // "collection.edit.template.cancel": "Cancel", - "collection.edit.template.cancel": "İptal", - - // "collection.edit.template.delete-button": "Delete", - "collection.edit.template.delete-button": "Sil", - - // "collection.edit.template.edit-button": "Edit", - "collection.edit.template.edit-button": "Düzenle", - - // "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", - "collection.edit.template.head": "Koleksiyon için Sablon Öğesini Düzenleyin \"{{ collection }}\"", - - // "collection.edit.template.label": "Template item", - "collection.edit.template.label": "Şablon öğe", - - // "collection.edit.template.notifications.delete.error": "Failed to delete the item template", - "collection.edit.template.notifications.delete.error": "Öğe şablonu silme başarısız", - - // "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", - "collection.edit.template.notifications.delete.success": "Öğe şablonu başarıyla silindi", - - // "collection.edit.template.title": "Edit Template Item", - "collection.edit.template.title": "Şablon Öğesini Düzenle", - - - - // "collection.form.abstract": "Short Description", - "collection.form.abstract": "Kısa Açıklama", - - // "collection.form.description": "Introductory text (HTML)", - "collection.form.description": "Tanıtım metni (HTML)", - - // "collection.form.errors.title.required": "Please enter a collection name", - "collection.form.errors.title.required": "Lütfen bir koleksiyon adı girin", - - // "collection.form.license": "License", - "collection.form.license": "Lisans", - - // "collection.form.provenance": "Provenance", - "collection.form.provenance": "Menşei", - - // "collection.form.rights": "Copyright text (HTML)", - "collection.form.rights": "Telif hakkı metni (HTML)", - - // "collection.form.tableofcontents": "News (HTML)", - "collection.form.tableofcontents": "Haberler (HTML)", - - // "collection.form.title": "Name", - "collection.form.title": "İsim", - - - - // "collection.listelement.badge": "Collection", - "collection.listelement.badge": "Koleksiyon", - - - - // "collection.page.browse.recent.head": "Recent Submissions", - "collection.page.browse.recent.head": "Son Başvurular", - - // "collection.page.browse.recent.empty": "No items to show", - "collection.page.browse.recent.empty": "Gösterilecek öğe yok", - - // "collection.page.edit": "Edit this collection", - "collection.page.edit": "Bu koleksiyonu düzenleyin", - - // "collection.page.handle": "Permanent URI for this collection", - "collection.page.handle": "Bu koleksiyon için kalıcı URI", - - // "collection.page.license": "License", - "collection.page.license": "Lisans", - - // "collection.page.news": "News", - "collection.page.news": "Haberler", - - - - // "collection.select.confirm": "Confirm selected", - "collection.select.confirm": "Seçilileri onayla", - - // "collection.select.empty": "No collections to show", - "collection.select.empty": "Gösterilecek koleksiyon yok", - - // "collection.select.table.title": "Title", - "collection.select.table.title": "Başlık", - - - - // "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", - "collection.source.update.notifications.error.content": "Sağlanan ayarlar test edildi ve işe yaramadı.", - - // "collection.source.update.notifications.error.title": "Server Error", - "collection.source.update.notifications.error.title": "Sunucu Hatası", - - - - // "communityList.tabTitle": "DSpace - Community List", - "communityList.tabTitle": "DSpace - Komünite Listesi", - - // "communityList.title": "List of Communities", - "communityList.title": "Komünitelerin Listesi", - - // "communityList.showMore": "Show More", - "communityList.showMore": "Daha fazla göster", - - - - // "community.create.head": "Create a Community", - "community.create.head": "Bir komünite oluştur", - - // "community.create.notifications.success": "Successfully created the Community", - "community.create.notifications.success": "Komünite başarıyla yaratıldı", - - // "community.create.sub-head": "Create a Sub-Community for Community {{ parent }}", - "community.create.sub-head": "Komünite için bir alt komünite oluşturun {{ parent }}", - - // "community.curate.header": "Curate Community: {{community}}", - "community.curate.header": "Kuratör komünitesi: {{community}}", - - // "community.delete.cancel": "Cancel", - "community.delete.cancel": "İptal", - - // "community.delete.confirm": "Confirm", - "community.delete.confirm": "Onayla", - - // "community.delete.head": "Delete Community", - "community.delete.head": "Komüniteyi sil", - - // "community.delete.notification.fail": "Community could not be deleted", - "community.delete.notification.fail": "Komünite silinemedi", - - // "community.delete.notification.success": "Successfully deleted community", - "community.delete.notification.success": "Komünite başarıyla silindi", - - // "community.delete.text": "Are you sure you want to delete community \"{{ dso }}\"", - "community.delete.text": "Komüniteyi silmek istediğinize emin misiniz \"{{ dso }}\"", - - // "community.edit.delete": "Delete this community", - "community.edit.delete": "Bu komüniteyi sil", - - // "community.edit.head": "Edit Community", - "community.edit.head": "Komüniteyi düzenle", - - // "community.edit.breadcrumbs": "Edit Community", - "community.edit.breadcrumbs": "Komüniteyi düzenle", - - - // "community.edit.logo.label": "Community logo", - "community.edit.logo.label": "Komünite logosu", - - // "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", - "community.edit.logo.notifications.add.error": "Komünite logosu yüklemesi başarısız. Lütfen yeniden denemeden önce içeriği doğrulayın.", - - // "community.edit.logo.notifications.add.success": "Upload Community logo successful.", - "community.edit.logo.notifications.add.success": "Komünite logosunu başarılı yükle.", - - // "community.edit.logo.notifications.delete.success.title": "Logo deleted", - "community.edit.logo.notifications.delete.success.title": "Logo silindi", - - // "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", - "community.edit.logo.notifications.delete.success.content": "Komünite logosu başarıyla silindi", - - // "community.edit.logo.notifications.delete.error.title": "Error deleting logo", - "community.edit.logo.notifications.delete.error.title": "Logo silme hatası", - - // "community.edit.logo.upload": "Drop a Community Logo to upload", - "community.edit.logo.upload": "Yüklenecek bir komünite logosu bırak", - - - - // "community.edit.notifications.success": "Successfully edited the Community", - "community.edit.notifications.success": "Komünite başarıyla düzenlendi", - - // "community.edit.notifications.unauthorized": "You do not have privileges to make this change", - "community.edit.notifications.unauthorized": "Bu değişikliği yapmak için ayrıcalıklarınız yok", - - // "community.edit.notifications.error": "An error occured while editing the Community", - "community.edit.notifications.error": "Komüniteyi düzenlerken bir hata oluştu", - - // "community.edit.return": "Return", - "community.edit.return": "Dönüş", - - - - // "community.edit.tabs.curate.head": "Curate", - "community.edit.tabs.curate.head": "Kuratör", - - // "community.edit.tabs.curate.title": "Community Edit - Curate", - "community.edit.tabs.curate.title": "Komünite Düzenle - Küratör", - - // "community.edit.tabs.metadata.head": "Edit Metadata", - "community.edit.tabs.metadata.head": "Metadataları Düzenle", - - // "community.edit.tabs.metadata.title": "Community Edit - Metadata", - "community.edit.tabs.metadata.title": "Komünite Düzenle - Metadatalar", - - // "community.edit.tabs.roles.head": "Assign Roles", - "community.edit.tabs.roles.head": "Rol atamak", - - // "community.edit.tabs.roles.title": "Community Edit - Roles", - "community.edit.tabs.roles.title": "Komünite Düzenle - Roller", - - // "community.edit.tabs.authorizations.head": "Authorizations", - "community.edit.tabs.authorizations.head": "Yetkilendirmeler", - - // "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", - "community.edit.tabs.authorizations.title": "Komünite Düzenle - Yetkilendirmeler", - - - - // "community.listelement.badge": "Community", - "community.listelement.badge": "Komünite", - - - - // "comcol-role.edit.no-group": "None", - "comcol-role.edit.no-group": "Hiçbiri", - - // "comcol-role.edit.create": "Create", - "comcol-role.edit.create": "Oluştur", - - // "comcol-role.edit.restrict": "Restrict", - "comcol-role.edit.restrict": "Kısıtla", - - // "comcol-role.edit.delete": "Delete", - "comcol-role.edit.delete": "Sil", - - - // "comcol-role.edit.community-admin.name": "Yöneticiler", - "comcol-role.edit.community-admin.name": "Administrators", - - // "comcol-role.edit.collection-admin.name": "Administrators", - "comcol-role.edit.collection-admin.name": "Yöneticiler", - - - // "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).", - "comcol-role.edit.community-admin.description": "Komünite yöneticileri alt komüniteler veya koleksiyonlar oluşturabilir ve bu alt komüniteler veya koleksiyonlar için yönetimi yönetebilir veya atayabilir. Ek olarak, kimsenin herhangi bir alt koleksiyona kimin gönderebileceğine, madde metadatalarını (sunulduktan sonra) düzenleyebileceğine karar verirler ve mevcut eşyaları diğer koleksiyonlardan (yetkilendirmeye tabi) ekleyin.", - - // "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).", - "comcol-role.edit.collection-admin.description": "Koleksiyon yöneticileri, eşyaları koleksiyona kimin gönderebileceğine, öğe metadatalarını (gönderimden sonra) düzenleyebileceğine karar verir ve mevcut eşyaları diğer koleksiyonlardan (bu koleksiyon için yetkilendirmeye tabi) ekleyin.", - - - // "comcol-role.edit.submitters.name": "Submitters", - "comcol-role.edit.submitters.name": "Göndericiler", - - // "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", - "comcol-role.edit.submitters.description": "Bu koleksiyona yeni eşya gönderme iznine sahip olan E-insanlar ve gruplar.", - - - // "comcol-role.edit.item_read.name": "Default item read access", - "comcol-role.edit.item_read.name": "Varsayılan öğe okuma erişimi", - - // "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.", - "comcol-role.edit.item_read.description": "Bu koleksiyona sunulan yeni eşyaları okuyabilen E-insanlar ve gruplar. Bu roldeki değişiklikler geriye dönük değildir. Sistemdeki mevcut eşyalar, eklemeleri sırasında erişimi okuyanlar tarafından görülebilir.", - - // "comcol-role.edit.item_read.anonymous-group": "Default read for incoming items is currently set to Anonymous.", - "comcol-role.edit.item_read.anonymous-group": "Gelen öğeler için varsayılan okuma şu anda isimsiz olarak ayarlanmıştır.", - - - // "comcol-role.edit.bitstream_read.name": "Default bitstream read access", - "comcol-role.edit.bitstream_read.name": "Varsayılan bitstream okuma erişimi", - - // "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).", - "comcol-role.edit.bitstream_read.description": "Komünite yöneticileri alt komüniteler veya koleksiyonlar oluşturabilir ve bu alt komüniteler veya koleksiyonlar için yönetimi yönetebilir veya atayabilirler. Ek olarak, eşyaları herhangi bir alt koleksiyona kimin gönderebileceğine, öğe metadatalarını (sunulduktan sonra) düzenleyebilir ve harita) Diğer koleksiyonlardan gelen mevcut eşyalar (yetkilendirmeye tabi).", - - // "comcol-role.edit.bitstream_read.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", - "comcol-role.edit.bitstream_read.anonymous-group": "Gelen bitstream için varsayılan okuma şu anda anonim olarak ayarlanmıştır.", - - - // "comcol-role.edit.editor.name": "Editors", - "comcol-role.edit.editor.name": "Editörler", - - // "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", - "comcol-role.edit.editor.description": "Editörler, gelen gönderilerin metadatalarını düzenleyebilir ve ardından onları kabul edebilir veya reddedebilir.", - - - // "comcol-role.edit.finaleditor.name": "Final editors", - "comcol-role.edit.finaleditor.name": "Son editörler", - - // "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", - "comcol-role.edit.finaleditor.description": "Nihai editörler gelen başvuruların metadatalarını düzenleyebilir, ancak onları reddedebilir.", - - - // "comcol-role.edit.reviewer.name": "Reviewers", - "comcol-role.edit.reviewer.name": "Yorumcular", - - // "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.", - "comcol-role.edit.reviewer.description": "Yorumcular gelen başvuruları kabul edebilir veya reddedebilirler. Ancak, gönderimin metadatalarını düzenleyemezler.", - - - - // "community.form.abstract": "Short Description", - "community.form.abstract": "Kısa Açıklama", - - // "community.form.description": "Introductory text (HTML)", - "community.form.description": "Tanıtım metni (HTML)", - - // "community.form.errors.title.required": "Please enter a community name", - "community.form.errors.title.required": "Lütfen bir komünite adı girin", - - // "community.form.rights": "Copyright text (HTML)", - "community.form.rights": "Telif Hakkı Metni (HTML)", - - // "community.form.tableofcontents": "News (HTML)", - "community.form.tableofcontents": "Haberler (HTML)", - - // "community.form.title": "Name", - "community.form.title": "İsim", - - // "community.page.edit": "Edit this community", - "community.page.edit": "Bu komüniteyi düzenle", - - // "community.page.handle": "Permanent URI for this community", - "community.page.handle": "Bu komünite için Kalıcı Uri", - - // "community.page.license": "License", - "community.page.license": "Lisans", - - // "community.page.news": "News", - "community.page.news": "Haberler", - - // "community.all-lists.head": "Subcommunities and Collections", - "community.all-lists.head": "Alt komüniteler ve koleksiyonlar", - - // "community.sub-collection-list.head": "Collections of this Community", - "community.sub-collection-list.head": "Bu komünitenin koleksiyonları", - - // "community.sub-community-list.head": "Communities of this Community", - "community.sub-community-list.head": "Bu komünitenin koleksiyonları", - - - - // "cookies.consent.accept-all": "Accept all", - "cookies.consent.accept-all": "Hepsini kabul et", - - // "cookies.consent.accept-selected": "Accept selected", - "cookies.consent.accept-selected": "Seçiliyi kabul et", - - // "cookies.consent.app.opt-out.description": "This app is loaded by default (but you can opt out)", - "cookies.consent.app.opt-out.description": "Bu uygulama varsayılan olarak yüklenir (ancak vazgeçebilirsiniz)", - - // "cookies.consent.app.opt-out.title": "(opt-out)", - "cookies.consent.app.opt-out.title": "(vazgeç)", - - // "cookies.consent.app.purpose": "purpose", - "cookies.consent.app.purpose": "amaç", - - // "cookies.consent.app.required.description": "This application is always required", - "cookies.consent.app.required.description": "Bu uygulama her zaman gereklidir", - - // "cookies.consent.app.required.title": "(always required)", - "cookies.consent.app.required.title": "(her zaman gerekli)", - - // "cookies.consent.update": "There were changes since your last visit, please update your consent.", - "cookies.consent.update": "Son ziyaretinizden bu yana değişiklikler vardı, lütfen onayınızı güncelleyin.", - - // "cookies.consent.close": "Close", - "cookies.consent.close": "Kapat", - - // "cookies.consent.decline": "Decline", - "cookies.consent.decline": "Reddet", - - // "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}.", - "cookies.consent.content-notice.description": "Kişisel bilgilerinizi aşağıdaki amaçlarla topluyor ve işleriz: Kimlik Doğrulama, Tercihler, Onay ve İstatistikler.
Daha fazla bilgi için, lütfen okuyun {privacyPolicy}.", - - // "cookies.consent.content-notice.learnMore": "Customize", - "cookies.consent.content-notice.learnMore": "Özelleştir", - - // "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", - "cookies.consent.content-modal.description": "Burada, sizin hakkınızda topladığımız bilgileri görebilir ve özelleştirebilirsiniz.", - - // "cookies.consent.content-modal.privacy-policy.name": "privacy policy", - "cookies.consent.content-modal.privacy-policy.name": "Gizlilik Politikası", - - // "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", - "cookies.consent.content-modal.privacy-policy.text": "Daha fazla bilgi için, lütfen okuyun {privacyPolicy}.", - - // "cookies.consent.content-modal.title": "Information that we collect", - "cookies.consent.content-modal.title": "Topladığımız bilgiler", - - - - // "cookies.consent.app.title.authentication": "Authentication", - "cookies.consent.app.title.authentication": "Kimlik doğrulama", - - // "cookies.consent.app.description.authentication": "Required for signing you in", - "cookies.consent.app.description.authentication": "Kayıt olmak için gerekli", - - - // "cookies.consent.app.title.preferences": "Preferences", - "cookies.consent.app.title.preferences": "Tercihler", - - // "cookies.consent.app.description.preferences": "Required for saving your preferences", - "cookies.consent.app.description.preferences": "Tercihlerinizi kaydetmek için gerekli", - - - - // "cookies.consent.app.title.acknowledgement": "Acknowledgement", - "cookies.consent.app.title.acknowledgement": "Onaylama", - - // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", - "cookies.consent.app.description.acknowledgement": "Teşekkürlerinizi ve onayları kurtarmak için gerekli", - - - - // "cookies.consent.app.title.google-analytics": "Google Analytics", - "cookies.consent.app.title.google-analytics": "Google Analitiği", - - // "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", - "cookies.consent.app.description.google-analytics": "İstatistiksel verileri izlememize izin verir", - - - - // "cookies.consent.purpose.functional": "Functional", - "cookies.consent.purpose.functional": "Fonksiyonel", - - // "cookies.consent.purpose.statistical": "Statistical", - "cookies.consent.purpose.statistical": "İstatistiksel", - - - // "curation-task.task.checklinks.label": "Check Links in Metadata", - "curation-task.task.checklinks.label": "Metadatalardaki Bağlantıları Kontrol Et", - - // "curation-task.task.noop.label": "NOOP", - "curation-task.task.noop.label": "NOOP", - - // "curation-task.task.profileformats.label": "Profile Bitstream Formats", - "curation-task.task.profileformats.label": "Profil Bitstream Formatları", - - // "curation-task.task.requiredmetadata.label": "Check for Required Metadata", - "curation-task.task.requiredmetadata.label": "Gerekli metadataları kontrol edin", - - // "curation-task.task.translate.label": "Microsoft Translator", - "curation-task.task.translate.label": "Microsoft Tercüman", - - // "curation-task.task.vscan.label": "Virus Scan", - "curation-task.task.vscan.label": "Virüs Taraması", - - - - // "curation.form.task-select.label": "Task:", - "curation.form.task-select.label": "Görev:", - - // "curation.form.submit": "Start", - "curation.form.submit": "Başlangıç", - - // "curation.form.submit.success.head": "The curation task has been started successfully", - "curation.form.submit.success.head": "Küratör görevi başarıyla başlatıldı", - - // "curation.form.submit.success.content": "You will be redirected to the corresponding process page.", - "curation.form.submit.success.content": "İlgili işlem sayfasına yönlendirileceksiniz.", - - // "curation.form.submit.error.head": "Running the curation task failed", - "curation.form.submit.error.head": "Küratörlük görevi başarısız oldu", - - // "curation.form.submit.error.content": "An error occured when trying to start the curation task.", - "curation.form.submit.error.content": "Küratörlük görevi başlatmaya çalışırken bir hata oluştu.", - - // "curation.form.handle.label": "Handle:", - "curation.form.handle.label": "Ele al:", - - // "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", - "curation.form.handle.hint": "İpucu: Gir [your-handle-prefix]/0 tüm sitede bir görevi çalıştırmak için (tüm görevler bu özelliği destekleyemez)", - - - - // "dso-selector.create.collection.head": "New collection", - "dso-selector.create.collection.head": "Yeni koleksiyon", - - // "dso-selector.create.collection.sub-level": "Create a new collection in", - "dso-selector.create.collection.sub-level": "Yeni bir koleksiyon oluşturun", - - // "dso-selector.create.community.head": "New community", - "dso-selector.create.community.head": "Yeni komünite", - - // "dso-selector.create.community.sub-level": "Create a new community in", - "dso-selector.create.community.sub-level": "Yeni bir komünite oluştur", - - // "dso-selector.create.community.top-level": "Create a new top-level community", - "dso-selector.create.community.top-level": "Yeni bir üst düzey komünite oluştur", - - // "dso-selector.create.item.head": "New item", - "dso-selector.create.item.head": "Yeni öğe", - - // "dso-selector.create.item.sub-level": "Create a new item in", - "dso-selector.create.item.sub-level": "İçinde yeni bir öğe oluşturun", - - // "dso-selector.create.submission.head": "New submission", - "dso-selector.create.submission.head": "Yeni başvuru", - - // "dso-selector.edit.collection.head": "Edit collection", - "dso-selector.edit.collection.head": "Koleksiyonu Düzenle", - - // "dso-selector.edit.community.head": "Edit community", - "dso-selector.edit.community.head": "Topluluğu Düzenle", - - // "dso-selector.edit.item.head": "Edit item", - "dso-selector.edit.item.head": "Ögeyi düzenle", - - // "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", - "dso-selector.export-metadata.dspaceobject.head": "Metadatalarını dışa aktar", - - // "dso-selector.no-results": "No {{ type }} found ", - "dso-selector.no-results": "Bulunamadı {{ type }} ", - - // "dso-selector.placeholder": "Search for a {{ type }}", - "dso-selector.placeholder": " Ara {{ type }}", - - - - // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", - "confirmation-modal.export-metadata.header": "Metadatalarını dışa aktar {{ dsoName }}", - - // "confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}", - "confirmation-modal.export-metadata.info": "Metadataları dışarı aktarmak istediğinizden emin misiniz {{ dsoName }}", - - // "confirmation-modal.export-metadata.cancel": "Cancel", - "confirmation-modal.export-metadata.cancel": "İptal", - - // "confirmation-modal.export-metadata.confirm": "Export", - "confirmation-modal.export-metadata.confirm": "Dışarı aktar", - - // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", - "confirmation-modal.delete-eperson.header": "EPerson'ı sil \"{{ dsoName }}\"", - - // "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", - "confirmation-modal.delete-eperson.info": "Eperson'u silmek istediğinize emin misiniz? \"{{ dsoName }}\"", - - // "confirmation-modal.delete-eperson.cancel": "Cancel", - "confirmation-modal.delete-eperson.cancel": "İptal", - - // "confirmation-modal.delete-eperson.confirm": "Delete", - "confirmation-modal.delete-eperson.confirm": "Sil", - - - // "error.bitstream": "Error fetching bitstream", - "error.bitstream": "Alınan bitstream hatası", - - // "error.browse-by": "Error fetching items", - "error.browse-by": "Alınan öğeler hatası", - - // "error.collection": "Error fetching collection", - "error.collection": "Alınan koleksiyon hatası", - - // "error.collections": "Error fetching collections", - "error.collections": "Alınan koleksiyonlar hatası", - - // "error.community": "Error fetching community", - "error.community": "Alınan komünite hatası", - - // "error.identifier": "No item found for the identifier", - "error.identifier": "Tanımlayıcı için ürün bulunamadı", - - // "error.default": "Error", - "error.default": "Hata", - - // "error.item": "Error fetching item", - "error.item": "Alınan öğe hatası", - - // "error.items": "Error fetching items", - "error.items": "Alınan öğeler hatası", - - // "error.objects": "Error fetching objects", - "error.objects": "Alınan nesneler hatası", - - // "error.recent-submissions": "Error fetching recent submissions", - "error.recent-submissions": "Son başvuruları alma hatası", - - // "error.search-results": "Error fetching search results", - "error.search-results": "Arama sonuçlarını alma hatası", - - // "error.sub-collections": "Error fetching sub-collections", - "error.sub-collections": "Alt koleksiyonları alma hatası", - - // "error.sub-communities": "Error fetching sub-communities", - "error.sub-communities": "Alt komüniteleri alma hatası", - - // "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

", - "error.submission.sections.init-form-error": "Bölüm başlatma sırasında bir hata oluştu, lütfen giriş formu yapılandırmanızı kontrol edin. Detaylar aşağıdadır :

", - - // "error.top-level-communities": "Error fetching top-level communities", - "error.top-level-communities": "Üst düzey komüniteleri alma hatası", - - // "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.", - "error.validation.license.notgranted": "Gönderinizi tamamlamak için bu lisansı vermelisiniz. Bu lisansı şu anda veremiyorsanız, çalışmanızı kaydedebilir ve daha sonra geri gönderebilir veya gönderimi kaldırabilirsiniz.", - - // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", - "error.validation.pattern": "Bu giriş mevcut modelle sınırlandırılmıştır.: {{ pattern }}.", - - // "error.validation.filerequired": "The file upload is mandatory", - "error.validation.filerequired": "Dosya yükleme zorunludur", - - - - // "file-section.error.header": "Error obtaining files for this item", - "file-section.error.header": "Bu öğe için dosyaları elde etme hatası", - - - - // "footer.copyright": "copyright © 2002-{{ year }}", - "footer.copyright": "telif hakkı © 2002-{{ year }}", - - // "footer.link.dspace": "DSpace software", - "footer.link.dspace": "DSpace yazılım", - - // "footer.link.lyrasis": "LYRASIS", - "footer.link.lyrasis": "LYRASIS", - - // "footer.link.cookies": "Cookie settings", - "footer.link.cookies": "Çerez Ayarları", - - // "footer.link.privacy-policy": "Privacy policy", - "footer.link.privacy-policy": "Gizlilik Politikası", - - // "footer.link.end-user-agreement":"End User Agreement", - "footer.link.end-user-agreement":"Son Kullanıcı Sözleşmesi", - - - - // "forgot-email.form.header": "Forgot Password", - "forgot-email.form.header": "Parolanızı mı unuttunuz", - - // "forgot-email.form.info": "Enter Register an account to subscribe to collections for email updates, and submit new items to DSpace.", - "forgot-email.form.info": "E-posta güncellemeleri için koleksiyonlara abone olmak için bir hesap kaydedin ve DSPace'e yeni öğeler gönderin.", - - // "forgot-email.form.email": "Email Address *", - "forgot-email.form.email": "Eposta Adresi *", - - // "forgot-email.form.email.error.required": "Please fill in an email address", - "forgot-email.form.email.error.required": "Lütfen bir e-posta adresi giriniz", - - // "forgot-email.form.email.error.pattern": "Please fill in a valid email address", - "forgot-email.form.email.error.pattern": "Lütfen bir e-posta adresi giriniz", - - // "forgot-email.form.email.hint": "This address will be verified and used as your login name.", - "forgot-email.form.email.hint": "Bu adres, giriş adınız olarak doğrulanacak ve kullanılacaktır.", - - // "forgot-email.form.submit": "Submit", - "forgot-email.form.submit": "Kaydet", - - // "forgot-email.form.success.head": "Verification email sent", - "forgot-email.form.success.head": "Doğrulama e-postası gönderildi", - - // "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", - "forgot-email.form.success.content": "Özel bir URL ve daha fazla talimat içeren bir e posta bu {{ email }} mail adresin gönderildi. ", - - // "forgot-email.form.error.head": "Error when trying to register email", - "forgot-email.form.error.head": "E-postayı kaydetmeye çalışırken hata oluştu", - - // "forgot-email.form.error.content": "An error occured when registering the following email address: {{ email }}", - "forgot-email.form.error.content": "E-posta adresini kaydederken bir hata oluştu: {{ email }}", - - - - // "forgot-password.title": "Forgot Password", - "forgot-password.title": "Parolanızı mı unuttunuz", - - // "forgot-password.form.head": "Forgot Password", - "forgot-password.form.head": "Parolanızı mı unuttunuz", - - // "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.", - "forgot-password.form.info": "Aşağıdaki kutuya yeni bir parola girin ve tekrar ikinci kutuya yazarak onaylayın. En az altı karakter uzunluğunda olmalıdır.", - - // "forgot-password.form.card.security": "Security", - "forgot-password.form.card.security": "Güvenlik", - - // "forgot-password.form.identification.header": "Identify", - "forgot-password.form.identification.header": "Kimlik", - - // "forgot-password.form.identification.email": "Email address: ", - "forgot-password.form.identification.email": "E-posta adresi: ", - - // "forgot-password.form.label.password": "Password", - "forgot-password.form.label.password": "Parola", - - // "forgot-password.form.label.passwordrepeat": "Retype to confirm", - "forgot-password.form.label.passwordrepeat": "Doğrulamak için yeniden yazınız", - - // "forgot-password.form.error.empty-password": "Please enter a password in the box below.", - "forgot-password.form.error.empty-password": "Lütfen aşağıdaki kutuya bir parola girin.", - - // "forgot-password.form.error.matching-passwords": "The passwords do not match.", - "forgot-password.form.error.matching-passwords": "Parolalar eşleşmiyor.", - - // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", - "forgot-password.form.error.password-length": "Parola en az 6 karakter uzunluğunda olmalıdır.", - - // "forgot-password.form.notification.error.title": "Error when trying to submit new password", - "forgot-password.form.notification.error.title": "Yeni parola göndermeye çalışırken hata oluştu", - - // "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", - "forgot-password.form.notification.success.content": "Parola sıfırlama başarılı oldu. Oluşturulan kullanıcı olarak giriş yaptınız.", - - // "forgot-password.form.notification.success.title": "Password reset completed", - "forgot-password.form.notification.success.title": "Parola sıfırlama tamamlandı", - - // "forgot-password.form.submit": "Submit password", - "forgot-password.form.submit": "Parolayı kaydet", - - - - // "form.add": "Add", - "form.add": "Ekle", - - // "form.add-help": "Click here to add the current entry and to add another one", - "form.add-help": "Geçerli girişi eklemek ve bir tane daha eklemek için buraya tıklayın.", - - // "form.cancel": "Cancel", - "form.cancel": "İptal", - - // "form.clear": "Clear", - "form.clear": "Temizle", - - // "form.clear-help": "Click here to remove the selected value", - "form.clear-help": "Seçilen değeri kaldırmak için buraya tıklayın", - - // "form.edit": "Edit", - "form.edit": "Düzenle", - - // "form.edit-help": "Click here to edit the selected value", - "form.edit-help": "Seçilen değeri düzenlemek için buraya tıklayın", - - // "form.first-name": "First name", - "form.first-name": "İlk adı", - - // "form.group-collapse": "Collapse", - "form.group-collapse": "Yığmak", - - // "form.group-collapse-help": "Click here to collapse", - "form.group-collapse-help": "Yığmak için buraya tıklayın", - - // "form.group-expand": "Expand", - "form.group-expand": "Uzat", - - // "form.group-expand-help": "Click here to expand and add more elements", - "form.group-expand-help": "Genişletmek ve daha fazla öğe eklemek için buraya tıklayın", - - // "form.last-name": "Last name", - "form.last-name": "Soyadı", - - // "form.loading": "Loading...", - "form.loading": "Yükleniyor...", - - // "form.lookup": "Lookup", - "form.lookup": "Yukarı Bak", - - // "form.lookup-help": "Click here to look up an existing relation", - "form.lookup-help": "Mevcut bir bağlantı aramak için buraya tıklayın", - - // "form.no-results": "No results found", - "form.no-results": "Sonuç bulunamadı", - - // "form.no-value": "No value entered", - "form.no-value": "Değer girilmez", - - // "form.other-information": {}, - "form.other-information": {}, - - // "form.remove": "Remove", - "form.remove": "Kaldır", - - // "form.save": "Save", - "form.save": "Kaydet", - - // "form.save-help": "Save changes", - "form.save-help": "Değişiklikleri kaydet", - - // "form.search": "Search", - "form.search": "Ara", - - // "form.search-help": "Click here to look for an existing correspondence", - "form.search-help": "Mevcut bir yazışma aramak için buraya tıklayın", - - // "form.submit": "Submit", - "form.submit": "Gönder", - - - - // "home.description": "", - "home.description": "", - - // "home.breadcrumbs": "Home", - "home.breadcrumbs": "Anasayfa", - - // "home.title": "DSpace Angular :: Home", - "home.title": "DSpace Açısal :: Anasayfa", - - // "home.top-level-communities.head": "Communities in DSpace", - "home.top-level-communities.head": "Dspace'deki Komüniteler", - - // "home.top-level-communities.help": "Select a community to browse its collections.", - "home.top-level-communities.help": "Koleksiyonlarına göz atmak için bir komünite seçin.", - - // "home.search-form.placeholder": "Search the repository ...", - "home.search-form.placeholder": "Depoda ara ...", - - - // "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", - "info.end-user-agreement.accept": "Okudum ve son kullanıcı sözleşmesini kabul ediyorum", - - // "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", - "info.end-user-agreement.accept.error": "Son kullanıcı sözleşmesini kabul eden bir hata oluştu", - - // "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", - "info.end-user-agreement.accept.success": "Son Kullanıcı Sözleşmesini başarıyla güncelledi", - - // "info.end-user-agreement.breadcrumbs": "End User Agreement", - "info.end-user-agreement.breadcrumbs": "Son Kullanıcı Sözleşmesi", - - // "info.end-user-agreement.buttons.cancel": "Cancel", - "info.end-user-agreement.buttons.cancel": "İptal", - - // "info.end-user-agreement.buttons.save": "Save", - "info.end-user-agreement.buttons.save": "Kaydet", - - // "info.end-user-agreement.head": "End User Agreement", - "info.end-user-agreement.head": "Son Kullanıcı Sözleşmesi", - - // "info.end-user-agreement.title": "End User Agreement", - "info.end-user-agreement.title": "Son Kullanıcı Sözleşmesi", - - // "info.privacy.breadcrumbs": "Privacy Statement", - "info.privacy.breadcrumbs": "Gizlilik bildirimi", - - // "info.privacy.head": "Privacy Statement", - "info.privacy.head": "Gizlilik bildirimi", - - // "info.privacy.title": "Privacy Statement", - "info.privacy.title": "Gizlilik bildirimi", - - - - // "item.alerts.private": "This item is private", - "item.alerts.private": "Bu öğe özel", - - // "item.alerts.withdrawn": "This item has been withdrawn", - "item.alerts.withdrawn": "Bu ürün geri çekildi", - - - - // "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.", - "item.edit.authorizations.heading": "Bu editör ile bir öğenin politikalarını görüntüleyebilir ve değiştirebilirsiniz, ayrıca bireysel ürün bileşenlerinin politikalarını değiştirebilirsiniz: Paketler ve Bitstream. Kısaca, bir öğe bir paket konteynırıdır ve paketler bitstream konteynırıdır. Konteynerler genellikle, bitstream yalnızca okuma / yazma politikalarına sahip olur.", - - // "item.edit.authorizations.title": "Edit item's Policies", - "item.edit.authorizations.title": "Edit item's Politikalar", - - - - // "item.badge.private": "Private", - "item.badge.private": "Özel", - - // "item.badge.withdrawn": "Withdrawn", - "item.badge.withdrawn": "Çekilmiş", - - - - // "item.bitstreams.upload.bundle": "Bundle", - "item.bitstreams.upload.bundle": "Paket", - - // "item.bitstreams.upload.bundle.placeholder": "Select a bundle", - "item.bitstreams.upload.bundle.placeholder": "Bir paket seçin", - - // "item.bitstreams.upload.bundle.new": "Create bundle", - "item.bitstreams.upload.bundle.new": "Paket oluştur", - - // "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.", - "item.bitstreams.upload.bundles.empty": "Bu öğe, bir bitstream yüklemek için herhangi bir paket içermiyor.", - - // "item.bitstreams.upload.cancel": "Cancel", - "item.bitstreams.upload.cancel": "İptal", - - // "item.bitstreams.upload.drop-message": "Drop a file to upload", - "item.bitstreams.upload.drop-message": "Yüklenecek bir dosya bırak", - - // "item.bitstreams.upload.item": "Item: ", - "item.bitstreams.upload.item": "Öğe: ", - - // "item.bitstreams.upload.notifications.bundle.created.content": "Successfully created new bundle.", - "item.bitstreams.upload.notifications.bundle.created.content": "Başarıyla yeni paket oluşturuldu.", - - // "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", - "item.bitstreams.upload.notifications.bundle.created.title": "Paket oluşturdu", - - // "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", - "item.bitstreams.upload.notifications.upload.failed": "Yükleme başarısız. Lütfen yeniden denemeden önce içeriği doğrulayın.", - - // "item.bitstreams.upload.title": "Upload bitstream", - "item.bitstreams.upload.title": "Bitstream yükle", - - - - // "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", - "item.edit.bitstreams.bundle.edit.buttons.upload": "Yükle", - - // "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", - "item.edit.bitstreams.bundle.displaying": "Şu anda görüntülenen {{ amount }} bitstream {{ total }}.", - - // "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", - "item.edit.bitstreams.bundle.load.all": "Hepsini yükle ({{ total }})", - - // "item.edit.bitstreams.bundle.load.more": "Load more", - "item.edit.bitstreams.bundle.load.more": "Daha fazla yükle", - - // "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", - "item.edit.bitstreams.bundle.name": "PAKET: {{ name }}", - - // "item.edit.bitstreams.discard-button": "Discard", - "item.edit.bitstreams.discard-button": "Yoksay", - - // "item.edit.bitstreams.edit.buttons.download": "Download", - "item.edit.bitstreams.edit.buttons.download": "İndir", - - // "item.edit.bitstreams.edit.buttons.drag": "Drag", - "item.edit.bitstreams.edit.buttons.drag": "Sürükle", - - // "item.edit.bitstreams.edit.buttons.edit": "Edit", - "item.edit.bitstreams.edit.buttons.edit": "Düzenle", - - // "item.edit.bitstreams.edit.buttons.remove": "Remove", - "item.edit.bitstreams.edit.buttons.remove": "Kaldır", - - // "item.edit.bitstreams.edit.buttons.undo": "Undo changes", - "item.edit.bitstreams.edit.buttons.undo": "Değişiklikleri geri al", - - // "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", - "item.edit.bitstreams.empty": "Bu öge herhangi bir veri içermiyor. Bir tane oluşturmak için yükle düğmesini tıklayınız.", - - // "item.edit.bitstreams.headers.actions": "Actions", - "item.edit.bitstreams.headers.actions": "İşlemler", - - // "item.edit.bitstreams.headers.bundle": "Bundle", - "item.edit.bitstreams.headers.bundle": "Seri", - - // "item.edit.bitstreams.headers.description": "Description", - "item.edit.bitstreams.headers.description": "Açıklama", - - // "item.edit.bitstreams.headers.format": "Format", - "item.edit.bitstreams.headers.format": "Format", - - // "item.edit.bitstreams.headers.name": "Name", - "item.edit.bitstreams.headers.name": "Ad", - - // "item.edit.bitstreams.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - "item.edit.bitstreams.notifications.discarded.content": "Yaptığınız değişiklikler silindi.Yaptığınız değişiklikleri geri yüklemek için 'Geri al' butonuna tıklayınız.", - - // "item.edit.bitstreams.notifications.discarded.title": "Changes discarded", - "item.edit.bitstreams.notifications.discarded.title": "Değişiklikler silindi.", - - // "item.edit.bitstreams.notifications.move.failed.title": "Error moving bitstreams", - "item.edit.bitstreams.notifications.move.failed.title": "Veri taşınırken bir hata oluştu.", - - // "item.edit.bitstreams.notifications.move.saved.content": "Your move changes to this item's bitstreams and bundles have been saved.", - "item.edit.bitstreams.notifications.move.saved.content": "Bu öğenin bitstreamda ve paketlerinde yaptığınız değişiklikler kaydedildi.", - - // "item.edit.bitstreams.notifications.move.saved.title": "Move changes saved", - "item.edit.bitstreams.notifications.move.saved.title": "Değişiklikler kaydedildi.", - - // "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", - "item.edit.bitstreams.notifications.outdated.content": "Şu anda üzerinde çalıştığınız öğe başka bir kullanıcı tarafından değiştirildi.Mevcut değişiklikleriniz çakışma olmasını önlemek için silindi. ", - - // "item.edit.bitstreams.notifications.outdated.title": "Changes outdated", - "item.edit.bitstreams.notifications.outdated.title": "Değişiklikler zaman aşımına uğradı.", - - // "item.edit.bitstreams.notifications.remove.failed.title": "Error deleting bitstream", - "item.edit.bitstreams.notifications.remove.failed.title": "Bitstream silinirken bir hata oluştu", - - // "item.edit.bitstreams.notifications.remove.saved.content": "Your removal changes to this item's bitstreams have been saved.", - "item.edit.bitstreams.notifications.remove.saved.content": "Bu öğenin bitstreamda yaptığınız kaldırma değişiklikleri kaydedildi.", - - // "item.edit.bitstreams.notifications.remove.saved.title": "Removal changes saved", - "item.edit.bitstreams.notifications.remove.saved.title": "Kaldırma değişiklikleri kaydedildi.", - - // "item.edit.bitstreams.reinstate-button": "Undo", - "item.edit.bitstreams.reinstate-button": "Geri al", - - // "item.edit.bitstreams.save-button": "Save", - "item.edit.bitstreams.save-button": "Kaydet", - - // "item.edit.bitstreams.upload-button": "Upload", - "item.edit.bitstreams.upload-button": "Yükle", - - - - // "item.edit.delete.cancel": "Cancel", - "item.edit.delete.cancel": "İptal et", - - // "item.edit.delete.confirm": "Delete", - "item.edit.delete.confirm": "Sil", - - // "item.edit.delete.description": "Are you sure this item should be completely deleted? Caution: At present, no tombstone would be left.", - "item.edit.delete.description": "Bu öğeyi kalıcı olarak silmek istedğinizden emin misiniz? Silme işlemi gerçekleştikten sonra geri alınamaz. ", - - // "item.edit.delete.error": "An error occurred while deleting the item", - "item.edit.delete.error": "Silme işlemi sırasında bir hata oluştu.", - - // "item.edit.delete.header": "Delete item: {{ id }}", - "item.edit.delete.header": "Silinecek öğeler: {{ id }}", - - // "item.edit.delete.success": "The item has been deleted", - "item.edit.delete.success": "Öğe silindi.", - - // "item.edit.head": "Edit Item", - "item.edit.head": "Ögeleri düzenle", - - // "item.edit.breadcrumbs": "Edit Item", - "item.edit.breadcrumbs": "Ögeleri düzenle", - - - // "item.edit.tabs.mapper.head": "Collection Mapper", - "item.edit.tabs.mapper.head": "Koleksiyon eşleştiricisi", - - // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", - "item.edit.tabs.item-mapper.title": "Öge düzenle- Koleksiyon eşleştiricisi", - - // "item.edit.item-mapper.buttons.add": "Map item to selected collections", - "item.edit.item-mapper.buttons.add": "Ögeyi seçili koleksiyonlarla eşleştir", - - // "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", - "item.edit.item-mapper.buttons.remove": "Seçili koleksiyonların öge eşleştirmelerini kaldır", - - // "item.edit.item-mapper.cancel": "Cancel", - "item.edit.item-mapper.cancel": "İptal et", - - // "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.", - "item.edit.item-mapper.description": "Öge eşleme aracı, yöneticilerin bu öğeyi diğer koleksiyonlarla eşleştirmesini ögeleri eşleştirmesini sağlar. Koleksiyonları arayabilir ve bunları eşleyebilir veya öğenin şu anda eşlendiği koleksiyonların listesine göz atabilirsiniz.", - - // "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", - "item.edit.item-mapper.head": "Öge eşleştirici - Ögeleri koleksiyonlarla eşleştirir", - - // "item.edit.item-mapper.item": "Item: \"{{name}}\"", - "item.edit.item-mapper.item": "Öge: \"{{name}}\"", - - // "item.edit.item-mapper.no-search": "Please enter a query to search", - "item.edit.item-mapper.no-search": "Lütfen arama yapmak için bir soru giriniz.", - - // "item.edit.item-mapper.notifications.add.error.content": "Errors occurred for mapping of item to {{amount}} collections.", - "item.edit.item-mapper.notifications.add.error.content": "Ögelerin {{amount}} koleksiyonlarla eşleştirirken bir hata oluştu.", - - // "item.edit.item-mapper.notifications.add.error.head": "Mapping errors", - "item.edit.item-mapper.notifications.add.error.head": "Eşleştirme hataları", - - // "item.edit.item-mapper.notifications.add.success.content": "Successfully mapped item to {{amount}} collections.", - "item.edit.item-mapper.notifications.add.success.content": "Ögeler {{amount}} koleksiyonlarla başarıyla eşleştirildi.", - - // "item.edit.item-mapper.notifications.add.success.head": "Mapping completed", - "item.edit.item-mapper.notifications.add.success.head": "Eşleştirme tamamlandı.", - - // "item.edit.item-mapper.notifications.remove.error.content": "Errors occurred for the removal of the mapping to {{amount}} collections.", - "item.edit.item-mapper.notifications.remove.error.content": "Ögelerin {{amount}} koleksiyonlarla eşleştirmeleri kaldırılırken bir hata oluştu.", - - // "item.edit.item-mapper.notifications.remove.error.head": "Removal of mapping errors", - "item.edit.item-mapper.notifications.remove.error.head": "Eşleştirme hatalarının kaldırılması", - - // "item.edit.item-mapper.notifications.remove.success.content": "Successfully removed mapping of item to {{amount}} collections.", - "item.edit.item-mapper.notifications.remove.success.content": "Ögeler {{amount}} koleksiyonlarla eşleştirmeleri başarıyla kaldırıldı.", - - // "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", - "item.edit.item-mapper.notifications.remove.success.head": "Eşleştirmelerin kaldırılması tamamlandı.", - - // "item.edit.item-mapper.tabs.browse": "Browse mapped collections", - "item.edit.item-mapper.tabs.browse": "Eşleştirilen koleksiyonları ara", - - // "item.edit.item-mapper.tabs.map": "Map new collections", - "item.edit.item-mapper.tabs.map": "Yeni koleksiyonları eşleştir", - - - - // "item.edit.metadata.add-button": "Add", - "item.edit.metadata.add-button": "Ekle", - - // "item.edit.metadata.discard-button": "Discard", - "item.edit.metadata.discard-button": "Sil", - - // "item.edit.metadata.edit.buttons.edit": "Edit", - "item.edit.metadata.edit.buttons.edit": "Düzenle", - - // "item.edit.metadata.edit.buttons.remove": "Remove", - "item.edit.metadata.edit.buttons.remove": "Kaldır", - - // "item.edit.metadata.edit.buttons.undo": "Undo changes", - "item.edit.metadata.edit.buttons.undo": "Değişiklikleri geri al", - - // "item.edit.metadata.edit.buttons.unedit": "Stop editing", - "item.edit.metadata.edit.buttons.unedit": "Düzenlemeyi bitir", - - // "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", - "item.edit.metadata.empty": "Öğe şu anda herhangi bir metadata içermiyor. Bir metadata değeri eklemeye başlamak için Ekle'ye tıklayın.", - - // "item.edit.metadata.headers.edit": "Edit", - "item.edit.metadata.headers.edit": "Düzenle", - - // "item.edit.metadata.headers.field": "Field", - "item.edit.metadata.headers.field": "Alan", - - // "item.edit.metadata.headers.language": "Lang", - "item.edit.metadata.headers.language": "Dil", - - // "item.edit.metadata.headers.value": "Value", - "item.edit.metadata.headers.value": "Değer", - - // "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", - "item.edit.metadata.metadatafield.invalid": "Lütfen geçerli bir metadata alanı seçin", - - // "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - "item.edit.metadata.notifications.discarded.content": "Yaptığınız değişiklikler silindi.Yaptığınız değişiklikleri geri yüklemek için 'Geri al' butonuna tıklayınız.", - - // "item.edit.metadata.notifications.discarded.title": "Changed discarded", - "item.edit.metadata.notifications.discarded.title": "Değişiklikler silindi", - - // "item.edit.metadata.notifications.error.title": "An error occurred", - "item.edit.metadata.notifications.error.title": "Bir hata oluştu", - - // "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", - "item.edit.metadata.notifications.invalid.content": "Değişiklikleriniz kaydedilmedi. Lütfen kaydetmeden önce tüm alanların geçerli olduğundan emin olun.", - - // "item.edit.metadata.notifications.invalid.title": "Metadata invalid", - "item.edit.metadata.notifications.invalid.title": "Metadata geçersiz", - - // "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.content": "Şu anda üzerinde çalıştığınız öge başka bir kullanıcı tarafından değiştirildi.Mevcut değişiklikleriniz çakışma olmasını önlemek için silindi.", - - // "item.edit.metadata.notifications.outdated.title": "Changed outdated", - "item.edit.metadata.notifications.outdated.title": "Değişiklikler zaman aşımına uğradı.", - - // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", - "item.edit.metadata.notifications.saved.content": "Ögenin metadatalarında yaptığınız değişiklikler kaydedildi.", - - // "item.edit.metadata.notifications.saved.title": "Metadata saved", - "item.edit.metadata.notifications.saved.title": "Metadatalar kaydedildi", - - // "item.edit.metadata.reinstate-button": "Undo", - "item.edit.metadata.reinstate-button": "Geri al", - - // "item.edit.metadata.save-button": "Save", - "item.edit.metadata.save-button": "Kaydet", - - - - // "item.edit.modify.overview.field": "Field", - "item.edit.modify.overview.field": "Alan", - - // "item.edit.modify.overview.language": "Language", - "item.edit.modify.overview.language": "Dil", - - // "item.edit.modify.overview.value": "Value", - "item.edit.modify.overview.value": "Değer", - - - - // "item.edit.move.cancel": "Cancel", - "item.edit.move.cancel": "İptal et", - - // "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.", - "item.edit.move.description": "Bu öğeyi taşımak istediğiniz koleksiyonu seçin. Görüntülenen koleksiyonların listesini daraltmak için arama kısmına bir arama sorgusu girebilirsiniz.", - - // "item.edit.move.error": "An error occurred when attempting to move the item", - "item.edit.move.error": "Öğeyi taşımaya çalışırken bir hata oluştu", - - // "item.edit.move.head": "Move item: {{id}}", - "item.edit.move.head": "Kaldırılacak öge: {{id}}", - - // "item.edit.move.inheritpolicies.checkbox": "Inherit policies", - "item.edit.move.inheritpolicies.checkbox": "Poliçeyi devral", - - // "item.edit.move.inheritpolicies.description": "Inherit the default policies of the destination collection", - "item.edit.move.inheritpolicies.description": "Hedef koleksiyonun varsayılan poliçelerini devral", - - // "item.edit.move.move": "Move", - "item.edit.move.move": "Taşı", - - // "item.edit.move.processing": "Moving...", - "item.edit.move.processing": "Taşınıyor...", - - // "item.edit.move.search.placeholder": "Enter a search query to look for collections", - "item.edit.move.search.placeholder": "Lütfen koleksiyonları aramak için bir arama sorgusu giriniz.", - - // "item.edit.move.success": "The item has been moved successfully", - "item.edit.move.success": "Öge başarıyla taşındı", - - // "item.edit.move.title": "Move item", - "item.edit.move.title": "Ögeleri taşı", - - - - // "item.edit.private.cancel": "Cancel", - "item.edit.private.cancel": "İptal et", - - // "item.edit.private.confirm": "Make it Private", - "item.edit.private.confirm": "Gizli yap", - - // "item.edit.private.description": "Are you sure this item should be made private in the archive?", - "item.edit.private.description": "Bu öğenin arşivde gizli yapılması gerektiğinden emin misiniz?", - - // "item.edit.private.error": "An error occurred while making the item private", - "item.edit.private.error": "Öge gizli yapılırken bir hata oluştu", - - // "item.edit.private.header": "Make item private: {{ id }}", - "item.edit.private.header": "Ögeyi gizli yap: {{ id }}", - - // "item.edit.private.success": "The item is now private", - "item.edit.private.success": "Öge gizlendi", - - - - // "item.edit.public.cancel": "Cancel", - "item.edit.public.cancel": "İptal et", - - // "item.edit.public.confirm": "Make it Public", - "item.edit.public.confirm": "Ögeyi herkese açık yap", - - // "item.edit.public.description": "Are you sure this item should be made public in the archive?", - "item.edit.public.description": "Bu öğenin arşivde herkese açık yapılması gerektiğinden emin misiniz?", - - // "item.edit.public.error": "An error occurred while making the item public", - "item.edit.public.error": "Öge herkese açık yapılırken bir hata oluştu", - - // "item.edit.public.header": "Make item public: {{ id }}", - "item.edit.public.header": "Herkese açık yapılacak öge: {{ id }}", - - // "item.edit.public.success": "The item is now public", - "item.edit.public.success": "Öge herkese açık yapıldı", - - - - // "item.edit.reinstate.cancel": "Cancel", - "item.edit.reinstate.cancel": "İptal et", - - // "item.edit.reinstate.confirm": "Reinstate", - "item.edit.reinstate.confirm": "Getir yükle", - - // "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?", - "item.edit.reinstate.description": "Bu öğenin arşive geri yüklenmesi gerektiğinden emin misiniz?", - - // "item.edit.reinstate.error": "An error occurred while reinstating the item", - "item.edit.reinstate.error": "Öğe geri yüklenirken bir hata oluştu", - - // "item.edit.reinstate.header": "Reinstate item: {{ id }}", - "item.edit.reinstate.header": "Geri yüklenecek öge: {{ id }}", - - // "item.edit.reinstate.success": "The item was reinstated successfully", - "item.edit.reinstate.success": "Öge başarıyla geri yüklendi", - - - - // "item.edit.relationships.discard-button": "Discard", - "item.edit.relationships.discard-button": "Sil", - - // "item.edit.relationships.edit.buttons.add": "Add", - "item.edit.relationships.edit.buttons.add": "Ekle", - - // "item.edit.relationships.edit.buttons.remove": "Remove", - "item.edit.relationships.edit.buttons.remove": "Kaldır", - - // "item.edit.relationships.edit.buttons.undo": "Undo changes", - "item.edit.relationships.edit.buttons.undo": "Değişiklikleri geri al", - - // "item.edit.relationships.no-relationships": "No relationships", - "item.edit.relationships.no-relationships": "İlişki yok", - - // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - "item.edit.relationships.notifications.discarded.content": "Yaptığınız değişiklikler silindi.Yaptığınız değişiklikleri geri yüklemek için 'Geri al' butonuna tıklayınız.", - - // "item.edit.relationships.notifications.discarded.title": "Changes discarded", - "item.edit.relationships.notifications.discarded.title": "Değişiklikler silindi", - - // "item.edit.relationships.notifications.failed.title": "Error editing relationships", - "item.edit.relationships.notifications.failed.title": "İlişkileri düzenlemede hata", - - // "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", - "item.edit.relationships.notifications.outdated.content": "Şu anda üzerinde çalıştığınız öge başka bir kullanıcı tarafından değiştirildi.Mevcut değişiklikleriniz çakışma olmasını önlemek için silindi.", - - // "item.edit.relationships.notifications.outdated.title": "Changes outdated", - "item.edit.relationships.notifications.outdated.title": "Değişiklikler zaman aşımına uğradı.", - - // "item.edit.relationships.notifications.saved.content": "Your changes to this item's relationships were saved.", - "item.edit.relationships.notifications.saved.content": "Bu öğenin ilişkilerinde yaptığınız değişiklikler kaydedildi.", - - // "item.edit.relationships.notifications.saved.title": "Relationships saved", - "item.edit.relationships.notifications.saved.title": "İlişkiler kaydedildi", - - // "item.edit.relationships.reinstate-button": "Undo", - "item.edit.relationships.reinstate-button": "Geri al", - - // "item.edit.relationships.save-button": "Save", - "item.edit.relationships.save-button": "Kaydet", - - // "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", - "item.edit.relationships.no-entity-type": "Bu öğe için ilişkileri etkinleştirmek için 'dspace.entity.type' metadatalarını ekleyin", - - - - // "item.edit.tabs.bitstreams.head": "Bitstreams", - "item.edit.tabs.bitstreams.head": "Bitstreamlar", - - // "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", - "item.edit.tabs.bitstreams.title": "Öge düzenle - Bitstreamlar", - - // "item.edit.tabs.curate.head": "Curate", - "item.edit.tabs.curate.head": "Düzenleme", - - // "item.edit.tabs.curate.title": "Item Edit - Curate", - "item.edit.tabs.curate.title": "Öge düzenle - Düzenleme", - - // "item.edit.tabs.metadata.head": "Metadata", - "item.edit.tabs.metadata.head": "Metadata", - - // "item.edit.tabs.metadata.title": "Item Edit - Metadata", - "item.edit.tabs.metadata.title": "Öge düzenle - Metadata", - - // "item.edit.tabs.relationships.head": "Relationships", - "item.edit.tabs.relationships.head": "İlişkiler", - - // "item.edit.tabs.relationships.title": "Item Edit - Relationships", - "item.edit.tabs.relationships.title": "Öge düzenle - İlişkiler", - - // "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", - "item.edit.tabs.status.buttons.authorizations.button": "Yetkilendiriliyor...", - - // "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", - "item.edit.tabs.status.buttons.authorizations.label": "Öğenin yetkilendirme politikalarını düzenle", - - // "item.edit.tabs.status.buttons.delete.button": "Permanently delete", - "item.edit.tabs.status.buttons.delete.button": "Kalıcı olarak sil", - - // "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", - "item.edit.tabs.status.buttons.delete.label": "Ögeyi kalıcı olarak sil", - - // "item.edit.tabs.status.buttons.mappedCollections.button": "Mapped collections", - "item.edit.tabs.status.buttons.mappedCollections.button": "Eşleştirilmiş koleksiyonlar", - - // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", - "item.edit.tabs.status.buttons.mappedCollections.label": "Eşlenen koleksiyonları yönetin", - - // "item.edit.tabs.status.buttons.move.button": "Move...", - "item.edit.tabs.status.buttons.move.button": "Taşınıyor...", - - // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", - "item.edit.tabs.status.buttons.move.label": "Öğeyi başka bir koleksiyona taşı", - - // "item.edit.tabs.status.buttons.private.button": "Make it private...", - "item.edit.tabs.status.buttons.private.button": "Gizleniyor...", - - // "item.edit.tabs.status.buttons.private.label": "Make item private", - "item.edit.tabs.status.buttons.private.label": "Ögeyi gizle", - - // "item.edit.tabs.status.buttons.public.button": "Make it public...", - "item.edit.tabs.status.buttons.public.button": "Öge herkese açık yapılıyor...", - - // "item.edit.tabs.status.buttons.public.label": "Make item public", - "item.edit.tabs.status.buttons.public.label": "Herkese açık yap", - - // "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", - "item.edit.tabs.status.buttons.reinstate.button": "Geri yükleniyor...", - - // "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", - "item.edit.tabs.status.buttons.reinstate.label": "Öğeyi depoya geri yükle", - - // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", - "item.edit.tabs.status.buttons.withdraw.button": "Çıkar...", - - // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", - "item.edit.tabs.status.buttons.withdraw.label": "Depodan öğeyi çıkar", - - // "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.", - "item.edit.tabs.status.description": "Öğe yönetimi sayfasına hoş geldiniz. Buradan öğeyi çıkarabilir, geri yükleyebilir, taşıyabilir veya silebilirsiniz. Diğer sekmelerde de güncelleyebilir veya yeni metadata / bit akışları ekleyebilirsiniz.", - - // "item.edit.tabs.status.head": "Status", - "item.edit.tabs.status.head": "Durum", - - // "item.edit.tabs.status.labels.handle": "Handle", - "item.edit.tabs.status.labels.handle": "Handle", - - // "item.edit.tabs.status.labels.id": "Item Internal ID", - "item.edit.tabs.status.labels.id": "Öge Dahili Kimliğ", - - // "item.edit.tabs.status.labels.itemPage": "Item Page", - "item.edit.tabs.status.labels.itemPage": "Öge sayfası", - - // "item.edit.tabs.status.labels.lastModified": "Last Modified", - "item.edit.tabs.status.labels.lastModified": "Son düzenleme", - - // "item.edit.tabs.status.title": "Item Edit - Status", - "item.edit.tabs.status.title": "Öge düzenle - Durum", - - // "item.edit.tabs.versionhistory.head": "Version History", - "item.edit.tabs.versionhistory.head": "Sürüm Geçmişi", - - // "item.edit.tabs.versionhistory.title": "Item Edit - Version History", - "item.edit.tabs.versionhistory.title": "Öge düzenle - Sürüm Geçmişi", - - // "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", - "item.edit.tabs.versionhistory.under-construction": "Bu kullanıcı arayüzünde henüz yeni sürümleri düzenlemek veya eklemek mümkün değil.", - - // "item.edit.tabs.view.head": "View Item", - "item.edit.tabs.view.head": "Ürünü incele", - - // "item.edit.tabs.view.title": "Item Edit - View", - "item.edit.tabs.view.title": "Öge düzenle - incele", - - - - // "item.edit.withdraw.cancel": "Cancel", - "item.edit.withdraw.cancel": "İptal et", - - // "item.edit.withdraw.confirm": "Withdraw", - "item.edit.withdraw.confirm": "Çıkar", - - // "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?", - "item.edit.withdraw.description": "Bu öğenin arşivden çıkartılması gerektiğinden emin misiniz?", - - // "item.edit.withdraw.error": "An error occurred while withdrawing the item", - "item.edit.withdraw.error": "Öğe çıkartılırken bir hata oluştu", - - // "item.edit.withdraw.header": "Withdraw item: {{ id }}", - "item.edit.withdraw.header": "Çıkarılan öge: {{ id }}", - - // "item.edit.withdraw.success": "The item was withdrawn successfully", - "item.edit.withdraw.success": "Öğe başarıyla çıkartıldı", - - - - // "item.listelement.badge": "Item", - "item.listelement.badge": "Öge", - - // "item.page.description": "Description", - "item.page.description": "Açıklama", - - // "item.page.edit": "Edit this item", - "item.page.edit": "Bu ögeyi düzenle", - - // "item.page.journal-issn": "Journal ISSN", - "item.page.journal-issn": "Süreli Yayın ISSN", - - // "item.page.journal-title": "Journal Title", - "item.page.journal-title": "Süreli Yayın başlığı", - - // "item.page.publisher": "Publisher", - "item.page.publisher": "Yayınevi", - - // "item.page.titleprefix": "Item: ", - "item.page.titleprefix": "Öge: ", - - // "item.page.volume-title": "Volume Title", - "item.page.volume-title": "Cilt Başlığı", - - // "item.search.results.head": "Item Search Results", - "item.search.results.head": "Öge Arama Sonuçları", - - // "item.search.title": "DSpace Angular :: Item Search", - "item.search.title": "DSpace Angular :: Öge Arama", - - - // "item.page.abstract": "Abstract", - "item.page.abstract": "Özet", - - // "item.page.author": "Authors", - "item.page.author": "Yazarlar", - - // "item.page.citation": "Citation", - "item.page.citation": "Alıntı", - - // "item.page.collections": "Collections", - "item.page.collections": "Koleksiyonlar", - - // "item.page.date": "Date", - "item.page.date": "Tarih", - - // "item.page.edit": "Edit this item", - "item.page.edit": "Bu öğeyi düzenle", - - // "item.page.files": "Files", - "item.page.files": "Dosyalar", - - // "item.page.filesection.description": "Description:", - "item.page.filesection.description": "Açıklama", - - // "item.page.filesection.download": "Download", - "item.page.filesection.download": "İndir", - - // "item.page.filesection.format": "Format:", - "item.page.filesection.format": "Format:", - - // "item.page.filesection.name": "Name:", - "item.page.filesection.name": "Ad:", - - // "item.page.filesection.size": "Size:", - "item.page.filesection.size": "Boyut:", - - // "item.page.journal.search.title": "Articles in this journal", - "item.page.journal.search.title": "Bu süreli yayındaki makaleler", - - // "item.page.link.full": "Full item page", - "item.page.link.full": "Tam öğe sayfası", - - // "item.page.link.simple": "Simple item page", - "item.page.link.simple": "Sadeleştirilmiş öğe sayfası", - - // "item.page.person.search.title": "Articles by this author", - "item.page.person.search.title": "Bu yazarın makaleleri", - - // "item.page.related-items.view-more": "Show {{ amount }} more", - "item.page.related-items.view-more": "Daha fazla göster {{ amount }}", - - // "item.page.related-items.view-less": "Hide last {{ amount }}", - "item.page.related-items.view-less": "Sonuncuyu gizle {{ amount }}", - - // "item.page.relationships.isAuthorOfPublication": "Publications", - "item.page.relationships.isAuthorOfPublication": "Yayınlar", - - // "item.page.relationships.isJournalOfPublication": "Publications", - "item.page.relationships.isJournalOfPublication": "Yayınlar", - - // "item.page.relationships.isOrgUnitOfPerson": "Authors", - "item.page.relationships.isOrgUnitOfPerson": "Yazarlar", - - // "item.page.relationships.isOrgUnitOfProject": "Research Projects", - "item.page.relationships.isOrgUnitOfProject": "Araştırma projeleri", - - // "item.page.subject": "Keywords", - "item.page.subject": "Anahtar kelimeler", - - // "item.page.uri": "URI", - "item.page.uri": "URI", - - // "item.page.bitstreams.view-more": "Show more", - "item.page.bitstreams.view-more": "Daha fazla göster", - - // "item.page.bitstreams.collapse": "Collapse", - "item.page.bitstreams.collapse": "Daralt", - - // "item.page.filesection.original.bundle" : "Original bundle", - "item.page.filesection.original.bundle" : "Orijinal seri", - - // "item.page.filesection.license.bundle" : "License bundle", - "item.page.filesection.license.bundle" : "Lisanslı seri", - - // "item.preview.dc.identifier.uri": "Identifier:", - "item.preview.dc.identifier.uri": "Belirteç:", - - // "item.preview.dc.contributor.author": "Authors:", - "item.preview.dc.contributor.author": "Yazarlar:", - - // "item.preview.dc.date.issued": "Published date:", - "item.preview.dc.date.issued": "Yayınlanma tarihi:", - - // "item.preview.dc.description.abstract": "Abstract:", - "item.preview.dc.description.abstract": "Özet:", - - // "item.preview.dc.identifier.other": "Other identifier:", - "item.preview.dc.identifier.other": "Diğer Belirteçler:", - - // "item.preview.dc.language.iso": "Language:", - "item.preview.dc.language.iso": "Dil:", - - // "item.preview.dc.subject": "Subjects:", - "item.preview.dc.subject": "Konular:", - - // "item.preview.dc.title": "Title:", - "item.preview.dc.title": "Başlık:", - - // "item.preview.person.familyName": "Surname:", - "item.preview.person.familyName": "Soyad:", - - // "item.preview.person.givenName": "Name:", - "item.preview.person.givenName": "Ad:", - - // "item.preview.person.identifier.orcid": "ORCID:", - "item.preview.person.identifier.orcid": "ORCID:", - - - // "item.select.confirm": "Confirm selected", - "item.select.confirm": "Seçileni onayla", - - // "item.select.empty": "No items to show", - "item.select.empty": "Gösterilecek öğe yok", - - // "item.select.table.author": "Author", - "item.select.table.author": "Yazar", - - // "item.select.table.collection": "Collection", - "item.select.table.collection": "Koleksiyon", - - // "item.select.table.title": "Title", - "item.select.table.title": "Başlık", - - - // "item.version.history.empty": "There are no other versions for this item yet.", - "item.version.history.empty": "Bu öğe için henüz başka sürüm yok.", - - // "item.version.history.head": "Version History", - "item.version.history.head": "Sürüm Geçmişi", - - // "item.version.history.return": "Return", - "item.version.history.return": "Geri dön", - - // "item.version.history.selected": "Selected version", - "item.version.history.selected": "Seçilen sürüm", - - // "item.version.history.table.version": "Version", - "item.version.history.table.version": "Sürüm", - - // "item.version.history.table.item": "Item", - "item.version.history.table.item": "Öge", - - // "item.version.history.table.editor": "Editor", - "item.version.history.table.editor": "Editör", - - // "item.version.history.table.date": "Date", - "item.version.history.table.date": "Tarih", - - // "item.version.history.table.summary": "Summary", - "item.version.history.table.summary": "Özet", - - - - // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", - "item.version.notice": "Bu, bu öğenin en son sürümü değil. En son sürüm burada bulunabilir.", - - - - // "journal.listelement.badge": "Journal", - "journal.listelement.badge": "Süreli yayın", - - // "journal.page.description": "Description", - "journal.page.description": "Açıklama", - - // "journal.page.edit": "Edit this item", - "journal.page.edit": "Bu öğeyi düzenle", - - // "journal.page.editor": "Editor-in-Chief", - "journal.page.editor": "Genel Yayın Yönetmeni", - - // "journal.page.issn": "ISSN", - "journal.page.issn": "ISSN", - - // "journal.page.publisher": "Publisher", - "journal.page.publisher": "Yayınevi", - - // "journal.page.titleprefix": "Journal: ", - "journal.page.titleprefix": "Süreli yayın: ", - - // "journal.search.results.head": "Journal Search Results", - "journal.search.results.head": "Süreli Yayın Arama Sonuçları", - - // "journal.search.title": "DSpace Angular :: Journal Search", - "journal.search.title": "DSpace Angular :: Süreli Yayın Arama", - - - - // "journalissue.listelement.badge": "Journal Issue", - "journalissue.listelement.badge": "Süreli Yayın Sayısı", - - // "journalissue.page.description": "Description", - "journalissue.page.description": "Açıklama", - - // "journalissue.page.edit": "Edit this item", - "journalissue.page.edit": "Bu öğeyi düzenle", - - // "journalissue.page.issuedate": "Issue Date", - "journalissue.page.issuedate": "Yayın tarihi", - - // "journalissue.page.journal-issn": "Journal ISSN", - "journalissue.page.journal-issn": "Süreli yayın ISSN", - - // "journalissue.page.journal-title": "Journal Title", - "journalissue.page.journal-title": "Süreli yayın Başlığı", - - // "journalissue.page.keyword": "Keywords", - "journalissue.page.keyword": "Anahtar kelimeler", - - // "journalissue.page.number": "Number", - "journalissue.page.number": "Sayı", - - // "journalissue.page.titleprefix": "Journal Issue: ", - "journalissue.page.titleprefix": "Süreli yayın sayısı: ", - - - - // "journalvolume.listelement.badge": "Journal Volume", - "journalvolume.listelement.badge": "Süreli yayın cilti", - - // "journalvolume.page.description": "Description", - "journalvolume.page.description": "Açıklama", - - // "journalvolume.page.edit": "Edit this item", - "journalvolume.page.edit": "Bu öğeyi düzenle", - - // "journalvolume.page.issuedate": "Issue Date", - "journalvolume.page.issuedate": "Yayın tarihi", - - // "journalvolume.page.titleprefix": "Journal Volume: ", - "journalvolume.page.titleprefix": "Süreli yayın cilti: ", - - // "journalvolume.page.volume": "Volume", - "journalvolume.page.volume": "Cilt", - - - - // "loading.bitstream": "Loading bitstream...", - "loading.bitstream": "Bitstream yükleniyor...", - - // "loading.bitstreams": "Loading bitstreams...", - "loading.bitstreams": "Bitstream yükleniyor...", - - // "loading.browse-by": "Loading items...", - "loading.browse-by": "Bitstream yükleniyor...", - - // "loading.browse-by-page": "Loading page...", - "loading.browse-by-page": "Yükleme sayfası...", - - // "loading.collection": "Loading collection...", - "loading.collection": "Koleksiyon yükleniyor...", - - // "loading.collections": "Loading collections...", - "loading.collections": "Koleksiyon yükleniyor...", - - // "loading.content-source": "Loading content source...", - "loading.content-source": "İçerik kaynağı yükleniyor...", - - // "loading.community": "Loading community...", - "loading.community": "Komünite yükleniyor...", - - // "loading.default": "Loading...", - "loading.default": "Yükleniyor...", - - // "loading.item": "Loading item...", - "loading.item": "Ögeler yükleniyor...", - - // "loading.items": "Loading items...", - "loading.items": "Ögeler yükleniyor...", - - // "loading.mydspace-results": "Loading items...", - "loading.mydspace-results": "Ögeler yükleniyor...", - - // "loading.objects": "Loading...", - "loading.objects": "Yükleniyor...", - - // "loading.recent-submissions": "Loading recent submissions...", - "loading.recent-submissions": "Son gönderiler yükleniyor...", - - // "loading.search-results": "Loading search results...", - "loading.search-results": "Arama sonuçları yükleniyor...", - - // "loading.sub-collections": "Loading sub-collections...", - "loading.sub-collections": "Alt koleksiyonlar yükleniyor...", - - // "loading.sub-communities": "Loading sub-communities...", - "loading.sub-communities": "Alt komüniteler yükleniyor...", - - // "loading.top-level-communities": "Loading top-level communities...", - "loading.top-level-communities": "Üst düzey komüniteler yükleniyor...", - - - - // "login.form.email": "Email address", - "login.form.email": "E-posta adresi", - - // "login.form.forgot-password": "Have you forgotten your password?", - "login.form.forgot-password": "Parolanızı unuttunuz mu?", - - // "login.form.header": "Please log in to DSpace", - "login.form.header": "Lütfen DSpace'e giriş yapın", - - // "login.form.new-user": "New user? Click here to register.", - "login.form.new-user": "Yeni kullanıcı mısınız? Kayıt olmak için buraya tıklayın.", - - // "login.form.or-divider": "or", - "login.form.or-divider": "ya da", - - // "login.form.password": "Password", - "login.form.password": "Parola", - - // "login.form.shibboleth": "Log in with Shibboleth", - "login.form.shibboleth": "Shibboleth ile giriş yapın", - - // "login.form.submit": "Log in", - "login.form.submit": "Giriş yap", - - // "login.title": "Login", - "login.title": "Giriş", - - // "login.breadcrumbs": "Login", - "login.breadcrumbs": "Giriş", - - - - // "logout.form.header": "Log out from DSpace", - "logout.form.header": "DSpace'den çıkış yapın", - - // "logout.form.submit": "Log out", - "logout.form.submit": "Çıkış yap", - - // "logout.title": "Logout", - "logout.title": "Çıkış yap", - - - - // "menu.header.admin": "Admin", - "menu.header.admin": "Yönetici", - - // "menu.header.image.logo": "Repository logo", - "menu.header.image.logo": "Depo logosu", - - - - // "menu.section.access_control": "Access Control", - "menu.section.access_control": "Giriş kontrolü", - - // "menu.section.access_control_authorizations": "Authorizations", - "menu.section.access_control_authorizations": "Yetkilendirmeler", - - // "menu.section.access_control_groups": "Groups", - "menu.section.access_control_groups": "Gruplar", - - // "menu.section.access_control_people": "People", - "menu.section.access_control_people": "Kişiler", - - - - // "menu.section.admin_search": "Admin Search", - "menu.section.admin_search": "Yönetici araması", - - - - // "menu.section.browse_community": "This Community", - "menu.section.browse_community": "Bu Komünite", - - // "menu.section.browse_community_by_author": "By Author", - "menu.section.browse_community_by_author": "Yazara göre", - - // "menu.section.browse_community_by_issue_date": "By Issue Date", - "menu.section.browse_community_by_issue_date": "Yayın tarihine göre", - - // "menu.section.browse_community_by_title": "By Title", - "menu.section.browse_community_by_title": "Başlığa göre", - - // "menu.section.browse_global": "All of DSpace", - "menu.section.browse_global": "Tümü", - - // "menu.section.browse_global_by_author": "By Author", - "menu.section.browse_global_by_author": "Yazara göre", - - // "menu.section.browse_global_by_dateissued": "By Issue Date", - "menu.section.browse_global_by_dateissued": "Yayın tarihine göre", - - // "menu.section.browse_global_by_subject": "By Subject", - "menu.section.browse_global_by_subject": "Konuya göre", - - // "menu.section.browse_global_by_title": "By Title", - "menu.section.browse_global_by_title": "Başlığa göre", - - // "menu.section.browse_global_communities_and_collections": "Communities & Collections", - "menu.section.browse_global_communities_and_collections": "Komüniteler ve Koleksiyonlar", - - - - // "menu.section.control_panel": "Control Panel", - "menu.section.control_panel": "Kontrol Paneli", - - // "menu.section.curation_task": "Curation Task", - "menu.section.curation_task": "Düzenleme görevi", - - - - // "menu.section.edit": "Edit", - "menu.section.edit": "Düzenle", - - // "menu.section.edit_collection": "Collection", - "menu.section.edit_collection": "Koleksiyon", - - // "menu.section.edit_community": "Community", - "menu.section.edit_community": "Komünite", - - // "menu.section.edit_item": "Item", - "menu.section.edit_item": "Öge", - - - - // "menu.section.export": "Export", - "menu.section.export": "Dışa aktar", - - // "menu.section.export_collection": "Collection", - "menu.section.export_collection": "Koleksiyon", - - // "menu.section.export_community": "Community", - "menu.section.export_community": "Komünite", - - // "menu.section.export_item": "Item", - "menu.section.export_item": "Öge", - - // "menu.section.export_metadata": "Metadata", - "menu.section.export_metadata": "Metadata", - - - - // "menu.section.icon.access_control": "Access Control menu section", - "menu.section.icon.access_control": "Erişim Kontrolü menüsü bölümü", - - // "menu.section.icon.admin_search": "Admin search menu section", - "menu.section.icon.admin_search": "Yönetici arama menüsü bölümü", - - // "menu.section.icon.control_panel": "Control Panel menu section", - "menu.section.icon.control_panel": "Kontrol Paneli menü bölümü", - - // "menu.section.icon.curation_task": "Curation Task menu section", - "menu.section.icon.curation_task": "Düzenleme Görevi menüsü bölümü", - - // "menu.section.icon.edit": "Edit menu section", - "menu.section.icon.edit": "Menü bölümünü düzenle", - - // "menu.section.icon.export": "Export menu section", - "menu.section.icon.export": "Menü bölümünü dışa aktar", - - // "menu.section.icon.find": "Find menu section", - "menu.section.icon.find": "Menü bölümünü bulun", - - // "menu.section.icon.import": "Import menu section", - "menu.section.icon.import": "Menü bölümünü içe aktar", - - // "menu.section.icon.new": "New menu section", - "menu.section.icon.new": "Yeni menü bölümü", - - // "menu.section.icon.pin": "Pin sidebar", - "menu.section.icon.pin": "Yan çubuğu sabitle", - - // "menu.section.icon.processes": "Processes menu section", - "menu.section.icon.processes": "İşlemler menüsü bölümü", - - // "menu.section.icon.registries": "Registries menu section", - "menu.section.icon.registries": "Kayıtlar menüsü bölümü", - - // "menu.section.icon.statistics_task": "Statistics Task menu section", - "menu.section.icon.statistics_task": "İstatistik Görev menüsü bölümü", - - // "menu.section.icon.unpin": "Unpin sidebar", - "menu.section.icon.unpin": "Kenar çubuğunu kaldır", - - - - // "menu.section.import": "Import", - "menu.section.import": "İçe aktar", - - // "menu.section.import_batch": "Batch Import (ZIP)", - "menu.section.import_batch": "Toplu İçe Aktarma (ZIP)", - - // "menu.section.import_metadata": "Metadata", - "menu.section.import_metadata": "Metadata", - - - - // "menu.section.new": "New", - "menu.section.new": "Yeni", - - // "menu.section.new_collection": "Collection", - "menu.section.new_collection": "Koleksiyon", - - // "menu.section.new_community": "Community", - "menu.section.new_community": "Komünite", - - // "menu.section.new_item": "Item", - "menu.section.new_item": "Öğe", - - // "menu.section.new_item_version": "Item Version", - "menu.section.new_item_version": "Öğe Sürümü", - - // "menu.section.new_process": "Process", - "menu.section.new_process": "Süreç", - - - - // "menu.section.pin": "Pin sidebar", - "menu.section.pin": "Kenar çubuğunu sabitle", - - // "menu.section.unpin": "Unpin sidebar", - "menu.section.unpin": "Kenar çubuğunun sabitlemesini kaldır", - - - - // "menu.section.processes": "Processes", - "menu.section.processes": "Süreçler", - - - - // "menu.section.registries": "Registries", - "menu.section.registries": "Kayıt", - - // "menu.section.registries_format": "Format", - "menu.section.registries_format": "Format", - - // "menu.section.registries_metadata": "Metadata", - "menu.section.registries_metadata": "Metadata", - - - - // "menu.section.statistics": "Statistics", - "menu.section.statistics": "İstatistik", - - // "menu.section.statistics_task": "Statistics Task", - "menu.section.statistics_task": "İstatistiksel Görev", - - - - // "menu.section.toggle.access_control": "Toggle Access Control section", - "menu.section.toggle.access_control": "Erişim kontrolü bölümünü aç/kapat", - - // "menu.section.toggle.control_panel": "Toggle Control Panel section", - "menu.section.toggle.control_panel": "Kontrol Paneli bölümünü aç/kapat", - - // "menu.section.toggle.curation_task": "Toggle Curation Task section", - "menu.section.toggle.curation_task": "İyileştirme Görevi bölümünü aç/kapat", - - // "menu.section.toggle.edit": "Toggle Edit section", - "menu.section.toggle.edit": "Düzenleme bölümünü aç/kapat", - - // "menu.section.toggle.export": "Toggle Export section", - "menu.section.toggle.export": "Dışa Aktarma bölümünü aç/kapat", - - // "menu.section.toggle.find": "Toggle Find section", - "menu.section.toggle.find": "Arama bölümünü aç/kapat", - - // "menu.section.toggle.import": "Toggle Import section", - "menu.section.toggle.import": "İçe Aktarma bölümünü aç/kapat", - - // "menu.section.toggle.new": "Toggle New section", - "menu.section.toggle.new": "Yeni bölümü aç/kapat", - - // "menu.section.toggle.registries": "Toggle Registries section", - "menu.section.toggle.registries": "Kayıtlar bölümünü aç/kapat", - - // "menu.section.toggle.statistics_task": "Toggle Statistics Task section", - "menu.section.toggle.statistics_task": "İstatistik Görev bölümünü aç/kapat", - - - // "menu.section.workflow": "Administer Workflow", - "menu.section.workflow": "İş Akışını Yönet", - - - // "mydspace.description": "", - "mydspace.description": "", - - // "mydspace.general.text-here": "here", - "mydspace.general.text-here": "Burada", - - // "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", - "mydspace.messages.controller-help": "Öğeyi gönderene bir mesaj göndermek için bu seçeneği seçin.", - - // "mydspace.messages.description-placeholder": "Insert your message here...", - "mydspace.messages.description-placeholder": "Mesajınızı buraya ekleyin...", - - // "mydspace.messages.hide-msg": "Hide message", - "mydspace.messages.hide-msg": "Mesajı gizle", - - // "mydspace.messages.mark-as-read": "Mark as read", - "mydspace.messages.mark-as-read": "Okundu olarak işaretle", - - // "mydspace.messages.mark-as-unread": "Mark as unread", - "mydspace.messages.mark-as-unread": "Okunmamış olarak işaretle", - - // "mydspace.messages.no-content": "No content.", - "mydspace.messages.no-content": "İçerik yok.", - - // "mydspace.messages.no-messages": "No messages yet.", - "mydspace.messages.no-messages": "Henüz mesaj yok.", - - // "mydspace.messages.send-btn": "Send", - "mydspace.messages.send-btn": "Gönder", - - // "mydspace.messages.show-msg": "Show message", - "mydspace.messages.show-msg": "Mesajı göster", - - // "mydspace.messages.subject-placeholder": "Subject...", - "mydspace.messages.subject-placeholder": "Konu...", - - // "mydspace.messages.submitter-help": "Select this option to send a message to controller.", - "mydspace.messages.submitter-help": "Kontrolöre mesaj göndermek için bu seçeneği seçin.", - - // "mydspace.messages.title": "Messages", - "mydspace.messages.title": "Mesajlar", - - // "mydspace.messages.to": "To", - "mydspace.messages.to": "-e", - - // "mydspace.new-submission": "New submission", - "mydspace.new-submission": "Yeni talep", - - // "mydspace.new-submission-external": "Import metadata from external source", - "mydspace.new-submission-external": "Harici kaynaktan metadataları içe aktar", - - // "mydspace.new-submission-external-short": "Import metadata", - "mydspace.new-submission-external-short": "Metadataları içeri aktar.", - - // "mydspace.results.head": "Your submissions", - "mydspace.results.head": "Gönderimleriniz", - - // "mydspace.results.no-abstract": "No Abstract", - "mydspace.results.no-abstract": "Özet yok", - - // "mydspace.results.no-authors": "No Authors", - "mydspace.results.no-authors": "Yazar yok.", - - // "mydspace.results.no-collections": "No Collections", - "mydspace.results.no-collections": "Koleksiyon yok", - - // "mydspace.results.no-date": "No Date", - "mydspace.results.no-date": "Tarih yok", - - // "mydspace.results.no-files": "No Files", - "mydspace.results.no-files": "Dosya yok", - - // "mydspace.results.no-results": "There were no items to show", - "mydspace.results.no-results": "Gösterilecek öğe yok.", - - // "mydspace.results.no-title": "No title", - "mydspace.results.no-title": "Başlık yok", - - // "mydspace.results.no-uri": "No Uri", - "mydspace.results.no-uri": "Uri yok", - - // "mydspace.show.workflow": "All tasks", - "mydspace.show.workflow": "Tüm görevler", - - // "mydspace.show.workspace": "Your Submissions", - "mydspace.show.workspace": "Gönderimleriniz", - - // "mydspace.status.archived": "Archived", - "mydspace.status.archived": "Arşivlendi", - - // "mydspace.status.validation": "Validation", - "mydspace.status.validation": "Doğrulama", - - // "mydspace.status.waiting-for-controller": "Waiting for controller", - "mydspace.status.waiting-for-controller": "Kontrolör bekleniyor", - - // "mydspace.status.workflow": "Workflow", - "mydspace.status.workflow": "İş akışı", - - // "mydspace.status.workspace": "Workspace", - "mydspace.status.workspace": "Çalışma alanı", - - // "mydspace.title": "MyDSpace", - "mydspace.title": "MyDSpace", - - // "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", - "mydspace.upload.upload-failed": "Yeni çalışma alanı oluşturulurken hata oluştu. Lütfen yeniden denemeden önce yüklenen içeriği doğrulayın.", - - // "mydspace.upload.upload-failed-manyentries": "Unprocessable file. Detected too many entries but allowed only one for file.", - "mydspace.upload.upload-failed-manyentries": "İşlenemeyen dosya. Çok fazla giriş algılandı fakat dosya için yalnızca bir girişe izin verildi.", - - // "mydspace.upload.upload-failed-moreonefile": "Unprocessable request. Only one file is allowed.", - "mydspace.upload.upload-failed-moreonefile": "İşlenemeyen istek. Yalnızca bir dosyaya izin verilir.", - - // "mydspace.upload.upload-multiple-successful": "{{qty}} new workspace items created.", - "mydspace.upload.upload-multiple-successful": "{{qty}} yeni çalışma alanı öğeleri oluşturuldu.", - - // "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", - "mydspace.upload.upload-successful": "Yeni çalışma alanı öğesi oluşturuldu. Düzenlemek için {{here}} tıklayın.", - - // "mydspace.view-btn": "View", - "mydspace.view-btn": "Görünüm", - - - - // "nav.browse.header": "All of DSpace", - "nav.browse.header": "DSpace'in tümü", - - // "nav.community-browse.header": "By Community", - "nav.community-browse.header": "Komünite tarafından", - - // "nav.language": "Language switch", - "nav.language": "Dil değiştirme", - - // "nav.login": "Log In", - "nav.login": "Giriş yap", - - // "nav.logout": "Log Out", - "nav.logout": "Çıkış yap", - - // "nav.mydspace": "MyDSpace", - "nav.mydspace": "BenimDSpace'im", - - // "nav.profile": "Profile", - "nav.profile": "Profil", - - // "nav.search": "Search", - "nav.search": "Arama", - - // "nav.statistics.header": "Statistics", - "nav.statistics.header": "İstatistik", - - // "nav.stop-impersonating": "Stop impersonating EPerson", - "nav.stop-impersonating": "EPerson'ı taklit etmeyi bırakın", - - - - // "orgunit.listelement.badge": "Organizational Unit", - "orgunit.listelement.badge": "Organizasyon Birimi", - - // "orgunit.page.city": "City", - "orgunit.page.city": "Şehir", - - // "orgunit.page.country": "Country", - "orgunit.page.country": "Ülke", - - // "orgunit.page.dateestablished": "Date established", - "orgunit.page.dateestablished": "Kuruluş tarihi", - - // "orgunit.page.description": "Description", - "orgunit.page.description": "Açıklama", - - // "orgunit.page.edit": "Edit this item", - "orgunit.page.edit": "Bu öğeyi düzenle", - - // "orgunit.page.id": "ID", - "orgunit.page.id": "Kimlik", - - // "orgunit.page.titleprefix": "Organizational Unit: ", - "orgunit.page.titleprefix": "Organizasyon Birimi: ", - - - - // "pagination.results-per-page": "Results Per Page", - "pagination.results-per-page": "Sayfa başına sonuç", - - // "pagination.showing.detail": "{{ range }} of {{ total }}", - "pagination.showing.detail": "{{ range }} / {{ total }}", - - // "pagination.showing.label": "Now showing ", - "pagination.showing.label": "Şimdi gösteriliyor ", - - // "pagination.sort-direction": "Sort Options", - "pagination.sort-direction": "Sıralama Seçenekleri", - - - - // "person.listelement.badge": "Person", - "person.listelement.badge": "Kişi", - - // "person.listelement.no-title": "No name found", - "person.listelement.no-title": "İsim bulunamadı", - - // "person.page.birthdate": "Birth Date", - "person.page.birthdate": "Doğum Tarihi", - - // "person.page.edit": "Edit this item", - "person.page.edit": "Bu öğeyi düzenle", - - // "person.page.email": "Email Address", - "person.page.email": "E-posta Adresi", - - // "person.page.firstname": "First Name", - "person.page.firstname": "Ad", - - // "person.page.jobtitle": "Job Title", - "person.page.jobtitle": "İş Adı", - - // "person.page.lastname": "Last Name", - "person.page.lastname": "Soyad", - - // "person.page.link.full": "Show all metadata", - "person.page.link.full": "Tüm metadata'yı göster", - - // "person.page.orcid": "ORCID", - "person.page.orcid": "ORCID", - - // "person.page.staffid": "Staff ID", - "person.page.staffid": "Personel Kimliği", - - // "person.page.titleprefix": "Person: ", - "person.page.titleprefix": "Kişi: ", - - // "person.search.results.head": "Person Search Results", - "person.search.results.head": "Kişi Arama Sonuçları", - - // "person.search.title": "DSpace Angular :: Person Search", - "person.search.title": "DSpace Angular :: Kişi Arama", - - - - // "process.new.select-parameters": "Parameters", - "process.new.select-parameters": "Parametreler", - - // "process.new.cancel": "Cancel", - "process.new.cancel": "İptal etmek", - - // "process.new.submit": "Submit", - "process.new.submit": "Göndermek", - - // "process.new.select-script": "Script", - "process.new.select-script": "Betik", - - // "process.new.select-script.placeholder": "Choose a script...", - "process.new.select-script.placeholder": "Betik Seçiniz...", - - // "process.new.select-script.required": "Script is required", - "process.new.select-script.required": "Betik gerekli", - - // "process.new.parameter.file.upload-button": "Select file...", - "process.new.parameter.file.upload-button": "Dosya seç...", - - // "process.new.parameter.file.required": "Please select a file", - "process.new.parameter.file.required": "Lütfen dosya seçiniz.", - - // "process.new.parameter.string.required": "Parameter value is required", - "process.new.parameter.string.required": "Parametre değeri gerekli", - - // "process.new.parameter.type.value": "value", - "process.new.parameter.type.value": "Değer", - - // "process.new.parameter.type.file": "file", - "process.new.parameter.type.file": "dosya", - - // "process.new.parameter.required.missing": "The following parameters are required but still missing:", - "process.new.parameter.required.missing": "Aşağıdaki parametreler gerekli ancak yine de eksik:", - - // "process.new.notification.success.title": "Success", - "process.new.notification.success.title": "Başarı", - - // "process.new.notification.success.content": "The process was successfully created", - "process.new.notification.success.content": "Süreç başarıyla oluşturuldu", - - // "process.new.notification.error.title": "Error", - "process.new.notification.error.title": "Hata", - - // "process.new.notification.error.content": "An error occurred while creating this process", - "process.new.notification.error.content": "Bu süreç oluşturulurken bir hata oluştu", - - // "process.new.header": "Create a new process", - "process.new.header": "Yeni bir süreç oluştur", - - // "process.new.title": "Create a new process", - "process.new.title": "Yeni bir süreç oluştur", - - // "process.new.breadcrumbs": "Create a new process", - "process.new.breadcrumbs": "Yeni bir süreç oluştur", - - - - // "process.detail.arguments" : "Arguments", - "process.detail.arguments" : "Argümanlar", - - // "process.detail.arguments.empty" : "This process doesn't contain any arguments", - "process.detail.arguments.empty" : "Bu süreç herhangi bir argüman içermiyor", - - // "process.detail.back" : "Back", - "process.detail.back" : "Geri", - - // "process.detail.output" : "Process Output", - "process.detail.output" : "Süreç Çıktısı", - - // "process.detail.logs.button": "Retrieve process output", - "process.detail.logs.button": "Süreç çıktısını geri al", - - // "process.detail.logs.loading": "Retrieving", - "process.detail.logs.loading": "Geri almak", - - // "process.detail.logs.none": "This process has no output", - "process.detail.logs.none": "Bu sürecin çıktısı yok", - - // "process.detail.output-files" : "Output Files", - "process.detail.output-files" : "Çıktı dosyaları", - - // "process.detail.output-files.empty" : "This process doesn't contain any output files", - "process.detail.output-files.empty" : "Bu süreç herhangi bir çıktı dosyası içermiyor", - - // "process.detail.script" : "Script", - "process.detail.script" : "Betik", - - // "process.detail.title" : "Process: {{ id }} - {{ name }}", - "process.detail.title" : "Süreç: {{ id }} - {{ name }}", - - // "process.detail.start-time" : "Start time", - "process.detail.start-time" : "Başlangıç saati", - - // "process.detail.end-time" : "Finish time", - "process.detail.end-time" : "Bitiş zamanı", - - // "process.detail.status" : "Status", - "process.detail.status" : "Durum", - - // "process.detail.create" : "Create similar process", - "process.detail.create" : "Benzer süreç oluştur", - - - - // "process.overview.table.finish" : "Finish time", - "process.overview.table.finish" : "Bitiş zamanı", - - // "process.overview.table.id" : "Process ID", - "process.overview.table.id" : "Süreç kimliği", - - // "process.overview.table.name" : "Name", - "process.overview.table.name" : "Ad", - - // "process.overview.table.start" : "Start time", - "process.overview.table.start" : "Başlangıç zamanı", - - // "process.overview.table.status" : "Status", - "process.overview.table.status" : "Durum", - - // "process.overview.table.user" : "User", - "process.overview.table.user" : "Kullanıcı", - - // "process.overview.title": "Processes Overview", - "process.overview.title": "Süreçlere Genel Bakış", - - // "process.overview.breadcrumbs": "Processes Overview", - "process.overview.breadcrumbs": "Süreçlere Genel Bakış", - - // "process.overview.new": "New", - "process.overview.new": "Yeni", - - - // "profile.breadcrumbs": "Update Profile", - "profile.breadcrumbs": "Profili Güncelle", - - // "profile.card.identify": "Identify", - "profile.card.identify": "Kimlik", - - // "profile.card.security": "Security", - "profile.card.security": "Güvenlik", - - // "profile.form.submit": "Update Profile", - "profile.form.submit": "Profili Güncelle", - - // "profile.groups.head": "Authorization groups you belong to", - "profile.groups.head": "Ait olduğunuz yetkilendirme grupları", - - // "profile.head": "Update Profile", - "profile.head": "Profili Güncelle", - - // "profile.metadata.form.error.firstname.required": "First Name is required", - "profile.metadata.form.error.firstname.required": "Ad gereklidir", - - // "profile.metadata.form.error.lastname.required": "Last Name is required", - "profile.metadata.form.error.lastname.required": "Soyadı gerekli", - - // "profile.metadata.form.label.email": "Email Address", - "profile.metadata.form.label.email": "E-posta Adresi", - - // "profile.metadata.form.label.firstname": "First Name", - "profile.metadata.form.label.firstname": "Ad", - - // "profile.metadata.form.label.language": "Language", - "profile.metadata.form.label.language": "Dil", - - // "profile.metadata.form.label.lastname": "Last Name", - "profile.metadata.form.label.lastname": "Soyadı", - - // "profile.metadata.form.label.phone": "Contact Telephone", - "profile.metadata.form.label.phone": "İletişim telefonu", - - // "profile.metadata.form.notifications.success.content": "Your changes to the profile were saved.", - "profile.metadata.form.notifications.success.content": "Profilde yaptığınız değişiklikler kaydedildi.", - - // "profile.metadata.form.notifications.success.title": "Profile saved", - "profile.metadata.form.notifications.success.title": "Profil kaydedildi", - - // "profile.notifications.warning.no-changes.content": "No changes were made to the Profile.", - "profile.notifications.warning.no-changes.content": "Profilde herhangi bir değişiklik yapılmadı.", - - // "profile.notifications.warning.no-changes.title": "No changes", - "profile.notifications.warning.no-changes.title": "Değişiklik yok", - - // "profile.security.form.error.matching-passwords": "The passwords do not match.", - "profile.security.form.error.matching-passwords": "Parolalar eşleşmiyor.", - - // "profile.security.form.error.password-length": "The password should be at least 6 characters long.", - "profile.security.form.error.password-length": "Parola en az 6 karakter uzunluğunda olmalıdır.", - - // "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.", - "profile.security.form.info": "İsteğe bağlı olarak aşağıdaki kutucuğa yeni bir parola girebilir ve ikinci kutucuğa tekrar yazarak onaylayabilirsiniz. En az altı karakter uzunluğunda olmalıdır.", - - // "profile.security.form.label.password": "Password", - "profile.security.form.label.password": "Parola", - - // "profile.security.form.label.passwordrepeat": "Retype to confirm", - "profile.security.form.label.passwordrepeat": "Doğrulamak için yeniden yazınız", - - // "profile.security.form.notifications.success.content": "Your changes to the password were saved.", - "profile.security.form.notifications.success.content": "Parola değişiklikleriniz kaydedildi.", - - // "profile.security.form.notifications.success.title": "Password saved", - "profile.security.form.notifications.success.title": "Parola kaydedildi", - - // "profile.security.form.notifications.error.title": "Error changing passwords", - "profile.security.form.notifications.error.title": "Parolalar değiştirilirken hata oluştu", - - // "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", - "profile.security.form.notifications.error.not-long-enough": "Parola en az 6 karakter uzunluğunda olmalıdır.", - - // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", - "profile.security.form.notifications.error.not-same": "Sağlanan parolalar aynı değil.", - - // "profile.title": "Update Profile", - "profile.title": "Profili Güncelle", - - - - // "project.listelement.badge": "Research Project", - "project.listelement.badge": "Araştırma projesi", - - // "project.page.contributor": "Contributors", - "project.page.contributor": "Katkıda Bulunanlar", - - // "project.page.description": "Description", - "project.page.description": "Açıklama", - - // "project.page.edit": "Edit this item", - "project.page.edit": "Bu öğeyi düzenle", - - // "project.page.expectedcompletion": "Expected Completion", - "project.page.expectedcompletion": "Beklenen Tamamlanma", - - // "project.page.funder": "Funders", - "project.page.funder": "Fon Sağlayıcılar", - - // "project.page.id": "ID", - "project.page.id": "Kimlik", - - // "project.page.keyword": "Keywords", - "project.page.keyword": "Anahtar kelimeler", - - // "project.page.status": "Status", - "project.page.status": "Durum", - - // "project.page.titleprefix": "Research Project: ", - "project.page.titleprefix": "Araştırma Projesi: ", - - // "project.search.results.head": "Project Search Results", - "project.search.results.head": "Proje Arama Sonuçları", - - - - // "publication.listelement.badge": "Publication", - "publication.listelement.badge": "Yayın", - - // "publication.page.description": "Description", - "publication.page.description": "Açıklama", - - // "publication.page.edit": "Edit this item", - "publication.page.edit": "Bu öğeyi düzenle", - - // "publication.page.journal-issn": "Journal ISSN", - "publication.page.journal-issn": "Dergi ISSN", - - // "publication.page.journal-title": "Journal Title", - "publication.page.journal-title": "Dergi Başlığı", - - // "publication.page.publisher": "Publisher", - "publication.page.publisher": "Yayımcı", - - // "publication.page.titleprefix": "Publication: ", - "publication.page.titleprefix": "Yayın: ", - - // "publication.page.volume-title": "Volume Title", - "publication.page.volume-title": "Cilt Başlığı", - - // "publication.search.results.head": "Publication Search Results", - "publication.search.results.head": "Yayın Arama Sonuçları", - - // "publication.search.title": "DSpace Angular :: Publication Search", - "publication.search.title": "DSpace Angular :: Yayın Arama", - - - // "register-email.title": "New user registration", - "register-email.title": "Yeni kullanıcı kaydı", - - // "register-page.create-profile.header": "Create Profile", - "register-page.create-profile.header": "Profil oluştur", - - // "register-page.create-profile.identification.header": "Identify", - "register-page.create-profile.identification.header": "Tanımlamak", - - // "register-page.create-profile.identification.email": "Email Address", - "register-page.create-profile.identification.email": "E-posta Adresi", - - // "register-page.create-profile.identification.first-name": "First Name *", - "register-page.create-profile.identification.first-name": "Ad *", - - // "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", - "register-page.create-profile.identification.first-name.error": "Lütfen bir ad girin", - - // "register-page.create-profile.identification.last-name": "Last Name *", - "register-page.create-profile.identification.last-name": "Soyadı *", - - // "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", - "register-page.create-profile.identification.last-name.error": "Lütfen bir soyadı girin", - - // "register-page.create-profile.identification.contact": "Contact Telephone", - "register-page.create-profile.identification.contact": "İletişim telefonu", - - // "register-page.create-profile.identification.language": "Language", - "register-page.create-profile.identification.language": "Dil", - - // "register-page.create-profile.security.header": "Security", - "register-page.create-profile.security.header": "Güvenlik", - - // "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.", - "register-page.create-profile.security.info": "Lütfen aşağıdaki kutuya bir parola girin ve ikinci kutuya tekrar yazarak onaylayın. En az altı karakter uzunluğunda olmalıdır.", - - // "register-page.create-profile.security.label.password": "Password *", - "register-page.create-profile.security.label.password": "Parola *", - - // "register-page.create-profile.security.label.passwordrepeat": "Retype to confirm *", - "register-page.create-profile.security.label.passwordrepeat": "Doğrulamak için yeniden yazınız *", - - // "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", - "register-page.create-profile.security.error.empty-password": "Lütfen aşağıdaki kutuya bir parola girin.", - - // "register-page.create-profile.security.error.matching-passwords": "The passwords do not match.", - "register-page.create-profile.security.error.matching-passwords": "Parolalar eşleşmiyor.", - - // "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", - "register-page.create-profile.security.error.password-length": "Parola en az 6 karakter uzunluğunda olmalıdır.", - - // "register-page.create-profile.submit": "Complete Registration", - "register-page.create-profile.submit": "Kaydı Tamamla", - - // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", - "register-page.create-profile.submit.error.content": "Yeni bir kullanıcı kaydedilirken bir şeyler ters gitti.", - - // "register-page.create-profile.submit.error.head": "Registration failed", - "register-page.create-profile.submit.error.head": "Kayıt başarısız", - - // "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", - "register-page.create-profile.submit.success.content": "Kayıt başarıyla tamamlandı. Oluşturulan kullanıcı olarak giriş yaptınız", - - // "register-page.create-profile.submit.success.head": "Registration completed", - "register-page.create-profile.submit.success.head": "Kayıt tamamlandı", - - - // "register-page.registration.header": "New user registration", - "register-page.registration.header": "Yeni kullanıcı kaydı", - - // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", - "register-page.registration.info": "E-mail güncellemeleri için koleksiyonlara abone olup hesap açın. Ve DSapce’e yeni öğeler kaydetin.", - - // "register-page.registration.email": "Email Address *", - "register-page.registration.email": "E-posta Adresi *", - - // "register-page.registration.email.error.required": "Please fill in an email address", - "register-page.registration.email.error.required": "Lütfen bir e-posta adresi girin", - - // "register-page.registration.email.error.pattern": "Please fill in a valid email address", - "register-page.registration.email.error.pattern": "Lütfen geçerli bir email adresi girin", - - // "register-page.registration.email.hint": "This address will be verified and used as your login name.", - "register-page.registration.email.hint": "Bu adres doğrulanacak ve oturum açma adınız olarak kullanılacaktır.", - - // "register-page.registration.submit": "Register", - "register-page.registration.submit": "Kayıt olmak", - - // "register-page.registration.success.head": "Verification email sent", - "register-page.registration.success.head": "Doğrulama e-postası gönderildi", - - // "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", - "register-page.registration.success.content": "{{ email }} adresine özel bir URL ve daha fazla talimat içeren bir e-posta gönderildi.", - - // "register-page.registration.error.head": "Error when trying to register email", - "register-page.registration.error.head": "E-posta kaydetmeye çalışırken hata", - - // "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", - "register-page.registration.error.content": "Aşağıdaki e-posta adresi kaydedilirken bir hata oluştu: {{ email }}", - - - - // "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", - "relationships.add.error.relationship-type.content": "İki öğe arasında {{ type }} ilişki türü için uygun bir eşleşme bulunamadı", - - // "relationships.add.error.server.content": "The server returned an error", - "relationships.add.error.server.content": "Sunucu bir hata verdi", - - // "relationships.add.error.title": "Unable to add relationship", - "relationships.add.error.title": "İlişki eklenemedi", - - // "relationships.isAuthorOf": "Authors", - "relationships.isAuthorOf": "Yazarlar", - - // "relationships.isAuthorOf.Person": "Authors (persons)", - "relationships.isAuthorOf.Person": "Yazarlar (kişiler)", - - // "relationships.isAuthorOf.OrgUnit": "Authors (organizational units)", - "relationships.isAuthorOf.OrgUnit": "Yazarlar (organizasyon birimleri)", - - // "relationships.isIssueOf": "Journal Issues", - "relationships.isIssueOf": "Dergi Sayıları", - - // "relationships.isJournalIssueOf": "Journal Issue", - "relationships.isJournalIssueOf": "Dergi Sayısı", - - // "relationships.isJournalOf": "Journals", - "relationships.isJournalOf": "Dergiler", - - // "relationships.isOrgUnitOf": "Organizational Units", - "relationships.isOrgUnitOf": "Organizasyon Birimleri", - - // "relationships.isPersonOf": "Authors", - "relationships.isPersonOf": "Yazarlar", - - // "relationships.isProjectOf": "Research Projects", - "relationships.isProjectOf": "Araştırma Projeleri", - - // "relationships.isPublicationOf": "Publications", - "relationships.isPublicationOf": "Yayınlar", - - // "relationships.isPublicationOfJournalIssue": "Articles", - "relationships.isPublicationOfJournalIssue": "Makaleler", - - // "relationships.isSingleJournalOf": "Journal", - "relationships.isSingleJournalOf": "Dergi", - - // "relationships.isSingleVolumeOf": "Journal Volume", - "relationships.isSingleVolumeOf": "Dergi Cilti", - - // "relationships.isVolumeOf": "Journal Volumes", - "relationships.isVolumeOf": "Dergi Ciltleri", - - // "relationships.isContributorOf": "Contributors", - "relationships.isContributorOf": "Katkıda Bulunanlar", - - - - // "resource-policies.add.button": "Add", - "resource-policies.add.button": "Ekle", - - // "resource-policies.add.for.": "Add a new policy", - "resource-policies.add.for.": "Yeni bir politika ekle", - - // "resource-policies.add.for.bitstream": "Add a new Bitstream policy", - "resource-policies.add.for.bitstream": "Yeni bir Bitstream ilkesi ekleyin", - - // "resource-policies.add.for.bundle": "Add a new Bundle policy", - "resource-policies.add.for.bundle": "Yeni bir Bundle ilkesi ekleyin", - - // "resource-policies.add.for.item": "Add a new Item policy", - "resource-policies.add.for.item": "Yeni bir öğe ilkesi ekleyin", - - // "resource-policies.add.for.community": "Add a new Community policy", - "resource-policies.add.for.community": "Yeni bir Komünite politikası ekle", - - // "resource-policies.add.for.collection": "Add a new Collection policy", - "resource-policies.add.for.collection": "Yeni bir Koleksiyon politikası ekle", - - // "resource-policies.create.page.heading": "Create new resource policy for ", - "resource-policies.create.page.heading": "Şunun için yeni kaynak ilkesi oluşturun: ", - - // "resource-policies.create.page.failure.content": "An error occurred while creating the resource policy.", - "resource-policies.create.page.failure.content": "Kaynak ilkesi oluşturulurken bir hata oluştu.", - - // "resource-policies.create.page.success.content": "Operation successful", - "resource-policies.create.page.success.content": "Operasyon başarılı", - - // "resource-policies.create.page.title": "Create new resource policy", - "resource-policies.create.page.title": "Yeni kaynak politikası oluştur", - - // "resource-policies.delete.btn": "Delete selected", - "resource-policies.delete.btn": "Seçileni sil", - - // "resource-policies.delete.btn.title": "Delete selected resource policies", - "resource-policies.delete.btn.title": "Seçili kaynak politikalarını sil", - - // "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", - "resource-policies.delete.failure.content": "Seçili kaynak ilkeleri silinirken bir hata oluştu.", - - // "resource-policies.delete.success.content": "Operation successful", - "resource-policies.delete.success.content": "İşlem başarılı", - - // "resource-policies.edit.page.heading": "Edit resource policy ", - "resource-policies.edit.page.heading": "Kaynak politikasını düzenle ", - - // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", - "resource-policies.edit.page.failure.content": "Kaynak ilkesi düzenlenirken bir hata oluştu.", - - // "resource-policies.edit.page.success.content": "Operation successful", - "resource-policies.edit.page.success.content": "İşlem başarılı", - - // "resource-policies.edit.page.title": "Edit resource policy", - "resource-policies.edit.page.title": "Kaynak politikasını düzenle", - - // "resource-policies.form.action-type.label": "Select the action type", - "resource-policies.form.action-type.label": "Eylem türünü seçin", - - // "resource-policies.form.action-type.required": "You must select the resource policy action.", - "resource-policies.form.action-type.required": "Kaynak ilkesi eylemini seçmelisiniz.", - - // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", - "resource-policies.form.eperson-group-list.label": "İzin verilecek e-kişi veya grup", - - // "resource-policies.form.eperson-group-list.select.btn": "Select", - "resource-policies.form.eperson-group-list.select.btn": "Seç", - - // "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", - "resource-policies.form.eperson-group-list.tab.eperson": "e-kişi arayın", - - // "resource-policies.form.eperson-group-list.tab.group": "Search for a group", - "resource-policies.form.eperson-group-list.tab.group": "Grup arayın", - - // "resource-policies.form.eperson-group-list.table.headers.action": "Action", - "resource-policies.form.eperson-group-list.table.headers.action": "Eylem", - - // "resource-policies.form.eperson-group-list.table.headers.id": "ID", - "resource-policies.form.eperson-group-list.table.headers.id": "Kimlik", - - // "resource-policies.form.eperson-group-list.table.headers.name": "Name", - "resource-policies.form.eperson-group-list.table.headers.name": "Ad", - - // "resource-policies.form.date.end.label": "End Date", - "resource-policies.form.date.end.label": "Bitiş Tarihi", - - // "resource-policies.form.date.start.label": "Start Date", - "resource-policies.form.date.start.label": "Başlangıç tarihi", - - // "resource-policies.form.description.label": "Description", - "resource-policies.form.description.label": "Açıklama", - - // "resource-policies.form.name.label": "Name", - "resource-policies.form.name.label": "Ad", - - // "resource-policies.form.policy-type.label": "Select the policy type", - "resource-policies.form.policy-type.label": "Politika türünü seçin", - - // "resource-policies.form.policy-type.required": "You must select the resource policy type.", - "resource-policies.form.policy-type.required": "Kaynak ilkesi türünü seçmelisiniz.", - - // "resource-policies.table.headers.action": "Action", - "resource-policies.table.headers.action": "Eylem", - - // "resource-policies.table.headers.date.end": "End Date", - "resource-policies.table.headers.date.end": "Bitiş tarihi", - - // "resource-policies.table.headers.date.start": "Start Date", - "resource-policies.table.headers.date.start": "Başlangıç Tarihi", - - // "resource-policies.table.headers.edit": "Edit", - "resource-policies.table.headers.edit": "Düzenle", - - // "resource-policies.table.headers.edit.group": "Edit group", - "resource-policies.table.headers.edit.group": "Grubu düzenle", - - // "resource-policies.table.headers.edit.policy": "Edit policy", - "resource-policies.table.headers.edit.policy": "Politikayı düzenle", - - // "resource-policies.table.headers.eperson": "E-kişi", - "resource-policies.table.headers.eperson": "E-kişi", - - // "resource-policies.table.headers.group": "Grup", - "resource-policies.table.headers.group": "Grup", - - // "resource-policies.table.headers.id": "ID", - "resource-policies.table.headers.id": "Kimlik", - - // "resource-policies.table.headers.name": "Name", - "resource-policies.table.headers.name": "Ad", - - // "resource-policies.table.headers.policyType": "type", - "resource-policies.table.headers.policyType": "tür", - - // "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", - "resource-policies.table.headers.title.for.bitstream": "BitStream Politikaları", - - // "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", - "resource-policies.table.headers.title.for.bundle": "Bundle Politikaları", - - // "resource-policies.table.headers.title.for.item": "Policies for Item", - "resource-policies.table.headers.title.for.item": "Öğe Politikaları", - - // "resource-policies.table.headers.title.for.community": "Policies for Community", - "resource-policies.table.headers.title.for.community": "Komünite Politikaları", - - // "resource-policies.table.headers.title.for.collection": "Policies for Collection", - "resource-policies.table.headers.title.for.collection": "Koleksiyon Politikaları", - - - - // "search.description": "", - "search.description": "", - - // "search.switch-configuration.title": "Show", - "search.switch-configuration.title": "Göster", - - // "search.title": "DSpace Angular :: Search", - "search.title": "DSpace Angular :: Ara", - - // "search.breadcrumbs": "Search", - "search.breadcrumbs": "Ara", - - - // "search.filters.applied.f.author": "Author", - "search.filters.applied.f.author": "Yazar", - - // "search.filters.applied.f.dateIssued.max": "End date", - "search.filters.applied.f.dateIssued.max": "Bitiş tarihi", - - // "search.filters.applied.f.dateIssued.min": "Start date", - "search.filters.applied.f.dateIssued.min": "Başlangıç Tarihi", - - // "search.filters.applied.f.dateSubmitted": "Date submitted", - "search.filters.applied.f.dateSubmitted": "Gönderilme tarihi", - - // "search.filters.applied.f.discoverable": "Private", - "search.filters.applied.f.discoverable": "Özel", - - // "search.filters.applied.f.entityType": "Item Type", - "search.filters.applied.f.entityType": "Öğe Türü", - - // "search.filters.applied.f.has_content_in_original_bundle": "Has files", - "search.filters.applied.f.has_content_in_original_bundle": "Has dosyaları", - - // "search.filters.applied.f.itemtype": "Type", - "search.filters.applied.f.itemtype": "Tür", - - // "search.filters.applied.f.namedresourcetype": "Status", - "search.filters.applied.f.namedresourcetype": "Durum", - - // "search.filters.applied.f.subject": "Subject", - "search.filters.applied.f.subject": "Konu", - - // "search.filters.applied.f.submitter": "Submitter", - "search.filters.applied.f.submitter": "Gönderen", - - // "search.filters.applied.f.jobTitle": "Job Title", - "search.filters.applied.f.jobTitle": "İş Adı", - - // "search.filters.applied.f.birthDate.max": "End birth date", - "search.filters.applied.f.birthDate.max": "Doğum Tarih Sonu", - - // "search.filters.applied.f.birthDate.min": "Start birth date", - "search.filters.applied.f.birthDate.min": "Doğum Tarih Başlangıcı", - - // "search.filters.applied.f.withdrawn": "Withdrawn", - "search.filters.applied.f.withdrawn": "Geri çekildi", - - - - // "search.filters.filter.author.head": "Author", - "search.filters.filter.author.head": "Yazar", - - // "search.filters.filter.author.placeholder": "Author name", - "search.filters.filter.author.placeholder": "Yazar adı", - - // "search.filters.filter.birthDate.head": "Birth Date", - "search.filters.filter.birthDate.head": "Doğum Tarihi", - - // "search.filters.filter.birthDate.placeholder": "Birth Date", - "search.filters.filter.birthDate.placeholder": "Doğum Tarihi", - - // "search.filters.filter.creativeDatePublished.head": "Date Published", - "search.filters.filter.creativeDatePublished.head": "Yayınlanma Tarihi", - - // "search.filters.filter.creativeDatePublished.placeholder": "Date Published", - "search.filters.filter.creativeDatePublished.placeholder": "Yayınlanma Tarihi", - - // "search.filters.filter.creativeWorkEditor.head": "Editor", - "search.filters.filter.creativeWorkEditor.head": "Editör", - - // "search.filters.filter.creativeWorkEditor.placeholder": "Editor", - "search.filters.filter.creativeWorkEditor.placeholder": "Editör", - - // "search.filters.filter.creativeWorkKeywords.head": "Subject", - "search.filters.filter.creativeWorkKeywords.head": "Konu", - - // "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", - "search.filters.filter.creativeWorkKeywords.placeholder": "Konu", - - // "search.filters.filter.creativeWorkPublisher.head": "Publisher", - "search.filters.filter.creativeWorkPublisher.head": "Yayımcı", - - // "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", - "search.filters.filter.creativeWorkPublisher.placeholder": "Yayımcı", - - // "search.filters.filter.dateIssued.head": "Date", - "search.filters.filter.dateIssued.head": "Tarih", - - // "search.filters.filter.dateIssued.max.placeholder": "Minimum Date", - "search.filters.filter.dateIssued.max.placeholder": "En Erken Tarih", - - // "search.filters.filter.dateIssued.min.placeholder": "Maximum Date", - "search.filters.filter.dateIssued.min.placeholder": "En Geç Tarih", - - // "search.filters.filter.dateSubmitted.head": "Date submitted", - "search.filters.filter.dateSubmitted.head": "Teslim Edilen Tarih", - - // "search.filters.filter.dateSubmitted.placeholder": "Date submitted", - "search.filters.filter.dateSubmitted.placeholder": "Teslim Edilen Tarih", - - // "search.filters.filter.discoverable.head": "Private", - "search.filters.filter.discoverable.head": "Özel", - - // "search.filters.filter.withdrawn.head": "Withdrawn", - "search.filters.filter.withdrawn.head": "Alınmış", - - // "search.filters.filter.entityType.head": "Item Type", - "search.filters.filter.entityType.head": "Materyal Türü", - - // "search.filters.filter.entityType.placeholder": "Item Type", - "search.filters.filter.entityType.placeholder": "Materyal Türü", - - // "search.filters.filter.has_content_in_original_bundle.head": "Has files", - "search.filters.filter.has_content_in_original_bundle.head": "Dosyalara Sahip", - - // "search.filters.filter.itemtype.head": "Type", - "search.filters.filter.itemtype.head": "Tür", - - // "search.filters.filter.itemtype.placeholder": "Type", - "search.filters.filter.itemtype.placeholder": "Tür", - - // "search.filters.filter.jobTitle.head": "Job Title", - "search.filters.filter.jobTitle.head": "İş Ünvanı", - - // "search.filters.filter.jobTitle.placeholder": "Job Title", - "search.filters.filter.jobTitle.placeholder": "İş Ünvanı", - - // "search.filters.filter.knowsLanguage.head": "Known language", - "search.filters.filter.knowsLanguage.head": "Bilinen Diller", - - // "search.filters.filter.knowsLanguage.placeholder": "Known language", - "search.filters.filter.knowsLanguage.placeholder": "Bilinen Diller", - - // "search.filters.filter.namedresourcetype.head": "Status", - "search.filters.filter.namedresourcetype.head": "Durum", - - // "search.filters.filter.namedresourcetype.placeholder": "Status", - "search.filters.filter.namedresourcetype.placeholder": "Durum", - - // "search.filters.filter.objectpeople.head": "People", - "search.filters.filter.objectpeople.head": "İnsanlar", - - // "search.filters.filter.objectpeople.placeholder": "People", - "search.filters.filter.objectpeople.placeholder": "İnsanlar", - - // "search.filters.filter.organizationAddressCountry.head": "Country", - "search.filters.filter.organizationAddressCountry.head": "Ülke", - - // "search.filters.filter.organizationAddressCountry.placeholder": "Country", - "search.filters.filter.organizationAddressCountry.placeholder": "Ülke", - - // "search.filters.filter.organizationAddressLocality.head": "City", - "search.filters.filter.organizationAddressLocality.head": "Şehir", - - // "search.filters.filter.organizationAddressLocality.placeholder": "City", - "search.filters.filter.organizationAddressLocality.placeholder": "Şehir", - - // "search.filters.filter.organizationFoundingDate.head": "Date Founded", - "search.filters.filter.organizationFoundingDate.head": "Bulunduğu Tarih", - - // "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", - "search.filters.filter.organizationFoundingDate.placeholder": "Bulunduğu Tarih", - - // "search.filters.filter.scope.head": "Scope", - "search.filters.filter.scope.head": "Kapsam", - - // "search.filters.filter.scope.placeholder": "Scope filter", - "search.filters.filter.scope.placeholder": "Kapsam Filtresi", - - // "search.filters.filter.show-less": "Collapse", - "search.filters.filter.show-less": "Yığılmış", - - // "search.filters.filter.show-more": "Show more", - "search.filters.filter.show-more": "Daha Fazla Göster", - - // "search.filters.filter.subject.head": "Subject", - "search.filters.filter.subject.head": "Konu", - - // "search.filters.filter.subject.placeholder": "Subject", - "search.filters.filter.subject.placeholder": "Konu", - - // "search.filters.filter.submitter.head": "Submitter", - "search.filters.filter.submitter.head": "Teslim Eden", - - // "search.filters.filter.submitter.placeholder": "Submitter", - "search.filters.filter.submitter.placeholder": "Teslim Eden", - - - - // "search.filters.entityType.JournalIssue": "Journal Issue", - "search.filters.entityType.JournalIssue": "Makale Konusu", - - // "search.filters.entityType.JournalVolume": "Journal Volume", - "search.filters.entityType.JournalVolume": "Cilt Sayısı", - - // "search.filters.entityType.OrgUnit": "Organizational Unit", - "search.filters.entityType.OrgUnit": "Ait Olduğu Organizasyon", - - // "search.filters.has_content_in_original_bundle.true": "Yes", - "search.filters.has_content_in_original_bundle.true": "Evet", - - // "search.filters.has_content_in_original_bundle.false": "No", - "search.filters.has_content_in_original_bundle.false": "Hayır", - - // "search.filters.discoverable.true": "No", - "search.filters.discoverable.true": "Hayır", - - // "search.filters.discoverable.false": "Yes", - "search.filters.discoverable.false": "Evet", - - // "search.filters.withdrawn.true": "Yes", - "search.filters.withdrawn.true": "Evet", - - // "search.filters.withdrawn.false": "No", - "search.filters.withdrawn.false": "Hayır", - - - // "search.filters.head": "Filters", - "search.filters.head": "Filtreler", - - // "search.filters.reset": "Reset filters", - "search.filters.reset": "Filtreleri Sıfırla", - - - - // "search.form.search": "Search", - "search.form.search": "Ara", - - // "search.form.search_dspace": "Search DSpace", - "search.form.search_dspace": "DSpace içinde Ara", - - // "search.form.search_mydspace": "Search MyDSpace", - "search.form.search_mydspace": "MyDSpace içinde Ara", - - - - // "search.results.head": "Search Results", - "search.results.head": "Sonuçları Ara", - - // "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", - "search.results.no-results": "Aramanız hiçbir sonuç vermedi. Aradığınızı bulmakta sorun mu yaşıyorsunuz? Bir daha deneyin.", - - // "search.results.no-results-link": "quotes around it", - "search.results.no-results-link": "Çevresindeki Alıntılar", - - // "search.results.empty": "Your search returned no results.", - "search.results.empty": "Aramanız hiçbir sonuç vermedi.", - - - - // "search.sidebar.close": "Back to results", - "search.sidebar.close": "Sonuçlara Dön", - - // "search.sidebar.filters.title": "Filters", - "search.sidebar.filters.title": "Filtreler", - - // "search.sidebar.open": "Search Tools", - "search.sidebar.open": "Araç Gereç Ara", - - // "search.sidebar.results": "results", - "search.sidebar.results": "Sonuçlar", - - // "search.sidebar.settings.rpp": "Results per page", - "search.sidebar.settings.rpp": "Sayfa Sonuçları", - - // "search.sidebar.settings.sort-by": "Sort By", - "search.sidebar.settings.sort-by": "Göre Sıralanmış", - - // "search.sidebar.settings.title": "Settings", - "search.sidebar.settings.title": "Ayarlar", - - - - // "search.view-switch.show-detail": "Show detail", - "search.view-switch.show-detail": "Detayları Göster", - - // "search.view-switch.show-grid": "Show as grid", - "search.view-switch.show-grid": "Ağ Dizge Olarak Göster", - - // "search.view-switch.show-list": "Show as list", - "search.view-switch.show-list": "Liste Olarak Göster", - - - - // "sorting.ASC": "Ascending", - "sorting.ASC": "Artan", - - // "sorting.DESC": "Descending", - "sorting.DESC": "Azalan", - - // "sorting.dc.title.ASC": "Title Ascending", - "sorting.dc.title.ASC": "Artan Başlıklar", - - // "sorting.dc.title.DESC": "Title Descending", - "sorting.dc.title.DESC": "Azalan Başlıklar", - - // "sorting.score.DESC": "Relevance", - "sorting.score.DESC": "Bağıntılı", - - - - // "statistics.title": "Statistics", - "statistics.title": "İstatistikler", - - // "statistics.header": "Statistics for {{ scope }}", - "statistics.header": "{{ scope }} için İstatistikler", - - // "statistics.breadcrumbs": "Statistics", - "statistics.breadcrumbs": "İstatistikler", - - // "statistics.page.no-data": "No data available", - "statistics.page.no-data": "Data Bulunamadı.", - - // "statistics.table.no-data": "No data available", - "statistics.table.no-data": "Data Bulunamadı.", - - // "statistics.table.title.TotalVisits": "Total visits", - "statistics.table.title.TotalVisits": "Toplam Ziyaretler", - - // "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", - "statistics.table.title.TotalVisitsPerMonth": "Aylık Toplam Ziyaretler", - - // "statistics.table.title.TotalDownloads": "File Visits", - "statistics.table.title.TotalDownloads": "Dosya Ziyaretleri", - - // "statistics.table.title.TopCountries": "Top country views", - "statistics.table.title.TopCountries": "En Çok Gösterilen Ülke", - - // "statistics.table.title.TopCities": "Top city views", - "statistics.table.title.TopCities": "En Çok Gösterilen Şehir", - - // "statistics.table.header.views": "Views", - "statistics.table.header.views": "Gösterilmeler", - - - - // "submission.edit.title": "Edit Submission", - "submission.edit.title": "Teslimi Düzenle", - - // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", - "submission.general.cannot_submit": "Yeni bir teslim yapamazsınız.", - - // "submission.general.deposit": "Deposit", - "submission.general.deposit": "Tamamla", - - // "submission.general.discard.confirm.cancel": "Cancel", - "submission.general.discard.confirm.cancel": "Vazgeç", - - // "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?", - "submission.general.discard.confirm.info": "Bu işlem geri alınamaz. Emin misiniz?", - - // "submission.general.discard.confirm.submit": "Yes, I'm sure", - "submission.general.discard.confirm.submit": "Evet eminim", - - // "submission.general.discard.confirm.title": "Discard submission", - "submission.general.discard.confirm.title": "Teslimi İptal Et", - - // "submission.general.discard.submit": "Discard", - "submission.general.discard.submit": "İptal", - - // "submission.general.save": "Save", - "submission.general.save": "Kaydet", - - // "submission.general.save-later": "Save for later", - "submission.general.save-later": "Sonrası İçin Kaydet", - - - // "submission.import-external.page.title": "Import metadata from an external source", - "submission.import-external.page.title": "Harici bir kaynaktan metadataları içe aktarın", - - // "submission.import-external.title": "Import metadata from an external source", - "submission.import-external.title": "Harici bir kaynaktan metadataları içe aktarın", - - // "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", - "submission.import-external.page.hint": "Web'den DSpace'e içe aktarılacak öğeleri bulmak için yukarıya bir sorgu girin.", - - // "submission.import-external.back-to-my-dspace": "Back to MyDSpace", - "submission.import-external.back-to-my-dspace": "MyDSpace'e Geri Dön", - - // "submission.import-external.search.placeholder": "Search the external source", - "submission.import-external.search.placeholder": "Dış Kaynaktan Ara", - - // "submission.import-external.search.button": "Search", - "submission.import-external.search.button": "Ara", - - // "submission.import-external.search.button.hint": "Write some words to search", - "submission.import-external.search.button.hint": "Aramak için Kelime Girin", - - // "submission.import-external.search.source.hint": "Pick an external source", - "submission.import-external.search.source.hint": "Dış Kaynak Seçin", - - // "submission.import-external.source.arxiv": "arXiv", - "submission.import-external.source.arxiv": "arXiv", - - // "submission.import-external.source.loading": "Loading ...", - "submission.import-external.source.loading": "Yükleniyor ...", - - // "submission.import-external.source.sherpaJournal": "SHERPA Journals", - "submission.import-external.source.sherpaJournal": "SHERPA Journals", - - // "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", - "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", - - // "submission.import-external.source.orcid": "ORCID", - "submission.import-external.source.orcid": "ORCID", - - // "submission.import-external.source.pubmed": "Pubmed", - "submission.import-external.source.pubmed": "Pubmed", - - // "submission.import-external.source.lcname": "Library of Congress Names", - "submission.import-external.source.lcname": "Kongre İsimleri Kütüphanesi", - - // "submission.import-external.preview.title": "Item Preview", - "submission.import-external.preview.title": "Materyal Önizlenimi", - - // "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", - "submission.import-external.preview.subtitle": "Aşağıdaki metadatalar harici bir kaynaktan içe aktarıldı. Gönderime başladığınızda önceden doldurulacaktır.", - - // "submission.import-external.preview.button.import": "Start submission", - "submission.import-external.preview.button.import": "Gönderimi Başlat", - - // "submission.import-external.preview.error.import.title": "Submission error", - "submission.import-external.preview.error.import.title": "Gönderim Sırasında Hata", - - // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", - "submission.import-external.preview.error.import.body": "Dış kaynak girişi içe aktarma işlemi sırasında bir hata oluştu.", - - // "submission.sections.describe.relationship-lookup.close": "Close", - "submission.sections.describe.relationship-lookup.close": "Kapat", - - // "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", - "submission.sections.describe.relationship-lookup.external-source.added": "Giriş seçime başarıyla eklendi", - - // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Dış Kaynak Yazarı İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Dış Kaynak Makaleyi İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Dış Kaynak Makale Konusu İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Dış Kaynak Makale Cilt Sayısı İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Dış Kaynak Yazarı İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Yazar seçime başarıyla eklendi", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Successfully imported and added external author to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Harici yazar başarıyla içe aktarıldı ve seçime eklendi", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Authority", - "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Yetkili", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Import as a new local authority entry", - "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Yeni bir yerel yetkili girişi olarak içe aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", - "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "İptal", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", - "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Yeni girişleri içe aktarmak için bir koleksiyon seçin", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", - "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Varlıklar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Import as a new local entity", - "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Yeni bir yerel varlık olarak içe aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "LC Adına göre İçe Aktar", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "ORCID'den İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Sherpa Journal'den İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Sherpa Publisher'den İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "PubMed'den İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "arXiv'den İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", - "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Makaleyi Dışardan İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": " Makale seçime başarıyla eklendi", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Harici makale başarıyla içe aktarıldı ve seçime eklendi", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Dış Kaynak Makale Konusu İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Dış Kaynak Makale Konusu Başarıyla İçe Aktarıldı.", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Başarıyla içe aktarıldı ve seçime harici makale sayısı eklendi", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Import Remote Journal Volume", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Dış Kaynak Makale Cilt Sayısı İçe Aktar", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Dış Kaynak Makale Cilt Sayısı Başarıyla İçe Aktarıldı.", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Harici makale cilti başarıyla içe aktarıldı ve seçime eklendi", - - // "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", - "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Yerel Eşleşmeyi Seç", - - // "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", - "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Tümünü Seçmeyi Bırak", - - // "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", - "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Sayfa Seçimin Bırak", - - // "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", - "submission.sections.describe.relationship-lookup.search-tab.loading": "Yükleniyor...", - - // "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", - "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Arama Sorgusu", - - // "submission.sections.describe.relationship-lookup.search-tab.search": "Go", - "submission.sections.describe.relationship-lookup.search-tab.search": "Git", - - // "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", - "submission.sections.describe.relationship-lookup.search-tab.select-all": "Hepsini Seç", - - // "submission.sections.describe.relationship-lookup.search-tab.select-page": "Select page", - "submission.sections.describe.relationship-lookup.search-tab.select-page": "Sayfa Seç", - - // "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", - "submission.sections.describe.relationship-lookup.selected": "{{ size }} boyutundaki Seçili Materyaller ", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": " Yerel Yazarlar({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Yerel Makaleler ({{ count }})", - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Yerel Projeler ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Yerel Yayınlar ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Yerel Yazarlar ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Yerel Organizasyonlar({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Yerel Veri Paketleri ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Yerel Veri Dosyaları ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Yerel Makaleler ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Yerel Makale Konuları ({{ count }})", - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Yerel Makale Konuları ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Yerel Makale Cilt ({{ count }})", - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Yerel Makale Cilt ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Sherpa Publishers ({{ count }})", - "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 }})", - "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 }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Adları ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", - "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", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Finansman Kuruluşlarını Arama", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Finansman Arama", - - // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Organizasyonları Arama", - - // "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", - "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Mevcut Seçim ({{ count }})", - - // "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", - "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Makale Konuları", - // "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", - "submission.sections.describe.relationship-lookup.title.JournalIssue": "Makale Konuları", - - // "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", - "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Makale Ciltleri", - // "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", - "submission.sections.describe.relationship-lookup.title.JournalVolume": "Makale Ciltleri", - - // "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", - "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Makaleler", - - // "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Authors", - "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Yazarlar", - - // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", - "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Finansman Kuruluşu", - // "submission.sections.describe.relationship-lookup.title.Project": "Projects", - "submission.sections.describe.relationship-lookup.title.Project": "Projeler", - - // "submission.sections.describe.relationship-lookup.title.Publication": "Publications", - "submission.sections.describe.relationship-lookup.title.Publication": "Yayınlar", - - // "submission.sections.describe.relationship-lookup.title.Person": "Authors", - "submission.sections.describe.relationship-lookup.title.Person": "Yazarlar", - - // "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", - "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizasyonlar", - - // "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", - "submission.sections.describe.relationship-lookup.title.DataPackage": "Veri Paketler", - - // "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", - "submission.sections.describe.relationship-lookup.title.DataFile": "Veri Dosyaları", - - // "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", - "submission.sections.describe.relationship-lookup.title.Funding Agency": "Finansman Kuruluşu", - - // "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", - "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Finansman", - - // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", - "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Ana Organizasyon", - - // "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", - "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Açılır menüyü aç/kapat", - - // "submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings", - "submission.sections.describe.relationship-lookup.selection-tab.settings": "Ayarlar", - - // "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", - "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Mevcut seçiminiz boş. ", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Authors", - "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Seçili Yazarlar", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Seçili Makaleler", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Seçili Makale Ciltleri", - // "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", - "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Seçili Projeler", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", - "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Seçili Yayınlar", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Authors", - "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Seçili Yazarlar", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", - "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Seçili Organizasyonlar", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", - "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Seçili Veri Paketleri", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Selected Data Files", - "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Seçili Veri Dosyaları", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", - "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Seçili Makaleler", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Seçili Makale Konuları", - // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", - "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Seçili Makale Ciltleri", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", - "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Seçili Finansman Kuruluşu", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", - "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Seçili Finansman", - // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", - "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Seçili Makale Konuları", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", - "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Seçili Organizasyonlar", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Sonuçları Ara", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Sonuçları Ara", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Sonuçları Ara", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Sonuçları Ara", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Sonuçları Ara", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Sonuçları Ara", - - // "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", - "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Sonuçları Ara", - - // "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.", - "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Bu kişi için \"{{ value }}\" ilerideki gönderilerde kullanılabilmek için Yeni İsim olarak kaydedilsin mi? Bunu yapmazsanız, yine de bu gönderim için kullanabilirsiniz .", - - // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", - "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Yeni İsim değişikliğini kaydet.", - - // "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", - "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Sadece bu gönderim için kullan.", - - // "submission.sections.ccLicense.type": "License Type", - "submission.sections.ccLicense.type": "Lisans Türü", - - // "submission.sections.ccLicense.select": "Select a license type…", - "submission.sections.ccLicense.select": "Lisans Türünü Seç…", - - // "submission.sections.ccLicense.change": "Change your license type…", - "submission.sections.ccLicense.change": "Lisans Türünü Değiştir…", - - // "submission.sections.ccLicense.none": "No licenses available", - "submission.sections.ccLicense.none": "Lisans Mevcut Değil", - - // "submission.sections.ccLicense.option.select": "Select an option…", - "submission.sections.ccLicense.option.select": "Seçenek Seç…", - - // "submission.sections.ccLicense.link": "You’ve selected the following license:", - "submission.sections.ccLicense.link": "Seçtiğiniz Lisans Türü:", - - // "submission.sections.ccLicense.confirmation": "I grant the license above", - "submission.sections.ccLicense.confirmation": "Yukarıdaki lisansı veriyorum", - - // "submission.sections.general.add-more": "Add more", - "submission.sections.general.add-more": "Ekle", - - // "submission.sections.general.collection": "Collection", - "submission.sections.general.collection": "Koleksiyon", - - // "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", - "submission.sections.general.deposit_error_notice": "Öğe gönderilirken bir sorun oluştu, lütfen daha sonra tekrar deneyin.", - - // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", - "submission.sections.general.deposit_success_notice": "Gönderim başarıyla yatırıldı.", - - // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", - "submission.sections.general.discard_error_notice": "Öğe gönderilirken bir sorun oluştu, lütfen daha sonra tekrar deneyin.", - - // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", - "submission.sections.general.discard_success_notice": "Gönderim başarıyla silindi.", - - // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", - "submission.sections.general.metadata-extracted": "Yeni metadatalar çıkarıldı ve {{sectionId}} bölümüne eklendi.", - - // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", - "submission.sections.general.metadata-extracted-new-section": "Gönderime yeni {{sectionId}} bölümü eklendi.", - - // "submission.sections.general.no-collection": "No collection found", - "submission.sections.general.no-collection": "Koleksiyon bulunamadı", - - // "submission.sections.general.no-sections": "No options available", - "submission.sections.general.no-sections": "Seçenekler Bulunamadı.", - - // "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", - "submission.sections.general.save_error_notice": "Öğe kaydedilirken bir sorun oluştu, lütfen daha sonra tekrar deneyin.", - - // "submission.sections.general.save_success_notice": "Submission saved successfully.", - "submission.sections.general.save_success_notice": "Gönderim başarıyla kaydedildi.", - - // "submission.sections.general.search-collection": "Search for a collection", - "submission.sections.general.search-collection": "Koleksiyon ara", - - // "submission.sections.general.sections_not_valid": "There are incomplete sections.", - "submission.sections.general.sections_not_valid": "Eksik bölümler var.", - - - - // "submission.sections.submit.progressbar.CClicense": "Creative commons license", - "submission.sections.submit.progressbar.CClicense": "Yaratıcı Ortak Lisansları", - - // "submission.sections.submit.progressbar.describe.recycle": "Recycle", - "submission.sections.submit.progressbar.describe.recycle": "Geri Dönüştür", - - // "submission.sections.submit.progressbar.describe.stepcustom": "Describe", - "submission.sections.submit.progressbar.describe.stepcustom": "Tanımla", - - // "submission.sections.submit.progressbar.describe.stepone": "Describe", - "submission.sections.submit.progressbar.describe.stepone": "Tanımla", - - // "submission.sections.submit.progressbar.describe.steptwo": "Describe", - "submission.sections.submit.progressbar.describe.steptwo": "Tanımla", - - // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", - "submission.sections.submit.progressbar.detect-duplicate": "Olası Kopyalar", - - // "submission.sections.submit.progressbar.license": "Deposit license", - "submission.sections.submit.progressbar.license": "Lisansı Yerleştir", - - // "submission.sections.submit.progressbar.upload": "Upload files", - "submission.sections.submit.progressbar.upload": "Dosyaları yükle", - - - - // "submission.sections.upload.delete.confirm.cancel": "Cancel", - "submission.sections.upload.delete.confirm.cancel": "İptal", - - // "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?", - "submission.sections.upload.delete.confirm.info": "Bu işlem geri alınamaz. Emin misin?", - - // "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", - "submission.sections.upload.delete.confirm.submit": "Evet eminim.", - - // "submission.sections.upload.delete.confirm.title": "Delete bitstream", - "submission.sections.upload.delete.confirm.title": "Bitstreamı Sil", - - // "submission.sections.upload.delete.submit": "Delete", - "submission.sections.upload.delete.submit": "Sil", - - // "submission.sections.upload.drop-message": "Drop files to attach them to the item", - "submission.sections.upload.drop-message": "Öğeye eklemek için dosyaları bırakın", - - // "submission.sections.upload.form.access-condition-label": "Access condition type", - "submission.sections.upload.form.access-condition-label": "Erişim Koşulu Türü", - - // "submission.sections.upload.form.date-required": "Date is required.", - "submission.sections.upload.form.date-required": "Tarih gerekli.", - - // "submission.sections.upload.form.from-label": "Grant access from", - "submission.sections.upload.form.from-label": "Şuradan erişim izni ver:", - - // "submission.sections.upload.form.from-placeholder": "From", - "submission.sections.upload.form.from-placeholder": "İtibaren", - - // "submission.sections.upload.form.group-label": "Group", - "submission.sections.upload.form.group-label": "Grup", - - // "submission.sections.upload.form.group-required": "Group is required.", - "submission.sections.upload.form.group-required": "Grup gerekli.", - - // "submission.sections.upload.form.until-label": "Grant access until", - "submission.sections.upload.form.until-label": "Şu tarihe kadar erişim izni ver:", - - // "submission.sections.upload.form.until-placeholder": "Until", - "submission.sections.upload.form.until-placeholder": "Kadar", - - // "submission.sections.upload.header.policy.default.nolist": "Uploaded files in the {{collectionName}} collection will be accessible according to the following group(s):", - "submission.sections.upload.header.policy.default.nolist": "{{collectionName}} koleksiyonuna yüklenen dosyalara aşağıdaki gruplara göre erişilebilir:", - - // "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):", - "submission.sections.upload.header.policy.default.withlist": "{{collectionName}} koleksiyonuna yüklenen dosyalara, tek dosya için açıkça karar verilenlere ek olarak aşağıdaki gruplarla erişilebilir olacağını lütfen unutmayın:", - - // "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", - "submission.sections.upload.info": "Burada, o anda öğede bulunan tüm dosyaları bulacaksınız. Dosya metadatalarını güncelleyebilir ve koşullara erişebilir veya sayfanın her yerine sürükleyip bırakarak ek dosyalar yükleyebilirsiniz", - - // "submission.sections.upload.no-entry": "No", - "submission.sections.upload.no-entry": "Hayır", - - // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", - "submission.sections.upload.no-file-uploaded": "Henüz dosya yüklenmedi.", - - // "submission.sections.upload.save-metadata": "Save metadata", - "submission.sections.upload.save-metadata": "Metadataları kaydet", - - // "submission.sections.upload.undo": "Cancel", - "submission.sections.upload.undo": "İptal", - - // "submission.sections.upload.upload-failed": "Upload failed", - "submission.sections.upload.upload-failed": "Yükleme Başarısız", - - // "submission.sections.upload.upload-successful": "Upload successful", - "submission.sections.upload.upload-successful": "Yükleme Başarılı", - - - - // "submission.submit.title": "Submission", - "submission.submit.title": "Gönder", - - - - // "submission.workflow.generic.delete": "Delete", - "submission.workflow.generic.delete": "Sil", - - // "submission.workflow.generic.delete-help": "If you would to discard this item, select \"Delete\". You will then be asked to confirm it.", - "submission.workflow.generic.delete-help": "Bu öğeyi atmak istiyorsanız, \"Sil\" öğesini seçin. Daha sonra onaylamanız istenecektir.", - - // "submission.workflow.generic.edit": "Edit", - "submission.workflow.generic.edit": "Değiştir", - - // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", - "submission.workflow.generic.edit-help": "Öğenin metadatalarını değiştirmek için bu seçeneği belirleyin.", - - // "submission.workflow.generic.view": "View", - "submission.workflow.generic.view": "Göster", - - // "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", - "submission.workflow.generic.view-help": "Öğenin metadatalarını görüntülemek için bu seçeneği belirleyin.", - - - - // "submission.workflow.tasks.claimed.approve": "Approve", - "submission.workflow.tasks.claimed.approve": "Kabul Et.", - - // "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", - "submission.workflow.tasks.claimed.approve_help": "Öğeyi incelediyseniz ve koleksiyona dahil edilmeye uygunsa, \"Onayla\"yı seçin.", - - // "submission.workflow.tasks.claimed.edit": "Edit", - "submission.workflow.tasks.claimed.edit": "Değiştir", - - // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", - "submission.workflow.tasks.claimed.edit_help": "Öğenin metadatalarını değiştirmek için bu seçeneği belirleyin.", - - // "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.", - "submission.workflow.tasks.claimed.reject.reason.info": "Lütfen gönderiyi reddetme nedeninizi aşağıdaki kutuya, gönderenin bir sorunu çözüp yeniden gönderip gönderemeyeceğini belirterek girin.", - - // "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", - "submission.workflow.tasks.claimed.reject.reason.placeholder": "Reddetme nedenini açıklayın", - - // "submission.workflow.tasks.claimed.reject.reason.submit": "Reject item", - "submission.workflow.tasks.claimed.reject.reason.submit": "Materyali Reddet", - - // "submission.workflow.tasks.claimed.reject.reason.title": "Reason", - "submission.workflow.tasks.claimed.reject.reason.title": "Neden", - - // "submission.workflow.tasks.claimed.reject.submit": "Reject", - "submission.workflow.tasks.claimed.reject.submit": "Kabul Etme", - - // "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.", - "submission.workflow.tasks.claimed.reject_help": "Öğeyi incelediyseniz ve koleksiyona dahil edilmeye uygun olmadığını bulduysanız, \"Reddet\"i seçin. Ardından, öğenin neden uygun olmadığını ve gönderenin bir şeyi değiştirip yeniden göndermesi gerekip gerekmediğini belirten bir mesaj girmeniz istenecektir.", - - // "submission.workflow.tasks.claimed.return": "Return to pool", - "submission.workflow.tasks.claimed.return": "Havuza Dön", - - // "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", - "submission.workflow.tasks.claimed.return_help": "Başka bir kullanıcının görevi gerçekleştirebilmesi için görevi havuza geri döndürün.", - - - - // "submission.workflow.tasks.generic.error": "Error occurred during operation...", - "submission.workflow.tasks.generic.error": "İşlem sırasında hata oluştu...", - - // "submission.workflow.tasks.generic.processing": "Processing...", - "submission.workflow.tasks.generic.processing": "İşleniyor...", - - // "submission.workflow.tasks.generic.submitter": "Submitter", - "submission.workflow.tasks.generic.submitter": "Gönderen", - - // "submission.workflow.tasks.generic.success": "Operation successful", - "submission.workflow.tasks.generic.success": "İşlem Başarılı", - - - - // "submission.workflow.tasks.pool.claim": "Claim", - "submission.workflow.tasks.pool.claim": "Talep Et", - - // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", - "submission.workflow.tasks.pool.claim_help": "Bu görevi kendinize atayın.", - - // "submission.workflow.tasks.pool.hide-detail": "Hide detail", - "submission.workflow.tasks.pool.hide-detail": "Detayları gizle", - - // "submission.workflow.tasks.pool.show-detail": "Show detail", - "submission.workflow.tasks.pool.show-detail": "Detayaları göster", - - - - // "title": "DSpace", - "title": "DSpace", - - - - // "vocabulary-treeview.header": "Hierarchical tree view", - "vocabulary-treeview.header": "Hiyerarşik ağaç görünümü", - - // "vocabulary-treeview.load-more": "Load more", - "vocabulary-treeview.load-more": "Daha Fazla Yükle", - - // "vocabulary-treeview.search.form.reset": "Reset", - "vocabulary-treeview.search.form.reset": "Sıfırla", - - // "vocabulary-treeview.search.form.search": "Search", - "vocabulary-treeview.search.form.search": "Ara", - - // "vocabulary-treeview.search.no-result": "There were no items to show", - "vocabulary-treeview.search.no-result": "Gösterilecek öğe yok", - - // "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", - "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", - - // "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", - "vocabulary-treeview.tree.description.srsc": "Araştırma Konusu Kategorileri", - - - - // "uploader.browse": "browse", - "uploader.browse": "Tara", - - // "uploader.drag-message": "Drag & Drop your files here", - "uploader.drag-message": "Dosyalarınızı buraya sürükleyip bırakın", - - // "uploader.or": ", or ", - "uploader.or": ", veya", - - // "uploader.processing": "Processing", - "uploader.processing": "İşleniyor", - - // "uploader.queue-length": "Queue length", - "uploader.queue-length": "Sıra Uzunluğu", - - // "virtual-metadata.delete-item.info": "Select the types for which you want to save the virtual metadata as real metadata", - "virtual-metadata.delete-item.info": "Sanal metadataları gerçek metadatalar olarak kaydetmek istediğiniz türleri seçin", - - // "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", - "virtual-metadata.delete-item.modal-head": "Bu ilişkinin sanal metadataları", - - // "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", - "virtual-metadata.delete-relationship.modal-head": "Sanal metadatalarını gerçek metadatalar olarak kaydetmek istediğiniz öğeleri seçin", - - - - // "workflowAdmin.search.results.head": "Administer Workflow", - "workflowAdmin.search.results.head": "İş Akışını Yönet", - - - - // "workflow-item.delete.notification.success.title": "Deleted", - "workflow-item.delete.notification.success.title": "Silindi", - - // "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", - "workflow-item.delete.notification.success.content": "Bu iş akışı öğesi başarıyla silindi", - - // "workflow-item.delete.notification.error.title": "Something went wrong", - "workflow-item.delete.notification.error.title": "Bir şeyler yanlış gitti", - - // "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", - "workflow-item.delete.notification.error.content": "İş akışı öğesi silinemedi", - - // "workflow-item.delete.title": "Delete workflow item", - "workflow-item.delete.title": "İş akışı öğesini sil", - - // "workflow-item.delete.header": "Delete workflow item", - "workflow-item.delete.header": "İş akışı öğesini sil", - - // "workflow-item.delete.button.cancel": "Cancel", - "workflow-item.delete.button.cancel": "İptal", - - // "workflow-item.delete.button.confirm": "Delete", - "workflow-item.delete.button.confirm": "Sil", - - - // "workflow-item.send-back.notification.success.title": "Sent back to submitter", - "workflow-item.send-back.notification.success.title": "Gönderene geri gönderildi", - - // "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", - "workflow-item.send-back.notification.success.content": "Bu iş akışı öğesi, gönderene başarıyla geri gönderildi", - - // "workflow-item.send-back.notification.error.title": "Something went wrong", - "workflow-item.send-back.notification.error.title": "Bir şeyler yanlış gitti", - - // "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", - "workflow-item.send-back.notification.error.content": "İş akışı öğesi, gönderene geri gönderilemedi", - - // "workflow-item.send-back.title": "Send workflow item back to submitter", - "workflow-item.send-back.title": "İş akışı öğesini gönderene geri gönder", - - // "workflow-item.send-back.header": "Send workflow item back to submitter", - "workflow-item.send-back.header": "İş akışı öğesini gönderene geri gönder", - - // "workflow-item.send-back.button.cancel": "Cancel", - "workflow-item.send-back.button.cancel": "İptal", - - // "workflow-item.send-back.button.confirm": "Send back" - "workflow-item.send-back.button.confirm": "Geri Gönder" - -} +{ + + // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", + "401.help": "Bu sayfaya erişim yetkiniz bulunmamaktadır. Ana sayfaya dönmek için aşağıdaki butonu kullanabilirsiniz.", + + // "401.link.home-page": "Take me to the home page", + "401.link.home-page": "Beni ana sayfaya götür", + + // "401.unauthorized": "unauthorized", + "401.unauthorized": "yetkisiz", + + + + // "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", + "403.help": "Bu sayfaya erişim yetkiniz bulunmamaktadır. Ana sayfaya dönmek için aşağıdaki butonu kullanabilirsiniz.", + + // "403.link.home-page": "Take me to the home page", + "403.link.home-page": "Beni ana sayfaya götür", + + // "403.forbidden": "forbidden", + "403.forbidden": "yasaklı", + + + + // "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. ", + "404.help": "Aradığınız sayfayı bulamıyoruz. Sayfa taşınmış veya silinmiş olabilir. Ana sayfaya geri dönmek için aşağıdaki butonu kullanabilirsiniz. ", + + // "404.link.home-page": "Take me to the home page", + "404.link.home-page": "Beni ana sayfaya götür", + + // "404.page-not-found": "page not found", + "404.page-not-found": "sayfa bulunamadı", + + // "admin.curation-tasks.breadcrumbs": "System curation tasks", + "admin.curation-tasks.breadcrumbs": "Sistem iyileştirme görevleri", + + // "admin.curation-tasks.title": "System curation tasks", + "admin.curation-tasks.title": "Sistem iyileştirme görevleri", + + // "admin.curation-tasks.header": "System curation tasks", + "admin.curation-tasks.header": "Sistem iyileştirme görevleri", + + // "admin.registries.bitstream-formats.breadcrumbs": "Format registry", + "admin.registries.bitstream-formats.breadcrumbs": "Kayıt defterini biçimlendir", + + // "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", + "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream biçimi", + + // "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", + "admin.registries.bitstream-formats.create.failure.content": "Yeni bitstream biçimi oluşturulurken bir hata oluştu.", + + // "admin.registries.bitstream-formats.create.failure.head": "Failure", + "admin.registries.bitstream-formats.create.failure.head": "Aksama", + + // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", + "admin.registries.bitstream-formats.create.head": "Vit akışı biçimi oluştur", + + // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", + "admin.registries.bitstream-formats.create.new": "Yeni bir bitstream biçimi ekleyin", + + // "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", + "admin.registries.bitstream-formats.create.success.content": "Yeni bitstream biçimi başarıyla oluşturuldu.", + + // "admin.registries.bitstream-formats.create.success.head": "Success", + "admin.registries.bitstream-formats.create.success.head": "Başarılı", + + // "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", + "admin.registries.bitstream-formats.delete.failure.amount": "{{ amount }} biçim(ler) kaldırılamadı", + + // "admin.registries.bitstream-formats.delete.failure.head": "Failure", + "admin.registries.bitstream-formats.delete.failure.head": "Aksama", + + // "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", + "admin.registries.bitstream-formats.delete.success.amount": "{{ amount }} biçim(ler) başarıyla kaldırıldı", + + // "admin.registries.bitstream-formats.delete.success.head": "Success", + "admin.registries.bitstream-formats.delete.success.head": "Başarılı", + + // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", + "admin.registries.bitstream-formats.description": "Bu bitstream biçimleri listesi, bilinen biçimler ve destek düzeyleri hakkında bilgi sağlar.", + + // "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", + "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream biçimi", + + // "admin.registries.bitstream-formats.edit.description.hint": "", + "admin.registries.bitstream-formats.edit.description.hint": "", + + // "admin.registries.bitstream-formats.edit.description.label": "Description", + "admin.registries.bitstream-formats.edit.description.label": "Tanımlama", + + // "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.hint": "Uzantılar, yüklenen dosyaların biçimini otomatik olarak tanımlamak için kullanılan dosya uzantılarıdır. Her biçim için birkaç uzantı girebilirsiniz.", + + // "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", + "admin.registries.bitstream-formats.edit.extensions.label": "Dosya uzantıları", + + // "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", + "admin.registries.bitstream-formats.edit.extensions.placeholder": "Nokta olmadan bir dosya uzantısı girin", + + // "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", + "admin.registries.bitstream-formats.edit.failure.content": "Bitstream biçimi düzenlenirken bir hata oluştu.", + + // "admin.registries.bitstream-formats.edit.failure.head": "Failure", + "admin.registries.bitstream-formats.edit.failure.head": "Aksama", + + // "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", + "admin.registries.bitstream-formats.edit.head": "Bitstream biçimi: {{ format }}", + + // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", + "admin.registries.bitstream-formats.edit.internal.hint": "Dahili olarak işaretlenen biçimler, kullanıcıdan gizlenir ve yönetim amacıyla kullanılır.", + + // "admin.registries.bitstream-formats.edit.internal.label": "Internal", + "admin.registries.bitstream-formats.edit.internal.label": "Dahili", + + // "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", + "admin.registries.bitstream-formats.edit.mimetype.hint": "Bu biçimle ilişkili MIME biçimi benzersiz olması gerekmez.", + + // "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", + "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Biçimi", + + // "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", + "admin.registries.bitstream-formats.edit.shortDescription.hint": "Bu biçim için benzersiz bir ad (ör. Microsoft Word XP veya Microsoft Word 2000)", + + // "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", + "admin.registries.bitstream-formats.edit.shortDescription.label": "İsim", + + // "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", + "admin.registries.bitstream-formats.edit.success.content": "Bitstream biçimi başarıyla düzenlendi.", + + // "admin.registries.bitstream-formats.edit.success.head": "Success", + "admin.registries.bitstream-formats.edit.success.head": "Başarılı", + + // "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", + "admin.registries.bitstream-formats.edit.supportLevel.hint": "Kurumunuzun bu biçim için taahhüt ettiği destek düzeyi.", + + // "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", + "admin.registries.bitstream-formats.edit.supportLevel.label": "Destek seviyesi", + + // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", + "admin.registries.bitstream-formats.head": "Bitstream Biçimi Kayıt Defteri", + + // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", + "admin.registries.bitstream-formats.no-items": "Gösterilecek bitstream biçimi yok.", + + // "admin.registries.bitstream-formats.table.delete": "Delete selected", + "admin.registries.bitstream-formats.table.delete": "Silme seçildi", + + // "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", + "admin.registries.bitstream-formats.table.deselect-all": "Tüm seçimleri kaldır", + + // "admin.registries.bitstream-formats.table.internal": "internal", + "admin.registries.bitstream-formats.table.internal": "dahili", + + // "admin.registries.bitstream-formats.table.mimetype": "MIME Type", + "admin.registries.bitstream-formats.table.mimetype": "MIME Biçimi", + + // "admin.registries.bitstream-formats.table.name": "Name", + "admin.registries.bitstream-formats.table.name": "İsim", + + // "admin.registries.bitstream-formats.table.return": "Return", + "admin.registries.bitstream-formats.table.return": "Geri Dön", + + // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", + "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Biliniyor", + + // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", + "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Destekleniyor", + + // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", + "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Bilinmiyor", + + // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", + "admin.registries.bitstream-formats.table.supportLevel.head": "Destek Seviyesi", + + // "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Format Registry", + "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Biçimi Kayıt Defteri ", + + + + // "admin.registries.metadata.breadcrumbs": "Metadata registry", + "admin.registries.metadata.breadcrumbs": "Metadata kayıt defteri", + + // "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.", + "admin.registries.metadata.description": "Metadata kayıt defteri, veri havuzda bulunan tüm metadata alanlarının bir listesini tutar. Bu alanlar birden çok şema arasında bölünebilir. Ancak, DSpace nitelikli Dublin Core şemasını gerektirir.", + + // "admin.registries.metadata.form.create": "Create metadata schema", + "admin.registries.metadata.form.create": "Metadata şeması oluştur", + + // "admin.registries.metadata.form.edit": "Edit metadata schema", + "admin.registries.metadata.form.edit": "Metadata şemasını düzenle", + + // "admin.registries.metadata.form.name": "Name", + "admin.registries.metadata.form.name": "İsim", + + // "admin.registries.metadata.form.namespace": "Namespace", + "admin.registries.metadata.form.namespace": "Ad Alanı", + + // "admin.registries.metadata.head": "Metadata Registry", + "admin.registries.metadata.head": "Metadata Kayıt Defteri", + + // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", + "admin.registries.metadata.schemas.no-items": "Gösterilecek metadata alanı yok.", + + // "admin.registries.metadata.schemas.table.delete": "Delete selected", + "admin.registries.metadata.schemas.table.delete": "Silme Seçildi", + + // "admin.registries.metadata.schemas.table.id": "ID", + "admin.registries.metadata.schemas.table.id": "Kimlik", + + // "admin.registries.metadata.schemas.table.name": "Name", + "admin.registries.metadata.schemas.table.name": "İsim", + + // "admin.registries.metadata.schemas.table.namespace": "Namespace", + "admin.registries.metadata.schemas.table.namespace": "Ad Alanı", + + // "admin.registries.metadata.title": "DSpace Angular :: Metadata Registry", + "admin.registries.metadata.title": "DSpace Angular :: Metadata Kayıt Defteri", + + + + // "admin.registries.schema.breadcrumbs": "Metadata schema", + "admin.registries.schema.breadcrumbs": "Metadata şeması", + + // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", + "admin.registries.schema.description": "Bu, \"{{namesapce}}\" için metadata şemasıdır.", + + // "admin.registries.schema.fields.head": "Schema metadata fields", + "admin.registries.schema.fields.head": "Şema metadata alanları", + + // "admin.registries.schema.fields.no-items": "No metadata fields to show.", + "admin.registries.schema.fields.no-items": "Gösterilecek metadata alanı yok.", + + // "admin.registries.schema.fields.table.delete": "Delete selected", + "admin.registries.schema.fields.table.delete": "Silme Seçildi", + + // "admin.registries.schema.fields.table.field": "Field", + "admin.registries.schema.fields.table.field": "Alan", + + // "admin.registries.schema.fields.table.scopenote": "Scope Note", + "admin.registries.schema.fields.table.scopenote": "Kapsam Notu", + + // "admin.registries.schema.form.create": "Create metadata field", + "admin.registries.schema.form.create": "Metadata alanı oluştur", + + // "admin.registries.schema.form.edit": "Edit metadata field", + "admin.registries.schema.form.edit": "Metadata alanını düzenle", + + // "admin.registries.schema.form.element": "Element", + "admin.registries.schema.form.element": "Element", + + // "admin.registries.schema.form.qualifier": "Qualifier", + "admin.registries.schema.form.qualifier": "Niteleyici", + + // "admin.registries.schema.form.scopenote": "Scope Note", + "admin.registries.schema.form.scopenote": "Kapsam Notu", + + // "admin.registries.schema.head": "Metadata Schema", + "admin.registries.schema.head": "Metadata Şeması", + + // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", + "admin.registries.schema.notification.created": "Metadata şeması \"{{prefix}}\" başarıyla oluşturuldu", + + // "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", + "admin.registries.schema.notification.deleted.failure": "{{amount}} metadata şeması silinemedi", + + // "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", + "admin.registries.schema.notification.deleted.success": "{{amount}} metadata şeması başarıyla silindi", + + // "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", + "admin.registries.schema.notification.edited": "Metadata şeması \"{{prefix}}\" başarıyla düzenlendi", + + // "admin.registries.schema.notification.failure": "Error", + "admin.registries.schema.notification.failure": "Hata", + + // "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", + "admin.registries.schema.notification.field.created": "\"{{field}}\" metadata alanı başarıyla oluşturuldu", + + // "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", + "admin.registries.schema.notification.field.deleted.failure": "{{amount}} metadata alanı silinemedi", + + // "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", + "admin.registries.schema.notification.field.deleted.success": "{{amount}} metadata alanı başarıyla silindi", + + // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", + "admin.registries.schema.notification.field.edited": "Metadata alanı \"{{field}}\" başarıyla düzenlendi", + + // "admin.registries.schema.notification.success": "Success", + "admin.registries.schema.notification.success": "Başarılı", + + // "admin.registries.schema.return": "Return", + "admin.registries.schema.return": "Geri Dön", + + // "admin.registries.schema.title": "DSpace Angular :: Metadata Schema Registry", + "admin.registries.schema.title": "DSpace Angular :: Metadata Şeması Kayıt Defteri", + + + + // "admin.access-control.epeople.actions.delete": "Delete EPerson", + "admin.access-control.epeople.actions.delete": "E-Kişiyi Sil", + + // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", + "admin.access-control.epeople.actions.impersonate": "E-Kişinin Kimliğine Bürün", + + // "admin.access-control.epeople.actions.reset": "Reset password", + "admin.access-control.epeople.actions.reset": "Parolayı sıfırla", + + // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", + "admin.access-control.epeople.actions.stop-impersonating": "E-Kişilerin kimliğine bürünmeyi durdurun", + + // "admin.access-control.epeople.title": "DSpace Angular :: EPeople", + "admin.access-control.epeople.title": "DSpace Angular :: E-kişiler", + + // "admin.access-control.epeople.head": "EPeople", + "admin.access-control.epeople.head": "E-Kişiler", + + // "admin.access-control.epeople.search.head": "Search", + "admin.access-control.epeople.search.head": "Ara", + + // "admin.access-control.epeople.button.see-all": "Tümüne Gözat", + "admin.access-control.epeople.button.see-all": "Browse All", + + // "admin.access-control.epeople.search.scope.metadata": "Metadata", + "admin.access-control.epeople.search.scope.metadata": "Metadata", + + // "admin.access-control.epeople.search.scope.email": "E-mail (exact)", + "admin.access-control.epeople.search.scope.email": "E-posta (tam)", + + // "admin.access-control.epeople.search.button": "Search", + "admin.access-control.epeople.search.button": "Ara", + + // "admin.access-control.epeople.button.add": "Add EPerson", + "admin.access-control.epeople.button.add": "E-Kişi Ekle", + + // "admin.access-control.epeople.table.id": "ID", + "admin.access-control.epeople.table.id": "Kimlik", + + // "admin.access-control.epeople.table.name": "Name", + "admin.access-control.epeople.table.name": "İsim", + + // "admin.access-control.epeople.table.email": "E-mail (exact)", + "admin.access-control.epeople.table.email": "E-posta (tam)", + + // "admin.access-control.epeople.table.edit": "Edit", + "admin.access-control.epeople.table.edit": "Düzenle", + + // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", + "admin.access-control.epeople.table.edit.buttons.edit": "Düzenle \"{{name}}\"", + + // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", + "admin.access-control.epeople.table.edit.buttons.remove": "Sil \"{{name}}\"", + + // "admin.access-control.epeople.no-items": "No EPeople to show.", + "admin.access-control.epeople.no-items": "Gösterilecek E-Kişiler yok.", + + // "admin.access-control.epeople.form.create": "Create EPerson", + "admin.access-control.epeople.form.create": "E-Kişi Oluştur", + + // "admin.access-control.epeople.form.edit": "Edit EPerson", + "admin.access-control.epeople.form.edit": "E-Kişiyi Düzenle", + + // "admin.access-control.epeople.form.firstName": "First name", + "admin.access-control.epeople.form.firstName": "İsim", + + // "admin.access-control.epeople.form.lastName": "Last name", + "admin.access-control.epeople.form.lastName": "Soyadı", + + // "admin.access-control.epeople.form.email": "E-mail", + "admin.access-control.epeople.form.email": "E-posta", + + // "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", + "admin.access-control.epeople.form.emailHint": "Geçerli bir e-posta adresi olmalı", + + // "admin.access-control.epeople.form.canLogIn": "Can log in", + "admin.access-control.epeople.form.canLogIn": "Giriş yapabilir", + + // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", + "admin.access-control.epeople.form.requireCertificate": "Sertifika gerektirir", + + // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.created.success": "E-Kişi \"{{name}}\" başarıyla oluşturuldu", + + // "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.created.failure": "E-Kişi \"{{name}}\" oluşturulamadı", + + // "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", + "admin.access-control.epeople.form.notification.created.failure.emailInUse": "E-Kişi \"{{name}}\" oluşturulamadı, e-posta \"{{email}}\" zaten kullanımda.", + + // "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", + "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "E-Kişi \"{{name}}\" düzenlenemedi, e-posta \"{{email}}\" zaten kullanımda.", + + // "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.edited.success": "E-kişi \"{{name}}\" başarıyla düzenlendi", + + // "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.edited.failure": "E-Kişi \"{{name}}\" düzenlenemedi", + + // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.success": "E-Kişi \"{{name}}\" başarıyla silindi", + + // "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.failure": "E-Kişi \"{{name}}\" silinemedi", + + // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", + "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Bu grupların üyesi:", + + // "admin.access-control.epeople.form.table.id": "ID", + "admin.access-control.epeople.form.table.id": "Kimlik", + + // "admin.access-control.epeople.form.table.name": "Name", + "admin.access-control.epeople.form.table.name": "İsim", + + // "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", + "admin.access-control.epeople.form.memberOfNoGroups": "Bu E-Kişi herhangi bir grubun üyesi değil", + + // "admin.access-control.epeople.form.goToGroups": "Add to groups", + "admin.access-control.epeople.form.goToGroups": "Gruplar ekle", + + // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", + "admin.access-control.epeople.notification.deleted.failure": "E-Kişi silinemedi: \"{{name}}\"", + + // "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", + "admin.access-control.epeople.notification.deleted.success": "E-Kişiler başarıyla silindi: \"{{name}}\"", + + + + // "admin.access-control.groups.title": "DSpace Angular :: Groups", + "admin.access-control.groups.title": "DSpace Angular :: Gruplar", + + // "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Edit Group", + "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Grubu Düzenle", + + // "admin.access-control.groups.title.addGroup": "DSpace Angular :: New Group", + "admin.access-control.groups.title.addGroup": "DSpace Angular :: Yeni Grup", + + // "admin.access-control.groups.head": "Groups", + "admin.access-control.groups.head": "Gruplar", + + // "admin.access-control.groups.button.add": "Add group", + "admin.access-control.groups.button.add": "Grup ekle", + + // "admin.access-control.groups.search.head": "Search groups", + "admin.access-control.groups.search.head": "Grupları ara", + + // "admin.access-control.groups.button.see-all": "Browse all", + "admin.access-control.groups.button.see-all": "Tümüne göz at", + + // "admin.access-control.groups.search.button": "Search", + "admin.access-control.groups.search.button": "Ara", + + // "admin.access-control.groups.table.id": "ID", + "admin.access-control.groups.table.id": "Kimlik", + + // "admin.access-control.groups.table.name": "Name", + "admin.access-control.groups.table.name": "İsim", + + // "admin.access-control.groups.table.members": "Members", + "admin.access-control.groups.table.members": "Üyeler", + + // "admin.access-control.groups.table.edit": "Edit", + "admin.access-control.groups.table.edit": "Düzenle", + + // "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", + "admin.access-control.groups.table.edit.buttons.edit": "Düzenle \"{{name}}\"", + + // "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", + "admin.access-control.groups.table.edit.buttons.remove": "Sil \"{{name}}\"", + + // "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", + "admin.access-control.groups.no-items": "Bu adla veya bu UUID olarak hiçbir grup bulunamadı", + + // "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", + "admin.access-control.groups.notification.deleted.success": "\"{{name}}\" grubu başarıyla silindi", + + // "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", + "admin.access-control.groups.notification.deleted.failure.title": "\"{{name}}\" grubu silinemedi", + + // "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", + "admin.access-control.groups.notification.deleted.failure.content": "Sorun: \"{{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.", + "admin.access-control.groups.form.alert.permanent": "Bu grup kalıcıdır, bu nedenle düzenlenemez veya silinemez. Yine de bu sayfayı kullanarak grup üyeleri ekleyip kaldırabilirsiniz.", + + // "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.", + "admin.access-control.groups.form.alert.workflowGroup": "Bu grup, \"{{name}}\" {{comcol}} içindeki gönderim ve iş akışı sürecindeki bir role karşılık geldiği için değiştirilemez veya silinemez. Bunu, {{comcol}} düzenleme sayfasındaki \"rol ata\" sekmesinden silebilirsiniz. Yine de bu sayfayı kullanarak grup üyeleri ekleyip kaldırabilirsiniz.", + + // "admin.access-control.groups.form.head.create": "Create group", + "admin.access-control.groups.form.head.create": "Grup oluştur", + + // "admin.access-control.groups.form.head.edit": "Edit group", + "admin.access-control.groups.form.head.edit": "Grubu düzenle", + + // "admin.access-control.groups.form.groupName": "Group name", + "admin.access-control.groups.form.groupName": "Grup adı", + + // "admin.access-control.groups.form.groupDescription": "Description", + "admin.access-control.groups.form.groupDescription": "Açıklama", + + // "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", + "admin.access-control.groups.form.notification.created.success": "Grup \"{{name}}\" başarıyla oluşturuldu", + + // "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", + "admin.access-control.groups.form.notification.created.failure": "\"{{name}}\" Grubu oluşturulamadı", + + // "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.", + "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Şu ada sahip Grup oluşturulamadı: \"{{name}}\", adın halihazırda kullanımda olmadığından emin olun.", + + // "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", + "admin.access-control.groups.form.notification.edited.failure": "\"{{name}}\" Grubu düzenlenemedi", + + // "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", + "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "\"{{name}}\" adı zaten kullanılıyor!", + + // "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", + "admin.access-control.groups.form.notification.edited.success": "\"{{name}}\" Grubu başarıyla düzenlendi", + + // "admin.access-control.groups.form.actions.delete": "Delete Group", + "admin.access-control.groups.form.actions.delete": "Grubu Sil", + + // "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", + "admin.access-control.groups.form.delete-group.modal.header": "\"{{ dsoName }}\" Grubunu Sil", + + // "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", + "admin.access-control.groups.form.delete-group.modal.info": "\"{{ dsoName }}\" Grubunu silmek istediğinizden emin misiniz?", + + // "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", + "admin.access-control.groups.form.delete-group.modal.cancel": "İptal", + + // "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", + "admin.access-control.groups.form.delete-group.modal.confirm": "Sil", + + // "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", + "admin.access-control.groups.form.notification.deleted.success": "\"{{ name }}\" grubu başarıyla silindi", + + // "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", + "admin.access-control.groups.form.notification.deleted.failure.title": "\"{{ name }}\" grubu silinemedi", + + // "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", + "admin.access-control.groups.form.notification.deleted.failure.content": "Sorun: \"{{ cause }}\"", + + // "admin.access-control.groups.form.members-list.head": "EPeople", + "admin.access-control.groups.form.members-list.head": "E-Kişiler", + + // "admin.access-control.groups.form.members-list.search.head": "Add EPeople", + "admin.access-control.groups.form.members-list.search.head": "E-Kişiler Ekle", + + // "admin.access-control.groups.form.members-list.button.see-all": "Browse All", + "admin.access-control.groups.form.members-list.button.see-all": "Tümüne Gözat", + + // "admin.access-control.groups.form.members-list.headMembers": "Current Members", + "admin.access-control.groups.form.members-list.headMembers": "Mevcut Üyeler", + + // "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", + "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", + + // "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", + "admin.access-control.groups.form.members-list.search.scope.email": "E-posta (tam)", + + // "admin.access-control.groups.form.members-list.search.button": "Search", + "admin.access-control.groups.form.members-list.search.button": "Ara", + + // "admin.access-control.groups.form.members-list.table.id": "ID", + "admin.access-control.groups.form.members-list.table.id": "Kimlik", + + // "admin.access-control.groups.form.members-list.table.name": "Name", + "admin.access-control.groups.form.members-list.table.name": "İsim", + + // "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", + "admin.access-control.groups.form.members-list.table.edit": "Kaldır / Ekle", + + // "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", + "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "\"{{name}}\" adlı üyeyi kaldırın", + + // "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.success.addMember": "Üye başarıyla eklendi: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.addMember": "Üye eklenemedi: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Üye başarıyla silindi: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Üye silinemedi: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", + "admin.access-control.groups.form.members-list.table.edit.buttons.add": "\"{{name}}\" adlı üye ekleyin", + + // "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "Mevcut aktif grup yok, önce bir isim gönderin.", + + // "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", + "admin.access-control.groups.form.members-list.no-members-yet": "Henüz grupta üye yok, arayın ve ekleyin.", + + // "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", + "admin.access-control.groups.form.members-list.no-items": "Bu aramada E-Kişiler bulunamadı", + + // "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure": "Bir şeyler yanlış gitti: \"{{cause}}\"", + + // "admin.access-control.groups.form.subgroups-list.head": "Groups", + "admin.access-control.groups.form.subgroups-list.head": "Gruplar", + + // "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", + "admin.access-control.groups.form.subgroups-list.search.head": "Alt Grup Ekle", + + // "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", + "admin.access-control.groups.form.subgroups-list.button.see-all": "Tümüne Gözat", + + // "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", + "admin.access-control.groups.form.subgroups-list.headSubgroups": "Mevcut Alt Gruplar", + + // "admin.access-control.groups.form.subgroups-list.search.button": "Search", + "admin.access-control.groups.form.subgroups-list.search.button": "Ara", + + // "admin.access-control.groups.form.subgroups-list.table.id": "ID", + "admin.access-control.groups.form.subgroups-list.table.id": "Kimlik", + + // "admin.access-control.groups.form.subgroups-list.table.name": "Name", + "admin.access-control.groups.form.subgroups-list.table.name": "İsim", + + // "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", + "admin.access-control.groups.form.subgroups-list.table.edit": "Kaldır / Ekle", + + // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "\"{{name}}\" adlı alt grubu kaldırın", + + // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "\"{{name}}\" adlı alt grup ekleyin", + + // "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", + "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Mevcut grup", + + // "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Alt grup başarıyla eklendi: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Alt grup eklenemedi: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Alt grup başarıyla silindi: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Alt grup silinemedi: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Aktif grup mevcut değil, önce bir isim gönderin.", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", + "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "Bu grup mevcut, eklenemez.", + + // "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", + "admin.access-control.groups.form.subgroups-list.no-items": "Bu adla veya bu UUID olarak hiçbir grup bulunamadı", + + // "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", + "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Henüz grupta alt grup yok.", + + // "admin.access-control.groups.form.return": "Return to groups", + "admin.access-control.groups.form.return": "Gruplara dön", + + + + // "admin.search.breadcrumbs": "Administrative Search", + "admin.search.breadcrumbs": "Yönetimsel Arama", + + // "admin.search.collection.edit": "Edit", + "admin.search.collection.edit": "Düzenle", + + // "admin.search.community.edit": "Edit", + "admin.search.community.edit": "Düzenle", + + // "admin.search.item.delete": "Delete", + "admin.search.item.delete": "Sil", + + // "admin.search.item.edit": "Edit", + "admin.search.item.edit": "Düzenle", + + // "admin.search.item.make-private": "Make Private", + "admin.search.item.make-private": "Özel yap", + + // "admin.search.item.make-public": "Make Public", + "admin.search.item.make-public": "Ortak yap", + + // "admin.search.item.move": "Move", + "admin.search.item.move": "Taşı", + + // "admin.search.item.reinstate": "Reinstate", + "admin.search.item.reinstate": "Eski durumuna getir", + + // "admin.search.item.withdraw": "Withdraw", + "admin.search.item.withdraw": "Çekil", + + // "admin.search.title": "Administrative Search", + "admin.search.title": "Yönetimsel Arama", + + // "administrativeView.search.results.head": "Administrative Search", + "administrativeView.search.results.head": "Yönetimsel Arama", + + + + + // "admin.workflow.breadcrumbs": "Administer Workflow", + "admin.workflow.breadcrumbs": "İş Akışını Yönet", + + // "admin.workflow.title": "Administer Workflow", + "admin.workflow.title": "İş Akışını Yönet", + + // "admin.workflow.item.workflow": "Workflow", + "admin.workflow.item.workflow": "İş akışı", + + // "admin.workflow.item.delete": "Delete", + "admin.workflow.item.delete": "Sil", + + // "admin.workflow.item.send-back": "Send back", + "admin.workflow.item.send-back": "Geri gönder", + + + + // "admin.metadata-import.breadcrumbs": "Import Metadata", + "admin.metadata-import.breadcrumbs": "Metadataları İçe Aktar", + + // "admin.metadata-import.title": "Import Metadata", + "admin.metadata-import.title": "Metadataları İçe Aktar", + + // "admin.metadata-import.page.header": "Import Metadata", + "admin.metadata-import.page.header": "Metadataları İçe Aktar", + + // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", + "admin.metadata-import.page.help": "Dosyalarda toplu metadata işlemleri içeren CSV dosyalarını buraya bırakabilir veya bunlara göz atabilirsiniz.", + + // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", + "admin.metadata-import.page.dropMsg": "İçe aktarmak için bir metadata CSV'si bırakın", + + // "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", + "admin.metadata-import.page.dropMsgReplace": "İçe aktarılacak CSV metadatalarını değiştirmek için bırakın", + + // "admin.metadata-import.page.button.return": "Return", + "admin.metadata-import.page.button.return": "Geri Dön", + + // "admin.metadata-import.page.button.proceed": "Proceed", + "admin.metadata-import.page.button.proceed": "Devam Et", + + // "admin.metadata-import.page.error.addFile": "Select file first!", + "admin.metadata-import.page.error.addFile": "Önce dosyayı seçin!", + + + + + // "auth.errors.invalid-user": "Invalid email address or password.", + "auth.errors.invalid-user": "Geçersiz e-posta adresi veya parola.", + + // "auth.messages.expired": "Your session has expired. Please log in again.", + "auth.messages.expired": "Oturumunuz sona erdi. Lütfen tekrar giriş yapın.", + + + + // "bitstream.edit.bitstream": "Bitstream: ", + "bitstream.edit.bitstream": "Bitstream: ", + + // "bitstream.edit.form.description.hint": "Optionally, provide a brief description of the file, for example \"Main article\" or \"Experiment data readings\".", + "bitstream.edit.form.description.hint": "İsteğe bağlı olarak, dosyanın kısa bir açıklamasını sağlayın, örneğin \"Ana makale\" veya \"Deneme veri okumaları\".", + + // "bitstream.edit.form.description.label": "Description", + "bitstream.edit.form.description.label": "Açıklama", + + // "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.", + "bitstream.edit.form.embargo.hint": "Erişime izin verilen ilk gün. Bu tarih bu formda değiştirilemez. Bir bitstream için bir ambargo tarihi ayarlamak için Öğe Durumu sekmesine gidin, Yetkiler...'i tıklayın., bitstreamın OKU politikasını oluşturun veya düzenleyin ve Başlangıç ​​Tarihi'ni istediğiniz gibi ayarlayın.", + + // "bitstream.edit.form.embargo.label": "Embargo until specific date", + "bitstream.edit.form.embargo.label": "Belirli bir tarihe kadar ambargo", + + // "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.", + "bitstream.edit.form.fileName.hint": "Bitstreamın dosya adını değiştirin. Bunun görünen bitstream URL'sini değiştireceğini, ancak dizi kimliği değişmediği sürece eski bağlantıların çözüleceğini unutmayın.", + + // "bitstream.edit.form.fileName.label": "Filename", + "bitstream.edit.form.fileName.label": "Dosya adı", + + // "bitstream.edit.form.newFormat.label": "Describe new format", + "bitstream.edit.form.newFormat.label": "Yeni biçimi tanımla", + + // "bitstream.edit.form.newFormat.hint": "The application you used to create the file, and the version number (for example, \"ACMESoft SuperApp version 1.5\").", + "bitstream.edit.form.newFormat.hint": "Dosyayı oluşturmak için kullandığınız uygulama ve sürüm numarası (örneğin, \"ACMESoft SuperApp versiyon 1.5\").", + + // "bitstream.edit.form.primaryBitstream.label": "Primary bitstream", + "bitstream.edit.form.primaryBitstream.label": "Birincil bitstream", + + // "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\".", + "bitstream.edit.form.selectedFormat.hint": "Biçim yukarıdaki listede yoksa, select \"listede olmayan biçim\"i above ve \"Yeni biçimi tanımla\" altında açıklayın.", + + // "bitstream.edit.form.selectedFormat.label": "Selected Format", + "bitstream.edit.form.selectedFormat.label": "Seçilen Biçim", + + // "bitstream.edit.form.selectedFormat.unknown": "Format not in list", + "bitstream.edit.form.selectedFormat.unknown": "Listede olmayan biçim", + + // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", + "bitstream.edit.notifications.error.format.title": "Bitstreamın biçimi kaydedilirken bir hata oluştu", + + // "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", + "bitstream.edit.notifications.saved.content": "Bu bitstreamda yaptığınız değişiklikler kaydedildi.", + + // "bitstream.edit.notifications.saved.title": "Bitstream saved", + "bitstream.edit.notifications.saved.title": "Bitstream kaydedildi", + + // "bitstream.edit.title": "Edit bitstream", + "bitstream.edit.title": "Bitstreamı düzenle", + + + + // "browse.comcol.by.author": "By Author", + "browse.comcol.by.author": "Yazara Göre", + + // "browse.comcol.by.dateissued": "By Issue Date", + "browse.comcol.by.dateissued": "Yayın Tarihine Göre", + + // "browse.comcol.by.subject": "By Subject", + "browse.comcol.by.subject": "Konuya Göre", + + // "browse.comcol.by.title": "By Title", + "browse.comcol.by.title": "Başlığa Göre", + + // "browse.comcol.head": "Browse", + "browse.comcol.head": "Gözat", + + // "browse.empty": "No items to show.", + "browse.empty": "Gösterilecek öğe yok.", + + // "browse.metadata.author": "Author", + "browse.metadata.author": "Yazar", + + // "browse.metadata.dateissued": "Issue Date", + "browse.metadata.dateissued": "Yayın Tarihi", + + // "browse.metadata.subject": "Subject", + "browse.metadata.subject": "Konu", + + // "browse.metadata.title": "Title", + "browse.metadata.title": "Başlık", + + // "browse.metadata.author.breadcrumbs": "Browse by Author", + "browse.metadata.author.breadcrumbs": "Yazara Göre Gözat", + + // "browse.metadata.dateissued.breadcrumbs": "Browse by Date", + "browse.metadata.dateissued.breadcrumbs": "Tarihe Göre Gözat", + + // "browse.metadata.subject.breadcrumbs": "Browse by Subject", + "browse.metadata.subject.breadcrumbs": "Konuya Göre Gözat", + + // "browse.metadata.title.breadcrumbs": "Browse by Title", + "browse.metadata.title.breadcrumbs": "Başlığa göre göz atın", + + // "browse.startsWith.choose_start": "(Choose start)", + "browse.startsWith.choose_start": "(Başlangıç seç)", + + // "browse.startsWith.choose_year": "(Choose year)", + "browse.startsWith.choose_year": "(Yıl seç)", + + // "browse.startsWith.jump": "Jump to a point in the index:", + "browse.startsWith.jump": "Dizinde bir noktaya atla:", + + // "browse.startsWith.months.april": "April", + "browse.startsWith.months.april": "Nisan", + + // "browse.startsWith.months.august": "August", + "browse.startsWith.months.august": "Ağustos", + + // "browse.startsWith.months.december": "December", + "browse.startsWith.months.december": "Aralık", + + // "browse.startsWith.months.february": "February", + "browse.startsWith.months.february": "Şubat", + + // "browse.startsWith.months.january": "January", + "browse.startsWith.months.january": "Ocak", + + // "browse.startsWith.months.july": "July", + "browse.startsWith.months.july": "Temmuz", + + // "browse.startsWith.months.june": "June", + "browse.startsWith.months.june": "Haziran", + + // "browse.startsWith.months.march": "March", + "browse.startsWith.months.march": "Mart", + + // "browse.startsWith.months.may": "May", + "browse.startsWith.months.may": "Mayıs", + + // "browse.startsWith.months.none": "(Choose month)", + "browse.startsWith.months.none": "(Ay seçin)", + + // "browse.startsWith.months.november": "November", + "browse.startsWith.months.november": "Kasım", + + // "browse.startsWith.months.october": "October", + "browse.startsWith.months.october": "Ekim", + + // "browse.startsWith.months.september": "September", + "browse.startsWith.months.september": "Eylül", + + // "browse.startsWith.submit": "Go", + "browse.startsWith.submit": "Git", + + // "browse.startsWith.type_date": "Or type in a date (year-month):", + "browse.startsWith.type_date": "Veya bir tarih yazın (yıl-ay):", + + // "browse.startsWith.type_text": "Or enter first few letters:", + "browse.startsWith.type_text": "Veya ilk birkaç harfi girin:", + + // "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", + "browse.title": "{{ field }} {{ value }} ile {{ collection }}'a göz atma", + + + // "chips.remove": "Remove chip", + "chips.remove": "Çipi kaldır", + + + + // "collection.create.head": "Create a Collection", + "collection.create.head": "Koleksiyon Oluştur", + + // "collection.create.notifications.success": "Successfully created the Collection", + "collection.create.notifications.success": "Koleksiyon başarıyla oluşturuldu", + + // "collection.create.sub-head": "Create a Collection for Community {{ parent }}", + "collection.create.sub-head": "Komünite için Koleksiyon Oluşturun {{ parent }}", + + // "collection.curate.header": "Curate Collection: {{collection}}", + "collection.curate.header": "Koleksiyonu Düzenle: {{collection}}", + + // "collection.delete.cancel": "Cancel", + "collection.delete.cancel": "İptal", + + // "collection.delete.confirm": "Confirm", + "collection.delete.confirm": "Onayla", + + // "collection.delete.head": "Delete Collection", + "collection.delete.head": "Koleksiyonu sil", + + // "collection.delete.notification.fail": "Collection could not be deleted", + "collection.delete.notification.fail": "Koleksiyon silinemedi", + + // "collection.delete.notification.success": "Successfully deleted collection", + "collection.delete.notification.success": "Koleksiyon başarıyla silindi", + + // "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", + "collection.delete.text": "\"{{ dso }}\" koleksiyonunu silmek istediğinizden emin misiniz?", + + + + // "collection.edit.delete": "Delete this collection", + "collection.edit.delete": "Bu koleksiyonu sil", + + // "collection.edit.head": "Edit Collection", + "collection.edit.head": "Koleksiyonu Düzenle", + + // "collection.edit.breadcrumbs": "Edit Collection", + "collection.edit.breadcrumbs": "Koleksiyonu Düzenle", + + + + // "collection.edit.tabs.mapper.head": "Item Mapper", + "collection.edit.tabs.mapper.head": "Öğe eşleştirici", + + // "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", + "collection.edit.tabs.item-mapper.title": "Koleksiyon Düzenleme - Öğe Eşleştirici", + + // "collection.edit.item-mapper.cancel": "Cancel", + "collection.edit.item-mapper.cancel": "İptal", + + // "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", + "collection.edit.item-mapper.collection": "Koleksiyon: \"{{name}}\"", + + // "collection.edit.item-mapper.confirm": "Map selected items", + "collection.edit.item-mapper.confirm": "Seçilen öğeleri eşle", + + // "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.", + "collection.edit.item-mapper.description": "Bu, koleksiyon yöneticilerinin diğer koleksiyonlardaki öğeleri bu koleksiyona eşlemelerine olanak tanıyan öğe eşleyici aracıdır. Diğer koleksiyonlardaki öğeleri arayabilir ve bunları eşleyebilir veya şu anda eşlenmiş öğelerin listesine göz atabilirsiniz.", + + // "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", + "collection.edit.item-mapper.head": "Öğe Eşleştirici - Diğer Koleksiyonlardaki Öğeleri Eşle", + + // "collection.edit.item-mapper.no-search": "Please enter a query to search", + "collection.edit.item-mapper.no-search": "Lütfen aramak için bir sorgu girin", + + // "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", + "collection.edit.item-mapper.notifications.map.error.content": "{{amount}} öğenin eşlenmesinde hatalar oluştu.", + + // "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", + "collection.edit.item-mapper.notifications.map.error.head": "Eşleme hataları", + + // "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", + "collection.edit.item-mapper.notifications.map.success.content": "{{amount}} öğe başarıyla eşlendi.", + + // "collection.edit.item-mapper.notifications.map.success.head": "Mapping completed", + "collection.edit.item-mapper.notifications.map.success.head": "Eşleme tamamlandı", + + // "collection.edit.item-mapper.notifications.unmap.error.content": "Errors occurred for removing the mappings of {{amount}} items.", + "collection.edit.item-mapper.notifications.unmap.error.content": "{{amount}} öğenin eşlemeleri kaldırılırken hatalar oluştu.", + + // "collection.edit.item-mapper.notifications.unmap.error.head": "Remove mapping errors", + "collection.edit.item-mapper.notifications.unmap.error.head": "Eşleme hatalarını kaldır", + + // "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", + "collection.edit.item-mapper.notifications.unmap.success.content": "{{amount}} öğenin eşlemeleri başarıyla kaldırıldı.", + + // "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", + "collection.edit.item-mapper.notifications.unmap.success.head": "Eşlemeyi kaldır tamamlandı", + + // "collection.edit.item-mapper.remove": "Remove selected item mappings", + "collection.edit.item-mapper.remove": "Seçili öğe eşlemelerini kaldır", + + // "collection.edit.item-mapper.tabs.browse": "Browse mapped items", + "collection.edit.item-mapper.tabs.browse": "Eşlenen öğelere göz atın", + + // "collection.edit.item-mapper.tabs.map": "Map new items", + "collection.edit.item-mapper.tabs.map": "Yeni öğeleri işle", + + + + // "collection.edit.logo.label": "Collection logo", + "collection.edit.logo.label": "Koleksiyon logosu", + + // "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", + "collection.edit.logo.notifications.add.error": "Koleksiyon logosu yüklemesi başarısız. Lütfen yeniden denemeden önce içeriği doğrulayın.", + + // "collection.edit.logo.notifications.add.success": "Upload Collection logo successful.", + "collection.edit.logo.notifications.add.success": "Koleksiyon logosu yüklemesi başarılı.", + + // "collection.edit.logo.notifications.delete.success.title": "Logo deleted", + "collection.edit.logo.notifications.delete.success.title": "Logo silindi", + + // "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", + "collection.edit.logo.notifications.delete.success.content": "Koleksiyonun logosunu başarıyla silindi", + + // "collection.edit.logo.notifications.delete.error.title": "Error deleting logo", + "collection.edit.logo.notifications.delete.error.title": "Logo silinirken hata", + + // "collection.edit.logo.upload": "Drop a Collection Logo to upload", + "collection.edit.logo.upload": "Yüklenecek bir koleksiyon logosu bırakın", + + + + // "collection.edit.notifications.success": "Successfully edited the Collection", + "collection.edit.notifications.success": "Koleksiyon başarıyla düzenlendi.", + + // "collection.edit.return": "Return", + "collection.edit.return": "Dönüş", + + + + // "collection.edit.tabs.curate.head": "Curate", + "collection.edit.tabs.curate.head": "Kuratör", + + // "collection.edit.tabs.curate.title": "Collection Edit - Curate", + "collection.edit.tabs.curate.title": "Koleksiyon düzenleme - Küratör", + + // "collection.edit.tabs.authorizations.head": "Authorizations", + "collection.edit.tabs.authorizations.head": "Yetkilendirmeler", + + // "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", + "collection.edit.tabs.authorizations.title": "Koleksiyon düzenleme - Yetkilendirmeler", + + // "collection.edit.tabs.metadata.head": "Edit Metadata", + "collection.edit.tabs.metadata.head": "Metadataları Düzenle", + + // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", + "collection.edit.tabs.metadata.title": "Koleksiyon Düzenle - Metadatalar", + + // "collection.edit.tabs.roles.head": "Assign Roles", + "collection.edit.tabs.roles.head": "Rol atamak", + + // "collection.edit.tabs.roles.title": "Collection Edit - Roles", + "collection.edit.tabs.roles.title": "Koleksiyon düzenleme - Roller", + + // "collection.edit.tabs.source.external": "This collection harvests its content from an external source", + "collection.edit.tabs.source.external": "Bu koleksiyon içeriğini harici bir kaynaktan toplar", + + // "collection.edit.tabs.source.form.errors.oaiSource.required": "You must provide a set id of the target collection.", + "collection.edit.tabs.source.form.errors.oaiSource.required": "Hedef koleksiyonuna bir set kimliği sağlamalısınız.", + + // "collection.edit.tabs.source.form.harvestType": "Content being harvested", + "collection.edit.tabs.source.form.harvestType": "İçerik harmanlanıyor", + + // "collection.edit.tabs.source.form.head": "Configure an external source", + "collection.edit.tabs.source.form.head": "Harici bir kaynak yapılandır", + + // "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", + "collection.edit.tabs.source.form.metadataConfigId": "Metadata formatı", + + // "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", + "collection.edit.tabs.source.form.oaiSetId": "OAI'ya Özel Set Kimliği", + + // "collection.edit.tabs.source.form.oaiSource": "OAI Provider", + "collection.edit.tabs.source.form.oaiSource": "OAI Sağlayıcısı", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Harvest metadata and bitstreams (requires ORE support)", + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Metadatalarını ve bitstreamı topla (ORE desteği gerektirir)", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest metadata and references to bitstreams (ORE desteği gerektirir)", + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Metadatalarını ve referansları topla (ORE desteği gerektirir)", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvest metadata only", + "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Sadece metadatalarını topla", + + // "collection.edit.tabs.source.head": "Content Source", + "collection.edit.tabs.source.head": "İçerik Kaynağı", + + // "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.content": "Değişiklikleriniz silindi. Değişikliklerinizi eski haline getirmek için 'Geri Al' düğmesine tıklayın.", + + // "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", + "collection.edit.tabs.source.notifications.discarded.title": "Silinenler değiştirildi.", + + // "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + "collection.edit.tabs.source.notifications.invalid.content": "Değişiklikleriniz kaydedilmedi. Lütfen kaydetmeden önce tüm alanların geçerli olduğundan emin olun.", + + // "collection.edit.tabs.source.notifications.invalid.title": "Metadata invalid", + "collection.edit.tabs.source.notifications.invalid.title": "Metadata geçersiz", + + // "collection.edit.tabs.source.notifications.saved.content": "Your changes to this collection's content source were saved.", + "collection.edit.tabs.source.notifications.saved.content": "Bu koleksiyonun içerik kaynağındaki değişiklikleriniz kaydedildi.", + + // "collection.edit.tabs.source.notifications.saved.title": "Content Source saved", + "collection.edit.tabs.source.notifications.saved.title": "İçerik Kaynağı kaydedildi", + + // "collection.edit.tabs.source.title": "Collection Edit - Content Source", + "collection.edit.tabs.source.title": "Koleksiyon düzenleme - İçerik Kaynağı", + + + + // "collection.edit.template.add-button": "Add", + "collection.edit.template.add-button": "Ekle", + + // "collection.edit.template.breadcrumbs": "Item template", + "collection.edit.template.breadcrumbs": "Öğe şablonu", + + // "collection.edit.template.cancel": "Cancel", + "collection.edit.template.cancel": "İptal", + + // "collection.edit.template.delete-button": "Delete", + "collection.edit.template.delete-button": "Sil", + + // "collection.edit.template.edit-button": "Edit", + "collection.edit.template.edit-button": "Düzenle", + + // "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", + "collection.edit.template.head": "Koleksiyon için Sablon Öğesini Düzenleyin \"{{ collection }}\"", + + // "collection.edit.template.label": "Template item", + "collection.edit.template.label": "Şablon öğe", + + // "collection.edit.template.notifications.delete.error": "Failed to delete the item template", + "collection.edit.template.notifications.delete.error": "Öğe şablonu silme başarısız", + + // "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", + "collection.edit.template.notifications.delete.success": "Öğe şablonu başarıyla silindi", + + // "collection.edit.template.title": "Edit Template Item", + "collection.edit.template.title": "Şablon Öğesini Düzenle", + + + + // "collection.form.abstract": "Short Description", + "collection.form.abstract": "Kısa Açıklama", + + // "collection.form.description": "Introductory text (HTML)", + "collection.form.description": "Tanıtım metni (HTML)", + + // "collection.form.errors.title.required": "Please enter a collection name", + "collection.form.errors.title.required": "Lütfen bir koleksiyon adı girin", + + // "collection.form.license": "License", + "collection.form.license": "Lisans", + + // "collection.form.provenance": "Provenance", + "collection.form.provenance": "Menşei", + + // "collection.form.rights": "Copyright text (HTML)", + "collection.form.rights": "Telif hakkı metni (HTML)", + + // "collection.form.tableofcontents": "News (HTML)", + "collection.form.tableofcontents": "Haberler (HTML)", + + // "collection.form.title": "Name", + "collection.form.title": "İsim", + + + + // "collection.listelement.badge": "Collection", + "collection.listelement.badge": "Koleksiyon", + + + + // "collection.page.browse.recent.head": "Recent Submissions", + "collection.page.browse.recent.head": "Son Başvurular", + + // "collection.page.browse.recent.empty": "No items to show", + "collection.page.browse.recent.empty": "Gösterilecek öğe yok", + + // "collection.page.edit": "Edit this collection", + "collection.page.edit": "Bu koleksiyonu düzenleyin", + + // "collection.page.handle": "Permanent URI for this collection", + "collection.page.handle": "Bu koleksiyon için kalıcı URI", + + // "collection.page.license": "License", + "collection.page.license": "Lisans", + + // "collection.page.news": "News", + "collection.page.news": "Haberler", + + + + // "collection.select.confirm": "Confirm selected", + "collection.select.confirm": "Seçilileri onayla", + + // "collection.select.empty": "No collections to show", + "collection.select.empty": "Gösterilecek koleksiyon yok", + + // "collection.select.table.title": "Title", + "collection.select.table.title": "Başlık", + + + + // "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", + "collection.source.update.notifications.error.content": "Sağlanan ayarlar test edildi ve işe yaramadı.", + + // "collection.source.update.notifications.error.title": "Server Error", + "collection.source.update.notifications.error.title": "Sunucu Hatası", + + + + // "communityList.tabTitle": "DSpace - Community List", + "communityList.tabTitle": "DSpace - Komünite Listesi", + + // "communityList.title": "List of Communities", + "communityList.title": "Komünitelerin Listesi", + + // "communityList.showMore": "Show More", + "communityList.showMore": "Daha fazla göster", + + + + // "community.create.head": "Create a Community", + "community.create.head": "Bir komünite oluştur", + + // "community.create.notifications.success": "Successfully created the Community", + "community.create.notifications.success": "Komünite başarıyla yaratıldı", + + // "community.create.sub-head": "Create a Sub-Community for Community {{ parent }}", + "community.create.sub-head": "Komünite için bir alt komünite oluşturun {{ parent }}", + + // "community.curate.header": "Curate Community: {{community}}", + "community.curate.header": "Kuratör komünitesi: {{community}}", + + // "community.delete.cancel": "Cancel", + "community.delete.cancel": "İptal", + + // "community.delete.confirm": "Confirm", + "community.delete.confirm": "Onayla", + + // "community.delete.head": "Delete Community", + "community.delete.head": "Komüniteyi sil", + + // "community.delete.notification.fail": "Community could not be deleted", + "community.delete.notification.fail": "Komünite silinemedi", + + // "community.delete.notification.success": "Successfully deleted community", + "community.delete.notification.success": "Komünite başarıyla silindi", + + // "community.delete.text": "Are you sure you want to delete community \"{{ dso }}\"", + "community.delete.text": "Komüniteyi silmek istediğinize emin misiniz \"{{ dso }}\"", + + // "community.edit.delete": "Delete this community", + "community.edit.delete": "Bu komüniteyi sil", + + // "community.edit.head": "Edit Community", + "community.edit.head": "Komüniteyi düzenle", + + // "community.edit.breadcrumbs": "Edit Community", + "community.edit.breadcrumbs": "Komüniteyi düzenle", + + + // "community.edit.logo.label": "Community logo", + "community.edit.logo.label": "Komünite logosu", + + // "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", + "community.edit.logo.notifications.add.error": "Komünite logosu yüklemesi başarısız. Lütfen yeniden denemeden önce içeriği doğrulayın.", + + // "community.edit.logo.notifications.add.success": "Upload Community logo successful.", + "community.edit.logo.notifications.add.success": "Komünite logosunu başarılı yükle.", + + // "community.edit.logo.notifications.delete.success.title": "Logo deleted", + "community.edit.logo.notifications.delete.success.title": "Logo silindi", + + // "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", + "community.edit.logo.notifications.delete.success.content": "Komünite logosu başarıyla silindi", + + // "community.edit.logo.notifications.delete.error.title": "Error deleting logo", + "community.edit.logo.notifications.delete.error.title": "Logo silme hatası", + + // "community.edit.logo.upload": "Drop a Community Logo to upload", + "community.edit.logo.upload": "Yüklenecek bir komünite logosu bırak", + + + + // "community.edit.notifications.success": "Successfully edited the Community", + "community.edit.notifications.success": "Komünite başarıyla düzenlendi", + + // "community.edit.notifications.unauthorized": "You do not have privileges to make this change", + "community.edit.notifications.unauthorized": "Bu değişikliği yapmak için ayrıcalıklarınız yok", + + // "community.edit.notifications.error": "An error occured while editing the Community", + "community.edit.notifications.error": "Komüniteyi düzenlerken bir hata oluştu", + + // "community.edit.return": "Return", + "community.edit.return": "Dönüş", + + + + // "community.edit.tabs.curate.head": "Curate", + "community.edit.tabs.curate.head": "Kuratör", + + // "community.edit.tabs.curate.title": "Community Edit - Curate", + "community.edit.tabs.curate.title": "Komünite Düzenle - Küratör", + + // "community.edit.tabs.metadata.head": "Edit Metadata", + "community.edit.tabs.metadata.head": "Metadataları Düzenle", + + // "community.edit.tabs.metadata.title": "Community Edit - Metadata", + "community.edit.tabs.metadata.title": "Komünite Düzenle - Metadatalar", + + // "community.edit.tabs.roles.head": "Assign Roles", + "community.edit.tabs.roles.head": "Rol atamak", + + // "community.edit.tabs.roles.title": "Community Edit - Roles", + "community.edit.tabs.roles.title": "Komünite Düzenle - Roller", + + // "community.edit.tabs.authorizations.head": "Authorizations", + "community.edit.tabs.authorizations.head": "Yetkilendirmeler", + + // "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", + "community.edit.tabs.authorizations.title": "Komünite Düzenle - Yetkilendirmeler", + + + + // "community.listelement.badge": "Community", + "community.listelement.badge": "Komünite", + + + + // "comcol-role.edit.no-group": "None", + "comcol-role.edit.no-group": "Hiçbiri", + + // "comcol-role.edit.create": "Create", + "comcol-role.edit.create": "Oluştur", + + // "comcol-role.edit.restrict": "Restrict", + "comcol-role.edit.restrict": "Kısıtla", + + // "comcol-role.edit.delete": "Delete", + "comcol-role.edit.delete": "Sil", + + + // "comcol-role.edit.community-admin.name": "Yöneticiler", + "comcol-role.edit.community-admin.name": "Administrators", + + // "comcol-role.edit.collection-admin.name": "Administrators", + "comcol-role.edit.collection-admin.name": "Yöneticiler", + + + // "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).", + "comcol-role.edit.community-admin.description": "Komünite yöneticileri alt komüniteler veya koleksiyonlar oluşturabilir ve bu alt komüniteler veya koleksiyonlar için yönetimi yönetebilir veya atayabilir. Ek olarak, kimsenin herhangi bir alt koleksiyona kimin gönderebileceğine, madde metadatalarını (sunulduktan sonra) düzenleyebileceğine karar verirler ve mevcut eşyaları diğer koleksiyonlardan (yetkilendirmeye tabi) ekleyin.", + + // "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).", + "comcol-role.edit.collection-admin.description": "Koleksiyon yöneticileri, eşyaları koleksiyona kimin gönderebileceğine, öğe metadatalarını (gönderimden sonra) düzenleyebileceğine karar verir ve mevcut eşyaları diğer koleksiyonlardan (bu koleksiyon için yetkilendirmeye tabi) ekleyin.", + + + // "comcol-role.edit.submitters.name": "Submitters", + "comcol-role.edit.submitters.name": "Göndericiler", + + // "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", + "comcol-role.edit.submitters.description": "Bu koleksiyona yeni eşya gönderme iznine sahip olan E-insanlar ve gruplar.", + + + // "comcol-role.edit.item_read.name": "Default item read access", + "comcol-role.edit.item_read.name": "Varsayılan öğe okuma erişimi", + + // "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.", + "comcol-role.edit.item_read.description": "Bu koleksiyona sunulan yeni eşyaları okuyabilen E-insanlar ve gruplar. Bu roldeki değişiklikler geriye dönük değildir. Sistemdeki mevcut eşyalar, eklemeleri sırasında erişimi okuyanlar tarafından görülebilir.", + + // "comcol-role.edit.item_read.anonymous-group": "Default read for incoming items is currently set to Anonymous.", + "comcol-role.edit.item_read.anonymous-group": "Gelen öğeler için varsayılan okuma şu anda isimsiz olarak ayarlanmıştır.", + + + // "comcol-role.edit.bitstream_read.name": "Default bitstream read access", + "comcol-role.edit.bitstream_read.name": "Varsayılan bitstream okuma erişimi", + + // "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).", + "comcol-role.edit.bitstream_read.description": "Komünite yöneticileri alt komüniteler veya koleksiyonlar oluşturabilir ve bu alt komüniteler veya koleksiyonlar için yönetimi yönetebilir veya atayabilirler. Ek olarak, eşyaları herhangi bir alt koleksiyona kimin gönderebileceğine, öğe metadatalarını (sunulduktan sonra) düzenleyebilir ve harita) Diğer koleksiyonlardan gelen mevcut eşyalar (yetkilendirmeye tabi).", + + // "comcol-role.edit.bitstream_read.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", + "comcol-role.edit.bitstream_read.anonymous-group": "Gelen bitstream için varsayılan okuma şu anda anonim olarak ayarlanmıştır.", + + + // "comcol-role.edit.editor.name": "Editors", + "comcol-role.edit.editor.name": "Editörler", + + // "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", + "comcol-role.edit.editor.description": "Editörler, gelen gönderilerin metadatalarını düzenleyebilir ve ardından onları kabul edebilir veya reddedebilir.", + + + // "comcol-role.edit.finaleditor.name": "Final editors", + "comcol-role.edit.finaleditor.name": "Son editörler", + + // "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", + "comcol-role.edit.finaleditor.description": "Nihai editörler gelen başvuruların metadatalarını düzenleyebilir, ancak onları reddedebilir.", + + + // "comcol-role.edit.reviewer.name": "Reviewers", + "comcol-role.edit.reviewer.name": "Yorumcular", + + // "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.", + "comcol-role.edit.reviewer.description": "Yorumcular gelen başvuruları kabul edebilir veya reddedebilirler. Ancak, gönderimin metadatalarını düzenleyemezler.", + + + + // "community.form.abstract": "Short Description", + "community.form.abstract": "Kısa Açıklama", + + // "community.form.description": "Introductory text (HTML)", + "community.form.description": "Tanıtım metni (HTML)", + + // "community.form.errors.title.required": "Please enter a community name", + "community.form.errors.title.required": "Lütfen bir komünite adı girin", + + // "community.form.rights": "Copyright text (HTML)", + "community.form.rights": "Telif Hakkı Metni (HTML)", + + // "community.form.tableofcontents": "News (HTML)", + "community.form.tableofcontents": "Haberler (HTML)", + + // "community.form.title": "Name", + "community.form.title": "İsim", + + // "community.page.edit": "Edit this community", + "community.page.edit": "Bu komüniteyi düzenle", + + // "community.page.handle": "Permanent URI for this community", + "community.page.handle": "Bu komünite için Kalıcı Uri", + + // "community.page.license": "License", + "community.page.license": "Lisans", + + // "community.page.news": "News", + "community.page.news": "Haberler", + + // "community.all-lists.head": "Subcommunities and Collections", + "community.all-lists.head": "Alt komüniteler ve koleksiyonlar", + + // "community.sub-collection-list.head": "Collections of this Community", + "community.sub-collection-list.head": "Bu komünitenin koleksiyonları", + + // "community.sub-community-list.head": "Communities of this Community", + "community.sub-community-list.head": "Bu komünitenin koleksiyonları", + + + + // "cookies.consent.accept-all": "Accept all", + "cookies.consent.accept-all": "Hepsini kabul et", + + // "cookies.consent.accept-selected": "Accept selected", + "cookies.consent.accept-selected": "Seçiliyi kabul et", + + // "cookies.consent.app.opt-out.description": "This app is loaded by default (but you can opt out)", + "cookies.consent.app.opt-out.description": "Bu uygulama varsayılan olarak yüklenir (ancak vazgeçebilirsiniz)", + + // "cookies.consent.app.opt-out.title": "(opt-out)", + "cookies.consent.app.opt-out.title": "(vazgeç)", + + // "cookies.consent.app.purpose": "purpose", + "cookies.consent.app.purpose": "amaç", + + // "cookies.consent.app.required.description": "This application is always required", + "cookies.consent.app.required.description": "Bu uygulama her zaman gereklidir", + + // "cookies.consent.app.required.title": "(always required)", + "cookies.consent.app.required.title": "(her zaman gerekli)", + + // "cookies.consent.update": "There were changes since your last visit, please update your consent.", + "cookies.consent.update": "Son ziyaretinizden bu yana değişiklikler vardı, lütfen onayınızı güncelleyin.", + + // "cookies.consent.close": "Close", + "cookies.consent.close": "Kapat", + + // "cookies.consent.decline": "Decline", + "cookies.consent.decline": "Reddet", + + // "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}.", + "cookies.consent.content-notice.description": "Kişisel bilgilerinizi aşağıdaki amaçlarla topluyor ve işleriz: Kimlik Doğrulama, Tercihler, Onay ve İstatistikler.
Daha fazla bilgi için, lütfen okuyun {privacyPolicy}.", + + // "cookies.consent.content-notice.learnMore": "Customize", + "cookies.consent.content-notice.learnMore": "Özelleştir", + + // "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", + "cookies.consent.content-modal.description": "Burada, sizin hakkınızda topladığımız bilgileri görebilir ve özelleştirebilirsiniz.", + + // "cookies.consent.content-modal.privacy-policy.name": "privacy policy", + "cookies.consent.content-modal.privacy-policy.name": "Gizlilik Politikası", + + // "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", + "cookies.consent.content-modal.privacy-policy.text": "Daha fazla bilgi için, lütfen okuyun {privacyPolicy}.", + + // "cookies.consent.content-modal.title": "Information that we collect", + "cookies.consent.content-modal.title": "Topladığımız bilgiler", + + + + // "cookies.consent.app.title.authentication": "Authentication", + "cookies.consent.app.title.authentication": "Kimlik doğrulama", + + // "cookies.consent.app.description.authentication": "Required for signing you in", + "cookies.consent.app.description.authentication": "Kayıt olmak için gerekli", + + + // "cookies.consent.app.title.preferences": "Preferences", + "cookies.consent.app.title.preferences": "Tercihler", + + // "cookies.consent.app.description.preferences": "Required for saving your preferences", + "cookies.consent.app.description.preferences": "Tercihlerinizi kaydetmek için gerekli", + + + + // "cookies.consent.app.title.acknowledgement": "Acknowledgement", + "cookies.consent.app.title.acknowledgement": "Onaylama", + + // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", + "cookies.consent.app.description.acknowledgement": "Teşekkürlerinizi ve onayları kurtarmak için gerekli", + + + + // "cookies.consent.app.title.google-analytics": "Google Analytics", + "cookies.consent.app.title.google-analytics": "Google Analitiği", + + // "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", + "cookies.consent.app.description.google-analytics": "İstatistiksel verileri izlememize izin verir", + + + + // "cookies.consent.purpose.functional": "Functional", + "cookies.consent.purpose.functional": "Fonksiyonel", + + // "cookies.consent.purpose.statistical": "Statistical", + "cookies.consent.purpose.statistical": "İstatistiksel", + + + // "curation-task.task.checklinks.label": "Check Links in Metadata", + "curation-task.task.checklinks.label": "Metadatalardaki Bağlantıları Kontrol Et", + + // "curation-task.task.noop.label": "NOOP", + "curation-task.task.noop.label": "NOOP", + + // "curation-task.task.profileformats.label": "Profile Bitstream Formats", + "curation-task.task.profileformats.label": "Profil Bitstream Formatları", + + // "curation-task.task.requiredmetadata.label": "Check for Required Metadata", + "curation-task.task.requiredmetadata.label": "Gerekli metadataları kontrol edin", + + // "curation-task.task.translate.label": "Microsoft Translator", + "curation-task.task.translate.label": "Microsoft Tercüman", + + // "curation-task.task.vscan.label": "Virus Scan", + "curation-task.task.vscan.label": "Virüs Taraması", + + + + // "curation.form.task-select.label": "Task:", + "curation.form.task-select.label": "Görev:", + + // "curation.form.submit": "Start", + "curation.form.submit": "Başlangıç", + + // "curation.form.submit.success.head": "The curation task has been started successfully", + "curation.form.submit.success.head": "Küratör görevi başarıyla başlatıldı", + + // "curation.form.submit.success.content": "You will be redirected to the corresponding process page.", + "curation.form.submit.success.content": "İlgili işlem sayfasına yönlendirileceksiniz.", + + // "curation.form.submit.error.head": "Running the curation task failed", + "curation.form.submit.error.head": "Küratörlük görevi başarısız oldu", + + // "curation.form.submit.error.content": "An error occured when trying to start the curation task.", + "curation.form.submit.error.content": "Küratörlük görevi başlatmaya çalışırken bir hata oluştu.", + + // "curation.form.handle.label": "Handle:", + "curation.form.handle.label": "Ele al:", + + // "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", + "curation.form.handle.hint": "İpucu: Gir [your-handle-prefix]/0 tüm sitede bir görevi çalıştırmak için (tüm görevler bu özelliği destekleyemez)", + + + + // "dso-selector.create.collection.head": "New collection", + "dso-selector.create.collection.head": "Yeni koleksiyon", + + // "dso-selector.create.collection.sub-level": "Create a new collection in", + "dso-selector.create.collection.sub-level": "Yeni bir koleksiyon oluşturun", + + // "dso-selector.create.community.head": "New community", + "dso-selector.create.community.head": "Yeni komünite", + + // "dso-selector.create.community.sub-level": "Create a new community in", + "dso-selector.create.community.sub-level": "Yeni bir komünite oluştur", + + // "dso-selector.create.community.top-level": "Create a new top-level community", + "dso-selector.create.community.top-level": "Yeni bir üst düzey komünite oluştur", + + // "dso-selector.create.item.head": "New item", + "dso-selector.create.item.head": "Yeni öğe", + + // "dso-selector.create.item.sub-level": "Create a new item in", + "dso-selector.create.item.sub-level": "İçinde yeni bir öğe oluşturun", + + // "dso-selector.create.submission.head": "New submission", + "dso-selector.create.submission.head": "Yeni başvuru", + + // "dso-selector.edit.collection.head": "Edit collection", + "dso-selector.edit.collection.head": "Koleksiyonu Düzenle", + + // "dso-selector.edit.community.head": "Edit community", + "dso-selector.edit.community.head": "Topluluğu Düzenle", + + // "dso-selector.edit.item.head": "Edit item", + "dso-selector.edit.item.head": "Ögeyi düzenle", + + // "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", + "dso-selector.export-metadata.dspaceobject.head": "Metadatalarını dışa aktar", + + // "dso-selector.no-results": "No {{ type }} found ", + "dso-selector.no-results": "Bulunamadı {{ type }} ", + + // "dso-selector.placeholder": "Search for a {{ type }}", + "dso-selector.placeholder": " Ara {{ type }}", + + + + // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", + "confirmation-modal.export-metadata.header": "Metadatalarını dışa aktar {{ dsoName }}", + + // "confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}", + "confirmation-modal.export-metadata.info": "Metadataları dışarı aktarmak istediğinizden emin misiniz {{ dsoName }}", + + // "confirmation-modal.export-metadata.cancel": "Cancel", + "confirmation-modal.export-metadata.cancel": "İptal", + + // "confirmation-modal.export-metadata.confirm": "Export", + "confirmation-modal.export-metadata.confirm": "Dışarı aktar", + + // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", + "confirmation-modal.delete-eperson.header": "EPerson'ı sil \"{{ dsoName }}\"", + + // "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", + "confirmation-modal.delete-eperson.info": "Eperson'u silmek istediğinize emin misiniz? \"{{ dsoName }}\"", + + // "confirmation-modal.delete-eperson.cancel": "Cancel", + "confirmation-modal.delete-eperson.cancel": "İptal", + + // "confirmation-modal.delete-eperson.confirm": "Delete", + "confirmation-modal.delete-eperson.confirm": "Sil", + + + // "error.bitstream": "Error fetching bitstream", + "error.bitstream": "Alınan bitstream hatası", + + // "error.browse-by": "Error fetching items", + "error.browse-by": "Alınan öğeler hatası", + + // "error.collection": "Error fetching collection", + "error.collection": "Alınan koleksiyon hatası", + + // "error.collections": "Error fetching collections", + "error.collections": "Alınan koleksiyonlar hatası", + + // "error.community": "Error fetching community", + "error.community": "Alınan komünite hatası", + + // "error.identifier": "No item found for the identifier", + "error.identifier": "Tanımlayıcı için ürün bulunamadı", + + // "error.default": "Error", + "error.default": "Hata", + + // "error.item": "Error fetching item", + "error.item": "Alınan öğe hatası", + + // "error.items": "Error fetching items", + "error.items": "Alınan öğeler hatası", + + // "error.objects": "Error fetching objects", + "error.objects": "Alınan nesneler hatası", + + // "error.recent-submissions": "Error fetching recent submissions", + "error.recent-submissions": "Son başvuruları alma hatası", + + // "error.search-results": "Error fetching search results", + "error.search-results": "Arama sonuçlarını alma hatası", + + // "error.sub-collections": "Error fetching sub-collections", + "error.sub-collections": "Alt koleksiyonları alma hatası", + + // "error.sub-communities": "Error fetching sub-communities", + "error.sub-communities": "Alt komüniteleri alma hatası", + + // "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

", + "error.submission.sections.init-form-error": "Bölüm başlatma sırasında bir hata oluştu, lütfen giriş formu yapılandırmanızı kontrol edin. Detaylar aşağıdadır :

", + + // "error.top-level-communities": "Error fetching top-level communities", + "error.top-level-communities": "Üst düzey komüniteleri alma hatası", + + // "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.", + "error.validation.license.notgranted": "Gönderinizi tamamlamak için bu lisansı vermelisiniz. Bu lisansı şu anda veremiyorsanız, çalışmanızı kaydedebilir ve daha sonra geri gönderebilir veya gönderimi kaldırabilirsiniz.", + + // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", + "error.validation.pattern": "Bu giriş mevcut modelle sınırlandırılmıştır.: {{ pattern }}.", + + // "error.validation.filerequired": "The file upload is mandatory", + "error.validation.filerequired": "Dosya yükleme zorunludur", + + + + // "file-section.error.header": "Error obtaining files for this item", + "file-section.error.header": "Bu öğe için dosyaları elde etme hatası", + + + + // "footer.copyright": "copyright © 2002-{{ year }}", + "footer.copyright": "telif hakkı © 2002-{{ year }}", + + // "footer.link.dspace": "DSpace software", + "footer.link.dspace": "DSpace yazılım", + + // "footer.link.lyrasis": "LYRASIS", + "footer.link.lyrasis": "LYRASIS", + + // "footer.link.cookies": "Cookie settings", + "footer.link.cookies": "Çerez Ayarları", + + // "footer.link.privacy-policy": "Privacy policy", + "footer.link.privacy-policy": "Gizlilik Politikası", + + // "footer.link.end-user-agreement":"End User Agreement", + "footer.link.end-user-agreement":"Son Kullanıcı Sözleşmesi", + + + + // "forgot-email.form.header": "Forgot Password", + "forgot-email.form.header": "Parolanızı mı unuttunuz", + + // "forgot-email.form.info": "Enter Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + "forgot-email.form.info": "E-posta güncellemeleri için koleksiyonlara abone olmak için bir hesap kaydedin ve DSPace'e yeni öğeler gönderin.", + + // "forgot-email.form.email": "Email Address *", + "forgot-email.form.email": "Eposta Adresi *", + + // "forgot-email.form.email.error.required": "Please fill in an email address", + "forgot-email.form.email.error.required": "Lütfen bir e-posta adresi giriniz", + + // "forgot-email.form.email.error.pattern": "Please fill in a valid email address", + "forgot-email.form.email.error.pattern": "Lütfen bir e-posta adresi giriniz", + + // "forgot-email.form.email.hint": "This address will be verified and used as your login name.", + "forgot-email.form.email.hint": "Bu adres, giriş adınız olarak doğrulanacak ve kullanılacaktır.", + + // "forgot-email.form.submit": "Submit", + "forgot-email.form.submit": "Kaydet", + + // "forgot-email.form.success.head": "Verification email sent", + "forgot-email.form.success.head": "Doğrulama e-postası gönderildi", + + // "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + "forgot-email.form.success.content": "Özel bir URL ve daha fazla talimat içeren bir e posta bu {{ email }} mail adresin gönderildi. ", + + // "forgot-email.form.error.head": "Error when trying to register email", + "forgot-email.form.error.head": "E-postayı kaydetmeye çalışırken hata oluştu", + + // "forgot-email.form.error.content": "An error occured when registering the following email address: {{ email }}", + "forgot-email.form.error.content": "E-posta adresini kaydederken bir hata oluştu: {{ email }}", + + + + // "forgot-password.title": "Forgot Password", + "forgot-password.title": "Parolanızı mı unuttunuz", + + // "forgot-password.form.head": "Forgot Password", + "forgot-password.form.head": "Parolanızı mı unuttunuz", + + // "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.", + "forgot-password.form.info": "Aşağıdaki kutuya yeni bir parola girin ve tekrar ikinci kutuya yazarak onaylayın. En az altı karakter uzunluğunda olmalıdır.", + + // "forgot-password.form.card.security": "Security", + "forgot-password.form.card.security": "Güvenlik", + + // "forgot-password.form.identification.header": "Identify", + "forgot-password.form.identification.header": "Kimlik", + + // "forgot-password.form.identification.email": "Email address: ", + "forgot-password.form.identification.email": "E-posta adresi: ", + + // "forgot-password.form.label.password": "Password", + "forgot-password.form.label.password": "Parola", + + // "forgot-password.form.label.passwordrepeat": "Retype to confirm", + "forgot-password.form.label.passwordrepeat": "Doğrulamak için yeniden yazınız", + + // "forgot-password.form.error.empty-password": "Please enter a password in the box below.", + "forgot-password.form.error.empty-password": "Lütfen aşağıdaki kutuya bir parola girin.", + + // "forgot-password.form.error.matching-passwords": "The passwords do not match.", + "forgot-password.form.error.matching-passwords": "Parolalar eşleşmiyor.", + + // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", + "forgot-password.form.error.password-length": "Parola en az 6 karakter uzunluğunda olmalıdır.", + + // "forgot-password.form.notification.error.title": "Error when trying to submit new password", + "forgot-password.form.notification.error.title": "Yeni parola göndermeye çalışırken hata oluştu", + + // "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", + "forgot-password.form.notification.success.content": "Parola sıfırlama başarılı oldu. Oluşturulan kullanıcı olarak giriş yaptınız.", + + // "forgot-password.form.notification.success.title": "Password reset completed", + "forgot-password.form.notification.success.title": "Parola sıfırlama tamamlandı", + + // "forgot-password.form.submit": "Submit password", + "forgot-password.form.submit": "Parolayı kaydet", + + + + // "form.add": "Add", + "form.add": "Ekle", + + // "form.add-help": "Click here to add the current entry and to add another one", + "form.add-help": "Geçerli girişi eklemek ve bir tane daha eklemek için buraya tıklayın.", + + // "form.cancel": "Cancel", + "form.cancel": "İptal", + + // "form.clear": "Clear", + "form.clear": "Temizle", + + // "form.clear-help": "Click here to remove the selected value", + "form.clear-help": "Seçilen değeri kaldırmak için buraya tıklayın", + + // "form.edit": "Edit", + "form.edit": "Düzenle", + + // "form.edit-help": "Click here to edit the selected value", + "form.edit-help": "Seçilen değeri düzenlemek için buraya tıklayın", + + // "form.first-name": "First name", + "form.first-name": "İlk adı", + + // "form.group-collapse": "Collapse", + "form.group-collapse": "Yığmak", + + // "form.group-collapse-help": "Click here to collapse", + "form.group-collapse-help": "Yığmak için buraya tıklayın", + + // "form.group-expand": "Expand", + "form.group-expand": "Uzat", + + // "form.group-expand-help": "Click here to expand and add more elements", + "form.group-expand-help": "Genişletmek ve daha fazla öğe eklemek için buraya tıklayın", + + // "form.last-name": "Last name", + "form.last-name": "Soyadı", + + // "form.loading": "Loading...", + "form.loading": "Yükleniyor...", + + // "form.lookup": "Lookup", + "form.lookup": "Yukarı Bak", + + // "form.lookup-help": "Click here to look up an existing relation", + "form.lookup-help": "Mevcut bir bağlantı aramak için buraya tıklayın", + + // "form.no-results": "No results found", + "form.no-results": "Sonuç bulunamadı", + + // "form.no-value": "No value entered", + "form.no-value": "Değer girilmez", + + // "form.other-information": {}, + "form.other-information": {}, + + // "form.remove": "Remove", + "form.remove": "Kaldır", + + // "form.save": "Save", + "form.save": "Kaydet", + + // "form.save-help": "Save changes", + "form.save-help": "Değişiklikleri kaydet", + + // "form.search": "Search", + "form.search": "Ara", + + // "form.search-help": "Click here to look for an existing correspondence", + "form.search-help": "Mevcut bir yazışma aramak için buraya tıklayın", + + // "form.submit": "Submit", + "form.submit": "Gönder", + + + + // "home.description": "", + "home.description": "", + + // "home.breadcrumbs": "Home", + "home.breadcrumbs": "Anasayfa", + + // "home.title": "DSpace Angular :: Home", + "home.title": "DSpace Açısal :: Anasayfa", + + // "home.top-level-communities.head": "Communities in DSpace", + "home.top-level-communities.head": "Dspace'deki Komüniteler", + + // "home.top-level-communities.help": "Select a community to browse its collections.", + "home.top-level-communities.help": "Koleksiyonlarına göz atmak için bir komünite seçin.", + + // "home.search-form.placeholder": "Search the repository ...", + "home.search-form.placeholder": "Depoda ara ...", + + + // "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", + "info.end-user-agreement.accept": "Okudum ve son kullanıcı sözleşmesini kabul ediyorum", + + // "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", + "info.end-user-agreement.accept.error": "Son kullanıcı sözleşmesini kabul eden bir hata oluştu", + + // "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", + "info.end-user-agreement.accept.success": "Son Kullanıcı Sözleşmesini başarıyla güncelledi", + + // "info.end-user-agreement.breadcrumbs": "End User Agreement", + "info.end-user-agreement.breadcrumbs": "Son Kullanıcı Sözleşmesi", + + // "info.end-user-agreement.buttons.cancel": "Cancel", + "info.end-user-agreement.buttons.cancel": "İptal", + + // "info.end-user-agreement.buttons.save": "Save", + "info.end-user-agreement.buttons.save": "Kaydet", + + // "info.end-user-agreement.head": "End User Agreement", + "info.end-user-agreement.head": "Son Kullanıcı Sözleşmesi", + + // "info.end-user-agreement.title": "End User Agreement", + "info.end-user-agreement.title": "Son Kullanıcı Sözleşmesi", + + // "info.privacy.breadcrumbs": "Privacy Statement", + "info.privacy.breadcrumbs": "Gizlilik bildirimi", + + // "info.privacy.head": "Privacy Statement", + "info.privacy.head": "Gizlilik bildirimi", + + // "info.privacy.title": "Privacy Statement", + "info.privacy.title": "Gizlilik bildirimi", + + + + // "item.alerts.private": "This item is private", + "item.alerts.private": "Bu öğe özel", + + // "item.alerts.withdrawn": "This item has been withdrawn", + "item.alerts.withdrawn": "Bu ürün geri çekildi", + + + + // "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.", + "item.edit.authorizations.heading": "Bu editör ile bir öğenin politikalarını görüntüleyebilir ve değiştirebilirsiniz, ayrıca bireysel ürün bileşenlerinin politikalarını değiştirebilirsiniz: Paketler ve Bitstream. Kısaca, bir öğe bir paket konteynırıdır ve paketler bitstream konteynırıdır. Konteynerler genellikle, bitstream yalnızca okuma / yazma politikalarına sahip olur.", + + // "item.edit.authorizations.title": "Edit item's Policies", + "item.edit.authorizations.title": "Edit item's Politikalar", + + + + // "item.badge.private": "Private", + "item.badge.private": "Özel", + + // "item.badge.withdrawn": "Withdrawn", + "item.badge.withdrawn": "Çekilmiş", + + + + // "item.bitstreams.upload.bundle": "Bundle", + "item.bitstreams.upload.bundle": "Paket", + + // "item.bitstreams.upload.bundle.placeholder": "Select a bundle", + "item.bitstreams.upload.bundle.placeholder": "Bir paket seçin", + + // "item.bitstreams.upload.bundle.new": "Create bundle", + "item.bitstreams.upload.bundle.new": "Paket oluştur", + + // "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.", + "item.bitstreams.upload.bundles.empty": "Bu öğe, bir bitstream yüklemek için herhangi bir paket içermiyor.", + + // "item.bitstreams.upload.cancel": "Cancel", + "item.bitstreams.upload.cancel": "İptal", + + // "item.bitstreams.upload.drop-message": "Drop a file to upload", + "item.bitstreams.upload.drop-message": "Yüklenecek bir dosya bırak", + + // "item.bitstreams.upload.item": "Item: ", + "item.bitstreams.upload.item": "Öğe: ", + + // "item.bitstreams.upload.notifications.bundle.created.content": "Successfully created new bundle.", + "item.bitstreams.upload.notifications.bundle.created.content": "Başarıyla yeni paket oluşturuldu.", + + // "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", + "item.bitstreams.upload.notifications.bundle.created.title": "Paket oluşturdu", + + // "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", + "item.bitstreams.upload.notifications.upload.failed": "Yükleme başarısız. Lütfen yeniden denemeden önce içeriği doğrulayın.", + + // "item.bitstreams.upload.title": "Upload bitstream", + "item.bitstreams.upload.title": "Bitstream yükle", + + + + // "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", + "item.edit.bitstreams.bundle.edit.buttons.upload": "Yükle", + + // "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", + "item.edit.bitstreams.bundle.displaying": "Şu anda görüntülenen {{ amount }} bitstream {{ total }}.", + + // "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", + "item.edit.bitstreams.bundle.load.all": "Hepsini yükle ({{ total }})", + + // "item.edit.bitstreams.bundle.load.more": "Load more", + "item.edit.bitstreams.bundle.load.more": "Daha fazla yükle", + + // "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", + "item.edit.bitstreams.bundle.name": "PAKET: {{ name }}", + + // "item.edit.bitstreams.discard-button": "Discard", + "item.edit.bitstreams.discard-button": "Yoksay", + + // "item.edit.bitstreams.edit.buttons.download": "Download", + "item.edit.bitstreams.edit.buttons.download": "İndir", + + // "item.edit.bitstreams.edit.buttons.drag": "Drag", + "item.edit.bitstreams.edit.buttons.drag": "Sürükle", + + // "item.edit.bitstreams.edit.buttons.edit": "Edit", + "item.edit.bitstreams.edit.buttons.edit": "Düzenle", + + // "item.edit.bitstreams.edit.buttons.remove": "Remove", + "item.edit.bitstreams.edit.buttons.remove": "Kaldır", + + // "item.edit.bitstreams.edit.buttons.undo": "Undo changes", + "item.edit.bitstreams.edit.buttons.undo": "Değişiklikleri geri al", + + // "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", + "item.edit.bitstreams.empty": "Bu öge herhangi bir veri içermiyor. Bir tane oluşturmak için yükle düğmesini tıklayınız.", + + // "item.edit.bitstreams.headers.actions": "Actions", + "item.edit.bitstreams.headers.actions": "İşlemler", + + // "item.edit.bitstreams.headers.bundle": "Bundle", + "item.edit.bitstreams.headers.bundle": "Seri", + + // "item.edit.bitstreams.headers.description": "Description", + "item.edit.bitstreams.headers.description": "Açıklama", + + // "item.edit.bitstreams.headers.format": "Format", + "item.edit.bitstreams.headers.format": "Format", + + // "item.edit.bitstreams.headers.name": "Name", + "item.edit.bitstreams.headers.name": "Ad", + + // "item.edit.bitstreams.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "item.edit.bitstreams.notifications.discarded.content": "Yaptığınız değişiklikler silindi.Yaptığınız değişiklikleri geri yüklemek için 'Geri al' butonuna tıklayınız.", + + // "item.edit.bitstreams.notifications.discarded.title": "Changes discarded", + "item.edit.bitstreams.notifications.discarded.title": "Değişiklikler silindi.", + + // "item.edit.bitstreams.notifications.move.failed.title": "Error moving bitstreams", + "item.edit.bitstreams.notifications.move.failed.title": "Veri taşınırken bir hata oluştu.", + + // "item.edit.bitstreams.notifications.move.saved.content": "Your move changes to this item's bitstreams and bundles have been saved.", + "item.edit.bitstreams.notifications.move.saved.content": "Bu öğenin bitstreamda ve paketlerinde yaptığınız değişiklikler kaydedildi.", + + // "item.edit.bitstreams.notifications.move.saved.title": "Move changes saved", + "item.edit.bitstreams.notifications.move.saved.title": "Değişiklikler kaydedildi.", + + // "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", + "item.edit.bitstreams.notifications.outdated.content": "Şu anda üzerinde çalıştığınız öğe başka bir kullanıcı tarafından değiştirildi.Mevcut değişiklikleriniz çakışma olmasını önlemek için silindi. ", + + // "item.edit.bitstreams.notifications.outdated.title": "Changes outdated", + "item.edit.bitstreams.notifications.outdated.title": "Değişiklikler zaman aşımına uğradı.", + + // "item.edit.bitstreams.notifications.remove.failed.title": "Error deleting bitstream", + "item.edit.bitstreams.notifications.remove.failed.title": "Bitstream silinirken bir hata oluştu", + + // "item.edit.bitstreams.notifications.remove.saved.content": "Your removal changes to this item's bitstreams have been saved.", + "item.edit.bitstreams.notifications.remove.saved.content": "Bu öğenin bitstreamda yaptığınız kaldırma değişiklikleri kaydedildi.", + + // "item.edit.bitstreams.notifications.remove.saved.title": "Removal changes saved", + "item.edit.bitstreams.notifications.remove.saved.title": "Kaldırma değişiklikleri kaydedildi.", + + // "item.edit.bitstreams.reinstate-button": "Undo", + "item.edit.bitstreams.reinstate-button": "Geri al", + + // "item.edit.bitstreams.save-button": "Save", + "item.edit.bitstreams.save-button": "Kaydet", + + // "item.edit.bitstreams.upload-button": "Upload", + "item.edit.bitstreams.upload-button": "Yükle", + + + + // "item.edit.delete.cancel": "Cancel", + "item.edit.delete.cancel": "İptal et", + + // "item.edit.delete.confirm": "Delete", + "item.edit.delete.confirm": "Sil", + + // "item.edit.delete.description": "Are you sure this item should be completely deleted? Caution: At present, no tombstone would be left.", + "item.edit.delete.description": "Bu öğeyi kalıcı olarak silmek istedğinizden emin misiniz? Silme işlemi gerçekleştikten sonra geri alınamaz. ", + + // "item.edit.delete.error": "An error occurred while deleting the item", + "item.edit.delete.error": "Silme işlemi sırasında bir hata oluştu.", + + // "item.edit.delete.header": "Delete item: {{ id }}", + "item.edit.delete.header": "Silinecek öğeler: {{ id }}", + + // "item.edit.delete.success": "The item has been deleted", + "item.edit.delete.success": "Öğe silindi.", + + // "item.edit.head": "Edit Item", + "item.edit.head": "Ögeleri düzenle", + + // "item.edit.breadcrumbs": "Edit Item", + "item.edit.breadcrumbs": "Ögeleri düzenle", + + + // "item.edit.tabs.mapper.head": "Collection Mapper", + "item.edit.tabs.mapper.head": "Koleksiyon eşleştiricisi", + + // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", + "item.edit.tabs.item-mapper.title": "Öge düzenle- Koleksiyon eşleştiricisi", + + // "item.edit.item-mapper.buttons.add": "Map item to selected collections", + "item.edit.item-mapper.buttons.add": "Ögeyi seçili koleksiyonlarla eşleştir", + + // "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", + "item.edit.item-mapper.buttons.remove": "Seçili koleksiyonların öge eşleştirmelerini kaldır", + + // "item.edit.item-mapper.cancel": "Cancel", + "item.edit.item-mapper.cancel": "İptal et", + + // "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.", + "item.edit.item-mapper.description": "Öge eşleme aracı, yöneticilerin bu öğeyi diğer koleksiyonlarla eşleştirmesini ögeleri eşleştirmesini sağlar. Koleksiyonları arayabilir ve bunları eşleyebilir veya öğenin şu anda eşlendiği koleksiyonların listesine göz atabilirsiniz.", + + // "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", + "item.edit.item-mapper.head": "Öge eşleştirici - Ögeleri koleksiyonlarla eşleştirir", + + // "item.edit.item-mapper.item": "Item: \"{{name}}\"", + "item.edit.item-mapper.item": "Öge: \"{{name}}\"", + + // "item.edit.item-mapper.no-search": "Please enter a query to search", + "item.edit.item-mapper.no-search": "Lütfen arama yapmak için bir soru giriniz.", + + // "item.edit.item-mapper.notifications.add.error.content": "Errors occurred for mapping of item to {{amount}} collections.", + "item.edit.item-mapper.notifications.add.error.content": "Ögelerin {{amount}} koleksiyonlarla eşleştirirken bir hata oluştu.", + + // "item.edit.item-mapper.notifications.add.error.head": "Mapping errors", + "item.edit.item-mapper.notifications.add.error.head": "Eşleştirme hataları", + + // "item.edit.item-mapper.notifications.add.success.content": "Successfully mapped item to {{amount}} collections.", + "item.edit.item-mapper.notifications.add.success.content": "Ögeler {{amount}} koleksiyonlarla başarıyla eşleştirildi.", + + // "item.edit.item-mapper.notifications.add.success.head": "Mapping completed", + "item.edit.item-mapper.notifications.add.success.head": "Eşleştirme tamamlandı.", + + // "item.edit.item-mapper.notifications.remove.error.content": "Errors occurred for the removal of the mapping to {{amount}} collections.", + "item.edit.item-mapper.notifications.remove.error.content": "Ögelerin {{amount}} koleksiyonlarla eşleştirmeleri kaldırılırken bir hata oluştu.", + + // "item.edit.item-mapper.notifications.remove.error.head": "Removal of mapping errors", + "item.edit.item-mapper.notifications.remove.error.head": "Eşleştirme hatalarının kaldırılması", + + // "item.edit.item-mapper.notifications.remove.success.content": "Successfully removed mapping of item to {{amount}} collections.", + "item.edit.item-mapper.notifications.remove.success.content": "Ögeler {{amount}} koleksiyonlarla eşleştirmeleri başarıyla kaldırıldı.", + + // "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", + "item.edit.item-mapper.notifications.remove.success.head": "Eşleştirmelerin kaldırılması tamamlandı.", + + // "item.edit.item-mapper.tabs.browse": "Browse mapped collections", + "item.edit.item-mapper.tabs.browse": "Eşleştirilen koleksiyonları ara", + + // "item.edit.item-mapper.tabs.map": "Map new collections", + "item.edit.item-mapper.tabs.map": "Yeni koleksiyonları eşleştir", + + + + // "item.edit.metadata.add-button": "Add", + "item.edit.metadata.add-button": "Ekle", + + // "item.edit.metadata.discard-button": "Discard", + "item.edit.metadata.discard-button": "Sil", + + // "item.edit.metadata.edit.buttons.edit": "Edit", + "item.edit.metadata.edit.buttons.edit": "Düzenle", + + // "item.edit.metadata.edit.buttons.remove": "Remove", + "item.edit.metadata.edit.buttons.remove": "Kaldır", + + // "item.edit.metadata.edit.buttons.undo": "Undo changes", + "item.edit.metadata.edit.buttons.undo": "Değişiklikleri geri al", + + // "item.edit.metadata.edit.buttons.unedit": "Stop editing", + "item.edit.metadata.edit.buttons.unedit": "Düzenlemeyi bitir", + + // "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", + "item.edit.metadata.empty": "Öğe şu anda herhangi bir metadata içermiyor. Bir metadata değeri eklemeye başlamak için Ekle'ye tıklayın.", + + // "item.edit.metadata.headers.edit": "Edit", + "item.edit.metadata.headers.edit": "Düzenle", + + // "item.edit.metadata.headers.field": "Field", + "item.edit.metadata.headers.field": "Alan", + + // "item.edit.metadata.headers.language": "Lang", + "item.edit.metadata.headers.language": "Dil", + + // "item.edit.metadata.headers.value": "Value", + "item.edit.metadata.headers.value": "Değer", + + // "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", + "item.edit.metadata.metadatafield.invalid": "Lütfen geçerli bir metadata alanı seçin", + + // "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "item.edit.metadata.notifications.discarded.content": "Yaptığınız değişiklikler silindi.Yaptığınız değişiklikleri geri yüklemek için 'Geri al' butonuna tıklayınız.", + + // "item.edit.metadata.notifications.discarded.title": "Changed discarded", + "item.edit.metadata.notifications.discarded.title": "Değişiklikler silindi", + + // "item.edit.metadata.notifications.error.title": "An error occurred", + "item.edit.metadata.notifications.error.title": "Bir hata oluştu", + + // "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + "item.edit.metadata.notifications.invalid.content": "Değişiklikleriniz kaydedilmedi. Lütfen kaydetmeden önce tüm alanların geçerli olduğundan emin olun.", + + // "item.edit.metadata.notifications.invalid.title": "Metadata invalid", + "item.edit.metadata.notifications.invalid.title": "Metadata geçersiz", + + // "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.content": "Şu anda üzerinde çalıştığınız öge başka bir kullanıcı tarafından değiştirildi.Mevcut değişiklikleriniz çakışma olmasını önlemek için silindi.", + + // "item.edit.metadata.notifications.outdated.title": "Changed outdated", + "item.edit.metadata.notifications.outdated.title": "Değişiklikler zaman aşımına uğradı.", + + // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", + "item.edit.metadata.notifications.saved.content": "Ögenin metadatalarında yaptığınız değişiklikler kaydedildi.", + + // "item.edit.metadata.notifications.saved.title": "Metadata saved", + "item.edit.metadata.notifications.saved.title": "Metadatalar kaydedildi", + + // "item.edit.metadata.reinstate-button": "Undo", + "item.edit.metadata.reinstate-button": "Geri al", + + // "item.edit.metadata.save-button": "Save", + "item.edit.metadata.save-button": "Kaydet", + + + + // "item.edit.modify.overview.field": "Field", + "item.edit.modify.overview.field": "Alan", + + // "item.edit.modify.overview.language": "Language", + "item.edit.modify.overview.language": "Dil", + + // "item.edit.modify.overview.value": "Value", + "item.edit.modify.overview.value": "Değer", + + + + // "item.edit.move.cancel": "Cancel", + "item.edit.move.cancel": "İptal et", + + // "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.", + "item.edit.move.description": "Bu öğeyi taşımak istediğiniz koleksiyonu seçin. Görüntülenen koleksiyonların listesini daraltmak için arama kısmına bir arama sorgusu girebilirsiniz.", + + // "item.edit.move.error": "An error occurred when attempting to move the item", + "item.edit.move.error": "Öğeyi taşımaya çalışırken bir hata oluştu", + + // "item.edit.move.head": "Move item: {{id}}", + "item.edit.move.head": "Kaldırılacak öge: {{id}}", + + // "item.edit.move.inheritpolicies.checkbox": "Inherit policies", + "item.edit.move.inheritpolicies.checkbox": "Poliçeyi devral", + + // "item.edit.move.inheritpolicies.description": "Inherit the default policies of the destination collection", + "item.edit.move.inheritpolicies.description": "Hedef koleksiyonun varsayılan poliçelerini devral", + + // "item.edit.move.move": "Move", + "item.edit.move.move": "Taşı", + + // "item.edit.move.processing": "Moving...", + "item.edit.move.processing": "Taşınıyor...", + + // "item.edit.move.search.placeholder": "Enter a search query to look for collections", + "item.edit.move.search.placeholder": "Lütfen koleksiyonları aramak için bir arama sorgusu giriniz.", + + // "item.edit.move.success": "The item has been moved successfully", + "item.edit.move.success": "Öge başarıyla taşındı", + + // "item.edit.move.title": "Move item", + "item.edit.move.title": "Ögeleri taşı", + + + + // "item.edit.private.cancel": "Cancel", + "item.edit.private.cancel": "İptal et", + + // "item.edit.private.confirm": "Make it Private", + "item.edit.private.confirm": "Gizli yap", + + // "item.edit.private.description": "Are you sure this item should be made private in the archive?", + "item.edit.private.description": "Bu öğenin arşivde gizli yapılması gerektiğinden emin misiniz?", + + // "item.edit.private.error": "An error occurred while making the item private", + "item.edit.private.error": "Öge gizli yapılırken bir hata oluştu", + + // "item.edit.private.header": "Make item private: {{ id }}", + "item.edit.private.header": "Ögeyi gizli yap: {{ id }}", + + // "item.edit.private.success": "The item is now private", + "item.edit.private.success": "Öge gizlendi", + + + + // "item.edit.public.cancel": "Cancel", + "item.edit.public.cancel": "İptal et", + + // "item.edit.public.confirm": "Make it Public", + "item.edit.public.confirm": "Ögeyi herkese açık yap", + + // "item.edit.public.description": "Are you sure this item should be made public in the archive?", + "item.edit.public.description": "Bu öğenin arşivde herkese açık yapılması gerektiğinden emin misiniz?", + + // "item.edit.public.error": "An error occurred while making the item public", + "item.edit.public.error": "Öge herkese açık yapılırken bir hata oluştu", + + // "item.edit.public.header": "Make item public: {{ id }}", + "item.edit.public.header": "Herkese açık yapılacak öge: {{ id }}", + + // "item.edit.public.success": "The item is now public", + "item.edit.public.success": "Öge herkese açık yapıldı", + + + + // "item.edit.reinstate.cancel": "Cancel", + "item.edit.reinstate.cancel": "İptal et", + + // "item.edit.reinstate.confirm": "Reinstate", + "item.edit.reinstate.confirm": "Getir yükle", + + // "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?", + "item.edit.reinstate.description": "Bu öğenin arşive geri yüklenmesi gerektiğinden emin misiniz?", + + // "item.edit.reinstate.error": "An error occurred while reinstating the item", + "item.edit.reinstate.error": "Öğe geri yüklenirken bir hata oluştu", + + // "item.edit.reinstate.header": "Reinstate item: {{ id }}", + "item.edit.reinstate.header": "Geri yüklenecek öge: {{ id }}", + + // "item.edit.reinstate.success": "The item was reinstated successfully", + "item.edit.reinstate.success": "Öge başarıyla geri yüklendi", + + + + // "item.edit.relationships.discard-button": "Discard", + "item.edit.relationships.discard-button": "Sil", + + // "item.edit.relationships.edit.buttons.add": "Add", + "item.edit.relationships.edit.buttons.add": "Ekle", + + // "item.edit.relationships.edit.buttons.remove": "Remove", + "item.edit.relationships.edit.buttons.remove": "Kaldır", + + // "item.edit.relationships.edit.buttons.undo": "Undo changes", + "item.edit.relationships.edit.buttons.undo": "Değişiklikleri geri al", + + // "item.edit.relationships.no-relationships": "No relationships", + "item.edit.relationships.no-relationships": "İlişki yok", + + // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "item.edit.relationships.notifications.discarded.content": "Yaptığınız değişiklikler silindi.Yaptığınız değişiklikleri geri yüklemek için 'Geri al' butonuna tıklayınız.", + + // "item.edit.relationships.notifications.discarded.title": "Changes discarded", + "item.edit.relationships.notifications.discarded.title": "Değişiklikler silindi", + + // "item.edit.relationships.notifications.failed.title": "Error editing relationships", + "item.edit.relationships.notifications.failed.title": "İlişkileri düzenlemede hata", + + // "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", + "item.edit.relationships.notifications.outdated.content": "Şu anda üzerinde çalıştığınız öge başka bir kullanıcı tarafından değiştirildi.Mevcut değişiklikleriniz çakışma olmasını önlemek için silindi.", + + // "item.edit.relationships.notifications.outdated.title": "Changes outdated", + "item.edit.relationships.notifications.outdated.title": "Değişiklikler zaman aşımına uğradı.", + + // "item.edit.relationships.notifications.saved.content": "Your changes to this item's relationships were saved.", + "item.edit.relationships.notifications.saved.content": "Bu öğenin ilişkilerinde yaptığınız değişiklikler kaydedildi.", + + // "item.edit.relationships.notifications.saved.title": "Relationships saved", + "item.edit.relationships.notifications.saved.title": "İlişkiler kaydedildi", + + // "item.edit.relationships.reinstate-button": "Undo", + "item.edit.relationships.reinstate-button": "Geri al", + + // "item.edit.relationships.save-button": "Save", + "item.edit.relationships.save-button": "Kaydet", + + // "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", + "item.edit.relationships.no-entity-type": "Bu öğe için ilişkileri etkinleştirmek için 'dspace.entity.type' metadatalarını ekleyin", + + + + // "item.edit.tabs.bitstreams.head": "Bitstreams", + "item.edit.tabs.bitstreams.head": "Bitstreamlar", + + // "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", + "item.edit.tabs.bitstreams.title": "Öge düzenle - Bitstreamlar", + + // "item.edit.tabs.curate.head": "Curate", + "item.edit.tabs.curate.head": "Düzenleme", + + // "item.edit.tabs.curate.title": "Item Edit - Curate", + "item.edit.tabs.curate.title": "Öge düzenle - Düzenleme", + + // "item.edit.tabs.metadata.head": "Metadata", + "item.edit.tabs.metadata.head": "Metadata", + + // "item.edit.tabs.metadata.title": "Item Edit - Metadata", + "item.edit.tabs.metadata.title": "Öge düzenle - Metadata", + + // "item.edit.tabs.relationships.head": "Relationships", + "item.edit.tabs.relationships.head": "İlişkiler", + + // "item.edit.tabs.relationships.title": "Item Edit - Relationships", + "item.edit.tabs.relationships.title": "Öge düzenle - İlişkiler", + + // "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", + "item.edit.tabs.status.buttons.authorizations.button": "Yetkilendiriliyor...", + + // "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", + "item.edit.tabs.status.buttons.authorizations.label": "Öğenin yetkilendirme politikalarını düzenle", + + // "item.edit.tabs.status.buttons.delete.button": "Permanently delete", + "item.edit.tabs.status.buttons.delete.button": "Kalıcı olarak sil", + + // "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", + "item.edit.tabs.status.buttons.delete.label": "Ögeyi kalıcı olarak sil", + + // "item.edit.tabs.status.buttons.mappedCollections.button": "Mapped collections", + "item.edit.tabs.status.buttons.mappedCollections.button": "Eşleştirilmiş koleksiyonlar", + + // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", + "item.edit.tabs.status.buttons.mappedCollections.label": "Eşlenen koleksiyonları yönetin", + + // "item.edit.tabs.status.buttons.move.button": "Move...", + "item.edit.tabs.status.buttons.move.button": "Taşınıyor...", + + // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", + "item.edit.tabs.status.buttons.move.label": "Öğeyi başka bir koleksiyona taşı", + + // "item.edit.tabs.status.buttons.private.button": "Make it private...", + "item.edit.tabs.status.buttons.private.button": "Gizleniyor...", + + // "item.edit.tabs.status.buttons.private.label": "Make item private", + "item.edit.tabs.status.buttons.private.label": "Ögeyi gizle", + + // "item.edit.tabs.status.buttons.public.button": "Make it public...", + "item.edit.tabs.status.buttons.public.button": "Öge herkese açık yapılıyor...", + + // "item.edit.tabs.status.buttons.public.label": "Make item public", + "item.edit.tabs.status.buttons.public.label": "Herkese açık yap", + + // "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", + "item.edit.tabs.status.buttons.reinstate.button": "Geri yükleniyor...", + + // "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", + "item.edit.tabs.status.buttons.reinstate.label": "Öğeyi depoya geri yükle", + + // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", + "item.edit.tabs.status.buttons.withdraw.button": "Çıkar...", + + // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", + "item.edit.tabs.status.buttons.withdraw.label": "Depodan öğeyi çıkar", + + // "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.", + "item.edit.tabs.status.description": "Öğe yönetimi sayfasına hoş geldiniz. Buradan öğeyi çıkarabilir, geri yükleyebilir, taşıyabilir veya silebilirsiniz. Diğer sekmelerde de güncelleyebilir veya yeni metadata / bit akışları ekleyebilirsiniz.", + + // "item.edit.tabs.status.head": "Status", + "item.edit.tabs.status.head": "Durum", + + // "item.edit.tabs.status.labels.handle": "Handle", + "item.edit.tabs.status.labels.handle": "Handle", + + // "item.edit.tabs.status.labels.id": "Item Internal ID", + "item.edit.tabs.status.labels.id": "Öge Dahili Kimliğ", + + // "item.edit.tabs.status.labels.itemPage": "Item Page", + "item.edit.tabs.status.labels.itemPage": "Öge sayfası", + + // "item.edit.tabs.status.labels.lastModified": "Last Modified", + "item.edit.tabs.status.labels.lastModified": "Son düzenleme", + + // "item.edit.tabs.status.title": "Item Edit - Status", + "item.edit.tabs.status.title": "Öge düzenle - Durum", + + // "item.edit.tabs.versionhistory.head": "Version History", + "item.edit.tabs.versionhistory.head": "Sürüm Geçmişi", + + // "item.edit.tabs.versionhistory.title": "Item Edit - Version History", + "item.edit.tabs.versionhistory.title": "Öge düzenle - Sürüm Geçmişi", + + // "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", + "item.edit.tabs.versionhistory.under-construction": "Bu kullanıcı arayüzünde henüz yeni sürümleri düzenlemek veya eklemek mümkün değil.", + + // "item.edit.tabs.view.head": "View Item", + "item.edit.tabs.view.head": "Ürünü incele", + + // "item.edit.tabs.view.title": "Item Edit - View", + "item.edit.tabs.view.title": "Öge düzenle - incele", + + + + // "item.edit.withdraw.cancel": "Cancel", + "item.edit.withdraw.cancel": "İptal et", + + // "item.edit.withdraw.confirm": "Withdraw", + "item.edit.withdraw.confirm": "Çıkar", + + // "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?", + "item.edit.withdraw.description": "Bu öğenin arşivden çıkartılması gerektiğinden emin misiniz?", + + // "item.edit.withdraw.error": "An error occurred while withdrawing the item", + "item.edit.withdraw.error": "Öğe çıkartılırken bir hata oluştu", + + // "item.edit.withdraw.header": "Withdraw item: {{ id }}", + "item.edit.withdraw.header": "Çıkarılan öge: {{ id }}", + + // "item.edit.withdraw.success": "The item was withdrawn successfully", + "item.edit.withdraw.success": "Öğe başarıyla çıkartıldı", + + + + // "item.listelement.badge": "Item", + "item.listelement.badge": "Öge", + + // "item.page.description": "Description", + "item.page.description": "Açıklama", + + // "item.page.edit": "Edit this item", + "item.page.edit": "Bu ögeyi düzenle", + + // "item.page.journal-issn": "Journal ISSN", + "item.page.journal-issn": "Süreli Yayın ISSN", + + // "item.page.journal-title": "Journal Title", + "item.page.journal-title": "Süreli Yayın başlığı", + + // "item.page.publisher": "Publisher", + "item.page.publisher": "Yayınevi", + + // "item.page.titleprefix": "Item: ", + "item.page.titleprefix": "Öge: ", + + // "item.page.volume-title": "Volume Title", + "item.page.volume-title": "Cilt Başlığı", + + // "item.search.results.head": "Item Search Results", + "item.search.results.head": "Öge Arama Sonuçları", + + // "item.search.title": "DSpace Angular :: Item Search", + "item.search.title": "DSpace Angular :: Öge Arama", + + + // "item.page.abstract": "Abstract", + "item.page.abstract": "Özet", + + // "item.page.author": "Authors", + "item.page.author": "Yazarlar", + + // "item.page.citation": "Citation", + "item.page.citation": "Alıntı", + + // "item.page.collections": "Collections", + "item.page.collections": "Koleksiyonlar", + + // "item.page.date": "Date", + "item.page.date": "Tarih", + + // "item.page.edit": "Edit this item", + "item.page.edit": "Bu öğeyi düzenle", + + // "item.page.files": "Files", + "item.page.files": "Dosyalar", + + // "item.page.filesection.description": "Description:", + "item.page.filesection.description": "Açıklama", + + // "item.page.filesection.download": "Download", + "item.page.filesection.download": "İndir", + + // "item.page.filesection.format": "Format:", + "item.page.filesection.format": "Format:", + + // "item.page.filesection.name": "Name:", + "item.page.filesection.name": "Ad:", + + // "item.page.filesection.size": "Size:", + "item.page.filesection.size": "Boyut:", + + // "item.page.journal.search.title": "Articles in this journal", + "item.page.journal.search.title": "Bu süreli yayındaki makaleler", + + // "item.page.link.full": "Full item page", + "item.page.link.full": "Tam öğe sayfası", + + // "item.page.link.simple": "Simple item page", + "item.page.link.simple": "Sadeleştirilmiş öğe sayfası", + + // "item.page.person.search.title": "Articles by this author", + "item.page.person.search.title": "Bu yazarın makaleleri", + + // "item.page.related-items.view-more": "Show {{ amount }} more", + "item.page.related-items.view-more": "Daha fazla göster {{ amount }}", + + // "item.page.related-items.view-less": "Hide last {{ amount }}", + "item.page.related-items.view-less": "Sonuncuyu gizle {{ amount }}", + + // "item.page.relationships.isAuthorOfPublication": "Publications", + "item.page.relationships.isAuthorOfPublication": "Yayınlar", + + // "item.page.relationships.isJournalOfPublication": "Publications", + "item.page.relationships.isJournalOfPublication": "Yayınlar", + + // "item.page.relationships.isOrgUnitOfPerson": "Authors", + "item.page.relationships.isOrgUnitOfPerson": "Yazarlar", + + // "item.page.relationships.isOrgUnitOfProject": "Research Projects", + "item.page.relationships.isOrgUnitOfProject": "Araştırma projeleri", + + // "item.page.subject": "Keywords", + "item.page.subject": "Anahtar kelimeler", + + // "item.page.uri": "URI", + "item.page.uri": "URI", + + // "item.page.bitstreams.view-more": "Show more", + "item.page.bitstreams.view-more": "Daha fazla göster", + + // "item.page.bitstreams.collapse": "Collapse", + "item.page.bitstreams.collapse": "Daralt", + + // "item.page.filesection.original.bundle" : "Original bundle", + "item.page.filesection.original.bundle" : "Orijinal seri", + + // "item.page.filesection.license.bundle" : "License bundle", + "item.page.filesection.license.bundle" : "Lisanslı seri", + + // "item.preview.dc.identifier.uri": "Identifier:", + "item.preview.dc.identifier.uri": "Belirteç:", + + // "item.preview.dc.contributor.author": "Authors:", + "item.preview.dc.contributor.author": "Yazarlar:", + + // "item.preview.dc.date.issued": "Published date:", + "item.preview.dc.date.issued": "Yayınlanma tarihi:", + + // "item.preview.dc.description.abstract": "Abstract:", + "item.preview.dc.description.abstract": "Özet:", + + // "item.preview.dc.identifier.other": "Other identifier:", + "item.preview.dc.identifier.other": "Diğer Belirteçler:", + + // "item.preview.dc.language.iso": "Language:", + "item.preview.dc.language.iso": "Dil:", + + // "item.preview.dc.subject": "Subjects:", + "item.preview.dc.subject": "Konular:", + + // "item.preview.dc.title": "Title:", + "item.preview.dc.title": "Başlık:", + + // "item.preview.person.familyName": "Surname:", + "item.preview.person.familyName": "Soyad:", + + // "item.preview.person.givenName": "Name:", + "item.preview.person.givenName": "Ad:", + + // "item.preview.person.identifier.orcid": "ORCID:", + "item.preview.person.identifier.orcid": "ORCID:", + + + // "item.select.confirm": "Confirm selected", + "item.select.confirm": "Seçileni onayla", + + // "item.select.empty": "No items to show", + "item.select.empty": "Gösterilecek öğe yok", + + // "item.select.table.author": "Author", + "item.select.table.author": "Yazar", + + // "item.select.table.collection": "Collection", + "item.select.table.collection": "Koleksiyon", + + // "item.select.table.title": "Title", + "item.select.table.title": "Başlık", + + + // "item.version.history.empty": "There are no other versions for this item yet.", + "item.version.history.empty": "Bu öğe için henüz başka sürüm yok.", + + // "item.version.history.head": "Version History", + "item.version.history.head": "Sürüm Geçmişi", + + // "item.version.history.return": "Return", + "item.version.history.return": "Geri dön", + + // "item.version.history.selected": "Selected version", + "item.version.history.selected": "Seçilen sürüm", + + // "item.version.history.table.version": "Version", + "item.version.history.table.version": "Sürüm", + + // "item.version.history.table.item": "Item", + "item.version.history.table.item": "Öge", + + // "item.version.history.table.editor": "Editor", + "item.version.history.table.editor": "Editör", + + // "item.version.history.table.date": "Date", + "item.version.history.table.date": "Tarih", + + // "item.version.history.table.summary": "Summary", + "item.version.history.table.summary": "Özet", + + + + // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", + "item.version.notice": "Bu, bu öğenin en son sürümü değil. En son sürüm burada bulunabilir.", + + + + // "journal.listelement.badge": "Journal", + "journal.listelement.badge": "Süreli yayın", + + // "journal.page.description": "Description", + "journal.page.description": "Açıklama", + + // "journal.page.edit": "Edit this item", + "journal.page.edit": "Bu öğeyi düzenle", + + // "journal.page.editor": "Editor-in-Chief", + "journal.page.editor": "Genel Yayın Yönetmeni", + + // "journal.page.issn": "ISSN", + "journal.page.issn": "ISSN", + + // "journal.page.publisher": "Publisher", + "journal.page.publisher": "Yayınevi", + + // "journal.page.titleprefix": "Journal: ", + "journal.page.titleprefix": "Süreli yayın: ", + + // "journal.search.results.head": "Journal Search Results", + "journal.search.results.head": "Süreli Yayın Arama Sonuçları", + + // "journal.search.title": "DSpace Angular :: Journal Search", + "journal.search.title": "DSpace Angular :: Süreli Yayın Arama", + + + + // "journalissue.listelement.badge": "Journal Issue", + "journalissue.listelement.badge": "Süreli Yayın Sayısı", + + // "journalissue.page.description": "Description", + "journalissue.page.description": "Açıklama", + + // "journalissue.page.edit": "Edit this item", + "journalissue.page.edit": "Bu öğeyi düzenle", + + // "journalissue.page.issuedate": "Issue Date", + "journalissue.page.issuedate": "Yayın tarihi", + + // "journalissue.page.journal-issn": "Journal ISSN", + "journalissue.page.journal-issn": "Süreli yayın ISSN", + + // "journalissue.page.journal-title": "Journal Title", + "journalissue.page.journal-title": "Süreli yayın Başlığı", + + // "journalissue.page.keyword": "Keywords", + "journalissue.page.keyword": "Anahtar kelimeler", + + // "journalissue.page.number": "Number", + "journalissue.page.number": "Sayı", + + // "journalissue.page.titleprefix": "Journal Issue: ", + "journalissue.page.titleprefix": "Süreli yayın sayısı: ", + + + + // "journalvolume.listelement.badge": "Journal Volume", + "journalvolume.listelement.badge": "Süreli yayın cilti", + + // "journalvolume.page.description": "Description", + "journalvolume.page.description": "Açıklama", + + // "journalvolume.page.edit": "Edit this item", + "journalvolume.page.edit": "Bu öğeyi düzenle", + + // "journalvolume.page.issuedate": "Issue Date", + "journalvolume.page.issuedate": "Yayın tarihi", + + // "journalvolume.page.titleprefix": "Journal Volume: ", + "journalvolume.page.titleprefix": "Süreli yayın cilti: ", + + // "journalvolume.page.volume": "Volume", + "journalvolume.page.volume": "Cilt", + + + + // "loading.bitstream": "Loading bitstream...", + "loading.bitstream": "Bitstream yükleniyor...", + + // "loading.bitstreams": "Loading bitstreams...", + "loading.bitstreams": "Bitstream yükleniyor...", + + // "loading.browse-by": "Loading items...", + "loading.browse-by": "Bitstream yükleniyor...", + + // "loading.browse-by-page": "Loading page...", + "loading.browse-by-page": "Yükleme sayfası...", + + // "loading.collection": "Loading collection...", + "loading.collection": "Koleksiyon yükleniyor...", + + // "loading.collections": "Loading collections...", + "loading.collections": "Koleksiyon yükleniyor...", + + // "loading.content-source": "Loading content source...", + "loading.content-source": "İçerik kaynağı yükleniyor...", + + // "loading.community": "Loading community...", + "loading.community": "Komünite yükleniyor...", + + // "loading.default": "Loading...", + "loading.default": "Yükleniyor...", + + // "loading.item": "Loading item...", + "loading.item": "Ögeler yükleniyor...", + + // "loading.items": "Loading items...", + "loading.items": "Ögeler yükleniyor...", + + // "loading.mydspace-results": "Loading items...", + "loading.mydspace-results": "Ögeler yükleniyor...", + + // "loading.objects": "Loading...", + "loading.objects": "Yükleniyor...", + + // "loading.recent-submissions": "Loading recent submissions...", + "loading.recent-submissions": "Son gönderiler yükleniyor...", + + // "loading.search-results": "Loading search results...", + "loading.search-results": "Arama sonuçları yükleniyor...", + + // "loading.sub-collections": "Loading sub-collections...", + "loading.sub-collections": "Alt koleksiyonlar yükleniyor...", + + // "loading.sub-communities": "Loading sub-communities...", + "loading.sub-communities": "Alt komüniteler yükleniyor...", + + // "loading.top-level-communities": "Loading top-level communities...", + "loading.top-level-communities": "Üst düzey komüniteler yükleniyor...", + + + + // "login.form.email": "Email address", + "login.form.email": "E-posta adresi", + + // "login.form.forgot-password": "Have you forgotten your password?", + "login.form.forgot-password": "Parolanızı unuttunuz mu?", + + // "login.form.header": "Please log in to DSpace", + "login.form.header": "Lütfen DSpace'e giriş yapın", + + // "login.form.new-user": "New user? Click here to register.", + "login.form.new-user": "Yeni kullanıcı mısınız? Kayıt olmak için buraya tıklayın.", + + // "login.form.or-divider": "or", + "login.form.or-divider": "ya da", + + // "login.form.password": "Password", + "login.form.password": "Parola", + + // "login.form.shibboleth": "Log in with Shibboleth", + "login.form.shibboleth": "Shibboleth ile giriş yapın", + + // "login.form.submit": "Log in", + "login.form.submit": "Giriş yap", + + // "login.title": "Login", + "login.title": "Giriş", + + // "login.breadcrumbs": "Login", + "login.breadcrumbs": "Giriş", + + + + // "logout.form.header": "Log out from DSpace", + "logout.form.header": "DSpace'den çıkış yapın", + + // "logout.form.submit": "Log out", + "logout.form.submit": "Çıkış yap", + + // "logout.title": "Logout", + "logout.title": "Çıkış yap", + + + + // "menu.header.admin": "Admin", + "menu.header.admin": "Yönetici", + + // "menu.header.image.logo": "Repository logo", + "menu.header.image.logo": "Depo logosu", + + + + // "menu.section.access_control": "Access Control", + "menu.section.access_control": "Giriş kontrolü", + + // "menu.section.access_control_authorizations": "Authorizations", + "menu.section.access_control_authorizations": "Yetkilendirmeler", + + // "menu.section.access_control_groups": "Groups", + "menu.section.access_control_groups": "Gruplar", + + // "menu.section.access_control_people": "People", + "menu.section.access_control_people": "Kişiler", + + + + // "menu.section.admin_search": "Admin Search", + "menu.section.admin_search": "Yönetici araması", + + + + // "menu.section.browse_community": "This Community", + "menu.section.browse_community": "Bu Komünite", + + // "menu.section.browse_community_by_author": "By Author", + "menu.section.browse_community_by_author": "Yazara göre", + + // "menu.section.browse_community_by_issue_date": "By Issue Date", + "menu.section.browse_community_by_issue_date": "Yayın tarihine göre", + + // "menu.section.browse_community_by_title": "By Title", + "menu.section.browse_community_by_title": "Başlığa göre", + + // "menu.section.browse_global": "All of DSpace", + "menu.section.browse_global": "Tümü", + + // "menu.section.browse_global_by_author": "By Author", + "menu.section.browse_global_by_author": "Yazara göre", + + // "menu.section.browse_global_by_dateissued": "By Issue Date", + "menu.section.browse_global_by_dateissued": "Yayın tarihine göre", + + // "menu.section.browse_global_by_subject": "By Subject", + "menu.section.browse_global_by_subject": "Konuya göre", + + // "menu.section.browse_global_by_title": "By Title", + "menu.section.browse_global_by_title": "Başlığa göre", + + // "menu.section.browse_global_communities_and_collections": "Communities & Collections", + "menu.section.browse_global_communities_and_collections": "Komüniteler ve Koleksiyonlar", + + + + // "menu.section.control_panel": "Control Panel", + "menu.section.control_panel": "Kontrol Paneli", + + // "menu.section.curation_task": "Curation Task", + "menu.section.curation_task": "Düzenleme görevi", + + + + // "menu.section.edit": "Edit", + "menu.section.edit": "Düzenle", + + // "menu.section.edit_collection": "Collection", + "menu.section.edit_collection": "Koleksiyon", + + // "menu.section.edit_community": "Community", + "menu.section.edit_community": "Komünite", + + // "menu.section.edit_item": "Item", + "menu.section.edit_item": "Öge", + + + + // "menu.section.export": "Export", + "menu.section.export": "Dışa aktar", + + // "menu.section.export_collection": "Collection", + "menu.section.export_collection": "Koleksiyon", + + // "menu.section.export_community": "Community", + "menu.section.export_community": "Komünite", + + // "menu.section.export_item": "Item", + "menu.section.export_item": "Öge", + + // "menu.section.export_metadata": "Metadata", + "menu.section.export_metadata": "Metadata", + + + + // "menu.section.icon.access_control": "Access Control menu section", + "menu.section.icon.access_control": "Erişim Kontrolü menüsü bölümü", + + // "menu.section.icon.admin_search": "Admin search menu section", + "menu.section.icon.admin_search": "Yönetici arama menüsü bölümü", + + // "menu.section.icon.control_panel": "Control Panel menu section", + "menu.section.icon.control_panel": "Kontrol Paneli menü bölümü", + + // "menu.section.icon.curation_task": "Curation Task menu section", + "menu.section.icon.curation_task": "Düzenleme Görevi menüsü bölümü", + + // "menu.section.icon.edit": "Edit menu section", + "menu.section.icon.edit": "Menü bölümünü düzenle", + + // "menu.section.icon.export": "Export menu section", + "menu.section.icon.export": "Menü bölümünü dışa aktar", + + // "menu.section.icon.find": "Find menu section", + "menu.section.icon.find": "Menü bölümünü bulun", + + // "menu.section.icon.import": "Import menu section", + "menu.section.icon.import": "Menü bölümünü içe aktar", + + // "menu.section.icon.new": "New menu section", + "menu.section.icon.new": "Yeni menü bölümü", + + // "menu.section.icon.pin": "Pin sidebar", + "menu.section.icon.pin": "Yan çubuğu sabitle", + + // "menu.section.icon.processes": "Processes menu section", + "menu.section.icon.processes": "İşlemler menüsü bölümü", + + // "menu.section.icon.registries": "Registries menu section", + "menu.section.icon.registries": "Kayıtlar menüsü bölümü", + + // "menu.section.icon.statistics_task": "Statistics Task menu section", + "menu.section.icon.statistics_task": "İstatistik Görev menüsü bölümü", + + // "menu.section.icon.unpin": "Unpin sidebar", + "menu.section.icon.unpin": "Kenar çubuğunu kaldır", + + + + // "menu.section.import": "Import", + "menu.section.import": "İçe aktar", + + // "menu.section.import_batch": "Batch Import (ZIP)", + "menu.section.import_batch": "Toplu İçe Aktarma (ZIP)", + + // "menu.section.import_metadata": "Metadata", + "menu.section.import_metadata": "Metadata", + + + + // "menu.section.new": "New", + "menu.section.new": "Yeni", + + // "menu.section.new_collection": "Collection", + "menu.section.new_collection": "Koleksiyon", + + // "menu.section.new_community": "Community", + "menu.section.new_community": "Komünite", + + // "menu.section.new_item": "Item", + "menu.section.new_item": "Öğe", + + // "menu.section.new_item_version": "Item Version", + "menu.section.new_item_version": "Öğe Sürümü", + + // "menu.section.new_process": "Process", + "menu.section.new_process": "Süreç", + + + + // "menu.section.pin": "Pin sidebar", + "menu.section.pin": "Kenar çubuğunu sabitle", + + // "menu.section.unpin": "Unpin sidebar", + "menu.section.unpin": "Kenar çubuğunun sabitlemesini kaldır", + + + + // "menu.section.processes": "Processes", + "menu.section.processes": "Süreçler", + + + + // "menu.section.registries": "Registries", + "menu.section.registries": "Kayıt", + + // "menu.section.registries_format": "Format", + "menu.section.registries_format": "Format", + + // "menu.section.registries_metadata": "Metadata", + "menu.section.registries_metadata": "Metadata", + + + + // "menu.section.statistics": "Statistics", + "menu.section.statistics": "İstatistik", + + // "menu.section.statistics_task": "Statistics Task", + "menu.section.statistics_task": "İstatistiksel Görev", + + + + // "menu.section.toggle.access_control": "Toggle Access Control section", + "menu.section.toggle.access_control": "Erişim kontrolü bölümünü aç/kapat", + + // "menu.section.toggle.control_panel": "Toggle Control Panel section", + "menu.section.toggle.control_panel": "Kontrol Paneli bölümünü aç/kapat", + + // "menu.section.toggle.curation_task": "Toggle Curation Task section", + "menu.section.toggle.curation_task": "İyileştirme Görevi bölümünü aç/kapat", + + // "menu.section.toggle.edit": "Toggle Edit section", + "menu.section.toggle.edit": "Düzenleme bölümünü aç/kapat", + + // "menu.section.toggle.export": "Toggle Export section", + "menu.section.toggle.export": "Dışa Aktarma bölümünü aç/kapat", + + // "menu.section.toggle.find": "Toggle Find section", + "menu.section.toggle.find": "Arama bölümünü aç/kapat", + + // "menu.section.toggle.import": "Toggle Import section", + "menu.section.toggle.import": "İçe Aktarma bölümünü aç/kapat", + + // "menu.section.toggle.new": "Toggle New section", + "menu.section.toggle.new": "Yeni bölümü aç/kapat", + + // "menu.section.toggle.registries": "Toggle Registries section", + "menu.section.toggle.registries": "Kayıtlar bölümünü aç/kapat", + + // "menu.section.toggle.statistics_task": "Toggle Statistics Task section", + "menu.section.toggle.statistics_task": "İstatistik Görev bölümünü aç/kapat", + + + // "menu.section.workflow": "Administer Workflow", + "menu.section.workflow": "İş Akışını Yönet", + + + // "mydspace.description": "", + "mydspace.description": "", + + // "mydspace.general.text-here": "here", + "mydspace.general.text-here": "Burada", + + // "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", + "mydspace.messages.controller-help": "Öğeyi gönderene bir mesaj göndermek için bu seçeneği seçin.", + + // "mydspace.messages.description-placeholder": "Insert your message here...", + "mydspace.messages.description-placeholder": "Mesajınızı buraya ekleyin...", + + // "mydspace.messages.hide-msg": "Hide message", + "mydspace.messages.hide-msg": "Mesajı gizle", + + // "mydspace.messages.mark-as-read": "Mark as read", + "mydspace.messages.mark-as-read": "Okundu olarak işaretle", + + // "mydspace.messages.mark-as-unread": "Mark as unread", + "mydspace.messages.mark-as-unread": "Okunmamış olarak işaretle", + + // "mydspace.messages.no-content": "No content.", + "mydspace.messages.no-content": "İçerik yok.", + + // "mydspace.messages.no-messages": "No messages yet.", + "mydspace.messages.no-messages": "Henüz mesaj yok.", + + // "mydspace.messages.send-btn": "Send", + "mydspace.messages.send-btn": "Gönder", + + // "mydspace.messages.show-msg": "Show message", + "mydspace.messages.show-msg": "Mesajı göster", + + // "mydspace.messages.subject-placeholder": "Subject...", + "mydspace.messages.subject-placeholder": "Konu...", + + // "mydspace.messages.submitter-help": "Select this option to send a message to controller.", + "mydspace.messages.submitter-help": "Kontrolöre mesaj göndermek için bu seçeneği seçin.", + + // "mydspace.messages.title": "Messages", + "mydspace.messages.title": "Mesajlar", + + // "mydspace.messages.to": "To", + "mydspace.messages.to": "-e", + + // "mydspace.new-submission": "New submission", + "mydspace.new-submission": "Yeni talep", + + // "mydspace.new-submission-external": "Import metadata from external source", + "mydspace.new-submission-external": "Harici kaynaktan metadataları içe aktar", + + // "mydspace.new-submission-external-short": "Import metadata", + "mydspace.new-submission-external-short": "Metadataları içeri aktar.", + + // "mydspace.results.head": "Your submissions", + "mydspace.results.head": "Gönderimleriniz", + + // "mydspace.results.no-abstract": "No Abstract", + "mydspace.results.no-abstract": "Özet yok", + + // "mydspace.results.no-authors": "No Authors", + "mydspace.results.no-authors": "Yazar yok.", + + // "mydspace.results.no-collections": "No Collections", + "mydspace.results.no-collections": "Koleksiyon yok", + + // "mydspace.results.no-date": "No Date", + "mydspace.results.no-date": "Tarih yok", + + // "mydspace.results.no-files": "No Files", + "mydspace.results.no-files": "Dosya yok", + + // "mydspace.results.no-results": "There were no items to show", + "mydspace.results.no-results": "Gösterilecek öğe yok.", + + // "mydspace.results.no-title": "No title", + "mydspace.results.no-title": "Başlık yok", + + // "mydspace.results.no-uri": "No Uri", + "mydspace.results.no-uri": "Uri yok", + + // "mydspace.show.workflow": "All tasks", + "mydspace.show.workflow": "Tüm görevler", + + // "mydspace.show.workspace": "Your Submissions", + "mydspace.show.workspace": "Gönderimleriniz", + + // "mydspace.status.archived": "Archived", + "mydspace.status.archived": "Arşivlendi", + + // "mydspace.status.validation": "Validation", + "mydspace.status.validation": "Doğrulama", + + // "mydspace.status.waiting-for-controller": "Waiting for controller", + "mydspace.status.waiting-for-controller": "Kontrolör bekleniyor", + + // "mydspace.status.workflow": "Workflow", + "mydspace.status.workflow": "İş akışı", + + // "mydspace.status.workspace": "Workspace", + "mydspace.status.workspace": "Çalışma alanı", + + // "mydspace.title": "MyDSpace", + "mydspace.title": "MyDSpace", + + // "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", + "mydspace.upload.upload-failed": "Yeni çalışma alanı oluşturulurken hata oluştu. Lütfen yeniden denemeden önce yüklenen içeriği doğrulayın.", + + // "mydspace.upload.upload-failed-manyentries": "Unprocessable file. Detected too many entries but allowed only one for file.", + "mydspace.upload.upload-failed-manyentries": "İşlenemeyen dosya. Çok fazla giriş algılandı fakat dosya için yalnızca bir girişe izin verildi.", + + // "mydspace.upload.upload-failed-moreonefile": "Unprocessable request. Only one file is allowed.", + "mydspace.upload.upload-failed-moreonefile": "İşlenemeyen istek. Yalnızca bir dosyaya izin verilir.", + + // "mydspace.upload.upload-multiple-successful": "{{qty}} new workspace items created.", + "mydspace.upload.upload-multiple-successful": "{{qty}} yeni çalışma alanı öğeleri oluşturuldu.", + + // "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", + "mydspace.upload.upload-successful": "Yeni çalışma alanı öğesi oluşturuldu. Düzenlemek için {{here}} tıklayın.", + + // "mydspace.view-btn": "View", + "mydspace.view-btn": "Görünüm", + + + + // "nav.browse.header": "All of DSpace", + "nav.browse.header": "DSpace'in tümü", + + // "nav.community-browse.header": "By Community", + "nav.community-browse.header": "Komünite tarafından", + + // "nav.language": "Language switch", + "nav.language": "Dil değiştirme", + + // "nav.login": "Log In", + "nav.login": "Giriş yap", + + // "nav.logout": "Log Out", + "nav.logout": "Çıkış yap", + + // "nav.mydspace": "MyDSpace", + "nav.mydspace": "BenimDSpace'im", + + // "nav.profile": "Profile", + "nav.profile": "Profil", + + // "nav.search": "Search", + "nav.search": "Arama", + + // "nav.statistics.header": "Statistics", + "nav.statistics.header": "İstatistik", + + // "nav.stop-impersonating": "Stop impersonating EPerson", + "nav.stop-impersonating": "EPerson'ı taklit etmeyi bırakın", + + + + // "orgunit.listelement.badge": "Organizational Unit", + "orgunit.listelement.badge": "Organizasyon Birimi", + + // "orgunit.page.city": "City", + "orgunit.page.city": "Şehir", + + // "orgunit.page.country": "Country", + "orgunit.page.country": "Ülke", + + // "orgunit.page.dateestablished": "Date established", + "orgunit.page.dateestablished": "Kuruluş tarihi", + + // "orgunit.page.description": "Description", + "orgunit.page.description": "Açıklama", + + // "orgunit.page.edit": "Edit this item", + "orgunit.page.edit": "Bu öğeyi düzenle", + + // "orgunit.page.id": "ID", + "orgunit.page.id": "Kimlik", + + // "orgunit.page.titleprefix": "Organizational Unit: ", + "orgunit.page.titleprefix": "Organizasyon Birimi: ", + + + + // "pagination.results-per-page": "Results Per Page", + "pagination.results-per-page": "Sayfa başına sonuç", + + // "pagination.showing.detail": "{{ range }} of {{ total }}", + "pagination.showing.detail": "{{ range }} / {{ total }}", + + // "pagination.showing.label": "Now showing ", + "pagination.showing.label": "Şimdi gösteriliyor ", + + // "pagination.sort-direction": "Sort Options", + "pagination.sort-direction": "Sıralama Seçenekleri", + + + + // "person.listelement.badge": "Person", + "person.listelement.badge": "Kişi", + + // "person.listelement.no-title": "No name found", + "person.listelement.no-title": "İsim bulunamadı", + + // "person.page.birthdate": "Birth Date", + "person.page.birthdate": "Doğum Tarihi", + + // "person.page.edit": "Edit this item", + "person.page.edit": "Bu öğeyi düzenle", + + // "person.page.email": "Email Address", + "person.page.email": "E-posta Adresi", + + // "person.page.firstname": "First Name", + "person.page.firstname": "Ad", + + // "person.page.jobtitle": "Job Title", + "person.page.jobtitle": "İş Adı", + + // "person.page.lastname": "Last Name", + "person.page.lastname": "Soyad", + + // "person.page.link.full": "Show all metadata", + "person.page.link.full": "Tüm metadata'yı göster", + + // "person.page.orcid": "ORCID", + "person.page.orcid": "ORCID", + + // "person.page.staffid": "Staff ID", + "person.page.staffid": "Personel Kimliği", + + // "person.page.titleprefix": "Person: ", + "person.page.titleprefix": "Kişi: ", + + // "person.search.results.head": "Person Search Results", + "person.search.results.head": "Kişi Arama Sonuçları", + + // "person.search.title": "DSpace Angular :: Person Search", + "person.search.title": "DSpace Angular :: Kişi Arama", + + + + // "process.new.select-parameters": "Parameters", + "process.new.select-parameters": "Parametreler", + + // "process.new.cancel": "Cancel", + "process.new.cancel": "İptal etmek", + + // "process.new.submit": "Submit", + "process.new.submit": "Göndermek", + + // "process.new.select-script": "Script", + "process.new.select-script": "Betik", + + // "process.new.select-script.placeholder": "Choose a script...", + "process.new.select-script.placeholder": "Betik Seçiniz...", + + // "process.new.select-script.required": "Script is required", + "process.new.select-script.required": "Betik gerekli", + + // "process.new.parameter.file.upload-button": "Select file...", + "process.new.parameter.file.upload-button": "Dosya seç...", + + // "process.new.parameter.file.required": "Please select a file", + "process.new.parameter.file.required": "Lütfen dosya seçiniz.", + + // "process.new.parameter.string.required": "Parameter value is required", + "process.new.parameter.string.required": "Parametre değeri gerekli", + + // "process.new.parameter.type.value": "value", + "process.new.parameter.type.value": "Değer", + + // "process.new.parameter.type.file": "file", + "process.new.parameter.type.file": "dosya", + + // "process.new.parameter.required.missing": "The following parameters are required but still missing:", + "process.new.parameter.required.missing": "Aşağıdaki parametreler gerekli ancak yine de eksik:", + + // "process.new.notification.success.title": "Success", + "process.new.notification.success.title": "Başarı", + + // "process.new.notification.success.content": "The process was successfully created", + "process.new.notification.success.content": "Süreç başarıyla oluşturuldu", + + // "process.new.notification.error.title": "Error", + "process.new.notification.error.title": "Hata", + + // "process.new.notification.error.content": "An error occurred while creating this process", + "process.new.notification.error.content": "Bu süreç oluşturulurken bir hata oluştu", + + // "process.new.header": "Create a new process", + "process.new.header": "Yeni bir süreç oluştur", + + // "process.new.title": "Create a new process", + "process.new.title": "Yeni bir süreç oluştur", + + // "process.new.breadcrumbs": "Create a new process", + "process.new.breadcrumbs": "Yeni bir süreç oluştur", + + + + // "process.detail.arguments" : "Arguments", + "process.detail.arguments" : "Argümanlar", + + // "process.detail.arguments.empty" : "This process doesn't contain any arguments", + "process.detail.arguments.empty" : "Bu süreç herhangi bir argüman içermiyor", + + // "process.detail.back" : "Back", + "process.detail.back" : "Geri", + + // "process.detail.output" : "Process Output", + "process.detail.output" : "Süreç Çıktısı", + + // "process.detail.logs.button": "Retrieve process output", + "process.detail.logs.button": "Süreç çıktısını geri al", + + // "process.detail.logs.loading": "Retrieving", + "process.detail.logs.loading": "Geri almak", + + // "process.detail.logs.none": "This process has no output", + "process.detail.logs.none": "Bu sürecin çıktısı yok", + + // "process.detail.output-files" : "Output Files", + "process.detail.output-files" : "Çıktı dosyaları", + + // "process.detail.output-files.empty" : "This process doesn't contain any output files", + "process.detail.output-files.empty" : "Bu süreç herhangi bir çıktı dosyası içermiyor", + + // "process.detail.script" : "Script", + "process.detail.script" : "Betik", + + // "process.detail.title" : "Process: {{ id }} - {{ name }}", + "process.detail.title" : "Süreç: {{ id }} - {{ name }}", + + // "process.detail.start-time" : "Start time", + "process.detail.start-time" : "Başlangıç saati", + + // "process.detail.end-time" : "Finish time", + "process.detail.end-time" : "Bitiş zamanı", + + // "process.detail.status" : "Status", + "process.detail.status" : "Durum", + + // "process.detail.create" : "Create similar process", + "process.detail.create" : "Benzer süreç oluştur", + + + + // "process.overview.table.finish" : "Finish time", + "process.overview.table.finish" : "Bitiş zamanı", + + // "process.overview.table.id" : "Process ID", + "process.overview.table.id" : "Süreç kimliği", + + // "process.overview.table.name" : "Name", + "process.overview.table.name" : "Ad", + + // "process.overview.table.start" : "Start time", + "process.overview.table.start" : "Başlangıç zamanı", + + // "process.overview.table.status" : "Status", + "process.overview.table.status" : "Durum", + + // "process.overview.table.user" : "User", + "process.overview.table.user" : "Kullanıcı", + + // "process.overview.title": "Processes Overview", + "process.overview.title": "Süreçlere Genel Bakış", + + // "process.overview.breadcrumbs": "Processes Overview", + "process.overview.breadcrumbs": "Süreçlere Genel Bakış", + + // "process.overview.new": "New", + "process.overview.new": "Yeni", + + + // "profile.breadcrumbs": "Update Profile", + "profile.breadcrumbs": "Profili Güncelle", + + // "profile.card.identify": "Identify", + "profile.card.identify": "Kimlik", + + // "profile.card.security": "Security", + "profile.card.security": "Güvenlik", + + // "profile.form.submit": "Update Profile", + "profile.form.submit": "Profili Güncelle", + + // "profile.groups.head": "Authorization groups you belong to", + "profile.groups.head": "Ait olduğunuz yetkilendirme grupları", + + // "profile.head": "Update Profile", + "profile.head": "Profili Güncelle", + + // "profile.metadata.form.error.firstname.required": "First Name is required", + "profile.metadata.form.error.firstname.required": "Ad gereklidir", + + // "profile.metadata.form.error.lastname.required": "Last Name is required", + "profile.metadata.form.error.lastname.required": "Soyadı gerekli", + + // "profile.metadata.form.label.email": "Email Address", + "profile.metadata.form.label.email": "E-posta Adresi", + + // "profile.metadata.form.label.firstname": "First Name", + "profile.metadata.form.label.firstname": "Ad", + + // "profile.metadata.form.label.language": "Language", + "profile.metadata.form.label.language": "Dil", + + // "profile.metadata.form.label.lastname": "Last Name", + "profile.metadata.form.label.lastname": "Soyadı", + + // "profile.metadata.form.label.phone": "Contact Telephone", + "profile.metadata.form.label.phone": "İletişim telefonu", + + // "profile.metadata.form.notifications.success.content": "Your changes to the profile were saved.", + "profile.metadata.form.notifications.success.content": "Profilde yaptığınız değişiklikler kaydedildi.", + + // "profile.metadata.form.notifications.success.title": "Profile saved", + "profile.metadata.form.notifications.success.title": "Profil kaydedildi", + + // "profile.notifications.warning.no-changes.content": "No changes were made to the Profile.", + "profile.notifications.warning.no-changes.content": "Profilde herhangi bir değişiklik yapılmadı.", + + // "profile.notifications.warning.no-changes.title": "No changes", + "profile.notifications.warning.no-changes.title": "Değişiklik yok", + + // "profile.security.form.error.matching-passwords": "The passwords do not match.", + "profile.security.form.error.matching-passwords": "Parolalar eşleşmiyor.", + + // "profile.security.form.error.password-length": "The password should be at least 6 characters long.", + "profile.security.form.error.password-length": "Parola en az 6 karakter uzunluğunda olmalıdır.", + + // "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.", + "profile.security.form.info": "İsteğe bağlı olarak aşağıdaki kutucuğa yeni bir parola girebilir ve ikinci kutucuğa tekrar yazarak onaylayabilirsiniz. En az altı karakter uzunluğunda olmalıdır.", + + // "profile.security.form.label.password": "Password", + "profile.security.form.label.password": "Parola", + + // "profile.security.form.label.passwordrepeat": "Retype to confirm", + "profile.security.form.label.passwordrepeat": "Doğrulamak için yeniden yazınız", + + // "profile.security.form.notifications.success.content": "Your changes to the password were saved.", + "profile.security.form.notifications.success.content": "Parola değişiklikleriniz kaydedildi.", + + // "profile.security.form.notifications.success.title": "Password saved", + "profile.security.form.notifications.success.title": "Parola kaydedildi", + + // "profile.security.form.notifications.error.title": "Error changing passwords", + "profile.security.form.notifications.error.title": "Parolalar değiştirilirken hata oluştu", + + // "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", + "profile.security.form.notifications.error.not-long-enough": "Parola en az 6 karakter uzunluğunda olmalıdır.", + + // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", + "profile.security.form.notifications.error.not-same": "Sağlanan parolalar aynı değil.", + + // "profile.title": "Update Profile", + "profile.title": "Profili Güncelle", + + + + // "project.listelement.badge": "Research Project", + "project.listelement.badge": "Araştırma projesi", + + // "project.page.contributor": "Contributors", + "project.page.contributor": "Katkıda Bulunanlar", + + // "project.page.description": "Description", + "project.page.description": "Açıklama", + + // "project.page.edit": "Edit this item", + "project.page.edit": "Bu öğeyi düzenle", + + // "project.page.expectedcompletion": "Expected Completion", + "project.page.expectedcompletion": "Beklenen Tamamlanma", + + // "project.page.funder": "Funders", + "project.page.funder": "Fon Sağlayıcılar", + + // "project.page.id": "ID", + "project.page.id": "Kimlik", + + // "project.page.keyword": "Keywords", + "project.page.keyword": "Anahtar kelimeler", + + // "project.page.status": "Status", + "project.page.status": "Durum", + + // "project.page.titleprefix": "Research Project: ", + "project.page.titleprefix": "Araştırma Projesi: ", + + // "project.search.results.head": "Project Search Results", + "project.search.results.head": "Proje Arama Sonuçları", + + + + // "publication.listelement.badge": "Publication", + "publication.listelement.badge": "Yayın", + + // "publication.page.description": "Description", + "publication.page.description": "Açıklama", + + // "publication.page.edit": "Edit this item", + "publication.page.edit": "Bu öğeyi düzenle", + + // "publication.page.journal-issn": "Journal ISSN", + "publication.page.journal-issn": "Dergi ISSN", + + // "publication.page.journal-title": "Journal Title", + "publication.page.journal-title": "Dergi Başlığı", + + // "publication.page.publisher": "Publisher", + "publication.page.publisher": "Yayımcı", + + // "publication.page.titleprefix": "Publication: ", + "publication.page.titleprefix": "Yayın: ", + + // "publication.page.volume-title": "Volume Title", + "publication.page.volume-title": "Cilt Başlığı", + + // "publication.search.results.head": "Publication Search Results", + "publication.search.results.head": "Yayın Arama Sonuçları", + + // "publication.search.title": "DSpace Angular :: Publication Search", + "publication.search.title": "DSpace Angular :: Yayın Arama", + + + // "register-email.title": "New user registration", + "register-email.title": "Yeni kullanıcı kaydı", + + // "register-page.create-profile.header": "Create Profile", + "register-page.create-profile.header": "Profil oluştur", + + // "register-page.create-profile.identification.header": "Identify", + "register-page.create-profile.identification.header": "Tanımlamak", + + // "register-page.create-profile.identification.email": "Email Address", + "register-page.create-profile.identification.email": "E-posta Adresi", + + // "register-page.create-profile.identification.first-name": "First Name *", + "register-page.create-profile.identification.first-name": "Ad *", + + // "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", + "register-page.create-profile.identification.first-name.error": "Lütfen bir ad girin", + + // "register-page.create-profile.identification.last-name": "Last Name *", + "register-page.create-profile.identification.last-name": "Soyadı *", + + // "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", + "register-page.create-profile.identification.last-name.error": "Lütfen bir soyadı girin", + + // "register-page.create-profile.identification.contact": "Contact Telephone", + "register-page.create-profile.identification.contact": "İletişim telefonu", + + // "register-page.create-profile.identification.language": "Language", + "register-page.create-profile.identification.language": "Dil", + + // "register-page.create-profile.security.header": "Security", + "register-page.create-profile.security.header": "Güvenlik", + + // "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.", + "register-page.create-profile.security.info": "Lütfen aşağıdaki kutuya bir parola girin ve ikinci kutuya tekrar yazarak onaylayın. En az altı karakter uzunluğunda olmalıdır.", + + // "register-page.create-profile.security.label.password": "Password *", + "register-page.create-profile.security.label.password": "Parola *", + + // "register-page.create-profile.security.label.passwordrepeat": "Retype to confirm *", + "register-page.create-profile.security.label.passwordrepeat": "Doğrulamak için yeniden yazınız *", + + // "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", + "register-page.create-profile.security.error.empty-password": "Lütfen aşağıdaki kutuya bir parola girin.", + + // "register-page.create-profile.security.error.matching-passwords": "The passwords do not match.", + "register-page.create-profile.security.error.matching-passwords": "Parolalar eşleşmiyor.", + + // "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", + "register-page.create-profile.security.error.password-length": "Parola en az 6 karakter uzunluğunda olmalıdır.", + + // "register-page.create-profile.submit": "Complete Registration", + "register-page.create-profile.submit": "Kaydı Tamamla", + + // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", + "register-page.create-profile.submit.error.content": "Yeni bir kullanıcı kaydedilirken bir şeyler ters gitti.", + + // "register-page.create-profile.submit.error.head": "Registration failed", + "register-page.create-profile.submit.error.head": "Kayıt başarısız", + + // "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", + "register-page.create-profile.submit.success.content": "Kayıt başarıyla tamamlandı. Oluşturulan kullanıcı olarak giriş yaptınız", + + // "register-page.create-profile.submit.success.head": "Registration completed", + "register-page.create-profile.submit.success.head": "Kayıt tamamlandı", + + + // "register-page.registration.header": "New user registration", + "register-page.registration.header": "Yeni kullanıcı kaydı", + + // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + "register-page.registration.info": "E-mail güncellemeleri için koleksiyonlara abone olup hesap açın. Ve DSapce’e yeni öğeler kaydetin.", + + // "register-page.registration.email": "Email Address *", + "register-page.registration.email": "E-posta Adresi *", + + // "register-page.registration.email.error.required": "Please fill in an email address", + "register-page.registration.email.error.required": "Lütfen bir e-posta adresi girin", + + // "register-page.registration.email.error.pattern": "Please fill in a valid email address", + "register-page.registration.email.error.pattern": "Lütfen geçerli bir email adresi girin", + + // "register-page.registration.email.hint": "This address will be verified and used as your login name.", + "register-page.registration.email.hint": "Bu adres doğrulanacak ve oturum açma adınız olarak kullanılacaktır.", + + // "register-page.registration.submit": "Register", + "register-page.registration.submit": "Kayıt olmak", + + // "register-page.registration.success.head": "Verification email sent", + "register-page.registration.success.head": "Doğrulama e-postası gönderildi", + + // "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + "register-page.registration.success.content": "{{ email }} adresine özel bir URL ve daha fazla talimat içeren bir e-posta gönderildi.", + + // "register-page.registration.error.head": "Error when trying to register email", + "register-page.registration.error.head": "E-posta kaydetmeye çalışırken hata", + + // "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", + "register-page.registration.error.content": "Aşağıdaki e-posta adresi kaydedilirken bir hata oluştu: {{ email }}", + + + + // "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", + "relationships.add.error.relationship-type.content": "İki öğe arasında {{ type }} ilişki türü için uygun bir eşleşme bulunamadı", + + // "relationships.add.error.server.content": "The server returned an error", + "relationships.add.error.server.content": "Sunucu bir hata verdi", + + // "relationships.add.error.title": "Unable to add relationship", + "relationships.add.error.title": "İlişki eklenemedi", + + // "relationships.isAuthorOf": "Authors", + "relationships.isAuthorOf": "Yazarlar", + + // "relationships.isAuthorOf.Person": "Authors (persons)", + "relationships.isAuthorOf.Person": "Yazarlar (kişiler)", + + // "relationships.isAuthorOf.OrgUnit": "Authors (organizational units)", + "relationships.isAuthorOf.OrgUnit": "Yazarlar (organizasyon birimleri)", + + // "relationships.isIssueOf": "Journal Issues", + "relationships.isIssueOf": "Dergi Sayıları", + + // "relationships.isJournalIssueOf": "Journal Issue", + "relationships.isJournalIssueOf": "Dergi Sayısı", + + // "relationships.isJournalOf": "Journals", + "relationships.isJournalOf": "Dergiler", + + // "relationships.isOrgUnitOf": "Organizational Units", + "relationships.isOrgUnitOf": "Organizasyon Birimleri", + + // "relationships.isPersonOf": "Authors", + "relationships.isPersonOf": "Yazarlar", + + // "relationships.isProjectOf": "Research Projects", + "relationships.isProjectOf": "Araştırma Projeleri", + + // "relationships.isPublicationOf": "Publications", + "relationships.isPublicationOf": "Yayınlar", + + // "relationships.isPublicationOfJournalIssue": "Articles", + "relationships.isPublicationOfJournalIssue": "Makaleler", + + // "relationships.isSingleJournalOf": "Journal", + "relationships.isSingleJournalOf": "Dergi", + + // "relationships.isSingleVolumeOf": "Journal Volume", + "relationships.isSingleVolumeOf": "Dergi Cilti", + + // "relationships.isVolumeOf": "Journal Volumes", + "relationships.isVolumeOf": "Dergi Ciltleri", + + // "relationships.isContributorOf": "Contributors", + "relationships.isContributorOf": "Katkıda Bulunanlar", + + + + // "resource-policies.add.button": "Add", + "resource-policies.add.button": "Ekle", + + // "resource-policies.add.for.": "Add a new policy", + "resource-policies.add.for.": "Yeni bir politika ekle", + + // "resource-policies.add.for.bitstream": "Add a new Bitstream policy", + "resource-policies.add.for.bitstream": "Yeni bir Bitstream ilkesi ekleyin", + + // "resource-policies.add.for.bundle": "Add a new Bundle policy", + "resource-policies.add.for.bundle": "Yeni bir Bundle ilkesi ekleyin", + + // "resource-policies.add.for.item": "Add a new Item policy", + "resource-policies.add.for.item": "Yeni bir öğe ilkesi ekleyin", + + // "resource-policies.add.for.community": "Add a new Community policy", + "resource-policies.add.for.community": "Yeni bir Komünite politikası ekle", + + // "resource-policies.add.for.collection": "Add a new Collection policy", + "resource-policies.add.for.collection": "Yeni bir Koleksiyon politikası ekle", + + // "resource-policies.create.page.heading": "Create new resource policy for ", + "resource-policies.create.page.heading": "Şunun için yeni kaynak ilkesi oluşturun: ", + + // "resource-policies.create.page.failure.content": "An error occurred while creating the resource policy.", + "resource-policies.create.page.failure.content": "Kaynak ilkesi oluşturulurken bir hata oluştu.", + + // "resource-policies.create.page.success.content": "Operation successful", + "resource-policies.create.page.success.content": "Operasyon başarılı", + + // "resource-policies.create.page.title": "Create new resource policy", + "resource-policies.create.page.title": "Yeni kaynak politikası oluştur", + + // "resource-policies.delete.btn": "Delete selected", + "resource-policies.delete.btn": "Seçileni sil", + + // "resource-policies.delete.btn.title": "Delete selected resource policies", + "resource-policies.delete.btn.title": "Seçili kaynak politikalarını sil", + + // "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", + "resource-policies.delete.failure.content": "Seçili kaynak ilkeleri silinirken bir hata oluştu.", + + // "resource-policies.delete.success.content": "Operation successful", + "resource-policies.delete.success.content": "İşlem başarılı", + + // "resource-policies.edit.page.heading": "Edit resource policy ", + "resource-policies.edit.page.heading": "Kaynak politikasını düzenle ", + + // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", + "resource-policies.edit.page.failure.content": "Kaynak ilkesi düzenlenirken bir hata oluştu.", + + // "resource-policies.edit.page.success.content": "Operation successful", + "resource-policies.edit.page.success.content": "İşlem başarılı", + + // "resource-policies.edit.page.title": "Edit resource policy", + "resource-policies.edit.page.title": "Kaynak politikasını düzenle", + + // "resource-policies.form.action-type.label": "Select the action type", + "resource-policies.form.action-type.label": "Eylem türünü seçin", + + // "resource-policies.form.action-type.required": "You must select the resource policy action.", + "resource-policies.form.action-type.required": "Kaynak ilkesi eylemini seçmelisiniz.", + + // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", + "resource-policies.form.eperson-group-list.label": "İzin verilecek e-kişi veya grup", + + // "resource-policies.form.eperson-group-list.select.btn": "Select", + "resource-policies.form.eperson-group-list.select.btn": "Seç", + + // "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", + "resource-policies.form.eperson-group-list.tab.eperson": "e-kişi arayın", + + // "resource-policies.form.eperson-group-list.tab.group": "Search for a group", + "resource-policies.form.eperson-group-list.tab.group": "Grup arayın", + + // "resource-policies.form.eperson-group-list.table.headers.action": "Action", + "resource-policies.form.eperson-group-list.table.headers.action": "Eylem", + + // "resource-policies.form.eperson-group-list.table.headers.id": "ID", + "resource-policies.form.eperson-group-list.table.headers.id": "Kimlik", + + // "resource-policies.form.eperson-group-list.table.headers.name": "Name", + "resource-policies.form.eperson-group-list.table.headers.name": "Ad", + + // "resource-policies.form.date.end.label": "End Date", + "resource-policies.form.date.end.label": "Bitiş Tarihi", + + // "resource-policies.form.date.start.label": "Start Date", + "resource-policies.form.date.start.label": "Başlangıç tarihi", + + // "resource-policies.form.description.label": "Description", + "resource-policies.form.description.label": "Açıklama", + + // "resource-policies.form.name.label": "Name", + "resource-policies.form.name.label": "Ad", + + // "resource-policies.form.policy-type.label": "Select the policy type", + "resource-policies.form.policy-type.label": "Politika türünü seçin", + + // "resource-policies.form.policy-type.required": "You must select the resource policy type.", + "resource-policies.form.policy-type.required": "Kaynak ilkesi türünü seçmelisiniz.", + + // "resource-policies.table.headers.action": "Action", + "resource-policies.table.headers.action": "Eylem", + + // "resource-policies.table.headers.date.end": "End Date", + "resource-policies.table.headers.date.end": "Bitiş tarihi", + + // "resource-policies.table.headers.date.start": "Start Date", + "resource-policies.table.headers.date.start": "Başlangıç Tarihi", + + // "resource-policies.table.headers.edit": "Edit", + "resource-policies.table.headers.edit": "Düzenle", + + // "resource-policies.table.headers.edit.group": "Edit group", + "resource-policies.table.headers.edit.group": "Grubu düzenle", + + // "resource-policies.table.headers.edit.policy": "Edit policy", + "resource-policies.table.headers.edit.policy": "Politikayı düzenle", + + // "resource-policies.table.headers.eperson": "E-kişi", + "resource-policies.table.headers.eperson": "E-kişi", + + // "resource-policies.table.headers.group": "Grup", + "resource-policies.table.headers.group": "Grup", + + // "resource-policies.table.headers.id": "ID", + "resource-policies.table.headers.id": "Kimlik", + + // "resource-policies.table.headers.name": "Name", + "resource-policies.table.headers.name": "Ad", + + // "resource-policies.table.headers.policyType": "type", + "resource-policies.table.headers.policyType": "tür", + + // "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", + "resource-policies.table.headers.title.for.bitstream": "BitStream Politikaları", + + // "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", + "resource-policies.table.headers.title.for.bundle": "Bundle Politikaları", + + // "resource-policies.table.headers.title.for.item": "Policies for Item", + "resource-policies.table.headers.title.for.item": "Öğe Politikaları", + + // "resource-policies.table.headers.title.for.community": "Policies for Community", + "resource-policies.table.headers.title.for.community": "Komünite Politikaları", + + // "resource-policies.table.headers.title.for.collection": "Policies for Collection", + "resource-policies.table.headers.title.for.collection": "Koleksiyon Politikaları", + + + + // "search.description": "", + "search.description": "", + + // "search.switch-configuration.title": "Show", + "search.switch-configuration.title": "Göster", + + // "search.title": "DSpace Angular :: Search", + "search.title": "DSpace Angular :: Ara", + + // "search.breadcrumbs": "Search", + "search.breadcrumbs": "Ara", + + + // "search.filters.applied.f.author": "Author", + "search.filters.applied.f.author": "Yazar", + + // "search.filters.applied.f.dateIssued.max": "End date", + "search.filters.applied.f.dateIssued.max": "Bitiş tarihi", + + // "search.filters.applied.f.dateIssued.min": "Start date", + "search.filters.applied.f.dateIssued.min": "Başlangıç Tarihi", + + // "search.filters.applied.f.dateSubmitted": "Date submitted", + "search.filters.applied.f.dateSubmitted": "Gönderilme tarihi", + + // "search.filters.applied.f.discoverable": "Private", + "search.filters.applied.f.discoverable": "Özel", + + // "search.filters.applied.f.entityType": "Item Type", + "search.filters.applied.f.entityType": "Öğe Türü", + + // "search.filters.applied.f.has_content_in_original_bundle": "Has files", + "search.filters.applied.f.has_content_in_original_bundle": "Has dosyaları", + + // "search.filters.applied.f.itemtype": "Type", + "search.filters.applied.f.itemtype": "Tür", + + // "search.filters.applied.f.namedresourcetype": "Status", + "search.filters.applied.f.namedresourcetype": "Durum", + + // "search.filters.applied.f.subject": "Subject", + "search.filters.applied.f.subject": "Konu", + + // "search.filters.applied.f.submitter": "Submitter", + "search.filters.applied.f.submitter": "Gönderen", + + // "search.filters.applied.f.jobTitle": "Job Title", + "search.filters.applied.f.jobTitle": "İş Adı", + + // "search.filters.applied.f.birthDate.max": "End birth date", + "search.filters.applied.f.birthDate.max": "Doğum Tarih Sonu", + + // "search.filters.applied.f.birthDate.min": "Start birth date", + "search.filters.applied.f.birthDate.min": "Doğum Tarih Başlangıcı", + + // "search.filters.applied.f.withdrawn": "Withdrawn", + "search.filters.applied.f.withdrawn": "Geri çekildi", + + + + // "search.filters.filter.author.head": "Author", + "search.filters.filter.author.head": "Yazar", + + // "search.filters.filter.author.placeholder": "Author name", + "search.filters.filter.author.placeholder": "Yazar adı", + + // "search.filters.filter.birthDate.head": "Birth Date", + "search.filters.filter.birthDate.head": "Doğum Tarihi", + + // "search.filters.filter.birthDate.placeholder": "Birth Date", + "search.filters.filter.birthDate.placeholder": "Doğum Tarihi", + + // "search.filters.filter.creativeDatePublished.head": "Date Published", + "search.filters.filter.creativeDatePublished.head": "Yayınlanma Tarihi", + + // "search.filters.filter.creativeDatePublished.placeholder": "Date Published", + "search.filters.filter.creativeDatePublished.placeholder": "Yayınlanma Tarihi", + + // "search.filters.filter.creativeWorkEditor.head": "Editor", + "search.filters.filter.creativeWorkEditor.head": "Editör", + + // "search.filters.filter.creativeWorkEditor.placeholder": "Editor", + "search.filters.filter.creativeWorkEditor.placeholder": "Editör", + + // "search.filters.filter.creativeWorkKeywords.head": "Subject", + "search.filters.filter.creativeWorkKeywords.head": "Konu", + + // "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", + "search.filters.filter.creativeWorkKeywords.placeholder": "Konu", + + // "search.filters.filter.creativeWorkPublisher.head": "Publisher", + "search.filters.filter.creativeWorkPublisher.head": "Yayımcı", + + // "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", + "search.filters.filter.creativeWorkPublisher.placeholder": "Yayımcı", + + // "search.filters.filter.dateIssued.head": "Date", + "search.filters.filter.dateIssued.head": "Tarih", + + // "search.filters.filter.dateIssued.max.placeholder": "Minimum Date", + "search.filters.filter.dateIssued.max.placeholder": "En Erken Tarih", + + // "search.filters.filter.dateIssued.min.placeholder": "Maximum Date", + "search.filters.filter.dateIssued.min.placeholder": "En Geç Tarih", + + // "search.filters.filter.dateSubmitted.head": "Date submitted", + "search.filters.filter.dateSubmitted.head": "Teslim Edilen Tarih", + + // "search.filters.filter.dateSubmitted.placeholder": "Date submitted", + "search.filters.filter.dateSubmitted.placeholder": "Teslim Edilen Tarih", + + // "search.filters.filter.discoverable.head": "Private", + "search.filters.filter.discoverable.head": "Özel", + + // "search.filters.filter.withdrawn.head": "Withdrawn", + "search.filters.filter.withdrawn.head": "Alınmış", + + // "search.filters.filter.entityType.head": "Item Type", + "search.filters.filter.entityType.head": "Materyal Türü", + + // "search.filters.filter.entityType.placeholder": "Item Type", + "search.filters.filter.entityType.placeholder": "Materyal Türü", + + // "search.filters.filter.has_content_in_original_bundle.head": "Has files", + "search.filters.filter.has_content_in_original_bundle.head": "Dosyalara Sahip", + + // "search.filters.filter.itemtype.head": "Type", + "search.filters.filter.itemtype.head": "Tür", + + // "search.filters.filter.itemtype.placeholder": "Type", + "search.filters.filter.itemtype.placeholder": "Tür", + + // "search.filters.filter.jobTitle.head": "Job Title", + "search.filters.filter.jobTitle.head": "İş Ünvanı", + + // "search.filters.filter.jobTitle.placeholder": "Job Title", + "search.filters.filter.jobTitle.placeholder": "İş Ünvanı", + + // "search.filters.filter.knowsLanguage.head": "Known language", + "search.filters.filter.knowsLanguage.head": "Bilinen Diller", + + // "search.filters.filter.knowsLanguage.placeholder": "Known language", + "search.filters.filter.knowsLanguage.placeholder": "Bilinen Diller", + + // "search.filters.filter.namedresourcetype.head": "Status", + "search.filters.filter.namedresourcetype.head": "Durum", + + // "search.filters.filter.namedresourcetype.placeholder": "Status", + "search.filters.filter.namedresourcetype.placeholder": "Durum", + + // "search.filters.filter.objectpeople.head": "People", + "search.filters.filter.objectpeople.head": "İnsanlar", + + // "search.filters.filter.objectpeople.placeholder": "People", + "search.filters.filter.objectpeople.placeholder": "İnsanlar", + + // "search.filters.filter.organizationAddressCountry.head": "Country", + "search.filters.filter.organizationAddressCountry.head": "Ülke", + + // "search.filters.filter.organizationAddressCountry.placeholder": "Country", + "search.filters.filter.organizationAddressCountry.placeholder": "Ülke", + + // "search.filters.filter.organizationAddressLocality.head": "City", + "search.filters.filter.organizationAddressLocality.head": "Şehir", + + // "search.filters.filter.organizationAddressLocality.placeholder": "City", + "search.filters.filter.organizationAddressLocality.placeholder": "Şehir", + + // "search.filters.filter.organizationFoundingDate.head": "Date Founded", + "search.filters.filter.organizationFoundingDate.head": "Bulunduğu Tarih", + + // "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", + "search.filters.filter.organizationFoundingDate.placeholder": "Bulunduğu Tarih", + + // "search.filters.filter.scope.head": "Scope", + "search.filters.filter.scope.head": "Kapsam", + + // "search.filters.filter.scope.placeholder": "Scope filter", + "search.filters.filter.scope.placeholder": "Kapsam Filtresi", + + // "search.filters.filter.show-less": "Collapse", + "search.filters.filter.show-less": "Yığılmış", + + // "search.filters.filter.show-more": "Show more", + "search.filters.filter.show-more": "Daha Fazla Göster", + + // "search.filters.filter.subject.head": "Subject", + "search.filters.filter.subject.head": "Konu", + + // "search.filters.filter.subject.placeholder": "Subject", + "search.filters.filter.subject.placeholder": "Konu", + + // "search.filters.filter.submitter.head": "Submitter", + "search.filters.filter.submitter.head": "Teslim Eden", + + // "search.filters.filter.submitter.placeholder": "Submitter", + "search.filters.filter.submitter.placeholder": "Teslim Eden", + + + + // "search.filters.entityType.JournalIssue": "Journal Issue", + "search.filters.entityType.JournalIssue": "Makale Konusu", + + // "search.filters.entityType.JournalVolume": "Journal Volume", + "search.filters.entityType.JournalVolume": "Cilt Sayısı", + + // "search.filters.entityType.OrgUnit": "Organizational Unit", + "search.filters.entityType.OrgUnit": "Ait Olduğu Organizasyon", + + // "search.filters.has_content_in_original_bundle.true": "Yes", + "search.filters.has_content_in_original_bundle.true": "Evet", + + // "search.filters.has_content_in_original_bundle.false": "No", + "search.filters.has_content_in_original_bundle.false": "Hayır", + + // "search.filters.discoverable.true": "No", + "search.filters.discoverable.true": "Hayır", + + // "search.filters.discoverable.false": "Yes", + "search.filters.discoverable.false": "Evet", + + // "search.filters.withdrawn.true": "Yes", + "search.filters.withdrawn.true": "Evet", + + // "search.filters.withdrawn.false": "No", + "search.filters.withdrawn.false": "Hayır", + + + // "search.filters.head": "Filters", + "search.filters.head": "Filtreler", + + // "search.filters.reset": "Reset filters", + "search.filters.reset": "Filtreleri Sıfırla", + + + + // "search.form.search": "Search", + "search.form.search": "Ara", + + // "search.form.search_dspace": "Search DSpace", + "search.form.search_dspace": "DSpace içinde Ara", + + // "search.form.search_mydspace": "Search MyDSpace", + "search.form.search_mydspace": "MyDSpace içinde Ara", + + + + // "search.results.head": "Search Results", + "search.results.head": "Sonuçları Ara", + + // "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", + "search.results.no-results": "Aramanız hiçbir sonuç vermedi. Aradığınızı bulmakta sorun mu yaşıyorsunuz? Bir daha deneyin.", + + // "search.results.no-results-link": "quotes around it", + "search.results.no-results-link": "Çevresindeki Alıntılar", + + // "search.results.empty": "Your search returned no results.", + "search.results.empty": "Aramanız hiçbir sonuç vermedi.", + + + + // "search.sidebar.close": "Back to results", + "search.sidebar.close": "Sonuçlara Dön", + + // "search.sidebar.filters.title": "Filters", + "search.sidebar.filters.title": "Filtreler", + + // "search.sidebar.open": "Search Tools", + "search.sidebar.open": "Araç Gereç Ara", + + // "search.sidebar.results": "results", + "search.sidebar.results": "Sonuçlar", + + // "search.sidebar.settings.rpp": "Results per page", + "search.sidebar.settings.rpp": "Sayfa Sonuçları", + + // "search.sidebar.settings.sort-by": "Sort By", + "search.sidebar.settings.sort-by": "Göre Sıralanmış", + + // "search.sidebar.settings.title": "Settings", + "search.sidebar.settings.title": "Ayarlar", + + + + // "search.view-switch.show-detail": "Show detail", + "search.view-switch.show-detail": "Detayları Göster", + + // "search.view-switch.show-grid": "Show as grid", + "search.view-switch.show-grid": "Ağ Dizge Olarak Göster", + + // "search.view-switch.show-list": "Show as list", + "search.view-switch.show-list": "Liste Olarak Göster", + + + + // "sorting.ASC": "Ascending", + "sorting.ASC": "Artan", + + // "sorting.DESC": "Descending", + "sorting.DESC": "Azalan", + + // "sorting.dc.title.ASC": "Title Ascending", + "sorting.dc.title.ASC": "Artan Başlıklar", + + // "sorting.dc.title.DESC": "Title Descending", + "sorting.dc.title.DESC": "Azalan Başlıklar", + + // "sorting.score.DESC": "Relevance", + "sorting.score.DESC": "Bağıntılı", + + + + // "statistics.title": "Statistics", + "statistics.title": "İstatistikler", + + // "statistics.header": "Statistics for {{ scope }}", + "statistics.header": "{{ scope }} için İstatistikler", + + // "statistics.breadcrumbs": "Statistics", + "statistics.breadcrumbs": "İstatistikler", + + // "statistics.page.no-data": "No data available", + "statistics.page.no-data": "Data Bulunamadı.", + + // "statistics.table.no-data": "No data available", + "statistics.table.no-data": "Data Bulunamadı.", + + // "statistics.table.title.TotalVisits": "Total visits", + "statistics.table.title.TotalVisits": "Toplam Ziyaretler", + + // "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", + "statistics.table.title.TotalVisitsPerMonth": "Aylık Toplam Ziyaretler", + + // "statistics.table.title.TotalDownloads": "File Visits", + "statistics.table.title.TotalDownloads": "Dosya Ziyaretleri", + + // "statistics.table.title.TopCountries": "Top country views", + "statistics.table.title.TopCountries": "En Çok Gösterilen Ülke", + + // "statistics.table.title.TopCities": "Top city views", + "statistics.table.title.TopCities": "En Çok Gösterilen Şehir", + + // "statistics.table.header.views": "Views", + "statistics.table.header.views": "Gösterilmeler", + + + + // "submission.edit.title": "Edit Submission", + "submission.edit.title": "Teslimi Düzenle", + + // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", + "submission.general.cannot_submit": "Yeni bir teslim yapamazsınız.", + + // "submission.general.deposit": "Deposit", + "submission.general.deposit": "Tamamla", + + // "submission.general.discard.confirm.cancel": "Cancel", + "submission.general.discard.confirm.cancel": "Vazgeç", + + // "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?", + "submission.general.discard.confirm.info": "Bu işlem geri alınamaz. Emin misiniz?", + + // "submission.general.discard.confirm.submit": "Yes, I'm sure", + "submission.general.discard.confirm.submit": "Evet eminim", + + // "submission.general.discard.confirm.title": "Discard submission", + "submission.general.discard.confirm.title": "Teslimi İptal Et", + + // "submission.general.discard.submit": "Discard", + "submission.general.discard.submit": "İptal", + + // "submission.general.save": "Save", + "submission.general.save": "Kaydet", + + // "submission.general.save-later": "Save for later", + "submission.general.save-later": "Sonrası İçin Kaydet", + + + // "submission.import-external.page.title": "Import metadata from an external source", + "submission.import-external.page.title": "Harici bir kaynaktan metadataları içe aktarın", + + // "submission.import-external.title": "Import metadata from an external source", + "submission.import-external.title": "Harici bir kaynaktan metadataları içe aktarın", + + // "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", + "submission.import-external.page.hint": "Web'den DSpace'e içe aktarılacak öğeleri bulmak için yukarıya bir sorgu girin.", + + // "submission.import-external.back-to-my-dspace": "Back to MyDSpace", + "submission.import-external.back-to-my-dspace": "MyDSpace'e Geri Dön", + + // "submission.import-external.search.placeholder": "Search the external source", + "submission.import-external.search.placeholder": "Dış Kaynaktan Ara", + + // "submission.import-external.search.button": "Search", + "submission.import-external.search.button": "Ara", + + // "submission.import-external.search.button.hint": "Write some words to search", + "submission.import-external.search.button.hint": "Aramak için Kelime Girin", + + // "submission.import-external.search.source.hint": "Pick an external source", + "submission.import-external.search.source.hint": "Dış Kaynak Seçin", + + // "submission.import-external.source.arxiv": "arXiv", + "submission.import-external.source.arxiv": "arXiv", + + // "submission.import-external.source.loading": "Loading ...", + "submission.import-external.source.loading": "Yükleniyor ...", + + // "submission.import-external.source.sherpaJournal": "SHERPA Journals", + "submission.import-external.source.sherpaJournal": "SHERPA Journals", + + // "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", + "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", + + // "submission.import-external.source.orcid": "ORCID", + "submission.import-external.source.orcid": "ORCID", + + // "submission.import-external.source.pubmed": "Pubmed", + "submission.import-external.source.pubmed": "Pubmed", + + // "submission.import-external.source.lcname": "Library of Congress Names", + "submission.import-external.source.lcname": "Kongre İsimleri Kütüphanesi", + + // "submission.import-external.preview.title": "Item Preview", + "submission.import-external.preview.title": "Materyal Önizlenimi", + + // "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", + "submission.import-external.preview.subtitle": "Aşağıdaki metadatalar harici bir kaynaktan içe aktarıldı. Gönderime başladığınızda önceden doldurulacaktır.", + + // "submission.import-external.preview.button.import": "Start submission", + "submission.import-external.preview.button.import": "Gönderimi Başlat", + + // "submission.import-external.preview.error.import.title": "Submission error", + "submission.import-external.preview.error.import.title": "Gönderim Sırasında Hata", + + // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", + "submission.import-external.preview.error.import.body": "Dış kaynak girişi içe aktarma işlemi sırasında bir hata oluştu.", + + // "submission.sections.describe.relationship-lookup.close": "Close", + "submission.sections.describe.relationship-lookup.close": "Kapat", + + // "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", + "submission.sections.describe.relationship-lookup.external-source.added": "Giriş seçime başarıyla eklendi", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Dış Kaynak Yazarı İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Dış Kaynak Makaleyi İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Dış Kaynak Makale Konusu İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Dış Kaynak Makale Cilt Sayısı İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Dış Kaynak Yazarı İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Yazar seçime başarıyla eklendi", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Successfully imported and added external author to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Harici yazar başarıyla içe aktarıldı ve seçime eklendi", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Authority", + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Yetkili", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Import as a new local authority entry", + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Yeni bir yerel yetkili girişi olarak içe aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", + "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "İptal", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", + "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Yeni girişleri içe aktarmak için bir koleksiyon seçin", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Varlıklar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Import as a new local entity", + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Yeni bir yerel varlık olarak içe aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "LC Adına göre İçe Aktar", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "ORCID'den İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Sherpa Journal'den İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Sherpa Publisher'den İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "PubMed'den İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "arXiv'den İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", + "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Makaleyi Dışardan İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": " Makale seçime başarıyla eklendi", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Harici makale başarıyla içe aktarıldı ve seçime eklendi", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Dış Kaynak Makale Konusu İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Dış Kaynak Makale Konusu Başarıyla İçe Aktarıldı.", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Başarıyla içe aktarıldı ve seçime harici makale sayısı eklendi", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Import Remote Journal Volume", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Dış Kaynak Makale Cilt Sayısı İçe Aktar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Dış Kaynak Makale Cilt Sayısı Başarıyla İçe Aktarıldı.", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Harici makale cilti başarıyla içe aktarıldı ve seçime eklendi", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", + "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Yerel Eşleşmeyi Seç", + + // "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", + "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Tümünü Seçmeyi Bırak", + + // "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", + "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Sayfa Seçimin Bırak", + + // "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", + "submission.sections.describe.relationship-lookup.search-tab.loading": "Yükleniyor...", + + // "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", + "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Arama Sorgusu", + + // "submission.sections.describe.relationship-lookup.search-tab.search": "Go", + "submission.sections.describe.relationship-lookup.search-tab.search": "Git", + + // "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", + "submission.sections.describe.relationship-lookup.search-tab.select-all": "Hepsini Seç", + + // "submission.sections.describe.relationship-lookup.search-tab.select-page": "Select page", + "submission.sections.describe.relationship-lookup.search-tab.select-page": "Sayfa Seç", + + // "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", + "submission.sections.describe.relationship-lookup.selected": "{{ size }} boyutundaki Seçili Materyaller ", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": " Yerel Yazarlar({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Yerel Makaleler ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Yerel Projeler ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Yerel Yayınlar ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Yerel Yazarlar ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Yerel Organizasyonlar({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Yerel Veri Paketleri ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Yerel Veri Dosyaları ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Yerel Makaleler ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Yerel Makale Konuları ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Yerel Makale Konuları ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Yerel Makale Cilt ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Yerel Makale Cilt ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Sherpa Publishers ({{ count }})", + "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 }})", + "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 }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Adları ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", + "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", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Finansman Kuruluşlarını Arama", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Finansman Arama", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Organizasyonları Arama", + + // "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", + "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Mevcut Seçim ({{ count }})", + + // "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", + "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Makale Konuları", + // "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", + "submission.sections.describe.relationship-lookup.title.JournalIssue": "Makale Konuları", + + // "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", + "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Makale Ciltleri", + // "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", + "submission.sections.describe.relationship-lookup.title.JournalVolume": "Makale Ciltleri", + + // "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", + "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Makaleler", + + // "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Authors", + "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Yazarlar", + + // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Finansman Kuruluşu", + // "submission.sections.describe.relationship-lookup.title.Project": "Projects", + "submission.sections.describe.relationship-lookup.title.Project": "Projeler", + + // "submission.sections.describe.relationship-lookup.title.Publication": "Publications", + "submission.sections.describe.relationship-lookup.title.Publication": "Yayınlar", + + // "submission.sections.describe.relationship-lookup.title.Person": "Authors", + "submission.sections.describe.relationship-lookup.title.Person": "Yazarlar", + + // "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", + "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizasyonlar", + + // "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", + "submission.sections.describe.relationship-lookup.title.DataPackage": "Veri Paketler", + + // "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", + "submission.sections.describe.relationship-lookup.title.DataFile": "Veri Dosyaları", + + // "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", + "submission.sections.describe.relationship-lookup.title.Funding Agency": "Finansman Kuruluşu", + + // "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", + "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Finansman", + + // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", + "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Ana Organizasyon", + + // "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", + "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Açılır menüyü aç/kapat", + + // "submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings", + "submission.sections.describe.relationship-lookup.selection-tab.settings": "Ayarlar", + + // "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", + "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Mevcut seçiminiz boş. ", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Authors", + "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Seçili Yazarlar", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Seçili Makaleler", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Seçili Makale Ciltleri", + // "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", + "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Seçili Projeler", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", + "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Seçili Yayınlar", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Authors", + "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Seçili Yazarlar", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", + "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Seçili Organizasyonlar", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", + "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Seçili Veri Paketleri", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Selected Data Files", + "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Seçili Veri Dosyaları", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", + "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Seçili Makaleler", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Seçili Makale Konuları", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Seçili Makale Ciltleri", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Seçili Finansman Kuruluşu", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Seçili Finansman", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Seçili Makale Konuları", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", + "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Seçili Organizasyonlar", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Sonuçları Ara", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Sonuçları Ara", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Sonuçları Ara", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Sonuçları Ara", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Sonuçları Ara", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Sonuçları Ara", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Sonuçları Ara", + + // "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.", + "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Bu kişi için \"{{ value }}\" ilerideki gönderilerde kullanılabilmek için Yeni İsim olarak kaydedilsin mi? Bunu yapmazsanız, yine de bu gönderim için kullanabilirsiniz .", + + // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", + "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Yeni İsim değişikliğini kaydet.", + + // "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", + "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Sadece bu gönderim için kullan.", + + // "submission.sections.ccLicense.type": "License Type", + "submission.sections.ccLicense.type": "Lisans Türü", + + // "submission.sections.ccLicense.select": "Select a license type…", + "submission.sections.ccLicense.select": "Lisans Türünü Seç…", + + // "submission.sections.ccLicense.change": "Change your license type…", + "submission.sections.ccLicense.change": "Lisans Türünü Değiştir…", + + // "submission.sections.ccLicense.none": "No licenses available", + "submission.sections.ccLicense.none": "Lisans Mevcut Değil", + + // "submission.sections.ccLicense.option.select": "Select an option…", + "submission.sections.ccLicense.option.select": "Seçenek Seç…", + + // "submission.sections.ccLicense.link": "You’ve selected the following license:", + "submission.sections.ccLicense.link": "Seçtiğiniz Lisans Türü:", + + // "submission.sections.ccLicense.confirmation": "I grant the license above", + "submission.sections.ccLicense.confirmation": "Yukarıdaki lisansı veriyorum", + + // "submission.sections.general.add-more": "Add more", + "submission.sections.general.add-more": "Ekle", + + // "submission.sections.general.collection": "Collection", + "submission.sections.general.collection": "Koleksiyon", + + // "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", + "submission.sections.general.deposit_error_notice": "Öğe gönderilirken bir sorun oluştu, lütfen daha sonra tekrar deneyin.", + + // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", + "submission.sections.general.deposit_success_notice": "Gönderim başarıyla yatırıldı.", + + // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", + "submission.sections.general.discard_error_notice": "Öğe gönderilirken bir sorun oluştu, lütfen daha sonra tekrar deneyin.", + + // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", + "submission.sections.general.discard_success_notice": "Gönderim başarıyla silindi.", + + // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", + "submission.sections.general.metadata-extracted": "Yeni metadatalar çıkarıldı ve {{sectionId}} bölümüne eklendi.", + + // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", + "submission.sections.general.metadata-extracted-new-section": "Gönderime yeni {{sectionId}} bölümü eklendi.", + + // "submission.sections.general.no-collection": "No collection found", + "submission.sections.general.no-collection": "Koleksiyon bulunamadı", + + // "submission.sections.general.no-sections": "No options available", + "submission.sections.general.no-sections": "Seçenekler Bulunamadı.", + + // "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", + "submission.sections.general.save_error_notice": "Öğe kaydedilirken bir sorun oluştu, lütfen daha sonra tekrar deneyin.", + + // "submission.sections.general.save_success_notice": "Submission saved successfully.", + "submission.sections.general.save_success_notice": "Gönderim başarıyla kaydedildi.", + + // "submission.sections.general.search-collection": "Search for a collection", + "submission.sections.general.search-collection": "Koleksiyon ara", + + // "submission.sections.general.sections_not_valid": "There are incomplete sections.", + "submission.sections.general.sections_not_valid": "Eksik bölümler var.", + + + + // "submission.sections.submit.progressbar.CClicense": "Creative commons license", + "submission.sections.submit.progressbar.CClicense": "Yaratıcı Ortak Lisansları", + + // "submission.sections.submit.progressbar.describe.recycle": "Recycle", + "submission.sections.submit.progressbar.describe.recycle": "Geri Dönüştür", + + // "submission.sections.submit.progressbar.describe.stepcustom": "Describe", + "submission.sections.submit.progressbar.describe.stepcustom": "Tanımla", + + // "submission.sections.submit.progressbar.describe.stepone": "Describe", + "submission.sections.submit.progressbar.describe.stepone": "Tanımla", + + // "submission.sections.submit.progressbar.describe.steptwo": "Describe", + "submission.sections.submit.progressbar.describe.steptwo": "Tanımla", + + // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", + "submission.sections.submit.progressbar.detect-duplicate": "Olası Kopyalar", + + // "submission.sections.submit.progressbar.license": "Deposit license", + "submission.sections.submit.progressbar.license": "Lisansı Yerleştir", + + // "submission.sections.submit.progressbar.upload": "Upload files", + "submission.sections.submit.progressbar.upload": "Dosyaları yükle", + + + + // "submission.sections.upload.delete.confirm.cancel": "Cancel", + "submission.sections.upload.delete.confirm.cancel": "İptal", + + // "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?", + "submission.sections.upload.delete.confirm.info": "Bu işlem geri alınamaz. Emin misin?", + + // "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", + "submission.sections.upload.delete.confirm.submit": "Evet eminim.", + + // "submission.sections.upload.delete.confirm.title": "Delete bitstream", + "submission.sections.upload.delete.confirm.title": "Bitstreamı Sil", + + // "submission.sections.upload.delete.submit": "Delete", + "submission.sections.upload.delete.submit": "Sil", + + // "submission.sections.upload.drop-message": "Drop files to attach them to the item", + "submission.sections.upload.drop-message": "Öğeye eklemek için dosyaları bırakın", + + // "submission.sections.upload.form.access-condition-label": "Access condition type", + "submission.sections.upload.form.access-condition-label": "Erişim Koşulu Türü", + + // "submission.sections.upload.form.date-required": "Date is required.", + "submission.sections.upload.form.date-required": "Tarih gerekli.", + + // "submission.sections.upload.form.from-label": "Grant access from", + "submission.sections.upload.form.from-label": "Şuradan erişim izni ver:", + + // "submission.sections.upload.form.from-placeholder": "From", + "submission.sections.upload.form.from-placeholder": "İtibaren", + + // "submission.sections.upload.form.group-label": "Group", + "submission.sections.upload.form.group-label": "Grup", + + // "submission.sections.upload.form.group-required": "Group is required.", + "submission.sections.upload.form.group-required": "Grup gerekli.", + + // "submission.sections.upload.form.until-label": "Grant access until", + "submission.sections.upload.form.until-label": "Şu tarihe kadar erişim izni ver:", + + // "submission.sections.upload.form.until-placeholder": "Until", + "submission.sections.upload.form.until-placeholder": "Kadar", + + // "submission.sections.upload.header.policy.default.nolist": "Uploaded files in the {{collectionName}} collection will be accessible according to the following group(s):", + "submission.sections.upload.header.policy.default.nolist": "{{collectionName}} koleksiyonuna yüklenen dosyalara aşağıdaki gruplara göre erişilebilir:", + + // "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):", + "submission.sections.upload.header.policy.default.withlist": "{{collectionName}} koleksiyonuna yüklenen dosyalara, tek dosya için açıkça karar verilenlere ek olarak aşağıdaki gruplarla erişilebilir olacağını lütfen unutmayın:", + + // "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", + "submission.sections.upload.info": "Burada, o anda öğede bulunan tüm dosyaları bulacaksınız. Dosya metadatalarını güncelleyebilir ve koşullara erişebilir veya sayfanın her yerine sürükleyip bırakarak ek dosyalar yükleyebilirsiniz", + + // "submission.sections.upload.no-entry": "No", + "submission.sections.upload.no-entry": "Hayır", + + // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", + "submission.sections.upload.no-file-uploaded": "Henüz dosya yüklenmedi.", + + // "submission.sections.upload.save-metadata": "Save metadata", + "submission.sections.upload.save-metadata": "Metadataları kaydet", + + // "submission.sections.upload.undo": "Cancel", + "submission.sections.upload.undo": "İptal", + + // "submission.sections.upload.upload-failed": "Upload failed", + "submission.sections.upload.upload-failed": "Yükleme Başarısız", + + // "submission.sections.upload.upload-successful": "Upload successful", + "submission.sections.upload.upload-successful": "Yükleme Başarılı", + + + + // "submission.submit.title": "Submission", + "submission.submit.title": "Gönder", + + + + // "submission.workflow.generic.delete": "Delete", + "submission.workflow.generic.delete": "Sil", + + // "submission.workflow.generic.delete-help": "If you would to discard this item, select \"Delete\". You will then be asked to confirm it.", + "submission.workflow.generic.delete-help": "Bu öğeyi atmak istiyorsanız, \"Sil\" öğesini seçin. Daha sonra onaylamanız istenecektir.", + + // "submission.workflow.generic.edit": "Edit", + "submission.workflow.generic.edit": "Değiştir", + + // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", + "submission.workflow.generic.edit-help": "Öğenin metadatalarını değiştirmek için bu seçeneği belirleyin.", + + // "submission.workflow.generic.view": "View", + "submission.workflow.generic.view": "Göster", + + // "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", + "submission.workflow.generic.view-help": "Öğenin metadatalarını görüntülemek için bu seçeneği belirleyin.", + + + + // "submission.workflow.tasks.claimed.approve": "Approve", + "submission.workflow.tasks.claimed.approve": "Kabul Et.", + + // "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", + "submission.workflow.tasks.claimed.approve_help": "Öğeyi incelediyseniz ve koleksiyona dahil edilmeye uygunsa, \"Onayla\"yı seçin.", + + // "submission.workflow.tasks.claimed.edit": "Edit", + "submission.workflow.tasks.claimed.edit": "Değiştir", + + // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", + "submission.workflow.tasks.claimed.edit_help": "Öğenin metadatalarını değiştirmek için bu seçeneği belirleyin.", + + // "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.", + "submission.workflow.tasks.claimed.reject.reason.info": "Lütfen gönderiyi reddetme nedeninizi aşağıdaki kutuya, gönderenin bir sorunu çözüp yeniden gönderip gönderemeyeceğini belirterek girin.", + + // "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", + "submission.workflow.tasks.claimed.reject.reason.placeholder": "Reddetme nedenini açıklayın", + + // "submission.workflow.tasks.claimed.reject.reason.submit": "Reject item", + "submission.workflow.tasks.claimed.reject.reason.submit": "Materyali Reddet", + + // "submission.workflow.tasks.claimed.reject.reason.title": "Reason", + "submission.workflow.tasks.claimed.reject.reason.title": "Neden", + + // "submission.workflow.tasks.claimed.reject.submit": "Reject", + "submission.workflow.tasks.claimed.reject.submit": "Kabul Etme", + + // "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.", + "submission.workflow.tasks.claimed.reject_help": "Öğeyi incelediyseniz ve koleksiyona dahil edilmeye uygun olmadığını bulduysanız, \"Reddet\"i seçin. Ardından, öğenin neden uygun olmadığını ve gönderenin bir şeyi değiştirip yeniden göndermesi gerekip gerekmediğini belirten bir mesaj girmeniz istenecektir.", + + // "submission.workflow.tasks.claimed.return": "Return to pool", + "submission.workflow.tasks.claimed.return": "Havuza Dön", + + // "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", + "submission.workflow.tasks.claimed.return_help": "Başka bir kullanıcının görevi gerçekleştirebilmesi için görevi havuza geri döndürün.", + + + + // "submission.workflow.tasks.generic.error": "Error occurred during operation...", + "submission.workflow.tasks.generic.error": "İşlem sırasında hata oluştu...", + + // "submission.workflow.tasks.generic.processing": "Processing...", + "submission.workflow.tasks.generic.processing": "İşleniyor...", + + // "submission.workflow.tasks.generic.submitter": "Submitter", + "submission.workflow.tasks.generic.submitter": "Gönderen", + + // "submission.workflow.tasks.generic.success": "Operation successful", + "submission.workflow.tasks.generic.success": "İşlem Başarılı", + + + + // "submission.workflow.tasks.pool.claim": "Claim", + "submission.workflow.tasks.pool.claim": "Talep Et", + + // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", + "submission.workflow.tasks.pool.claim_help": "Bu görevi kendinize atayın.", + + // "submission.workflow.tasks.pool.hide-detail": "Hide detail", + "submission.workflow.tasks.pool.hide-detail": "Detayları gizle", + + // "submission.workflow.tasks.pool.show-detail": "Show detail", + "submission.workflow.tasks.pool.show-detail": "Detayaları göster", + + + + // "title": "DSpace", + "title": "DSpace", + + + + // "vocabulary-treeview.header": "Hierarchical tree view", + "vocabulary-treeview.header": "Hiyerarşik ağaç görünümü", + + // "vocabulary-treeview.load-more": "Load more", + "vocabulary-treeview.load-more": "Daha Fazla Yükle", + + // "vocabulary-treeview.search.form.reset": "Reset", + "vocabulary-treeview.search.form.reset": "Sıfırla", + + // "vocabulary-treeview.search.form.search": "Search", + "vocabulary-treeview.search.form.search": "Ara", + + // "vocabulary-treeview.search.no-result": "There were no items to show", + "vocabulary-treeview.search.no-result": "Gösterilecek öğe yok", + + // "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", + "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", + + // "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", + "vocabulary-treeview.tree.description.srsc": "Araştırma Konusu Kategorileri", + + + + // "uploader.browse": "browse", + "uploader.browse": "Tara", + + // "uploader.drag-message": "Drag & Drop your files here", + "uploader.drag-message": "Dosyalarınızı buraya sürükleyip bırakın", + + // "uploader.or": ", or ", + "uploader.or": ", veya", + + // "uploader.processing": "Processing", + "uploader.processing": "İşleniyor", + + // "uploader.queue-length": "Queue length", + "uploader.queue-length": "Sıra Uzunluğu", + + // "virtual-metadata.delete-item.info": "Select the types for which you want to save the virtual metadata as real metadata", + "virtual-metadata.delete-item.info": "Sanal metadataları gerçek metadatalar olarak kaydetmek istediğiniz türleri seçin", + + // "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", + "virtual-metadata.delete-item.modal-head": "Bu ilişkinin sanal metadataları", + + // "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", + "virtual-metadata.delete-relationship.modal-head": "Sanal metadatalarını gerçek metadatalar olarak kaydetmek istediğiniz öğeleri seçin", + + + + // "workflowAdmin.search.results.head": "Administer Workflow", + "workflowAdmin.search.results.head": "İş Akışını Yönet", + + + + // "workflow-item.delete.notification.success.title": "Deleted", + "workflow-item.delete.notification.success.title": "Silindi", + + // "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", + "workflow-item.delete.notification.success.content": "Bu iş akışı öğesi başarıyla silindi", + + // "workflow-item.delete.notification.error.title": "Something went wrong", + "workflow-item.delete.notification.error.title": "Bir şeyler yanlış gitti", + + // "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", + "workflow-item.delete.notification.error.content": "İş akışı öğesi silinemedi", + + // "workflow-item.delete.title": "Delete workflow item", + "workflow-item.delete.title": "İş akışı öğesini sil", + + // "workflow-item.delete.header": "Delete workflow item", + "workflow-item.delete.header": "İş akışı öğesini sil", + + // "workflow-item.delete.button.cancel": "Cancel", + "workflow-item.delete.button.cancel": "İptal", + + // "workflow-item.delete.button.confirm": "Delete", + "workflow-item.delete.button.confirm": "Sil", + + + // "workflow-item.send-back.notification.success.title": "Sent back to submitter", + "workflow-item.send-back.notification.success.title": "Gönderene geri gönderildi", + + // "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", + "workflow-item.send-back.notification.success.content": "Bu iş akışı öğesi, gönderene başarıyla geri gönderildi", + + // "workflow-item.send-back.notification.error.title": "Something went wrong", + "workflow-item.send-back.notification.error.title": "Bir şeyler yanlış gitti", + + // "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", + "workflow-item.send-back.notification.error.content": "İş akışı öğesi, gönderene geri gönderilemedi", + + // "workflow-item.send-back.title": "Send workflow item back to submitter", + "workflow-item.send-back.title": "İş akışı öğesini gönderene geri gönder", + + // "workflow-item.send-back.header": "Send workflow item back to submitter", + "workflow-item.send-back.header": "İş akışı öğesini gönderene geri gönder", + + // "workflow-item.send-back.button.cancel": "Cancel", + "workflow-item.send-back.button.cancel": "İptal", + + // "workflow-item.send-back.button.confirm": "Send back" + "workflow-item.send-back.button.confirm": "Geri Gönder" + +} From 310237d30f1bdc0fc3991678e573e55fc4cc805d Mon Sep 17 00:00:00 2001 From: corrad82 Date: Tue, 30 Aug 2022 12:00:27 +0200 Subject: [PATCH 21/24] [CST-6035] updated test description and used example.com domain in test urls --- .../submission-import-external.component.spec.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/submission/import-external/submission-import-external.component.spec.ts b/src/app/submission/import-external/submission-import-external.component.spec.ts index 7a9c71f342..1b21203b58 100644 --- a/src/app/submission/import-external/submission-import-external.component.spec.ts +++ b/src/app/submission/import-external/submission-import-external.component.spec.ts @@ -184,7 +184,7 @@ describe('SubmissionImportExternalComponent test suite', () => { }); }); - describe('handle BE response for search query', () => { + describe('handle backend response for search query', () => { const paginatedData: any = { 'timeCompleted': 1657009282990, 'msToLive': 900000, @@ -203,20 +203,20 @@ describe('SubmissionImportExternalComponent test suite', () => { }, '_links': { 'first': { - 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entries?query=test&page=0&size=10&sort=id,asc' + 'href': 'https://example.com/server/api/integration/externalsources/scopus/entries?query=test&page=0&size=10&sort=id,asc' }, 'self': { - 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entries?sort=id,ASC&page=0&size=10&query=test' + 'href': 'https://example.com/server/api/integration/externalsources/scopus/entries?sort=id,ASC&page=0&size=10&query=test' }, 'next': { - 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entries?query=test&page=1&size=10&sort=id,asc' + 'href': 'https://example.com/server/api/integration/externalsources/scopus/entries?query=test&page=1&size=10&sort=id,asc' }, 'last': { - 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entries?query=test&page=1197160&size=10&sort=id,asc' + 'href': 'https://example.com/server/api/integration/externalsources/scopus/entries?query=test&page=1197160&size=10&sort=id,asc' }, 'page': [ { - 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entryValues/2-s2.0-85130258665' + 'href': 'https://example.com/server/api/integration/externalsources/scopus/entryValues/2-s2.0-85130258665' } ] }, @@ -411,7 +411,7 @@ describe('SubmissionImportExternalComponent test suite', () => { }, '_links': { 'self': { - 'href': 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/scopus/entryValues/2-s2.0-85130258665' + 'href': 'https://example.com/server/api/integration/externalsources/scopus/entryValues/2-s2.0-85130258665' } } } @@ -421,7 +421,7 @@ describe('SubmissionImportExternalComponent test suite', () => { }; const errorObj = { errorMessage: 'Http failure response for ' + - 'https://dspacecris7.4science.cloud/server/api/integration/externalsources/pubmed/entries?sort=id,ASC&page=0&size=10&query=test: 500 OK', + 'https://example.com/server/api/integration/externalsources/pubmed/entries?sort=id,ASC&page=0&size=10&query=test: 500 OK', statusCode: 500, timeCompleted: 1656950434666, errors: [{ From 9f609a2966a834e3c94f695164370a1ad1135546 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 2 Sep 2022 11:53:10 -0400 Subject: [PATCH 22/24] Add themed components to shared module and 'custom' theme. --- src/app/shared/shared.module.ts | 30 +++++++++++++++++++ ...te-collection-parent-selector.component.ts | 11 +++++++ ...e-community-parent-selector.component.html | 19 ++++++++++++ ...e-community-parent-selector.component.scss | 3 ++ ...ate-community-parent-selector.component.ts | 12 ++++++++ ...create-item-parent-selector.component.html | 15 ++++++++++ .../create-item-parent-selector.component.ts | 11 +++++++ .../dso-selector-modal-wrapper.component.html | 11 +++++++ .../edit-collection-selector.component.ts | 11 +++++++ .../edit-community-selector.component.ts | 11 +++++++ .../edit-item-selector.component.ts | 11 +++++++ src/themes/custom/eager-theme.module.ts | 24 +++++++++++++++ 12 files changed, 169 insertions(+) create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.ts create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.html create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.scss create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.ts create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.html create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index f40ddd5b90..9036ff98c5 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -124,12 +124,21 @@ import { DSOSelectorComponent } from './dso-selector/dso-selector/dso-selector.c import { CreateCommunityParentSelectorComponent } from './dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component'; +import { + ThemedCreateCommunityParentSelectorComponent +} from './dso-selector/modal-wrappers/create-community-parent-selector/themed-create-community-parent-selector.component'; import { CreateItemParentSelectorComponent } from './dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; +import { + ThemedCreateItemParentSelectorComponent +} from './dso-selector/modal-wrappers/create-item-parent-selector/themed-create-item-parent-selector.component'; import { CreateCollectionParentSelectorComponent } from './dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component'; +import { + ThemedCreateCollectionParentSelectorComponent +} from './dso-selector/modal-wrappers/create-collection-parent-selector/themed-create-collection-parent-selector.component'; import { CommunitySearchResultListElementComponent } from './object-list/search-result-list-element/community-search-result/community-search-result-list-element.component'; @@ -139,12 +148,21 @@ import { import { EditItemSelectorComponent } from './dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component'; +import { + ThemedEditItemSelectorComponent +} from './dso-selector/modal-wrappers/edit-item-selector/themed-edit-item-selector.component'; import { EditCommunitySelectorComponent } from './dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component'; +import { + ThemedEditCommunitySelectorComponent +} from './dso-selector/modal-wrappers/edit-community-selector/themed-edit-community-selector.component'; import { EditCollectionSelectorComponent } from './dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component'; +import { + ThemedEditCollectionSelectorComponent +} from './dso-selector/modal-wrappers/edit-collection-selector/themed-edit-collection-selector.component'; import { ItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component'; @@ -395,11 +413,17 @@ const COMPONENTS = [ DsoInputSuggestionsComponent, DSOSelectorComponent, CreateCommunityParentSelectorComponent, + ThemedCreateCommunityParentSelectorComponent, CreateCollectionParentSelectorComponent, + ThemedCreateCollectionParentSelectorComponent, CreateItemParentSelectorComponent, + ThemedCreateItemParentSelectorComponent, EditCommunitySelectorComponent, + ThemedEditCommunitySelectorComponent, EditCollectionSelectorComponent, + ThemedEditCollectionSelectorComponent, EditItemSelectorComponent, + ThemedEditItemSelectorComponent, CommunitySearchResultListElementComponent, CollectionSearchResultListElementComponent, BrowseByComponent, @@ -491,11 +515,17 @@ const ENTRY_COMPONENTS = [ StartsWithDateComponent, StartsWithTextComponent, CreateCommunityParentSelectorComponent, + ThemedCreateCommunityParentSelectorComponent, CreateCollectionParentSelectorComponent, + ThemedCreateCollectionParentSelectorComponent, CreateItemParentSelectorComponent, + ThemedCreateItemParentSelectorComponent, EditCommunitySelectorComponent, + ThemedEditCommunitySelectorComponent, EditCollectionSelectorComponent, + ThemedEditCollectionSelectorComponent, EditItemSelectorComponent, + ThemedEditItemSelectorComponent, PlainTextMetadataListElementComponent, ItemMetadataListElementComponent, MetadataRepresentationListElementComponent, diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.ts new file mode 100644 index 0000000000..6df8807cae --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; +import { + CreateCollectionParentSelectorComponent as BaseComponent +} from 'src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component'; + +@Component({ + selector: 'ds-create-collection-parent-selector', + templateUrl: '../dso-selector-modal-wrapper.component.html', +}) +export class CreateCollectionParentSelectorComponent extends BaseComponent { +} diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.html b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.html new file mode 100644 index 0000000000..84fdd34c01 --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.html @@ -0,0 +1,19 @@ +
+ + +
diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.scss b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.scss new file mode 100644 index 0000000000..0daf4cfa5f --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.scss @@ -0,0 +1,3 @@ +#create-community-or-separator { + top: 0; +} \ No newline at end of file diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.ts new file mode 100644 index 0000000000..bb2785eab9 --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; +import { + CreateCommunityParentSelectorComponent as BaseComponent +} from 'src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component'; + +@Component({ + selector: 'ds-create-community-parent-selector', + styleUrls: ['./create-community-parent-selector.component.scss'], + templateUrl: './create-community-parent-selector.component.html', +}) +export class CreateCommunityParentSelectorComponent extends BaseComponent { +} diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.html b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.html new file mode 100644 index 0000000000..664aef95c0 --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.html @@ -0,0 +1,15 @@ +
+ + +
diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts new file mode 100644 index 0000000000..e04874c801 --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; +import { + CreateItemParentSelectorComponent as BaseComponent +} from 'src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; + +@Component({ + selector: 'ulib-create-item-parent-selector', + templateUrl: './create-item-parent-selector.component.html', +}) +export class CreateItemParentSelectorComponent extends BaseComponent { +} diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html b/src/themes/custom/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html new file mode 100644 index 0000000000..85d8797e66 --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html @@ -0,0 +1,11 @@ +
+ + +
diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts new file mode 100644 index 0000000000..6a51908dbc --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; +import { + EditCollectionSelectorComponent as BaseComponent +} from 'src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component' + +@Component({ + selector: 'ds-edit-collection-selector', + templateUrl: '../dso-selector-modal-wrapper.component.html', +}) +export class EditCollectionSelectorComponent extends BaseComponent { +} \ No newline at end of file diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts new file mode 100644 index 0000000000..3a20cff266 --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; +import { + EditCommunitySelectorComponent as BaseComponent +} from 'src/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component'; + +@Component({ + selector: 'ds-edit-item-selector', + templateUrl: '../dso-selector-modal-wrapper.component.html', +}) +export class EditCommunitySelectorComponent extends BaseComponent { +} \ No newline at end of file diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts new file mode 100644 index 0000000000..ddd6cae7b6 --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; +import { + EditItemSelectorComponent as BaseComponent +} from 'src/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component'; + +@Component({ + selector: 'ds-edit-item-selector', + templateUrl: '../dso-selector-modal-wrapper.component.html', +}) +export class EditItemSelectorComponent extends BaseComponent { +} \ No newline at end of file diff --git a/src/themes/custom/eager-theme.module.ts b/src/themes/custom/eager-theme.module.ts index 5256d2fd7c..4c75f63cc9 100644 --- a/src/themes/custom/eager-theme.module.ts +++ b/src/themes/custom/eager-theme.module.ts @@ -21,6 +21,24 @@ import { } from './app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component'; import { UntypedItemComponent } from './app/item-page/simple/item-types/untyped-item/untyped-item.component'; import { ItemSharedModule } from '../../app/item-page/item-shared.module'; +import { + CreateCollectionParentSelectorComponent +} from './app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component'; +import { + CreateCommunityParentSelectorComponent +} from './app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component'; +import { + CreateItemParentSelectorComponent +} from './app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; +import { + EditCollectionSelectorComponent +} from './app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component'; +import { + EditCommunitySelectorComponent +} from './app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component'; +import { + EditItemSelectorComponent +} from './app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component'; /** * Add components that use a custom decorator to ENTRY_COMPONENTS as well as DECLARATIONS. @@ -41,6 +59,12 @@ const DECLARATIONS = [ HeaderNavbarWrapperComponent, NavbarComponent, FooterComponent, + CreateCollectionParentSelectorComponent, + CreateCommunityParentSelectorComponent, + CreateItemParentSelectorComponent, + EditCollectionSelectorComponent, + EditCommunitySelectorComponent, + EditItemSelectorComponent, ]; @NgModule({ From 1f1b04e88f56ab2e8a70cf2a66e4706f9c592c54 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 2 Sep 2022 12:04:01 -0400 Subject: [PATCH 23/24] Fix lint issues, incorrect selector copied from local code. --- .../create-item-parent-selector.component.ts | 2 +- .../edit-collection-selector.component.ts | 4 ++-- .../edit-community-selector.component.ts | 2 +- .../edit-item-selector/edit-item-selector.component.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts index e04874c801..44eb6edd18 100644 --- a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts @@ -4,7 +4,7 @@ import { } from 'src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; @Component({ - selector: 'ulib-create-item-parent-selector', + selector: 'ds-create-item-parent-selector', templateUrl: './create-item-parent-selector.component.html', }) export class CreateItemParentSelectorComponent extends BaseComponent { diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts index 6a51908dbc..3b463f2851 100644 --- a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts @@ -1,11 +1,11 @@ import { Component } from '@angular/core'; import { EditCollectionSelectorComponent as BaseComponent -} from 'src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component' +} from 'src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component'; @Component({ selector: 'ds-edit-collection-selector', templateUrl: '../dso-selector-modal-wrapper.component.html', }) export class EditCollectionSelectorComponent extends BaseComponent { -} \ No newline at end of file +} diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts index 3a20cff266..cd9ea222f4 100644 --- a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts @@ -8,4 +8,4 @@ import { templateUrl: '../dso-selector-modal-wrapper.component.html', }) export class EditCommunitySelectorComponent extends BaseComponent { -} \ No newline at end of file +} diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts index ddd6cae7b6..efff58d2a3 100644 --- a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts @@ -8,4 +8,4 @@ import { templateUrl: '../dso-selector-modal-wrapper.component.html', }) export class EditItemSelectorComponent extends BaseComponent { -} \ No newline at end of file +} From ba2f173199ea750706479ffd3fcc0abe23358b62 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Tue, 6 Sep 2022 13:56:04 -0400 Subject: [PATCH 24/24] Address review: add missing templates, commented references to them, reference original templates by default. --- .../create-collection-parent-selector.component.html} | 0 .../create-collection-parent-selector.component.scss | 0 .../create-collection-parent-selector.component.ts | 6 ++++-- .../create-community-parent-selector.component.ts | 8 +++++--- .../create-item-parent-selector.component.scss | 0 .../create-item-parent-selector.component.ts | 6 ++++-- .../edit-collection-selector.component.html | 11 +++++++++++ .../edit-collection-selector.component.scss | 0 .../edit-collection-selector.component.ts | 6 ++++-- .../edit-community-selector.component.html | 11 +++++++++++ .../edit-community-selector.component.scss | 0 .../edit-community-selector.component.ts | 6 ++++-- .../edit-item-selector.component.html | 11 +++++++++++ .../edit-item-selector.component.scss | 0 .../edit-item-selector.component.ts | 4 +++- 15 files changed, 57 insertions(+), 12 deletions(-) rename src/themes/custom/app/shared/dso-selector/modal-wrappers/{dso-selector-modal-wrapper.component.html => create-collection-parent-selector/create-collection-parent-selector.component.html} (100%) create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.scss create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.scss create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.html create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.scss create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.html create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.scss create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.html create mode 100644 src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.scss diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.html similarity index 100% rename from src/themes/custom/app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html rename to src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.html diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.scss b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.ts index 6df8807cae..22d40ff539 100644 --- a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.ts +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component.ts @@ -1,11 +1,13 @@ import { Component } from '@angular/core'; import { CreateCollectionParentSelectorComponent as BaseComponent -} from 'src/app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component'; +} from '../../../../../../../app/shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component'; @Component({ selector: 'ds-create-collection-parent-selector', - templateUrl: '../dso-selector-modal-wrapper.component.html', + // styleUrls: ['./create-collection-parent-selector.component.scss'], + // templateUrl: './create-collection-parent-selector.component.html', + templateUrl: '../../../../../../../app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html', }) export class CreateCollectionParentSelectorComponent extends BaseComponent { } diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.ts index bb2785eab9..8b28ee1bb8 100644 --- a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.ts +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.ts @@ -1,12 +1,14 @@ import { Component } from '@angular/core'; import { CreateCommunityParentSelectorComponent as BaseComponent -} from 'src/app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component'; +} from '../../../../../../../app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component'; @Component({ selector: 'ds-create-community-parent-selector', - styleUrls: ['./create-community-parent-selector.component.scss'], - templateUrl: './create-community-parent-selector.component.html', + // styleUrls: ['./create-community-parent-selector.component.scss'], + styleUrls: ['../../../../../../../app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.scss'], + // templateUrl: './create-community-parent-selector.component.html', + templateUrl: '../../../../../../../app/shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component.html', }) export class CreateCommunityParentSelectorComponent extends BaseComponent { } diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.scss b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts index 44eb6edd18..f8e3401454 100644 --- a/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.ts @@ -1,11 +1,13 @@ import {Component} from '@angular/core'; import { CreateItemParentSelectorComponent as BaseComponent -} from 'src/app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; +} from '../../../../../../../app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; @Component({ selector: 'ds-create-item-parent-selector', - templateUrl: './create-item-parent-selector.component.html', + // styleUrls: ['./create-item-parent-selector.component.scss'], + // templateUrl: './create-item-parent-selector.component.html', + templateUrl: '../../../../../../../app/shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component.html', }) export class CreateItemParentSelectorComponent extends BaseComponent { } diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.html b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.html new file mode 100644 index 0000000000..85d8797e66 --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.html @@ -0,0 +1,11 @@ +
+ + +
diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.scss b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts index 3b463f2851..8f4a8dd5cd 100644 --- a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component.ts @@ -1,11 +1,13 @@ import { Component } from '@angular/core'; import { EditCollectionSelectorComponent as BaseComponent -} from 'src/app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component'; +} from '../../../../../../../app/shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component'; @Component({ selector: 'ds-edit-collection-selector', - templateUrl: '../dso-selector-modal-wrapper.component.html', + // styleUrls: ['./edit-collection-selector.component.scss'], + // templateUrl: './edit-collection-selector.component.html', + templateUrl: '../../../../../../../app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html', }) export class EditCollectionSelectorComponent extends BaseComponent { } diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.html b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.html new file mode 100644 index 0000000000..85d8797e66 --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.html @@ -0,0 +1,11 @@ +
+ + +
diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.scss b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts index cd9ea222f4..79d52fc350 100644 --- a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component.ts @@ -1,11 +1,13 @@ import { Component } from '@angular/core'; import { EditCommunitySelectorComponent as BaseComponent -} from 'src/app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component'; +} from '../../../../../../../app/shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component'; @Component({ selector: 'ds-edit-item-selector', - templateUrl: '../dso-selector-modal-wrapper.component.html', + // styleUrls: ['./edit-community-selector.component.scss'], + // templateUrl: './edit-community-selector.component.html', + templateUrl: '../../../../../../../app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html', }) export class EditCommunitySelectorComponent extends BaseComponent { } diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.html b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.html new file mode 100644 index 0000000000..85d8797e66 --- /dev/null +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.html @@ -0,0 +1,11 @@ +
+ + +
diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.scss b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts index efff58d2a3..398dbc933c 100644 --- a/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts +++ b/src/themes/custom/app/shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component.ts @@ -5,7 +5,9 @@ import { @Component({ selector: 'ds-edit-item-selector', - templateUrl: '../dso-selector-modal-wrapper.component.html', + // styleUrls: ['./edit-item-selector.component.scss'], + // templateUrl: './edit-item-selector.component.html', + templateUrl: '../../../../../../../app/shared/dso-selector/modal-wrappers/dso-selector-modal-wrapper.component.html', }) export class EditItemSelectorComponent extends BaseComponent { }