From 2bc1217dff9448d8f99836c39cda66179bedc40c Mon Sep 17 00:00:00 2001 From: myrza1 Date: Thu, 19 Aug 2021 13:16:54 +0600 Subject: [PATCH 001/119] Create Kazakh Translation Create Kazakh Translation --- src/assets/i18n/kz.json5 | 6743 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 6743 insertions(+) create mode 100644 src/assets/i18n/kz.json5 diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 new file mode 100644 index 0000000000..e18e846d17 --- /dev/null +++ b/src/assets/i18n/kz.json5 @@ -0,0 +1,6743 @@ +{ + + // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", + // TODO New key - Add a translation + "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", + + // "401.link.home-page": "Take me to the home page", + "401.link.home-page": "Басты бетке өту", + + // "401.unauthorized": "unauthorized", + // TODO New key - Add a translation + "401.unauthorized": "unauthorized", + + + + // "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", + // TODO New key - Add a translation + "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", + + // "403.link.home-page": "Take me to the home page", + // TODO New key - Add a translation + "403.link.home-page": "Take me to the home page", + + // "403.forbidden": "forbidden", + // TODO New key - Add a translation + "403.forbidden": "forbidden", + + + + // "404.help": "We can't find the page you're looking for. The page may have been moved or deleted. You can use the button below to get back to the home page. ", + // TODO New key - Add a translation + "404.help": "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.link.home-page": "Take me to the home page", + // TODO New key - Add a translation + "404.link.home-page": "Take me to the home page", + + // "404.page-not-found": "page not found", + // TODO New key - Add a translation + "404.page-not-found": "page not found", + + // "admin.curation-tasks.breadcrumbs": "System curation tasks", + // TODO New key - Add a translation + "admin.curation-tasks.breadcrumbs": "System curation tasks", + + // "admin.curation-tasks.title": "System curation tasks", + // TODO New key - Add a translation + "admin.curation-tasks.title": "System curation tasks", + + // "admin.curation-tasks.header": "System curation tasks", + // TODO New key - Add a translation + "admin.curation-tasks.header": "System curation tasks", + + // "admin.registries.bitstream-formats.breadcrumbs": "Format registry", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.breadcrumbs": "Format registry", + + // "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", + + // "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", + + // "admin.registries.bitstream-formats.create.failure.head": "Failure", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.failure.head": "Failure", + + // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.head": "Create Bitstream format", + + // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", + + // "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", + + // "admin.registries.bitstream-formats.create.success.head": "Success", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.success.head": "Success", + + // "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", + + // "admin.registries.bitstream-formats.delete.failure.head": "Failure", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.delete.failure.head": "Failure", + + // "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", + + // "admin.registries.bitstream-formats.delete.success.head": "Success", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.delete.success.head": "Success", + + // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", + + // "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", + + // "admin.registries.bitstream-formats.edit.description.hint": "", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.description.hint": "", + + // "admin.registries.bitstream-formats.edit.description.label": "Description", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.description.label": "Description", + + // "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.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.extensions.hint": "Extensions are file extensions that are used to automatically identify the format of uploaded files. You can enter several extensions for each format.", + + // "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", + + // "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", + + // "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", + + // "admin.registries.bitstream-formats.edit.failure.head": "Failure", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.failure.head": "Failure", + + // "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", + + // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", + + // "admin.registries.bitstream-formats.edit.internal.label": "Internal", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.internal.label": "Internal", + + // "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", + + // "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", + + // "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", + + // "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", + + // "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", + + // "admin.registries.bitstream-formats.edit.success.head": "Success", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.success.head": "Success", + + // "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", + + // "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", + + // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.head": "Bitstream Format Registry", + + // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", + + // "admin.registries.bitstream-formats.table.delete": "Delete selected", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.delete": "Delete selected", + + // "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", + + // "admin.registries.bitstream-formats.table.internal": "internal", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.internal": "internal", + + // "admin.registries.bitstream-formats.table.mimetype": "MIME Type", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.mimetype": "MIME Type", + + // "admin.registries.bitstream-formats.table.name": "Name", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.name": "Name", + + // "admin.registries.bitstream-formats.table.return": "Return", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.return": "Return", + + // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", + + // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", + + // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", + + // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", + + // "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Format Registry", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Format Registry", + + + + // "admin.registries.metadata.breadcrumbs": "Metadata registry", + // TODO New key - Add a translation + "admin.registries.metadata.breadcrumbs": "Metadata registry", + + // "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", + // TODO New key - Add a translation + "admin.registries.metadata.description": "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.form.create": "Create metadata schema", + // TODO New key - Add a translation + "admin.registries.metadata.form.create": "Create metadata schema", + + // "admin.registries.metadata.form.edit": "Edit metadata schema", + // TODO New key - Add a translation + "admin.registries.metadata.form.edit": "Edit metadata schema", + + // "admin.registries.metadata.form.name": "Name", + // TODO New key - Add a translation + "admin.registries.metadata.form.name": "Name", + + // "admin.registries.metadata.form.namespace": "Namespace", + // TODO New key - Add a translation + "admin.registries.metadata.form.namespace": "Namespace", + + // "admin.registries.metadata.head": "Metadata Registry", + // TODO New key - Add a translation + "admin.registries.metadata.head": "Metadata Registry", + + // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", + // TODO New key - Add a translation + "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", + + // "admin.registries.metadata.schemas.table.delete": "Delete selected", + // TODO New key - Add a translation + "admin.registries.metadata.schemas.table.delete": "Delete selected", + + // "admin.registries.metadata.schemas.table.id": "ID", + // TODO New key - Add a translation + "admin.registries.metadata.schemas.table.id": "ID", + + // "admin.registries.metadata.schemas.table.name": "Name", + // TODO New key - Add a translation + "admin.registries.metadata.schemas.table.name": "Name", + + // "admin.registries.metadata.schemas.table.namespace": "Namespace", + // TODO New key - Add a translation + "admin.registries.metadata.schemas.table.namespace": "Namespace", + + // "admin.registries.metadata.title": "DSpace Angular :: Metadata Registry", + // TODO New key - Add a translation + "admin.registries.metadata.title": "DSpace Angular :: Metadata Registry", + + + + // "admin.registries.schema.breadcrumbs": "Metadata schema", + // TODO New key - Add a translation + "admin.registries.schema.breadcrumbs": "Metadata schema", + + // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", + // TODO New key - Add a translation + "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", + + // "admin.registries.schema.fields.head": "Schema metadata fields", + // TODO New key - Add a translation + "admin.registries.schema.fields.head": "Schema metadata fields", + + // "admin.registries.schema.fields.no-items": "No metadata fields to show.", + // TODO New key - Add a translation + "admin.registries.schema.fields.no-items": "No metadata fields to show.", + + // "admin.registries.schema.fields.table.delete": "Delete selected", + // TODO New key - Add a translation + "admin.registries.schema.fields.table.delete": "Delete selected", + + // "admin.registries.schema.fields.table.field": "Field", + // TODO New key - Add a translation + "admin.registries.schema.fields.table.field": "Field", + + // "admin.registries.schema.fields.table.scopenote": "Scope Note", + // TODO New key - Add a translation + "admin.registries.schema.fields.table.scopenote": "Scope Note", + + // "admin.registries.schema.form.create": "Create metadata field", + // TODO New key - Add a translation + "admin.registries.schema.form.create": "Create metadata field", + + // "admin.registries.schema.form.edit": "Edit metadata field", + // TODO New key - Add a translation + "admin.registries.schema.form.edit": "Edit metadata field", + + // "admin.registries.schema.form.element": "Element", + // TODO New key - Add a translation + "admin.registries.schema.form.element": "Element", + + // "admin.registries.schema.form.qualifier": "Qualifier", + // TODO New key - Add a translation + "admin.registries.schema.form.qualifier": "Qualifier", + + // "admin.registries.schema.form.scopenote": "Scope Note", + // TODO New key - Add a translation + "admin.registries.schema.form.scopenote": "Scope Note", + + // "admin.registries.schema.head": "Metadata Schema", + // TODO New key - Add a translation + "admin.registries.schema.head": "Metadata Schema", + + // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", + // TODO New key - Add a translation + "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", + + // "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", + // TODO New key - Add a translation + "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", + + // "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", + // TODO New key - Add a translation + "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", + + // "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", + // TODO New key - Add a translation + "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", + + // "admin.registries.schema.notification.failure": "Error", + // TODO New key - Add a translation + "admin.registries.schema.notification.failure": "Error", + + // "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", + // TODO New key - Add a translation + "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", + + // "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", + // TODO New key - Add a translation + "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", + + // "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", + // TODO New key - Add a translation + "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", + + // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", + // TODO New key - Add a translation + "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", + + // "admin.registries.schema.notification.success": "Success", + // TODO New key - Add a translation + "admin.registries.schema.notification.success": "Success", + + // "admin.registries.schema.return": "Return", + // TODO New key - Add a translation + "admin.registries.schema.return": "Return", + + // "admin.registries.schema.title": "DSpace Angular :: Metadata Schema Registry", + // TODO New key - Add a translation + "admin.registries.schema.title": "DSpace Angular :: Metadata Schema Registry", + + + + // "admin.access-control.epeople.actions.delete": "Delete EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.actions.delete": "Delete EPerson", + + // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", + + // "admin.access-control.epeople.actions.reset": "Reset password", + // TODO New key - Add a translation + "admin.access-control.epeople.actions.reset": "Reset password", + + // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", + + // "admin.access-control.epeople.title": "DSpace Angular :: EPeople", + // TODO New key - Add a translation + "admin.access-control.epeople.title": "DSpace Angular :: EPeople", + + // "admin.access-control.epeople.head": "EPeople", + // TODO New key - Add a translation + "admin.access-control.epeople.head": "EPeople", + + // "admin.access-control.epeople.search.head": "Search", + "admin.access-control.epeople.search.head": "Іздеу", + + // "admin.access-control.epeople.button.see-all": "Browse All", + // TODO New key - Add a translation + "admin.access-control.epeople.button.see-all": "Browse All", + + // "admin.access-control.epeople.search.scope.metadata": "Metadata", + // TODO New key - Add a translation + "admin.access-control.epeople.search.scope.metadata": "Metadata", + + // "admin.access-control.epeople.search.scope.email": "E-mail (exact)", + // TODO New key - Add a translation + "admin.access-control.epeople.search.scope.email": "E-mail (exact)", + + // "admin.access-control.epeople.search.button": "Search", + // TODO New key - Add a translation + "admin.access-control.epeople.search.button": "Search", + + // "admin.access-control.epeople.button.add": "Add EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.button.add": "Add EPerson", + + // "admin.access-control.epeople.table.id": "ID", + // TODO New key - Add a translation + "admin.access-control.epeople.table.id": "ID", + + // "admin.access-control.epeople.table.name": "Name", + // TODO New key - Add a translation + "admin.access-control.epeople.table.name": "Name", + + // "admin.access-control.epeople.table.email": "E-mail (exact)", + // TODO New key - Add a translation + "admin.access-control.epeople.table.email": "E-mail (exact)", + + // "admin.access-control.epeople.table.edit": "Edit", + // TODO New key - Add a translation + "admin.access-control.epeople.table.edit": "Edit", + + // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", + + // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", + + // "admin.access-control.epeople.no-items": "No EPeople to show.", + // TODO New key - Add a translation + "admin.access-control.epeople.no-items": "No EPeople to show.", + + // "admin.access-control.epeople.form.create": "Create EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.form.create": "Create EPerson", + + // "admin.access-control.epeople.form.edit": "Edit EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.form.edit": "Edit EPerson", + + // "admin.access-control.epeople.form.firstName": "First name", + // TODO New key - Add a translation + "admin.access-control.epeople.form.firstName": "First name", + + // "admin.access-control.epeople.form.lastName": "Last name", + // TODO New key - Add a translation + "admin.access-control.epeople.form.lastName": "Last name", + + // "admin.access-control.epeople.form.email": "E-mail", + // TODO New key - Add a translation + "admin.access-control.epeople.form.email": "E-mail", + + // "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", + // TODO New key - Add a translation + "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", + + // "admin.access-control.epeople.form.canLogIn": "Can log in", + // TODO New key - Add a translation + "admin.access-control.epeople.form.canLogIn": "Can log in", + + // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", + // TODO New key - Add a translation + "admin.access-control.epeople.form.requireCertificate": "Requires certificate", + + // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", + + // "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", + + // "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", + // TODO New key - Add a translation + "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", + + // "admin.access-control.epeople.form.table.id": "ID", + // TODO New key - Add a translation + "admin.access-control.epeople.form.table.id": "ID", + + // "admin.access-control.epeople.form.table.name": "Name", + // TODO New key - Add a translation + "admin.access-control.epeople.form.table.name": "Name", + + // "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", + // TODO New key - Add a translation + "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", + + // "admin.access-control.epeople.form.goToGroups": "Add to groups", + // TODO New key - Add a translation + "admin.access-control.epeople.form.goToGroups": "Add to groups", + + // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", + + // "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", + + + + // "admin.access-control.groups.title": "DSpace Angular :: Groups", + // TODO New key - Add a translation + "admin.access-control.groups.title": "DSpace Angular :: Groups", + + // "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Edit Group", + // TODO New key - Add a translation + "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Edit Group", + + // "admin.access-control.groups.title.addGroup": "DSpace Angular :: New Group", + // TODO New key - Add a translation + "admin.access-control.groups.title.addGroup": "DSpace Angular :: New Group", + + // "admin.access-control.groups.head": "Groups", + // TODO New key - Add a translation + "admin.access-control.groups.head": "Groups", + + // "admin.access-control.groups.button.add": "Add group", + // TODO New key - Add a translation + "admin.access-control.groups.button.add": "Add group", + + // "admin.access-control.groups.search.head": "Search groups", + // TODO New key - Add a translation + "admin.access-control.groups.search.head": "Search groups", + + // "admin.access-control.groups.button.see-all": "Browse all", + // TODO New key - Add a translation + "admin.access-control.groups.button.see-all": "Browse all", + + // "admin.access-control.groups.search.button": "Search", + // TODO New key - Add a translation + "admin.access-control.groups.search.button": "Search", + + // "admin.access-control.groups.table.id": "ID", + // TODO New key - Add a translation + "admin.access-control.groups.table.id": "ID", + + // "admin.access-control.groups.table.name": "Name", + // TODO New key - Add a translation + "admin.access-control.groups.table.name": "Name", + + // "admin.access-control.groups.table.members": "Members", + // TODO New key - Add a translation + "admin.access-control.groups.table.members": "Members", + + // "admin.access-control.groups.table.edit": "Edit", + // TODO New key - Add a translation + "admin.access-control.groups.table.edit": "Edit", + + // "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", + + // "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", + + // "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", + // TODO New key - Add a translation + "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", + + // "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", + + // "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", + + // "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", + + + + // "admin.access-control.groups.form.alert.permanent": "This group is permanent, so it can't be edited or deleted. You can still add and remove group members using this page.", + // TODO New key - Add a translation + "admin.access-control.groups.form.alert.permanent": "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.workflowGroup": "This group can’t be modified or deleted because it corresponds to a role in the submission and workflow process in the \"{{name}}\" {{comcol}}. You can delete it from the \"assign roles\" tab on the edit {{comcol}} page. You can still add and remove group members using this page.", + // TODO New key - Add a translation + "admin.access-control.groups.form.alert.workflowGroup": "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.head.create": "Create group", + // TODO New key - Add a translation + "admin.access-control.groups.form.head.create": "Create group", + + // "admin.access-control.groups.form.head.edit": "Edit group", + // TODO New key - Add a translation + "admin.access-control.groups.form.head.edit": "Edit group", + + // "admin.access-control.groups.form.groupName": "Group name", + // TODO New key - Add a translation + "admin.access-control.groups.form.groupName": "Group name", + + // "admin.access-control.groups.form.groupDescription": "Description", + // TODO New key - Add a translation + "admin.access-control.groups.form.groupDescription": "Description", + + // "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", + + // "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", + + // "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Failed to create Group with name: \"{{name}}\", make sure the name is not already in use.", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Failed to create Group with name: \"{{name}}\", make sure the name is not already in use.", + + // "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", + + // "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", + + // "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", + + // "admin.access-control.groups.form.actions.delete": "Delete Group", + // TODO New key - Add a translation + "admin.access-control.groups.form.actions.delete": "Delete Group", + + // "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", + + // "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", + + // "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", + // TODO New key - Add a translation + "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", + + // "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", + // TODO New key - Add a translation + "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", + + // "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", + + // "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", + + // "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", + + // "admin.access-control.groups.form.members-list.head": "EPeople", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.head": "EPeople", + + // "admin.access-control.groups.form.members-list.search.head": "Add EPeople", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.search.head": "Add EPeople", + + // "admin.access-control.groups.form.members-list.button.see-all": "Browse All", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.button.see-all": "Browse All", + + // "admin.access-control.groups.form.members-list.headMembers": "Current Members", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.headMembers": "Current Members", + + // "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", + + // "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", + + // "admin.access-control.groups.form.members-list.search.button": "Search", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.search.button": "Search", + + // "admin.access-control.groups.form.members-list.table.id": "ID", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.id": "ID", + + // "admin.access-control.groups.form.members-list.table.name": "Name", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.name": "Name", + + // "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", + + // "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + + // "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", + + // "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", + + // "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", + + // "admin.access-control.groups.form.subgroups-list.head": "Groups", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.head": "Groups", + + // "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", + + // "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", + + // "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", + + // "admin.access-control.groups.form.subgroups-list.search.button": "Search", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.search.button": "Search", + + // "admin.access-control.groups.form.subgroups-list.table.id": "ID", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.id": "ID", + + // "admin.access-control.groups.form.subgroups-list.table.name": "Name", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.name": "Name", + + // "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", + + // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", + + // "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", + + // "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", + + // "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", + + // "admin.access-control.groups.form.return": "Return to groups", + // TODO New key - Add a translation + "admin.access-control.groups.form.return": "Return to groups", + + + + // "admin.search.breadcrumbs": "Administrative Search", + // TODO New key - Add a translation + "admin.search.breadcrumbs": "Administrative Search", + + // "admin.search.collection.edit": "Edit", + // TODO New key - Add a translation + "admin.search.collection.edit": "Edit", + + // "admin.search.community.edit": "Edit", + // TODO New key - Add a translation + "admin.search.community.edit": "Edit", + + // "admin.search.item.delete": "Delete", + // TODO New key - Add a translation + "admin.search.item.delete": "Delete", + + // "admin.search.item.edit": "Edit", + // TODO New key - Add a translation + "admin.search.item.edit": "Edit", + + // "admin.search.item.make-private": "Make Private", + // TODO New key - Add a translation + "admin.search.item.make-private": "Make Private", + + // "admin.search.item.make-public": "Make Public", + // TODO New key - Add a translation + "admin.search.item.make-public": "Make Public", + + // "admin.search.item.move": "Move", + // TODO New key - Add a translation + "admin.search.item.move": "Move", + + // "admin.search.item.reinstate": "Reinstate", + // TODO New key - Add a translation + "admin.search.item.reinstate": "Reinstate", + + // "admin.search.item.withdraw": "Withdraw", + // TODO New key - Add a translation + "admin.search.item.withdraw": "Withdraw", + + // "admin.search.title": "Administrative Search", + // TODO New key - Add a translation + "admin.search.title": "Administrative Search", + + // "administrativeView.search.results.head": "Administrative Search", + // TODO New key - Add a translation + "administrativeView.search.results.head": "Administrative Search", + + + + + // "admin.workflow.breadcrumbs": "Administer Workflow", + // TODO New key - Add a translation + "admin.workflow.breadcrumbs": "Administer Workflow", + + // "admin.workflow.title": "Administer Workflow", + // TODO New key - Add a translation + "admin.workflow.title": "Administer Workflow", + + // "admin.workflow.item.workflow": "Workflow", + // TODO New key - Add a translation + "admin.workflow.item.workflow": "Workflow", + + // "admin.workflow.item.delete": "Delete", + // TODO New key - Add a translation + "admin.workflow.item.delete": "Delete", + + // "admin.workflow.item.send-back": "Send back", + // TODO New key - Add a translation + "admin.workflow.item.send-back": "Send back", + + + + // "admin.metadata-import.breadcrumbs": "Import Metadata", + // TODO New key - Add a translation + "admin.metadata-import.breadcrumbs": "Import Metadata", + + // "admin.metadata-import.title": "Import Metadata", + // TODO New key - Add a translation + "admin.metadata-import.title": "Import Metadata", + + // "admin.metadata-import.page.header": "Import Metadata", + // TODO New key - Add a translation + "admin.metadata-import.page.header": "Import Metadata", + + // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", + // TODO New key - Add a translation + "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", + + // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", + // TODO New key - Add a translation + "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", + + // "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", + // TODO New key - Add a translation + "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", + + // "admin.metadata-import.page.button.return": "Return", + // TODO New key - Add a translation + "admin.metadata-import.page.button.return": "Return", + + // "admin.metadata-import.page.button.proceed": "Proceed", + // TODO New key - Add a translation + "admin.metadata-import.page.button.proceed": "Proceed", + + // "admin.metadata-import.page.error.addFile": "Select file first!", + // TODO New key - Add a translation + "admin.metadata-import.page.error.addFile": "Select file first!", + + + + + // "auth.errors.invalid-user": "Invalid email address or password.", + // TODO New key - Add a translation + "auth.errors.invalid-user": "Invalid email address or password.", + + // "auth.messages.expired": "Your session has expired. Please log in again.", + // TODO New key - Add a translation + "auth.messages.expired": "Your session has expired. Please log in again.", + + + + // "bitstream.edit.bitstream": "Bitstream: ", + // TODO New key - Add a translation + "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\".", + // TODO New key - Add a translation + "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.label": "Description", + // TODO New key - Add a translation + "bitstream.edit.form.description.label": "Description", + + // "bitstream.edit.form.embargo.hint": "The first day from which access is allowed. This date cannot be modified on this form. To set an embargo date for a bitstream, go to the Item Status tab, click Authorizations..., create or edit the bitstream's READ policy, and set the Start Date as desired.", + // TODO New key - Add a translation + "bitstream.edit.form.embargo.hint": "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.label": "Embargo until specific date", + // TODO New key - Add a translation + "bitstream.edit.form.embargo.label": "Embargo until specific date", + + // "bitstream.edit.form.fileName.hint": "Change the filename for the bitstream. Note that this will change the display bitstream URL, but old links will still resolve as long as the sequence ID does not change.", + // TODO New key - Add a translation + "bitstream.edit.form.fileName.hint": "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.label": "Filename", + // TODO New key - Add a translation + "bitstream.edit.form.fileName.label": "Filename", + + // "bitstream.edit.form.newFormat.label": "Describe new format", + // TODO New key - Add a translation + "bitstream.edit.form.newFormat.label": "Describe new format", + + // "bitstream.edit.form.newFormat.hint": "The application you used to create the file, and the version number (for example, \"ACMESoft SuperApp version 1.5\").", + // TODO New key - Add a translation + "bitstream.edit.form.newFormat.hint": "The application you used to create the file, and the version number (for example, \"ACMESoft SuperApp version 1.5\").", + + // "bitstream.edit.form.primaryBitstream.label": "Primary bitstream", + // TODO New key - Add a translation + "bitstream.edit.form.primaryBitstream.label": "Primary 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\".", + // TODO New key - Add a translation + "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.label": "Selected Format", + // TODO New key - Add a translation + "bitstream.edit.form.selectedFormat.label": "Selected Format", + + // "bitstream.edit.form.selectedFormat.unknown": "Format not in list", + // TODO New key - Add a translation + "bitstream.edit.form.selectedFormat.unknown": "Format not in list", + + // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", + // TODO New key - Add a translation + "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", + + // "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", + // TODO New key - Add a translation + "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", + + // "bitstream.edit.notifications.saved.title": "Bitstream saved", + // TODO New key - Add a translation + "bitstream.edit.notifications.saved.title": "Bitstream saved", + + // "bitstream.edit.title": "Edit bitstream", + // TODO New key - Add a translation + "bitstream.edit.title": "Edit bitstream", + + + + // "browse.comcol.by.author": "By Author", + // TODO New key - Add a translation + "browse.comcol.by.author": "By Author", + + // "browse.comcol.by.dateissued": "By Issue Date", + // TODO New key - Add a translation + "browse.comcol.by.dateissued": "By Issue Date", + + // "browse.comcol.by.subject": "By Subject", + // TODO New key - Add a translation + "browse.comcol.by.subject": "By Subject", + + // "browse.comcol.by.title": "By Title", + // TODO New key - Add a translation + "browse.comcol.by.title": "By Title", + + // "browse.comcol.head": "Browse", + // TODO New key - Add a translation + "browse.comcol.head": "Browse", + + // "browse.empty": "No items to show.", + // TODO New key - Add a translation + "browse.empty": "No items to show.", + + // "browse.metadata.author": "Author", + // TODO New key - Add a translation + "browse.metadata.author": "Author", + + // "browse.metadata.dateissued": "Issue Date", + // TODO New key - Add a translation + "browse.metadata.dateissued": "Issue Date", + + // "browse.metadata.subject": "Subject", + // TODO New key - Add a translation + "browse.metadata.subject": "Subject", + + // "browse.metadata.title": "Title", + // TODO New key - Add a translation + "browse.metadata.title": "Title", + + // "browse.metadata.author.breadcrumbs": "Browse by Author", + // TODO New key - Add a translation + "browse.metadata.author.breadcrumbs": "Browse by Author", + + // "browse.metadata.dateissued.breadcrumbs": "Browse by Date", + // TODO New key - Add a translation + "browse.metadata.dateissued.breadcrumbs": "Browse by Date", + + // "browse.metadata.subject.breadcrumbs": "Browse by Subject", + // TODO New key - Add a translation + "browse.metadata.subject.breadcrumbs": "Browse by Subject", + + // "browse.metadata.title.breadcrumbs": "Browse by Title", + // TODO New key - Add a translation + "browse.metadata.title.breadcrumbs": "Browse by Title", + + // "browse.startsWith.choose_start": "(Choose start)", + // TODO New key - Add a translation + "browse.startsWith.choose_start": "(Choose start)", + + // "browse.startsWith.choose_year": "(Choose year)", + // TODO New key - Add a translation + "browse.startsWith.choose_year": "(Choose year)", + + // "browse.startsWith.jump": "Jump to a point in the index:", + // TODO New key - Add a translation + "browse.startsWith.jump": "Jump to a point in the index:", + + // "browse.startsWith.months.april": "April", + // TODO New key - Add a translation + "browse.startsWith.months.april": "April", + + // "browse.startsWith.months.august": "August", + // TODO New key - Add a translation + "browse.startsWith.months.august": "August", + + // "browse.startsWith.months.december": "December", + // TODO New key - Add a translation + "browse.startsWith.months.december": "December", + + // "browse.startsWith.months.february": "February", + // TODO New key - Add a translation + "browse.startsWith.months.february": "February", + + // "browse.startsWith.months.january": "January", + // TODO New key - Add a translation + "browse.startsWith.months.january": "January", + + // "browse.startsWith.months.july": "July", + // TODO New key - Add a translation + "browse.startsWith.months.july": "July", + + // "browse.startsWith.months.june": "June", + // TODO New key - Add a translation + "browse.startsWith.months.june": "June", + + // "browse.startsWith.months.march": "March", + // TODO New key - Add a translation + "browse.startsWith.months.march": "March", + + // "browse.startsWith.months.may": "May", + // TODO New key - Add a translation + "browse.startsWith.months.may": "May", + + // "browse.startsWith.months.none": "(Choose month)", + // TODO New key - Add a translation + "browse.startsWith.months.none": "(Choose month)", + + // "browse.startsWith.months.november": "November", + // TODO New key - Add a translation + "browse.startsWith.months.november": "November", + + // "browse.startsWith.months.october": "October", + // TODO New key - Add a translation + "browse.startsWith.months.october": "October", + + // "browse.startsWith.months.september": "September", + // TODO New key - Add a translation + "browse.startsWith.months.september": "September", + + // "browse.startsWith.submit": "Go", + // TODO New key - Add a translation + "browse.startsWith.submit": "Go", + + // "browse.startsWith.type_date": "Or type in a date (year-month):", + // TODO New key - Add a translation + "browse.startsWith.type_date": "Or type in a date (year-month):", + + // "browse.startsWith.type_text": "Or enter first few letters:", + // TODO New key - Add a translation + "browse.startsWith.type_text": "Or enter first few letters:", + + // "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", + // TODO New key - Add a translation + "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", + + + // "chips.remove": "Remove chip", + // TODO New key - Add a translation + "chips.remove": "Remove chip", + + + + // "collection.create.head": "Create a Collection", + // TODO New key - Add a translation + "collection.create.head": "Create a Collection", + + // "collection.create.notifications.success": "Successfully created the Collection", + // TODO New key - Add a translation + "collection.create.notifications.success": "Successfully created the Collection", + + // "collection.create.sub-head": "Create a Collection for Community {{ parent }}", + // TODO New key - Add a translation + "collection.create.sub-head": "Create a Collection for Community {{ parent }}", + + // "collection.curate.header": "Curate Collection: {{collection}}", + // TODO New key - Add a translation + "collection.curate.header": "Curate Collection: {{collection}}", + + // "collection.delete.cancel": "Cancel", + // TODO New key - Add a translation + "collection.delete.cancel": "Cancel", + + // "collection.delete.confirm": "Confirm", + // TODO New key - Add a translation + "collection.delete.confirm": "Confirm", + + // "collection.delete.head": "Delete Collection", + // TODO New key - Add a translation + "collection.delete.head": "Delete Collection", + + // "collection.delete.notification.fail": "Collection could not be deleted", + // TODO New key - Add a translation + "collection.delete.notification.fail": "Collection could not be deleted", + + // "collection.delete.notification.success": "Successfully deleted collection", + // TODO New key - Add a translation + "collection.delete.notification.success": "Successfully deleted collection", + + // "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", + // TODO New key - Add a translation + "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", + + + + // "collection.edit.delete": "Delete this collection", + // TODO New key - Add a translation + "collection.edit.delete": "Delete this collection", + + // "collection.edit.head": "Edit Collection", + // TODO New key - Add a translation + "collection.edit.head": "Edit Collection", + + // "collection.edit.breadcrumbs": "Edit Collection", + // TODO New key - Add a translation + "collection.edit.breadcrumbs": "Edit Collection", + + + + // "collection.edit.tabs.mapper.head": "Item Mapper", + // TODO New key - Add a translation + "collection.edit.tabs.mapper.head": "Item Mapper", + + // "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", + // TODO New key - Add a translation + "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", + + // "collection.edit.item-mapper.cancel": "Cancel", + // TODO New key - Add a translation + "collection.edit.item-mapper.cancel": "Cancel", + + // "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", + // TODO New key - Add a translation + "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", + + // "collection.edit.item-mapper.confirm": "Map selected items", + // TODO New key - Add a translation + "collection.edit.item-mapper.confirm": "Map selected items", + + // "collection.edit.item-mapper.description": "This is the item mapper tool that allows collection administrators to map items from other collections into this collection. You can search for items from other collections and map them, or browse the list of currently mapped items.", + // TODO New key - Add a translation + "collection.edit.item-mapper.description": "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.head": "Item Mapper - Map Items from Other Collections", + // TODO New key - Add a translation + "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", + + // "collection.edit.item-mapper.no-search": "Please enter a query to search", + // TODO New key - Add a translation + "collection.edit.item-mapper.no-search": "Please enter a query to search", + + // "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", + + // "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", + + // "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", + + // "collection.edit.item-mapper.notifications.map.success.head": "Mapping completed", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.map.success.head": "Mapping completed", + + // "collection.edit.item-mapper.notifications.unmap.error.content": "Errors occurred for removing the mappings of {{amount}} items.", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.unmap.error.content": "Errors occurred for removing the mappings of {{amount}} items.", + + // "collection.edit.item-mapper.notifications.unmap.error.head": "Remove mapping errors", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.unmap.error.head": "Remove mapping errors", + + // "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", + + // "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", + + // "collection.edit.item-mapper.remove": "Remove selected item mappings", + // TODO New key - Add a translation + "collection.edit.item-mapper.remove": "Remove selected item mappings", + + // "collection.edit.item-mapper.tabs.browse": "Browse mapped items", + // TODO New key - Add a translation + "collection.edit.item-mapper.tabs.browse": "Browse mapped items", + + // "collection.edit.item-mapper.tabs.map": "Map new items", + // TODO New key - Add a translation + "collection.edit.item-mapper.tabs.map": "Map new items", + + + + // "collection.edit.logo.label": "Collection logo", + // TODO New key - Add a translation + "collection.edit.logo.label": "Collection logo", + + // "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", + // TODO New key - Add a translation + "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", + + // "collection.edit.logo.notifications.add.success": "Upload Collection logo successful.", + // TODO New key - Add a translation + "collection.edit.logo.notifications.add.success": "Upload Collection logo successful.", + + // "collection.edit.logo.notifications.delete.success.title": "Logo deleted", + // TODO New key - Add a translation + "collection.edit.logo.notifications.delete.success.title": "Logo deleted", + + // "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", + // TODO New key - Add a translation + "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", + + // "collection.edit.logo.notifications.delete.error.title": "Error deleting logo", + // TODO New key - Add a translation + "collection.edit.logo.notifications.delete.error.title": "Error deleting logo", + + // "collection.edit.logo.upload": "Drop a Collection Logo to upload", + // TODO New key - Add a translation + "collection.edit.logo.upload": "Drop a Collection Logo to upload", + + + + // "collection.edit.notifications.success": "Successfully edited the Collection", + // TODO New key - Add a translation + "collection.edit.notifications.success": "Successfully edited the Collection", + + // "collection.edit.return": "Return", + // TODO New key - Add a translation + "collection.edit.return": "Return", + + + + // "collection.edit.tabs.curate.head": "Curate", + // TODO New key - Add a translation + "collection.edit.tabs.curate.head": "Curate", + + // "collection.edit.tabs.curate.title": "Collection Edit - Curate", + // TODO New key - Add a translation + "collection.edit.tabs.curate.title": "Collection Edit - Curate", + + // "collection.edit.tabs.authorizations.head": "Authorizations", + // TODO New key - Add a translation + "collection.edit.tabs.authorizations.head": "Authorizations", + + // "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", + // TODO New key - Add a translation + "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", + + // "collection.edit.tabs.metadata.head": "Edit Metadata", + // TODO New key - Add a translation + "collection.edit.tabs.metadata.head": "Edit Metadata", + + // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", + // TODO New key - Add a translation + "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", + + // "collection.edit.tabs.roles.head": "Assign Roles", + // TODO New key - Add a translation + "collection.edit.tabs.roles.head": "Assign Roles", + + // "collection.edit.tabs.roles.title": "Collection Edit - Roles", + // TODO New key - Add a translation + "collection.edit.tabs.roles.title": "Collection Edit - Roles", + + // "collection.edit.tabs.source.external": "This collection harvests its content from an external source", + // TODO New key - Add a translation + "collection.edit.tabs.source.external": "This collection harvests its content from an external source", + + // "collection.edit.tabs.source.form.errors.oaiSource.required": "You must provide a set id of the target collection.", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.errors.oaiSource.required": "You must provide a set id of the target collection.", + + // "collection.edit.tabs.source.form.harvestType": "Content being harvested", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.harvestType": "Content being harvested", + + // "collection.edit.tabs.source.form.head": "Configure an external source", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.head": "Configure an external source", + + // "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", + + // "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", + + // "collection.edit.tabs.source.form.oaiSource": "OAI Provider", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.oaiSource": "OAI Provider", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Harvest metadata and bitstreams (requires ORE support)", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Harvest metadata and bitstreams (requires ORE support)", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest metadata and references to bitstreams (requires ORE support)", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest metadata and references to bitstreams (requires ORE support)", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvest metadata only", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvest metadata only", + + // "collection.edit.tabs.source.head": "Content Source", + // TODO New key - Add a translation + "collection.edit.tabs.source.head": "Content Source", + + // "collection.edit.tabs.source.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + + // "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", + + // "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + + // "collection.edit.tabs.source.notifications.invalid.title": "Metadata invalid", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.invalid.title": "Metadata invalid", + + // "collection.edit.tabs.source.notifications.saved.content": "Your changes to this collection's content source were saved.", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.saved.content": "Your changes to this collection's content source were saved.", + + // "collection.edit.tabs.source.notifications.saved.title": "Content Source saved", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.saved.title": "Content Source saved", + + // "collection.edit.tabs.source.title": "Collection Edit - Content Source", + // TODO New key - Add a translation + "collection.edit.tabs.source.title": "Collection Edit - Content Source", + + + + // "collection.edit.template.add-button": "Add", + // TODO New key - Add a translation + "collection.edit.template.add-button": "Add", + + // "collection.edit.template.breadcrumbs": "Item template", + // TODO New key - Add a translation + "collection.edit.template.breadcrumbs": "Item template", + + // "collection.edit.template.cancel": "Cancel", + // TODO New key - Add a translation + "collection.edit.template.cancel": "Cancel", + + // "collection.edit.template.delete-button": "Delete", + // TODO New key - Add a translation + "collection.edit.template.delete-button": "Delete", + + // "collection.edit.template.edit-button": "Edit", + // TODO New key - Add a translation + "collection.edit.template.edit-button": "Edit", + + // "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", + // TODO New key - Add a translation + "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", + + // "collection.edit.template.label": "Template item", + // TODO New key - Add a translation + "collection.edit.template.label": "Template item", + + // "collection.edit.template.notifications.delete.error": "Failed to delete the item template", + // TODO New key - Add a translation + "collection.edit.template.notifications.delete.error": "Failed to delete the item template", + + // "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", + // TODO New key - Add a translation + "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", + + // "collection.edit.template.title": "Edit Template Item", + // TODO New key - Add a translation + "collection.edit.template.title": "Edit Template Item", + + + + // "collection.form.abstract": "Short Description", + // TODO New key - Add a translation + "collection.form.abstract": "Short Description", + + // "collection.form.description": "Introductory text (HTML)", + // TODO New key - Add a translation + "collection.form.description": "Introductory text (HTML)", + + // "collection.form.errors.title.required": "Please enter a collection name", + // TODO New key - Add a translation + "collection.form.errors.title.required": "Please enter a collection name", + + // "collection.form.license": "License", + // TODO New key - Add a translation + "collection.form.license": "License", + + // "collection.form.provenance": "Provenance", + // TODO New key - Add a translation + "collection.form.provenance": "Provenance", + + // "collection.form.rights": "Copyright text (HTML)", + // TODO New key - Add a translation + "collection.form.rights": "Copyright text (HTML)", + + // "collection.form.tableofcontents": "News (HTML)", + // TODO New key - Add a translation + "collection.form.tableofcontents": "News (HTML)", + + // "collection.form.title": "Name", + // TODO New key - Add a translation + "collection.form.title": "Name", + + + + // "collection.listelement.badge": "Collection", + // TODO New key - Add a translation + "collection.listelement.badge": "Collection", + + + + // "collection.page.browse.recent.head": "Recent Submissions", + // TODO New key - Add a translation + "collection.page.browse.recent.head": "Recent Submissions", + + // "collection.page.browse.recent.empty": "No items to show", + // TODO New key - Add a translation + "collection.page.browse.recent.empty": "No items to show", + + // "collection.page.edit": "Edit this collection", + // TODO New key - Add a translation + "collection.page.edit": "Edit this collection", + + // "collection.page.handle": "Permanent URI for this collection", + // TODO New key - Add a translation + "collection.page.handle": "Permanent URI for this collection", + + // "collection.page.license": "License", + // TODO New key - Add a translation + "collection.page.license": "License", + + // "collection.page.news": "News", + "collection.page.news": "Жаңалықтар", + + + + // "collection.select.confirm": "Confirm selected", + // TODO New key - Add a translation + "collection.select.confirm": "Confirm selected", + + // "collection.select.empty": "No collections to show", + // TODO New key - Add a translation + "collection.select.empty": "No collections to show", + + // "collection.select.table.title": "Title", + // TODO New key - Add a translation + "collection.select.table.title": "Title", + + + + // "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", + // TODO New key - Add a translation + "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", + + // "collection.source.update.notifications.error.title": "Server Error", + // TODO New key - Add a translation + "collection.source.update.notifications.error.title": "Server Error", + + + + // "communityList.tabTitle": "DSpace - Community List", + // TODO New key - Add a translation + "communityList.tabTitle": "DSpace - Community List", + + // "communityList.title": "List of Communities", + // TODO New key - Add a translation + "communityList.title": "List of Communities", + + // "communityList.showMore": "Show More", + // TODO New key - Add a translation + "communityList.showMore": "Show More", + + + + // "community.create.head": "Create a Community", + // TODO New key - Add a translation + "community.create.head": "Create a Community", + + // "community.create.notifications.success": "Successfully created the Community", + // TODO New key - Add a translation + "community.create.notifications.success": "Successfully created the Community", + + // "community.create.sub-head": "Create a Sub-Community for Community {{ parent }}", + // TODO New key - Add a translation + "community.create.sub-head": "Create a Sub-Community for Community {{ parent }}", + + // "community.curate.header": "Curate Community: {{community}}", + // TODO New key - Add a translation + "community.curate.header": "Curate Community: {{community}}", + + // "community.delete.cancel": "Cancel", + // TODO New key - Add a translation + "community.delete.cancel": "Cancel", + + // "community.delete.confirm": "Confirm", + // TODO New key - Add a translation + "community.delete.confirm": "Confirm", + + // "community.delete.head": "Delete Community", + // TODO New key - Add a translation + "community.delete.head": "Delete Community", + + // "community.delete.notification.fail": "Community could not be deleted", + // TODO New key - Add a translation + "community.delete.notification.fail": "Community could not be deleted", + + // "community.delete.notification.success": "Successfully deleted community", + // TODO New key - Add a translation + "community.delete.notification.success": "Successfully deleted community", + + // "community.delete.text": "Are you sure you want to delete community \"{{ dso }}\"", + // TODO New key - Add a translation + "community.delete.text": "Are you sure you want to delete community \"{{ dso }}\"", + + // "community.edit.delete": "Delete this community", + // TODO New key - Add a translation + "community.edit.delete": "Delete this community", + + // "community.edit.head": "Edit Community", + // TODO New key - Add a translation + "community.edit.head": "Edit Community", + + // "community.edit.breadcrumbs": "Edit Community", + // TODO New key - Add a translation + "community.edit.breadcrumbs": "Edit Community", + + + // "community.edit.logo.label": "Community logo", + // TODO New key - Add a translation + "community.edit.logo.label": "Community logo", + + // "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", + // TODO New key - Add a translation + "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", + + // "community.edit.logo.notifications.add.success": "Upload Community logo successful.", + // TODO New key - Add a translation + "community.edit.logo.notifications.add.success": "Upload Community logo successful.", + + // "community.edit.logo.notifications.delete.success.title": "Logo deleted", + // TODO New key - Add a translation + "community.edit.logo.notifications.delete.success.title": "Logo deleted", + + // "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", + // TODO New key - Add a translation + "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", + + // "community.edit.logo.notifications.delete.error.title": "Error deleting logo", + // TODO New key - Add a translation + "community.edit.logo.notifications.delete.error.title": "Error deleting logo", + + // "community.edit.logo.upload": "Drop a Community Logo to upload", + // TODO New key - Add a translation + "community.edit.logo.upload": "Drop a Community Logo to upload", + + + + // "community.edit.notifications.success": "Successfully edited the Community", + // TODO New key - Add a translation + "community.edit.notifications.success": "Successfully edited the Community", + + // "community.edit.notifications.unauthorized": "You do not have privileges to make this change", + // TODO New key - Add a translation + "community.edit.notifications.unauthorized": "You do not have privileges to make this change", + + // "community.edit.notifications.error": "An error occured while editing the Community", + // TODO New key - Add a translation + "community.edit.notifications.error": "An error occured while editing the Community", + + // "community.edit.return": "Return", + // TODO New key - Add a translation + "community.edit.return": "Return", + + + + // "community.edit.tabs.curate.head": "Curate", + // TODO New key - Add a translation + "community.edit.tabs.curate.head": "Curate", + + // "community.edit.tabs.curate.title": "Community Edit - Curate", + // TODO New key - Add a translation + "community.edit.tabs.curate.title": "Community Edit - Curate", + + // "community.edit.tabs.metadata.head": "Edit Metadata", + // TODO New key - Add a translation + "community.edit.tabs.metadata.head": "Edit Metadata", + + // "community.edit.tabs.metadata.title": "Community Edit - Metadata", + // TODO New key - Add a translation + "community.edit.tabs.metadata.title": "Community Edit - Metadata", + + // "community.edit.tabs.roles.head": "Assign Roles", + // TODO New key - Add a translation + "community.edit.tabs.roles.head": "Assign Roles", + + // "community.edit.tabs.roles.title": "Community Edit - Roles", + // TODO New key - Add a translation + "community.edit.tabs.roles.title": "Community Edit - Roles", + + // "community.edit.tabs.authorizations.head": "Authorizations", + // TODO New key - Add a translation + "community.edit.tabs.authorizations.head": "Authorizations", + + // "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", + // TODO New key - Add a translation + "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", + + + + // "community.listelement.badge": "Community", + // TODO New key - Add a translation + "community.listelement.badge": "Community", + + + + // "comcol-role.edit.no-group": "None", + // TODO New key - Add a translation + "comcol-role.edit.no-group": "None", + + // "comcol-role.edit.create": "Create", + // TODO New key - Add a translation + "comcol-role.edit.create": "Create", + + // "comcol-role.edit.restrict": "Restrict", + // TODO New key - Add a translation + "comcol-role.edit.restrict": "Restrict", + + // "comcol-role.edit.delete": "Delete", + // TODO New key - Add a translation + "comcol-role.edit.delete": "Delete", + + + // "comcol-role.edit.community-admin.name": "Administrators", + // TODO New key - Add a translation + "comcol-role.edit.community-admin.name": "Administrators", + + // "comcol-role.edit.collection-admin.name": "Administrators", + // TODO New key - Add a translation + "comcol-role.edit.collection-admin.name": "Administrators", + + + // "comcol-role.edit.community-admin.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", + // TODO New key - Add a translation + "comcol-role.edit.community-admin.description": "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.collection-admin.description": "Collection administrators decide who can submit items to the collection, edit item metadata (after submission), and add (map) existing items from other collections to this collection (subject to authorization for that collection).", + // TODO New key - Add a translation + "comcol-role.edit.collection-admin.description": "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.submitters.name": "Submitters", + // TODO New key - Add a translation + "comcol-role.edit.submitters.name": "Submitters", + + // "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", + // TODO New key - Add a translation + "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", + + + // "comcol-role.edit.item_read.name": "Default item read access", + // TODO New key - Add a translation + "comcol-role.edit.item_read.name": "Default item read access", + + // "comcol-role.edit.item_read.description": "E-People and Groups that can read new items submitted to this collection. Changes to this role are not retroactive. Existing items in the system will still be viewable by those who had read access at the time of their addition.", + // TODO New key - Add a translation + "comcol-role.edit.item_read.description": "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.anonymous-group": "Default read for incoming items is currently set to Anonymous.", + // TODO New key - Add a translation + "comcol-role.edit.item_read.anonymous-group": "Default read for incoming items is currently set to Anonymous.", + + + // "comcol-role.edit.bitstream_read.name": "Default bitstream read access", + // TODO New key - Add a translation + "comcol-role.edit.bitstream_read.name": "Default bitstream read access", + + // "comcol-role.edit.bitstream_read.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", + // TODO New key - Add a translation + "comcol-role.edit.bitstream_read.description": "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.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", + // TODO New key - Add a translation + "comcol-role.edit.bitstream_read.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", + + + // "comcol-role.edit.editor.name": "Editors", + // TODO New key - Add a translation + "comcol-role.edit.editor.name": "Editors", + + // "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", + // TODO New key - Add a translation + "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", + + + // "comcol-role.edit.finaleditor.name": "Final editors", + // TODO New key - Add a translation + "comcol-role.edit.finaleditor.name": "Final editors", + + // "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", + // TODO New key - Add a translation + "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", + + + // "comcol-role.edit.reviewer.name": "Reviewers", + // TODO New key - Add a translation + "comcol-role.edit.reviewer.name": "Reviewers", + + // "comcol-role.edit.reviewer.description": "Reviewers are able to accept or reject incoming submissions. However, they are not able to edit the submission's metadata.", + // TODO New key - Add a translation + "comcol-role.edit.reviewer.description": "Reviewers are able to accept or reject incoming submissions. However, they are not able to edit the submission's metadata.", + + + + // "community.form.abstract": "Short Description", + // TODO New key - Add a translation + "community.form.abstract": "Short Description", + + // "community.form.description": "Introductory text (HTML)", + // TODO New key - Add a translation + "community.form.description": "Introductory text (HTML)", + + // "community.form.errors.title.required": "Please enter a community name", + // TODO New key - Add a translation + "community.form.errors.title.required": "Please enter a community name", + + // "community.form.rights": "Copyright text (HTML)", + // TODO New key - Add a translation + "community.form.rights": "Copyright text (HTML)", + + // "community.form.tableofcontents": "News (HTML)", + // TODO New key - Add a translation + "community.form.tableofcontents": "News (HTML)", + + // "community.form.title": "Name", + // TODO New key - Add a translation + "community.form.title": "Name", + + // "community.page.edit": "Edit this community", + // TODO New key - Add a translation + "community.page.edit": "Edit this community", + + // "community.page.handle": "Permanent URI for this community", + // TODO New key - Add a translation + "community.page.handle": "Permanent URI for this community", + + // "community.page.license": "License", + // TODO New key - Add a translation + "community.page.license": "License", + + // "community.page.news": "News", + // TODO New key - Add a translation + "community.page.news": "News", + + // "community.all-lists.head": "Subcommunities and Collections", + // TODO New key - Add a translation + "community.all-lists.head": "Subcommunities and Collections", + + // "community.sub-collection-list.head": "Collections of this Community", + // TODO New key - Add a translation + "community.sub-collection-list.head": "Collections of this Community", + + // "community.sub-community-list.head": "Communities of this Community", + // TODO New key - Add a translation + "community.sub-community-list.head": "Communities of this Community", + + + + // "cookies.consent.accept-all": "Accept all", + // TODO New key - Add a translation + "cookies.consent.accept-all": "Accept all", + + // "cookies.consent.accept-selected": "Accept selected", + // TODO New key - Add a translation + "cookies.consent.accept-selected": "Accept selected", + + // "cookies.consent.app.opt-out.description": "This app is loaded by default (but you can opt out)", + // TODO New key - Add a translation + "cookies.consent.app.opt-out.description": "This app is loaded by default (but you can opt out)", + + // "cookies.consent.app.opt-out.title": "(opt-out)", + // TODO New key - Add a translation + "cookies.consent.app.opt-out.title": "(opt-out)", + + // "cookies.consent.app.purpose": "purpose", + // TODO New key - Add a translation + "cookies.consent.app.purpose": "purpose", + + // "cookies.consent.app.required.description": "This application is always required", + // TODO New key - Add a translation + "cookies.consent.app.required.description": "This application is always required", + + // "cookies.consent.app.required.title": "(always required)", + // TODO New key - Add a translation + "cookies.consent.app.required.title": "(always required)", + + // "cookies.consent.update": "There were changes since your last visit, please update your consent.", + // TODO New key - Add a translation + "cookies.consent.update": "There were changes since your last visit, please update your consent.", + + // "cookies.consent.close": "Close", + // TODO New key - Add a translation + "cookies.consent.close": "Close", + + // "cookies.consent.decline": "Decline", + // TODO New key - Add a translation + "cookies.consent.decline": "Decline", + + // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", + // TODO New key - Add a translation + "cookies.consent.content-notice.description": "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.learnMore": "Customize", + // TODO New key - Add a translation + "cookies.consent.content-notice.learnMore": "Customize", + + // "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", + // TODO New key - Add a translation + "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", + + // "cookies.consent.content-modal.privacy-policy.name": "privacy policy", + // TODO New key - Add a translation + "cookies.consent.content-modal.privacy-policy.name": "privacy policy", + + // "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", + // TODO New key - Add a translation + "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", + + // "cookies.consent.content-modal.title": "Information that we collect", + // TODO New key - Add a translation + "cookies.consent.content-modal.title": "Information that we collect", + + + + // "cookies.consent.app.title.authentication": "Authentication", + // TODO New key - Add a translation + "cookies.consent.app.title.authentication": "Authentication", + + // "cookies.consent.app.description.authentication": "Required for signing you in", + // TODO New key - Add a translation + "cookies.consent.app.description.authentication": "Required for signing you in", + + + // "cookies.consent.app.title.preferences": "Preferences", + // TODO New key - Add a translation + "cookies.consent.app.title.preferences": "Preferences", + + // "cookies.consent.app.description.preferences": "Required for saving your preferences", + // TODO New key - Add a translation + "cookies.consent.app.description.preferences": "Required for saving your preferences", + + + + // "cookies.consent.app.title.acknowledgement": "Acknowledgement", + // TODO New key - Add a translation + "cookies.consent.app.title.acknowledgement": "Acknowledgement", + + // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", + // TODO New key - Add a translation + "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", + + + + // "cookies.consent.app.title.google-analytics": "Google Analytics", + // TODO New key - Add a translation + "cookies.consent.app.title.google-analytics": "Google Analytics", + + // "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", + // TODO New key - Add a translation + "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", + + + + // "cookies.consent.purpose.functional": "Functional", + // TODO New key - Add a translation + "cookies.consent.purpose.functional": "Functional", + + // "cookies.consent.purpose.statistical": "Statistical", + // TODO New key - Add a translation + "cookies.consent.purpose.statistical": "Statistical", + + + // "curation-task.task.checklinks.label": "Check Links in Metadata", + // TODO New key - Add a translation + "curation-task.task.checklinks.label": "Check Links in Metadata", + + // "curation-task.task.noop.label": "NOOP", + // TODO New key - Add a translation + "curation-task.task.noop.label": "NOOP", + + // "curation-task.task.profileformats.label": "Profile Bitstream Formats", + // TODO New key - Add a translation + "curation-task.task.profileformats.label": "Profile Bitstream Formats", + + // "curation-task.task.requiredmetadata.label": "Check for Required Metadata", + // TODO New key - Add a translation + "curation-task.task.requiredmetadata.label": "Check for Required Metadata", + + // "curation-task.task.translate.label": "Microsoft Translator", + // TODO New key - Add a translation + "curation-task.task.translate.label": "Microsoft Translator", + + // "curation-task.task.vscan.label": "Virus Scan", + // TODO New key - Add a translation + "curation-task.task.vscan.label": "Virus Scan", + + + + // "curation.form.task-select.label": "Task:", + // TODO New key - Add a translation + "curation.form.task-select.label": "Task:", + + // "curation.form.submit": "Start", + // TODO New key - Add a translation + "curation.form.submit": "Start", + + // "curation.form.submit.success.head": "The curation task has been started successfully", + // TODO New key - Add a translation + "curation.form.submit.success.head": "The curation task has been started successfully", + + // "curation.form.submit.success.content": "You will be redirected to the corresponding process page.", + // TODO New key - Add a translation + "curation.form.submit.success.content": "You will be redirected to the corresponding process page.", + + // "curation.form.submit.error.head": "Running the curation task failed", + // TODO New key - Add a translation + "curation.form.submit.error.head": "Running the curation task failed", + + // "curation.form.submit.error.content": "An error occured when trying to start the curation task.", + // TODO New key - Add a translation + "curation.form.submit.error.content": "An error occured when trying to start the curation task.", + + // "curation.form.handle.label": "Handle:", + // TODO New key - Add a translation + "curation.form.handle.label": "Handle:", + + // "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", + // TODO New key - Add a translation + "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", + + + + // "dso-selector.create.collection.head": "New collection", + // TODO New key - Add a translation + "dso-selector.create.collection.head": "New collection", + + // "dso-selector.create.collection.sub-level": "Create a new collection in", + // TODO New key - Add a translation + "dso-selector.create.collection.sub-level": "Create a new collection in", + + // "dso-selector.create.community.head": "New community", + // TODO New key - Add a translation + "dso-selector.create.community.head": "New community", + + // "dso-selector.create.community.sub-level": "Create a new community in", + // TODO New key - Add a translation + "dso-selector.create.community.sub-level": "Create a new community in", + + // "dso-selector.create.community.top-level": "Create a new top-level community", + // TODO New key - Add a translation + "dso-selector.create.community.top-level": "Create a new top-level community", + + // "dso-selector.create.item.head": "New item", + // TODO New key - Add a translation + "dso-selector.create.item.head": "New item", + + // "dso-selector.create.item.sub-level": "Create a new item in", + // TODO New key - Add a translation + "dso-selector.create.item.sub-level": "Create a new item in", + + // "dso-selector.create.submission.head": "New submission", + // TODO New key - Add a translation + "dso-selector.create.submission.head": "New submission", + + // "dso-selector.edit.collection.head": "Edit collection", + // TODO New key - Add a translation + "dso-selector.edit.collection.head": "Edit collection", + + // "dso-selector.edit.community.head": "Edit community", + // TODO New key - Add a translation + "dso-selector.edit.community.head": "Edit community", + + // "dso-selector.edit.item.head": "Edit item", + // TODO New key - Add a translation + "dso-selector.edit.item.head": "Edit item", + + // "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", + // TODO New key - Add a translation + "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", + + // "dso-selector.no-results": "No {{ type }} found", + // TODO New key - Add a translation + "dso-selector.no-results": "No {{ type }} found", + + // "dso-selector.placeholder": "Search for a {{ type }}", + // TODO New key - Add a translation + "dso-selector.placeholder": "Search for a {{ type }}", + + + + // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", + // TODO New key - Add a translation + "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", + + // "confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}", + // TODO New key - Add a translation + "confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}", + + // "confirmation-modal.export-metadata.cancel": "Cancel", + // TODO New key - Add a translation + "confirmation-modal.export-metadata.cancel": "Cancel", + + // "confirmation-modal.export-metadata.confirm": "Export", + // TODO New key - Add a translation + "confirmation-modal.export-metadata.confirm": "Export", + + // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", + // TODO New key - Add a translation + "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", + + // "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", + // TODO New key - Add a translation + "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", + + // "confirmation-modal.delete-eperson.cancel": "Cancel", + // TODO New key - Add a translation + "confirmation-modal.delete-eperson.cancel": "Cancel", + + // "confirmation-modal.delete-eperson.confirm": "Delete", + // TODO New key - Add a translation + "confirmation-modal.delete-eperson.confirm": "Delete", + + + // "error.bitstream": "Error fetching bitstream", + // TODO New key - Add a translation + "error.bitstream": "Error fetching bitstream", + + // "error.browse-by": "Error fetching items", + // TODO New key - Add a translation + "error.browse-by": "Error fetching items", + + // "error.collection": "Error fetching collection", + // TODO New key - Add a translation + "error.collection": "Error fetching collection", + + // "error.collections": "Error fetching collections", + // TODO New key - Add a translation + "error.collections": "Error fetching collections", + + // "error.community": "Error fetching community", + // TODO New key - Add a translation + "error.community": "Error fetching community", + + // "error.identifier": "No item found for the identifier", + // TODO New key - Add a translation + "error.identifier": "No item found for the identifier", + + // "error.default": "Error", + // TODO New key - Add a translation + "error.default": "Error", + + // "error.item": "Error fetching item", + // TODO New key - Add a translation + "error.item": "Error fetching item", + + // "error.items": "Error fetching items", + // TODO New key - Add a translation + "error.items": "Error fetching items", + + // "error.objects": "Error fetching objects", + // TODO New key - Add a translation + "error.objects": "Error fetching objects", + + // "error.recent-submissions": "Error fetching recent submissions", + // TODO New key - Add a translation + "error.recent-submissions": "Error fetching recent submissions", + + // "error.search-results": "Error fetching search results", + // TODO New key - Add a translation + "error.search-results": "Error fetching search results", + + // "error.sub-collections": "Error fetching sub-collections", + // TODO New key - Add a translation + "error.sub-collections": "Error fetching sub-collections", + + // "error.sub-communities": "Error fetching sub-communities", + // TODO New key - Add a translation + "error.sub-communities": "Error fetching sub-communities", + + // "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

", + // TODO New key - Add a translation + "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

", + + // "error.top-level-communities": "Error fetching top-level communities", + // TODO New key - Add a translation + "error.top-level-communities": "Error fetching top-level communities", + + // "error.validation.license.notgranted": "You must grant this license to complete your submission. If you are unable to grant this license at this time you may save your work and return later or remove the submission.", + // TODO New key - Add a translation + "error.validation.license.notgranted": "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.pattern": "This input is restricted by the current pattern: {{ pattern }}.", + // TODO New key - Add a translation + "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", + + // "error.validation.filerequired": "The file upload is mandatory", + // TODO New key - Add a translation + "error.validation.filerequired": "The file upload is mandatory", + + + + // "file-section.error.header": "Error obtaining files for this item", + // TODO New key - Add a translation + "file-section.error.header": "Error obtaining files for this item", + + + + // "footer.copyright": "copyright © 2002-{{ year }}", + // TODO New key - Add a translation + "footer.copyright": "copyright © 2002-{{ year }}", + + // "footer.link.dspace": "DSpace software", + // TODO New key - Add a translation + "footer.link.dspace": "DSpace software", + + // "footer.link.lyrasis": "LYRASIS", + // TODO New key - Add a translation + "footer.link.lyrasis": "LYRASIS", + + // "footer.link.cookies": "Cookie settings", + // TODO New key - Add a translation + "footer.link.cookies": "Cookie settings", + + // "footer.link.privacy-policy": "Privacy policy", + // TODO New key - Add a translation + "footer.link.privacy-policy": "Privacy policy", + + // "footer.link.end-user-agreement":"End User Agreement", + // TODO New key - Add a translation + "footer.link.end-user-agreement":"End User Agreement", + + + + // "forgot-email.form.header": "Forgot Password", + // TODO New key - Add a translation + "forgot-email.form.header": "Forgot Password", + + // "forgot-email.form.info": "Enter Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + // TODO New key - Add a translation + "forgot-email.form.info": "Enter Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + + // "forgot-email.form.email": "Email Address *", + // TODO New key - Add a translation + "forgot-email.form.email": "Email Address *", + + // "forgot-email.form.email.error.required": "Please fill in an email address", + // TODO New key - Add a translation + "forgot-email.form.email.error.required": "Please fill in an email address", + + // "forgot-email.form.email.error.pattern": "Please fill in a valid email address", + // TODO New key - Add a translation + "forgot-email.form.email.error.pattern": "Please fill in a valid email address", + + // "forgot-email.form.email.hint": "This address will be verified and used as your login name.", + // TODO New key - Add a translation + "forgot-email.form.email.hint": "This address will be verified and used as your login name.", + + // "forgot-email.form.submit": "Submit", + // TODO New key - Add a translation + "forgot-email.form.submit": "Submit", + + // "forgot-email.form.success.head": "Verification email sent", + // TODO New key - Add a translation + "forgot-email.form.success.head": "Verification email sent", + + // "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + // TODO New key - Add a translation + "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + + // "forgot-email.form.error.head": "Error when trying to register email", + // TODO New key - Add a translation + "forgot-email.form.error.head": "Error when trying to register email", + + // "forgot-email.form.error.content": "An error occured when registering the following email address: {{ email }}", + // TODO New key - Add a translation + "forgot-email.form.error.content": "An error occured when registering the following email address: {{ email }}", + + + + // "forgot-password.title": "Forgot Password", + // TODO New key - Add a translation + "forgot-password.title": "Forgot Password", + + // "forgot-password.form.head": "Forgot Password", + // TODO New key - Add a translation + "forgot-password.form.head": "Forgot Password", + + // "forgot-password.form.info": "Enter a new password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", + // TODO New key - Add a translation + "forgot-password.form.info": "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.card.security": "Security", + // TODO New key - Add a translation + "forgot-password.form.card.security": "Security", + + // "forgot-password.form.identification.header": "Identify", + // TODO New key - Add a translation + "forgot-password.form.identification.header": "Identify", + + // "forgot-password.form.identification.email": "Email address: ", + // TODO New key - Add a translation + "forgot-password.form.identification.email": "Email address: ", + + // "forgot-password.form.label.password": "Password", + // TODO New key - Add a translation + "forgot-password.form.label.password": "Password", + + // "forgot-password.form.label.passwordrepeat": "Retype to confirm", + // TODO New key - Add a translation + "forgot-password.form.label.passwordrepeat": "Retype to confirm", + + // "forgot-password.form.error.empty-password": "Please enter a password in the box below.", + // TODO New key - Add a translation + "forgot-password.form.error.empty-password": "Please enter a password in the box below.", + + // "forgot-password.form.error.matching-passwords": "The passwords do not match.", + // TODO New key - Add a translation + "forgot-password.form.error.matching-passwords": "The passwords do not match.", + + // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", + // TODO New key - Add a translation + "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", + + // "forgot-password.form.notification.error.title": "Error when trying to submit new password", + // TODO New key - Add a translation + "forgot-password.form.notification.error.title": "Error when trying to submit new password", + + // "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", + // TODO New key - Add a translation + "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", + + // "forgot-password.form.notification.success.title": "Password reset completed", + // TODO New key - Add a translation + "forgot-password.form.notification.success.title": "Password reset completed", + + // "forgot-password.form.submit": "Submit password", + // TODO New key - Add a translation + "forgot-password.form.submit": "Submit password", + + + + // "form.add": "Add", + // TODO New key - Add a translation + "form.add": "Add", + + // "form.add-help": "Click here to add the current entry and to add another one", + // TODO New key - Add a translation + "form.add-help": "Click here to add the current entry and to add another one", + + // "form.cancel": "Cancel", + // TODO New key - Add a translation + "form.cancel": "Cancel", + + // "form.clear": "Clear", + // TODO New key - Add a translation + "form.clear": "Clear", + + // "form.clear-help": "Click here to remove the selected value", + // TODO New key - Add a translation + "form.clear-help": "Click here to remove the selected value", + + // "form.edit": "Edit", + // TODO New key - Add a translation + "form.edit": "Edit", + + // "form.edit-help": "Click here to edit the selected value", + // TODO New key - Add a translation + "form.edit-help": "Click here to edit the selected value", + + // "form.first-name": "First name", + // TODO New key - Add a translation + "form.first-name": "First name", + + // "form.group-collapse": "Collapse", + // TODO New key - Add a translation + "form.group-collapse": "Collapse", + + // "form.group-collapse-help": "Click here to collapse", + // TODO New key - Add a translation + "form.group-collapse-help": "Click here to collapse", + + // "form.group-expand": "Expand", + // TODO New key - Add a translation + "form.group-expand": "Expand", + + // "form.group-expand-help": "Click here to expand and add more elements", + // TODO New key - Add a translation + "form.group-expand-help": "Click here to expand and add more elements", + + // "form.last-name": "Last name", + // TODO New key - Add a translation + "form.last-name": "Last name", + + // "form.loading": "Loading...", + // TODO New key - Add a translation + "form.loading": "Loading...", + + // "form.lookup": "Lookup", + // TODO New key - Add a translation + "form.lookup": "Lookup", + + // "form.lookup-help": "Click here to look up an existing relation", + // TODO New key - Add a translation + "form.lookup-help": "Click here to look up an existing relation", + + // "form.no-results": "No results found", + // TODO New key - Add a translation + "form.no-results": "No results found", + + // "form.no-value": "No value entered", + // TODO New key - Add a translation + "form.no-value": "No value entered", + + // "form.other-information": {}, + // TODO New key - Add a translation + "form.other-information": {}, + + // "form.remove": "Remove", + // TODO New key - Add a translation + "form.remove": "Remove", + + // "form.save": "Save", + // TODO New key - Add a translation + "form.save": "Save", + + // "form.save-help": "Save changes", + // TODO New key - Add a translation + "form.save-help": "Save changes", + + // "form.search": "Search", + // TODO New key - Add a translation + "form.search": "Search", + + // "form.search-help": "Click here to look for an existing correspondence", + // TODO New key - Add a translation + "form.search-help": "Click here to look for an existing correspondence", + + // "form.submit": "Submit", + // TODO New key - Add a translation + "form.submit": "Submit", + + + + // "home.description": "", + // TODO New key - Add a translation + "home.description": "", + + // "home.breadcrumbs": "Home", + // TODO New key - Add a translation + "home.breadcrumbs": "Home", + + // "home.title": "DSpace Angular :: Home", + // TODO New key - Add a translation + "home.title": "DSpace Angular :: Home", + + // "home.top-level-communities.head": "Communities in DSpace", + // TODO New key - Add a translation + "home.top-level-communities.head": "Communities in DSpace", + + // "home.top-level-communities.help": "Select a community to browse its collections.", + // TODO New key - Add a translation + "home.top-level-communities.help": "Select a community to browse its collections.", + + + + // "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", + + // "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", + + // "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", + + // "info.end-user-agreement.breadcrumbs": "End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.breadcrumbs": "End User Agreement", + + // "info.end-user-agreement.buttons.cancel": "Cancel", + // TODO New key - Add a translation + "info.end-user-agreement.buttons.cancel": "Cancel", + + // "info.end-user-agreement.buttons.save": "Save", + // TODO New key - Add a translation + "info.end-user-agreement.buttons.save": "Save", + + // "info.end-user-agreement.head": "End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.head": "End User Agreement", + + // "info.end-user-agreement.title": "End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.title": "End User Agreement", + + // "info.privacy.breadcrumbs": "Privacy Statement", + // TODO New key - Add a translation + "info.privacy.breadcrumbs": "Privacy Statement", + + // "info.privacy.head": "Privacy Statement", + // TODO New key - Add a translation + "info.privacy.head": "Privacy Statement", + + // "info.privacy.title": "Privacy Statement", + // TODO New key - Add a translation + "info.privacy.title": "Privacy Statement", + + + + // "item.alerts.private": "This item is private", + // TODO New key - Add a translation + "item.alerts.private": "This item is private", + + // "item.alerts.withdrawn": "This item has been withdrawn", + // TODO New key - Add a translation + "item.alerts.withdrawn": "This item has been withdrawn", + + + + // "item.edit.authorizations.heading": "With this editor you can view and alter the policies of an item, plus alter policies of individual item components: bundles and bitstreams. Briefly, an item is a container of bundles, and bundles are containers of bitstreams. Containers usually have ADD/REMOVE/READ/WRITE policies, while bitstreams only have READ/WRITE policies.", + // TODO New key - Add a translation + "item.edit.authorizations.heading": "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.title": "Edit item's Policies", + // TODO New key - Add a translation + "item.edit.authorizations.title": "Edit item's Policies", + + + + // "item.badge.private": "Private", + // TODO New key - Add a translation + "item.badge.private": "Private", + + // "item.badge.withdrawn": "Withdrawn", + // TODO New key - Add a translation + "item.badge.withdrawn": "Withdrawn", + + + + // "item.bitstreams.upload.bundle": "Bundle", + // TODO New key - Add a translation + "item.bitstreams.upload.bundle": "Bundle", + + // "item.bitstreams.upload.bundle.placeholder": "Select a bundle", + // TODO New key - Add a translation + "item.bitstreams.upload.bundle.placeholder": "Select a bundle", + + // "item.bitstreams.upload.bundle.new": "Create bundle", + // TODO New key - Add a translation + "item.bitstreams.upload.bundle.new": "Create bundle", + + // "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.", + // TODO New key - Add a translation + "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.", + + // "item.bitstreams.upload.cancel": "Cancel", + // TODO New key - Add a translation + "item.bitstreams.upload.cancel": "Cancel", + + // "item.bitstreams.upload.drop-message": "Drop a file to upload", + // TODO New key - Add a translation + "item.bitstreams.upload.drop-message": "Drop a file to upload", + + // "item.bitstreams.upload.item": "Item: ", + // TODO New key - Add a translation + "item.bitstreams.upload.item": "Item: ", + + // "item.bitstreams.upload.notifications.bundle.created.content": "Successfully created new bundle.", + // TODO New key - Add a translation + "item.bitstreams.upload.notifications.bundle.created.content": "Successfully created new bundle.", + + // "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", + // TODO New key - Add a translation + "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", + + // "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", + // TODO New key - Add a translation + "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", + + // "item.bitstreams.upload.title": "Upload bitstream", + // TODO New key - Add a translation + "item.bitstreams.upload.title": "Upload bitstream", + + + + // "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", + // TODO New key - Add a translation + "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", + + // "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", + // TODO New key - Add a translation + "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", + + // "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", + // TODO New key - Add a translation + "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", + + // "item.edit.bitstreams.bundle.load.more": "Load more", + // TODO New key - Add a translation + "item.edit.bitstreams.bundle.load.more": "Load more", + + // "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", + // TODO New key - Add a translation + "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", + + // "item.edit.bitstreams.discard-button": "Discard", + // TODO New key - Add a translation + "item.edit.bitstreams.discard-button": "Discard", + + // "item.edit.bitstreams.edit.buttons.download": "Download", + // TODO New key - Add a translation + "item.edit.bitstreams.edit.buttons.download": "Download", + + // "item.edit.bitstreams.edit.buttons.drag": "Drag", + // TODO New key - Add a translation + "item.edit.bitstreams.edit.buttons.drag": "Drag", + + // "item.edit.bitstreams.edit.buttons.edit": "Edit", + // TODO New key - Add a translation + "item.edit.bitstreams.edit.buttons.edit": "Edit", + + // "item.edit.bitstreams.edit.buttons.remove": "Remove", + // TODO New key - Add a translation + "item.edit.bitstreams.edit.buttons.remove": "Remove", + + // "item.edit.bitstreams.edit.buttons.undo": "Undo changes", + // TODO New key - Add a translation + "item.edit.bitstreams.edit.buttons.undo": "Undo changes", + + // "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", + // TODO New key - Add a translation + "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", + + // "item.edit.bitstreams.headers.actions": "Actions", + // TODO New key - Add a translation + "item.edit.bitstreams.headers.actions": "Actions", + + // "item.edit.bitstreams.headers.bundle": "Bundle", + // TODO New key - Add a translation + "item.edit.bitstreams.headers.bundle": "Bundle", + + // "item.edit.bitstreams.headers.description": "Description", + // TODO New key - Add a translation + "item.edit.bitstreams.headers.description": "Description", + + // "item.edit.bitstreams.headers.format": "Format", + // TODO New key - Add a translation + "item.edit.bitstreams.headers.format": "Format", + + // "item.edit.bitstreams.headers.name": "Name", + // TODO New key - Add a translation + "item.edit.bitstreams.headers.name": "Name", + + // "item.edit.bitstreams.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + + // "item.edit.bitstreams.notifications.discarded.title": "Changes discarded", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.discarded.title": "Changes discarded", + + // "item.edit.bitstreams.notifications.move.failed.title": "Error moving bitstreams", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.move.failed.title": "Error moving bitstreams", + + // "item.edit.bitstreams.notifications.move.saved.content": "Your move changes to this item's bitstreams and bundles have been saved.", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.move.saved.content": "Your move changes to this item's bitstreams and bundles have been saved.", + + // "item.edit.bitstreams.notifications.move.saved.title": "Move changes saved", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.move.saved.title": "Move changes saved", + + // "item.edit.bitstreams.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.outdated.content": "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.title": "Changes outdated", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.outdated.title": "Changes outdated", + + // "item.edit.bitstreams.notifications.remove.failed.title": "Error deleting bitstream", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.remove.failed.title": "Error deleting bitstream", + + // "item.edit.bitstreams.notifications.remove.saved.content": "Your removal changes to this item's bitstreams have been saved.", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.remove.saved.content": "Your removal changes to this item's bitstreams have been saved.", + + // "item.edit.bitstreams.notifications.remove.saved.title": "Removal changes saved", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.remove.saved.title": "Removal changes saved", + + // "item.edit.bitstreams.reinstate-button": "Undo", + // TODO New key - Add a translation + "item.edit.bitstreams.reinstate-button": "Undo", + + // "item.edit.bitstreams.save-button": "Save", + // TODO New key - Add a translation + "item.edit.bitstreams.save-button": "Save", + + // "item.edit.bitstreams.upload-button": "Upload", + // TODO New key - Add a translation + "item.edit.bitstreams.upload-button": "Upload", + + + + // "item.edit.delete.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.delete.cancel": "Cancel", + + // "item.edit.delete.confirm": "Delete", + // TODO New key - Add a translation + "item.edit.delete.confirm": "Delete", + + // "item.edit.delete.description": "Are you sure this item should be completely deleted? Caution: At present, no tombstone would be left.", + // TODO New key - Add a translation + "item.edit.delete.description": "Are you sure this item should be completely deleted? Caution: At present, no tombstone would be left.", + + // "item.edit.delete.error": "An error occurred while deleting the item", + // TODO New key - Add a translation + "item.edit.delete.error": "An error occurred while deleting the item", + + // "item.edit.delete.header": "Delete item: {{ id }}", + // TODO New key - Add a translation + "item.edit.delete.header": "Delete item: {{ id }}", + + // "item.edit.delete.success": "The item has been deleted", + // TODO New key - Add a translation + "item.edit.delete.success": "The item has been deleted", + + // "item.edit.head": "Edit Item", + // TODO New key - Add a translation + "item.edit.head": "Edit Item", + + // "item.edit.breadcrumbs": "Edit Item", + // TODO New key - Add a translation + "item.edit.breadcrumbs": "Edit Item", + + + // "item.edit.tabs.mapper.head": "Collection Mapper", + // TODO New key - Add a translation + "item.edit.tabs.mapper.head": "Collection Mapper", + + // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", + // TODO New key - Add a translation + "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", + + // "item.edit.item-mapper.buttons.add": "Map item to selected collections", + // TODO New key - Add a translation + "item.edit.item-mapper.buttons.add": "Map item to selected collections", + + // "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", + // TODO New key - Add a translation + "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", + + // "item.edit.item-mapper.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.item-mapper.cancel": "Cancel", + + // "item.edit.item-mapper.description": "This is the item mapper tool that allows administrators to map this item to other collections. You can search for collections and map them, or browse the list of collections the item is currently mapped to.", + // TODO New key - Add a translation + "item.edit.item-mapper.description": "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.head": "Item Mapper - Map Item to Collections", + // TODO New key - Add a translation + "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", + + // "item.edit.item-mapper.item": "Item: \"{{name}}\"", + // TODO New key - Add a translation + "item.edit.item-mapper.item": "Item: \"{{name}}\"", + + // "item.edit.item-mapper.no-search": "Please enter a query to search", + // TODO New key - Add a translation + "item.edit.item-mapper.no-search": "Please enter a query to search", + + // "item.edit.item-mapper.notifications.add.error.content": "Errors occurred for mapping of item to {{amount}} collections.", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.add.error.content": "Errors occurred for mapping of item to {{amount}} collections.", + + // "item.edit.item-mapper.notifications.add.error.head": "Mapping errors", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.add.error.head": "Mapping errors", + + // "item.edit.item-mapper.notifications.add.success.content": "Successfully mapped item to {{amount}} collections.", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.add.success.content": "Successfully mapped item to {{amount}} collections.", + + // "item.edit.item-mapper.notifications.add.success.head": "Mapping completed", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.add.success.head": "Mapping completed", + + // "item.edit.item-mapper.notifications.remove.error.content": "Errors occurred for the removal of the mapping to {{amount}} collections.", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.remove.error.content": "Errors occurred for the removal of the mapping to {{amount}} collections.", + + // "item.edit.item-mapper.notifications.remove.error.head": "Removal of mapping errors", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.remove.error.head": "Removal of mapping errors", + + // "item.edit.item-mapper.notifications.remove.success.content": "Successfully removed mapping of item to {{amount}} collections.", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.remove.success.content": "Successfully removed mapping of item to {{amount}} collections.", + + // "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", + + // "item.edit.item-mapper.tabs.browse": "Browse mapped collections", + // TODO New key - Add a translation + "item.edit.item-mapper.tabs.browse": "Browse mapped collections", + + // "item.edit.item-mapper.tabs.map": "Map new collections", + // TODO New key - Add a translation + "item.edit.item-mapper.tabs.map": "Map new collections", + + + + // "item.edit.metadata.add-button": "Add", + // TODO New key - Add a translation + "item.edit.metadata.add-button": "Add", + + // "item.edit.metadata.discard-button": "Discard", + // TODO New key - Add a translation + "item.edit.metadata.discard-button": "Discard", + + // "item.edit.metadata.edit.buttons.edit": "Edit", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.edit": "Edit", + + // "item.edit.metadata.edit.buttons.remove": "Remove", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.remove": "Remove", + + // "item.edit.metadata.edit.buttons.undo": "Undo changes", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.undo": "Undo changes", + + // "item.edit.metadata.edit.buttons.unedit": "Stop editing", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.unedit": "Stop editing", + + // "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", + // TODO New key - Add a translation + "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", + + // "item.edit.metadata.headers.edit": "Edit", + // TODO New key - Add a translation + "item.edit.metadata.headers.edit": "Edit", + + // "item.edit.metadata.headers.field": "Field", + // TODO New key - Add a translation + "item.edit.metadata.headers.field": "Field", + + // "item.edit.metadata.headers.language": "Lang", + // TODO New key - Add a translation + "item.edit.metadata.headers.language": "Lang", + + // "item.edit.metadata.headers.value": "Value", + // TODO New key - Add a translation + "item.edit.metadata.headers.value": "Value", + + // "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", + // TODO New key - Add a translation + "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", + + // "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + // TODO New key - Add a translation + "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + + // "item.edit.metadata.notifications.discarded.title": "Changed discarded", + // TODO New key - Add a translation + "item.edit.metadata.notifications.discarded.title": "Changed discarded", + + // "item.edit.metadata.notifications.error.title": "An error occurred", + // TODO New key - Add a translation + "item.edit.metadata.notifications.error.title": "An error occurred", + + // "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + // TODO New key - Add a translation + "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + + // "item.edit.metadata.notifications.invalid.title": "Metadata invalid", + // TODO New key - Add a translation + "item.edit.metadata.notifications.invalid.title": "Metadata invalid", + + // "item.edit.metadata.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", + // TODO New key - Add a translation + "item.edit.metadata.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", + + // "item.edit.metadata.notifications.outdated.title": "Changed outdated", + // TODO New key - Add a translation + "item.edit.metadata.notifications.outdated.title": "Changed outdated", + + // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", + // TODO New key - Add a translation + "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", + + // "item.edit.metadata.notifications.saved.title": "Metadata saved", + // TODO New key - Add a translation + "item.edit.metadata.notifications.saved.title": "Metadata saved", + + // "item.edit.metadata.reinstate-button": "Undo", + // TODO New key - Add a translation + "item.edit.metadata.reinstate-button": "Undo", + + // "item.edit.metadata.save-button": "Save", + // TODO New key - Add a translation + "item.edit.metadata.save-button": "Save", + + + + // "item.edit.modify.overview.field": "Field", + // TODO New key - Add a translation + "item.edit.modify.overview.field": "Field", + + // "item.edit.modify.overview.language": "Language", + // TODO New key - Add a translation + "item.edit.modify.overview.language": "Language", + + // "item.edit.modify.overview.value": "Value", + // TODO New key - Add a translation + "item.edit.modify.overview.value": "Value", + + + + // "item.edit.move.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.move.cancel": "Cancel", + + // "item.edit.move.description": "Select the collection you wish to move this item to. To narrow down the list of displayed collections, you can enter a search query in the box.", + // TODO New key - Add a translation + "item.edit.move.description": "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.error": "An error occurred when attempting to move the item", + // TODO New key - Add a translation + "item.edit.move.error": "An error occurred when attempting to move the item", + + // "item.edit.move.head": "Move item: {{id}}", + // TODO New key - Add a translation + "item.edit.move.head": "Move item: {{id}}", + + // "item.edit.move.inheritpolicies.checkbox": "Inherit policies", + // TODO New key - Add a translation + "item.edit.move.inheritpolicies.checkbox": "Inherit policies", + + // "item.edit.move.inheritpolicies.description": "Inherit the default policies of the destination collection", + // TODO New key - Add a translation + "item.edit.move.inheritpolicies.description": "Inherit the default policies of the destination collection", + + // "item.edit.move.move": "Move", + // TODO New key - Add a translation + "item.edit.move.move": "Move", + + // "item.edit.move.processing": "Moving...", + // TODO New key - Add a translation + "item.edit.move.processing": "Moving...", + + // "item.edit.move.search.placeholder": "Enter a search query to look for collections", + // TODO New key - Add a translation + "item.edit.move.search.placeholder": "Enter a search query to look for collections", + + // "item.edit.move.success": "The item has been moved successfully", + // TODO New key - Add a translation + "item.edit.move.success": "The item has been moved successfully", + + // "item.edit.move.title": "Move item", + // TODO New key - Add a translation + "item.edit.move.title": "Move item", + + + + // "item.edit.private.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.private.cancel": "Cancel", + + // "item.edit.private.confirm": "Make it Private", + // TODO New key - Add a translation + "item.edit.private.confirm": "Make it Private", + + // "item.edit.private.description": "Are you sure this item should be made private in the archive?", + // TODO New key - Add a translation + "item.edit.private.description": "Are you sure this item should be made private in the archive?", + + // "item.edit.private.error": "An error occurred while making the item private", + // TODO New key - Add a translation + "item.edit.private.error": "An error occurred while making the item private", + + // "item.edit.private.header": "Make item private: {{ id }}", + // TODO New key - Add a translation + "item.edit.private.header": "Make item private: {{ id }}", + + // "item.edit.private.success": "The item is now private", + // TODO New key - Add a translation + "item.edit.private.success": "The item is now private", + + + + // "item.edit.public.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.public.cancel": "Cancel", + + // "item.edit.public.confirm": "Make it Public", + // TODO New key - Add a translation + "item.edit.public.confirm": "Make it Public", + + // "item.edit.public.description": "Are you sure this item should be made public in the archive?", + // TODO New key - Add a translation + "item.edit.public.description": "Are you sure this item should be made public in the archive?", + + // "item.edit.public.error": "An error occurred while making the item public", + // TODO New key - Add a translation + "item.edit.public.error": "An error occurred while making the item public", + + // "item.edit.public.header": "Make item public: {{ id }}", + // TODO New key - Add a translation + "item.edit.public.header": "Make item public: {{ id }}", + + // "item.edit.public.success": "The item is now public", + // TODO New key - Add a translation + "item.edit.public.success": "The item is now public", + + + + // "item.edit.reinstate.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.reinstate.cancel": "Cancel", + + // "item.edit.reinstate.confirm": "Reinstate", + // TODO New key - Add a translation + "item.edit.reinstate.confirm": "Reinstate", + + // "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?", + // TODO New key - Add a translation + "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?", + + // "item.edit.reinstate.error": "An error occurred while reinstating the item", + // TODO New key - Add a translation + "item.edit.reinstate.error": "An error occurred while reinstating the item", + + // "item.edit.reinstate.header": "Reinstate item: {{ id }}", + // TODO New key - Add a translation + "item.edit.reinstate.header": "Reinstate item: {{ id }}", + + // "item.edit.reinstate.success": "The item was reinstated successfully", + // TODO New key - Add a translation + "item.edit.reinstate.success": "The item was reinstated successfully", + + + + // "item.edit.relationships.discard-button": "Discard", + // TODO New key - Add a translation + "item.edit.relationships.discard-button": "Discard", + + // "item.edit.relationships.edit.buttons.add": "Add", + // TODO New key - Add a translation + "item.edit.relationships.edit.buttons.add": "Add", + + // "item.edit.relationships.edit.buttons.remove": "Remove", + // TODO New key - Add a translation + "item.edit.relationships.edit.buttons.remove": "Remove", + + // "item.edit.relationships.edit.buttons.undo": "Undo changes", + // TODO New key - Add a translation + "item.edit.relationships.edit.buttons.undo": "Undo changes", + + // "item.edit.relationships.no-relationships": "No relationships", + // TODO New key - Add a translation + "item.edit.relationships.no-relationships": "No relationships", + + // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + // TODO New key - Add a translation + "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + + // "item.edit.relationships.notifications.discarded.title": "Changes discarded", + // TODO New key - Add a translation + "item.edit.relationships.notifications.discarded.title": "Changes discarded", + + // "item.edit.relationships.notifications.failed.title": "Error editing relationships", + // TODO New key - Add a translation + "item.edit.relationships.notifications.failed.title": "Error editing relationships", + + // "item.edit.relationships.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", + // TODO New key - Add a translation + "item.edit.relationships.notifications.outdated.content": "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.title": "Changes outdated", + // TODO New key - Add a translation + "item.edit.relationships.notifications.outdated.title": "Changes outdated", + + // "item.edit.relationships.notifications.saved.content": "Your changes to this item's relationships were saved.", + // TODO New key - Add a translation + "item.edit.relationships.notifications.saved.content": "Your changes to this item's relationships were saved.", + + // "item.edit.relationships.notifications.saved.title": "Relationships saved", + // TODO New key - Add a translation + "item.edit.relationships.notifications.saved.title": "Relationships saved", + + // "item.edit.relationships.reinstate-button": "Undo", + // TODO New key - Add a translation + "item.edit.relationships.reinstate-button": "Undo", + + // "item.edit.relationships.save-button": "Save", + // TODO New key - Add a translation + "item.edit.relationships.save-button": "Save", + + // "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", + // TODO New key - Add a translation + "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", + + + + // "item.edit.tabs.bitstreams.head": "Bitstreams", + // TODO New key - Add a translation + "item.edit.tabs.bitstreams.head": "Bitstreams", + + // "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", + // TODO New key - Add a translation + "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", + + // "item.edit.tabs.curate.head": "Curate", + // TODO New key - Add a translation + "item.edit.tabs.curate.head": "Curate", + + // "item.edit.tabs.curate.title": "Item Edit - Curate", + // TODO New key - Add a translation + "item.edit.tabs.curate.title": "Item Edit - Curate", + + // "item.edit.tabs.metadata.head": "Metadata", + // TODO New key - Add a translation + "item.edit.tabs.metadata.head": "Metadata", + + // "item.edit.tabs.metadata.title": "Item Edit - Metadata", + // TODO New key - Add a translation + "item.edit.tabs.metadata.title": "Item Edit - Metadata", + + // "item.edit.tabs.relationships.head": "Relationships", + // TODO New key - Add a translation + "item.edit.tabs.relationships.head": "Relationships", + + // "item.edit.tabs.relationships.title": "Item Edit - Relationships", + // TODO New key - Add a translation + "item.edit.tabs.relationships.title": "Item Edit - Relationships", + + // "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", + + // "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", + + // "item.edit.tabs.status.buttons.delete.button": "Permanently delete", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.delete.button": "Permanently delete", + + // "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", + + // "item.edit.tabs.status.buttons.mappedCollections.button": "Mapped collections", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.mappedCollections.button": "Mapped collections", + + // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", + + // "item.edit.tabs.status.buttons.move.button": "Move...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.move.button": "Move...", + + // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.move.label": "Move item to another collection", + + // "item.edit.tabs.status.buttons.private.button": "Make it private...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.private.button": "Make it private...", + + // "item.edit.tabs.status.buttons.private.label": "Make item private", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.private.label": "Make item private", + + // "item.edit.tabs.status.buttons.public.button": "Make it public...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.public.button": "Make it public...", + + // "item.edit.tabs.status.buttons.public.label": "Make item public", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.public.label": "Make item public", + + // "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", + + // "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", + + // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", + + // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", + + // "item.edit.tabs.status.description": "Welcome to the item management page. From here you can withdraw, reinstate, move or delete the item. You may also update or add new metadata / bitstreams on the other tabs.", + // TODO New key - Add a translation + "item.edit.tabs.status.description": "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.head": "Status", + // TODO New key - Add a translation + "item.edit.tabs.status.head": "Status", + + // "item.edit.tabs.status.labels.handle": "Handle", + // TODO New key - Add a translation + "item.edit.tabs.status.labels.handle": "Handle", + + // "item.edit.tabs.status.labels.id": "Item Internal ID", + // TODO New key - Add a translation + "item.edit.tabs.status.labels.id": "Item Internal ID", + + // "item.edit.tabs.status.labels.itemPage": "Item Page", + // TODO New key - Add a translation + "item.edit.tabs.status.labels.itemPage": "Item Page", + + // "item.edit.tabs.status.labels.lastModified": "Last Modified", + // TODO New key - Add a translation + "item.edit.tabs.status.labels.lastModified": "Last Modified", + + // "item.edit.tabs.status.title": "Item Edit - Status", + // TODO New key - Add a translation + "item.edit.tabs.status.title": "Item Edit - Status", + + // "item.edit.tabs.versionhistory.head": "Version History", + // TODO New key - Add a translation + "item.edit.tabs.versionhistory.head": "Version History", + + // "item.edit.tabs.versionhistory.title": "Item Edit - Version History", + // TODO New key - Add a translation + "item.edit.tabs.versionhistory.title": "Item Edit - Version History", + + // "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", + // TODO New key - Add a translation + "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", + + // "item.edit.tabs.view.head": "View Item", + // TODO New key - Add a translation + "item.edit.tabs.view.head": "View Item", + + // "item.edit.tabs.view.title": "Item Edit - View", + // TODO New key - Add a translation + "item.edit.tabs.view.title": "Item Edit - View", + + + + // "item.edit.withdraw.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.withdraw.cancel": "Cancel", + + // "item.edit.withdraw.confirm": "Withdraw", + // TODO New key - Add a translation + "item.edit.withdraw.confirm": "Withdraw", + + // "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?", + // TODO New key - Add a translation + "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?", + + // "item.edit.withdraw.error": "An error occurred while withdrawing the item", + // TODO New key - Add a translation + "item.edit.withdraw.error": "An error occurred while withdrawing the item", + + // "item.edit.withdraw.header": "Withdraw item: {{ id }}", + // TODO New key - Add a translation + "item.edit.withdraw.header": "Withdraw item: {{ id }}", + + // "item.edit.withdraw.success": "The item was withdrawn successfully", + // TODO New key - Add a translation + "item.edit.withdraw.success": "The item was withdrawn successfully", + + + + // "item.listelement.badge": "Item", + // TODO New key - Add a translation + "item.listelement.badge": "Item", + + // "item.page.description": "Description", + // TODO New key - Add a translation + "item.page.description": "Description", + + // "item.page.edit": "Edit this item", + // TODO New key - Add a translation + "item.page.edit": "Edit this item", + + // "item.page.journal-issn": "Journal ISSN", + // TODO New key - Add a translation + "item.page.journal-issn": "Journal ISSN", + + // "item.page.journal-title": "Journal Title", + // TODO New key - Add a translation + "item.page.journal-title": "Journal Title", + + // "item.page.publisher": "Publisher", + // TODO New key - Add a translation + "item.page.publisher": "Publisher", + + // "item.page.titleprefix": "Item: ", + // TODO New key - Add a translation + "item.page.titleprefix": "Item: ", + + // "item.page.volume-title": "Volume Title", + // TODO New key - Add a translation + "item.page.volume-title": "Volume Title", + + // "item.search.results.head": "Item Search Results", + // TODO New key - Add a translation + "item.search.results.head": "Item Search Results", + + // "item.search.title": "DSpace Angular :: Item Search", + // TODO New key - Add a translation + "item.search.title": "DSpace Angular :: Item Search", + + + + // "item.page.abstract": "Abstract", + // TODO New key - Add a translation + "item.page.abstract": "Abstract", + + // "item.page.author": "Authors", + // TODO New key - Add a translation + "item.page.author": "Authors", + + // "item.page.citation": "Citation", + // TODO New key - Add a translation + "item.page.citation": "Citation", + + // "item.page.collections": "Collections", + // TODO New key - Add a translation + "item.page.collections": "Collections", + + // "item.page.date": "Date", + // TODO New key - Add a translation + "item.page.date": "Date", + + // "item.page.edit": "Edit this item", + // TODO New key - Add a translation + "item.page.edit": "Edit this item", + + // "item.page.files": "Files", + // TODO New key - Add a translation + "item.page.files": "Files", + + // "item.page.filesection.description": "Description:", + // TODO New key - Add a translation + "item.page.filesection.description": "Description:", + + // "item.page.filesection.download": "Download", + // TODO New key - Add a translation + "item.page.filesection.download": "Download", + + // "item.page.filesection.format": "Format:", + // TODO New key - Add a translation + "item.page.filesection.format": "Format:", + + // "item.page.filesection.name": "Name:", + // TODO New key - Add a translation + "item.page.filesection.name": "Name:", + + // "item.page.filesection.size": "Size:", + // TODO New key - Add a translation + "item.page.filesection.size": "Size:", + + // "item.page.journal.search.title": "Articles in this journal", + // TODO New key - Add a translation + "item.page.journal.search.title": "Articles in this journal", + + // "item.page.link.full": "Full item page", + // TODO New key - Add a translation + "item.page.link.full": "Full item page", + + // "item.page.link.simple": "Simple item page", + // TODO New key - Add a translation + "item.page.link.simple": "Simple item page", + + // "item.page.person.search.title": "Articles by this author", + // TODO New key - Add a translation + "item.page.person.search.title": "Articles by this author", + + // "item.page.related-items.view-more": "Show {{ amount }} more", + // TODO New key - Add a translation + "item.page.related-items.view-more": "Show {{ amount }} more", + + // "item.page.related-items.view-less": "Hide last {{ amount }}", + // TODO New key - Add a translation + "item.page.related-items.view-less": "Hide last {{ amount }}", + + // "item.page.relationships.isAuthorOfPublication": "Publications", + // TODO New key - Add a translation + "item.page.relationships.isAuthorOfPublication": "Publications", + + // "item.page.relationships.isJournalOfPublication": "Publications", + // TODO New key - Add a translation + "item.page.relationships.isJournalOfPublication": "Publications", + + // "item.page.relationships.isOrgUnitOfPerson": "Authors", + // TODO New key - Add a translation + "item.page.relationships.isOrgUnitOfPerson": "Authors", + + // "item.page.relationships.isOrgUnitOfProject": "Research Projects", + // TODO New key - Add a translation + "item.page.relationships.isOrgUnitOfProject": "Research Projects", + + // "item.page.subject": "Keywords", + // TODO New key - Add a translation + "item.page.subject": "Keywords", + + // "item.page.uri": "URI", + // TODO New key - Add a translation + "item.page.uri": "URI", + + // "item.page.bitstreams.view-more": "Show more", + // TODO New key - Add a translation + "item.page.bitstreams.view-more": "Show more", + + // "item.page.bitstreams.collapse": "Collapse", + // TODO New key - Add a translation + "item.page.bitstreams.collapse": "Collapse", + + // "item.page.filesection.original.bundle" : "Original bundle", + // TODO New key - Add a translation + "item.page.filesection.original.bundle" : "Original bundle", + + // "item.page.filesection.license.bundle" : "License bundle", + // TODO New key - Add a translation + "item.page.filesection.license.bundle" : "License bundle", + + // "item.preview.dc.identifier.uri": "Identifier:", + // TODO New key - Add a translation + "item.preview.dc.identifier.uri": "Identifier:", + + // "item.preview.dc.contributor.author": "Authors:", + // TODO New key - Add a translation + "item.preview.dc.contributor.author": "Authors:", + + // "item.preview.dc.date.issued": "Published date:", + // TODO New key - Add a translation + "item.preview.dc.date.issued": "Published date:", + + // "item.preview.dc.description.abstract": "Abstract:", + // TODO New key - Add a translation + "item.preview.dc.description.abstract": "Abstract:", + + // "item.preview.dc.identifier.other": "Other identifier:", + // TODO New key - Add a translation + "item.preview.dc.identifier.other": "Other identifier:", + + // "item.preview.dc.language.iso": "Language:", + // TODO New key - Add a translation + "item.preview.dc.language.iso": "Language:", + + // "item.preview.dc.subject": "Subjects:", + // TODO New key - Add a translation + "item.preview.dc.subject": "Subjects:", + + // "item.preview.dc.title": "Title:", + // TODO New key - Add a translation + "item.preview.dc.title": "Title:", + + // "item.preview.person.familyName": "Surname:", + // TODO New key - Add a translation + "item.preview.person.familyName": "Surname:", + + // "item.preview.person.givenName": "Name:", + // TODO New key - Add a translation + "item.preview.person.givenName": "Name:", + + // "item.preview.person.identifier.orcid": "ORCID:", + // TODO New key - Add a translation + "item.preview.person.identifier.orcid": "ORCID:", + + + // "item.select.confirm": "Confirm selected", + // TODO New key - Add a translation + "item.select.confirm": "Confirm selected", + + // "item.select.empty": "No items to show", + // TODO New key - Add a translation + "item.select.empty": "No items to show", + + // "item.select.table.author": "Author", + // TODO New key - Add a translation + "item.select.table.author": "Author", + + // "item.select.table.collection": "Collection", + // TODO New key - Add a translation + "item.select.table.collection": "Collection", + + // "item.select.table.title": "Title", + // TODO New key - Add a translation + "item.select.table.title": "Title", + + + // "item.version.history.empty": "There are no other versions for this item yet.", + // TODO New key - Add a translation + "item.version.history.empty": "There are no other versions for this item yet.", + + // "item.version.history.head": "Version History", + // TODO New key - Add a translation + "item.version.history.head": "Version History", + + // "item.version.history.return": "Return", + // TODO New key - Add a translation + "item.version.history.return": "Return", + + // "item.version.history.selected": "Selected version", + // TODO New key - Add a translation + "item.version.history.selected": "Selected version", + + // "item.version.history.table.version": "Version", + // TODO New key - Add a translation + "item.version.history.table.version": "Version", + + // "item.version.history.table.item": "Item", + // TODO New key - Add a translation + "item.version.history.table.item": "Item", + + // "item.version.history.table.editor": "Editor", + // TODO New key - Add a translation + "item.version.history.table.editor": "Editor", + + // "item.version.history.table.date": "Date", + // TODO New key - Add a translation + "item.version.history.table.date": "Date", + + // "item.version.history.table.summary": "Summary", + // TODO New key - Add a translation + "item.version.history.table.summary": "Summary", + + + + // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", + // TODO New key - Add a translation + "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", + + + + // "journal.listelement.badge": "Journal", + // TODO New key - Add a translation + "journal.listelement.badge": "Journal", + + // "journal.page.description": "Description", + // TODO New key - Add a translation + "journal.page.description": "Description", + + // "journal.page.edit": "Edit this item", + // TODO New key - Add a translation + "journal.page.edit": "Edit this item", + + // "journal.page.editor": "Editor-in-Chief", + // TODO New key - Add a translation + "journal.page.editor": "Editor-in-Chief", + + // "journal.page.issn": "ISSN", + // TODO New key - Add a translation + "journal.page.issn": "ISSN", + + // "journal.page.publisher": "Publisher", + // TODO New key - Add a translation + "journal.page.publisher": "Publisher", + + // "journal.page.titleprefix": "Journal: ", + // TODO New key - Add a translation + "journal.page.titleprefix": "Journal: ", + + // "journal.search.results.head": "Journal Search Results", + // TODO New key - Add a translation + "journal.search.results.head": "Journal Search Results", + + // "journal.search.title": "DSpace Angular :: Journal Search", + // TODO New key - Add a translation + "journal.search.title": "DSpace Angular :: Journal Search", + + + + // "journalissue.listelement.badge": "Journal Issue", + // TODO New key - Add a translation + "journalissue.listelement.badge": "Journal Issue", + + // "journalissue.page.description": "Description", + // TODO New key - Add a translation + "journalissue.page.description": "Description", + + // "journalissue.page.edit": "Edit this item", + // TODO New key - Add a translation + "journalissue.page.edit": "Edit this item", + + // "journalissue.page.issuedate": "Issue Date", + // TODO New key - Add a translation + "journalissue.page.issuedate": "Issue Date", + + // "journalissue.page.journal-issn": "Journal ISSN", + // TODO New key - Add a translation + "journalissue.page.journal-issn": "Journal ISSN", + + // "journalissue.page.journal-title": "Journal Title", + // TODO New key - Add a translation + "journalissue.page.journal-title": "Journal Title", + + // "journalissue.page.keyword": "Keywords", + // TODO New key - Add a translation + "journalissue.page.keyword": "Keywords", + + // "journalissue.page.number": "Number", + // TODO New key - Add a translation + "journalissue.page.number": "Number", + + // "journalissue.page.titleprefix": "Journal Issue: ", + // TODO New key - Add a translation + "journalissue.page.titleprefix": "Journal Issue: ", + + + + // "journalvolume.listelement.badge": "Journal Volume", + // TODO New key - Add a translation + "journalvolume.listelement.badge": "Journal Volume", + + // "journalvolume.page.description": "Description", + // TODO New key - Add a translation + "journalvolume.page.description": "Description", + + // "journalvolume.page.edit": "Edit this item", + // TODO New key - Add a translation + "journalvolume.page.edit": "Edit this item", + + // "journalvolume.page.issuedate": "Issue Date", + // TODO New key - Add a translation + "journalvolume.page.issuedate": "Issue Date", + + // "journalvolume.page.titleprefix": "Journal Volume: ", + // TODO New key - Add a translation + "journalvolume.page.titleprefix": "Journal Volume: ", + + // "journalvolume.page.volume": "Volume", + // TODO New key - Add a translation + "journalvolume.page.volume": "Volume", + + + + // "loading.bitstream": "Loading bitstream...", + // TODO New key - Add a translation + "loading.bitstream": "Loading bitstream...", + + // "loading.bitstreams": "Loading bitstreams...", + // TODO New key - Add a translation + "loading.bitstreams": "Loading bitstreams...", + + // "loading.browse-by": "Loading items...", + // TODO New key - Add a translation + "loading.browse-by": "Loading items...", + + // "loading.browse-by-page": "Loading page...", + // TODO New key - Add a translation + "loading.browse-by-page": "Loading page...", + + // "loading.collection": "Loading collection...", + // TODO New key - Add a translation + "loading.collection": "Loading collection...", + + // "loading.collections": "Loading collections...", + // TODO New key - Add a translation + "loading.collections": "Loading collections...", + + // "loading.content-source": "Loading content source...", + // TODO New key - Add a translation + "loading.content-source": "Loading content source...", + + // "loading.community": "Loading community...", + // TODO New key - Add a translation + "loading.community": "Loading community...", + + // "loading.default": "Loading...", + // TODO New key - Add a translation + "loading.default": "Loading...", + + // "loading.item": "Loading item...", + // TODO New key - Add a translation + "loading.item": "Loading item...", + + // "loading.items": "Loading items...", + // TODO New key - Add a translation + "loading.items": "Loading items...", + + // "loading.mydspace-results": "Loading items...", + // TODO New key - Add a translation + "loading.mydspace-results": "Loading items...", + + // "loading.objects": "Loading...", + // TODO New key - Add a translation + "loading.objects": "Loading...", + + // "loading.recent-submissions": "Loading recent submissions...", + // TODO New key - Add a translation + "loading.recent-submissions": "Loading recent submissions...", + + // "loading.search-results": "Loading search results...", + // TODO New key - Add a translation + "loading.search-results": "Loading search results...", + + // "loading.sub-collections": "Loading sub-collections...", + // TODO New key - Add a translation + "loading.sub-collections": "Loading sub-collections...", + + // "loading.sub-communities": "Loading sub-communities...", + // TODO New key - Add a translation + "loading.sub-communities": "Loading sub-communities...", + + // "loading.top-level-communities": "Loading top-level communities...", + // TODO New key - Add a translation + "loading.top-level-communities": "Loading top-level communities...", + + + + // "login.form.email": "Email address", + // TODO New key - Add a translation + "login.form.email": "Email address", + + // "login.form.forgot-password": "Have you forgotten your password?", + // TODO New key - Add a translation + "login.form.forgot-password": "Have you forgotten your password?", + + // "login.form.header": "Please log in to DSpace", + // TODO New key - Add a translation + "login.form.header": "Please log in to DSpace", + + // "login.form.new-user": "New user? Click here to register.", + // TODO New key - Add a translation + "login.form.new-user": "New user? Click here to register.", + + // "login.form.or-divider": "or", + // TODO New key - Add a translation + "login.form.or-divider": "or", + + // "login.form.password": "Password", + // TODO New key - Add a translation + "login.form.password": "Password", + + // "login.form.shibboleth": "Log in with Shibboleth", + // TODO New key - Add a translation + "login.form.shibboleth": "Log in with Shibboleth", + + // "login.form.submit": "Log in", + // TODO New key - Add a translation + "login.form.submit": "Log in", + + // "login.title": "Login", + // TODO New key - Add a translation + "login.title": "Login", + + // "login.breadcrumbs": "Login", + // TODO New key - Add a translation + "login.breadcrumbs": "Login", + + + + // "logout.form.header": "Log out from DSpace", + // TODO New key - Add a translation + "logout.form.header": "Log out from DSpace", + + // "logout.form.submit": "Log out", + // TODO New key - Add a translation + "logout.form.submit": "Log out", + + // "logout.title": "Logout", + // TODO New key - Add a translation + "logout.title": "Logout", + + + + // "menu.header.admin": "Admin", + // TODO New key - Add a translation + "menu.header.admin": "Admin", + + // "menu.header.image.logo": "Repository logo", + // TODO New key - Add a translation + "menu.header.image.logo": "Repository logo", + + + + // "menu.section.access_control": "Access Control", + // TODO New key - Add a translation + "menu.section.access_control": "Access Control", + + // "menu.section.access_control_authorizations": "Authorizations", + // TODO New key - Add a translation + "menu.section.access_control_authorizations": "Authorizations", + + // "menu.section.access_control_groups": "Groups", + // TODO New key - Add a translation + "menu.section.access_control_groups": "Groups", + + // "menu.section.access_control_people": "People", + // TODO New key - Add a translation + "menu.section.access_control_people": "People", + + + + // "menu.section.admin_search": "Admin Search", + // TODO New key - Add a translation + "menu.section.admin_search": "Admin Search", + + + + // "menu.section.browse_community": "This Community", + // TODO New key - Add a translation + "menu.section.browse_community": "This Community", + + // "menu.section.browse_community_by_author": "By Author", + // TODO New key - Add a translation + "menu.section.browse_community_by_author": "By Author", + + // "menu.section.browse_community_by_issue_date": "By Issue Date", + // TODO New key - Add a translation + "menu.section.browse_community_by_issue_date": "By Issue Date", + + // "menu.section.browse_community_by_title": "By Title", + // TODO New key - Add a translation + "menu.section.browse_community_by_title": "By Title", + + // "menu.section.browse_global": "All of DSpace", + // TODO New key - Add a translation + "menu.section.browse_global": "All of DSpace", + + // "menu.section.browse_global_by_author": "By Author", + // TODO New key - Add a translation + "menu.section.browse_global_by_author": "By Author", + + // "menu.section.browse_global_by_dateissued": "By Issue Date", + // TODO New key - Add a translation + "menu.section.browse_global_by_dateissued": "By Issue Date", + + // "menu.section.browse_global_by_subject": "By Subject", + // TODO New key - Add a translation + "menu.section.browse_global_by_subject": "By Subject", + + // "menu.section.browse_global_by_title": "By Title", + // TODO New key - Add a translation + "menu.section.browse_global_by_title": "By Title", + + // "menu.section.browse_global_communities_and_collections": "Communities & Collections", + // TODO New key - Add a translation + "menu.section.browse_global_communities_and_collections": "Communities & Collections", + + + + // "menu.section.control_panel": "Control Panel", + // TODO New key - Add a translation + "menu.section.control_panel": "Control Panel", + + // "menu.section.curation_task": "Curation Task", + // TODO New key - Add a translation + "menu.section.curation_task": "Curation Task", + + + + // "menu.section.edit": "Edit", + // TODO New key - Add a translation + "menu.section.edit": "Edit", + + // "menu.section.edit_collection": "Collection", + // TODO New key - Add a translation + "menu.section.edit_collection": "Collection", + + // "menu.section.edit_community": "Community", + // TODO New key - Add a translation + "menu.section.edit_community": "Community", + + // "menu.section.edit_item": "Item", + // TODO New key - Add a translation + "menu.section.edit_item": "Item", + + + + // "menu.section.export": "Export", + // TODO New key - Add a translation + "menu.section.export": "Export", + + // "menu.section.export_collection": "Collection", + // TODO New key - Add a translation + "menu.section.export_collection": "Collection", + + // "menu.section.export_community": "Community", + // TODO New key - Add a translation + "menu.section.export_community": "Community", + + // "menu.section.export_item": "Item", + // TODO New key - Add a translation + "menu.section.export_item": "Item", + + // "menu.section.export_metadata": "Metadata", + // TODO New key - Add a translation + "menu.section.export_metadata": "Metadata", + + + + // "menu.section.icon.access_control": "Access Control menu section", + // TODO New key - Add a translation + "menu.section.icon.access_control": "Access Control menu section", + + // "menu.section.icon.admin_search": "Admin search menu section", + // TODO New key - Add a translation + "menu.section.icon.admin_search": "Admin search menu section", + + // "menu.section.icon.control_panel": "Control Panel menu section", + // TODO New key - Add a translation + "menu.section.icon.control_panel": "Control Panel menu section", + + // "menu.section.icon.curation_task": "Curation Task menu section", + // TODO New key - Add a translation + "menu.section.icon.curation_task": "Curation Task menu section", + + // "menu.section.icon.edit": "Edit menu section", + // TODO New key - Add a translation + "menu.section.icon.edit": "Edit menu section", + + // "menu.section.icon.export": "Export menu section", + // TODO New key - Add a translation + "menu.section.icon.export": "Export menu section", + + // "menu.section.icon.find": "Find menu section", + // TODO New key - Add a translation + "menu.section.icon.find": "Find menu section", + + // "menu.section.icon.import": "Import menu section", + // TODO New key - Add a translation + "menu.section.icon.import": "Import menu section", + + // "menu.section.icon.new": "New menu section", + // TODO New key - Add a translation + "menu.section.icon.new": "New menu section", + + // "menu.section.icon.pin": "Pin sidebar", + // TODO New key - Add a translation + "menu.section.icon.pin": "Pin sidebar", + + // "menu.section.icon.processes": "Processes menu section", + // TODO New key - Add a translation + "menu.section.icon.processes": "Processes menu section", + + // "menu.section.icon.registries": "Registries menu section", + // TODO New key - Add a translation + "menu.section.icon.registries": "Registries menu section", + + // "menu.section.icon.statistics_task": "Statistics Task menu section", + // TODO New key - Add a translation + "menu.section.icon.statistics_task": "Statistics Task menu section", + + // "menu.section.icon.unpin": "Unpin sidebar", + // TODO New key - Add a translation + "menu.section.icon.unpin": "Unpin sidebar", + + + + // "menu.section.import": "Import", + // TODO New key - Add a translation + "menu.section.import": "Import", + + // "menu.section.import_batch": "Batch Import (ZIP)", + // TODO New key - Add a translation + "menu.section.import_batch": "Batch Import (ZIP)", + + // "menu.section.import_metadata": "Metadata", + // TODO New key - Add a translation + "menu.section.import_metadata": "Metadata", + + + + // "menu.section.new": "New", + // TODO New key - Add a translation + "menu.section.new": "New", + + // "menu.section.new_collection": "Collection", + // TODO New key - Add a translation + "menu.section.new_collection": "Collection", + + // "menu.section.new_community": "Community", + // TODO New key - Add a translation + "menu.section.new_community": "Community", + + // "menu.section.new_item": "Item", + // TODO New key - Add a translation + "menu.section.new_item": "Item", + + // "menu.section.new_item_version": "Item Version", + // TODO New key - Add a translation + "menu.section.new_item_version": "Item Version", + + // "menu.section.new_process": "Process", + // TODO New key - Add a translation + "menu.section.new_process": "Process", + + + + // "menu.section.pin": "Pin sidebar", + // TODO New key - Add a translation + "menu.section.pin": "Pin sidebar", + + // "menu.section.unpin": "Unpin sidebar", + // TODO New key - Add a translation + "menu.section.unpin": "Unpin sidebar", + + + + // "menu.section.processes": "Processes", + // TODO New key - Add a translation + "menu.section.processes": "Processes", + + + + // "menu.section.registries": "Registries", + // TODO New key - Add a translation + "menu.section.registries": "Registries", + + // "menu.section.registries_format": "Format", + // TODO New key - Add a translation + "menu.section.registries_format": "Format", + + // "menu.section.registries_metadata": "Metadata", + // TODO New key - Add a translation + "menu.section.registries_metadata": "Metadata", + + + + // "menu.section.statistics": "Statistics", + // TODO New key - Add a translation + "menu.section.statistics": "Statistics", + + // "menu.section.statistics_task": "Statistics Task", + // TODO New key - Add a translation + "menu.section.statistics_task": "Statistics Task", + + + + // "menu.section.toggle.access_control": "Toggle Access Control section", + // TODO New key - Add a translation + "menu.section.toggle.access_control": "Toggle Access Control section", + + // "menu.section.toggle.control_panel": "Toggle Control Panel section", + // TODO New key - Add a translation + "menu.section.toggle.control_panel": "Toggle Control Panel section", + + // "menu.section.toggle.curation_task": "Toggle Curation Task section", + // TODO New key - Add a translation + "menu.section.toggle.curation_task": "Toggle Curation Task section", + + // "menu.section.toggle.edit": "Toggle Edit section", + // TODO New key - Add a translation + "menu.section.toggle.edit": "Toggle Edit section", + + // "menu.section.toggle.export": "Toggle Export section", + // TODO New key - Add a translation + "menu.section.toggle.export": "Toggle Export section", + + // "menu.section.toggle.find": "Toggle Find section", + // TODO New key - Add a translation + "menu.section.toggle.find": "Toggle Find section", + + // "menu.section.toggle.import": "Toggle Import section", + // TODO New key - Add a translation + "menu.section.toggle.import": "Toggle Import section", + + // "menu.section.toggle.new": "Toggle New section", + // TODO New key - Add a translation + "menu.section.toggle.new": "Toggle New section", + + // "menu.section.toggle.registries": "Toggle Registries section", + // TODO New key - Add a translation + "menu.section.toggle.registries": "Toggle Registries section", + + // "menu.section.toggle.statistics_task": "Toggle Statistics Task section", + // TODO New key - Add a translation + "menu.section.toggle.statistics_task": "Toggle Statistics Task section", + + + // "menu.section.workflow": "Administer Workflow", + // TODO New key - Add a translation + "menu.section.workflow": "Administer Workflow", + + + // "mydspace.description": "", + // TODO New key - Add a translation + "mydspace.description": "", + + // "mydspace.general.text-here": "here", + // TODO New key - Add a translation + "mydspace.general.text-here": "here", + + // "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", + // TODO New key - Add a translation + "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", + + // "mydspace.messages.description-placeholder": "Insert your message here...", + // TODO New key - Add a translation + "mydspace.messages.description-placeholder": "Insert your message here...", + + // "mydspace.messages.hide-msg": "Hide message", + // TODO New key - Add a translation + "mydspace.messages.hide-msg": "Hide message", + + // "mydspace.messages.mark-as-read": "Mark as read", + // TODO New key - Add a translation + "mydspace.messages.mark-as-read": "Mark as read", + + // "mydspace.messages.mark-as-unread": "Mark as unread", + // TODO New key - Add a translation + "mydspace.messages.mark-as-unread": "Mark as unread", + + // "mydspace.messages.no-content": "No content.", + // TODO New key - Add a translation + "mydspace.messages.no-content": "No content.", + + // "mydspace.messages.no-messages": "No messages yet.", + // TODO New key - Add a translation + "mydspace.messages.no-messages": "No messages yet.", + + // "mydspace.messages.send-btn": "Send", + // TODO New key - Add a translation + "mydspace.messages.send-btn": "Send", + + // "mydspace.messages.show-msg": "Show message", + // TODO New key - Add a translation + "mydspace.messages.show-msg": "Show message", + + // "mydspace.messages.subject-placeholder": "Subject...", + // TODO New key - Add a translation + "mydspace.messages.subject-placeholder": "Subject...", + + // "mydspace.messages.submitter-help": "Select this option to send a message to controller.", + // TODO New key - Add a translation + "mydspace.messages.submitter-help": "Select this option to send a message to controller.", + + // "mydspace.messages.title": "Messages", + // TODO New key - Add a translation + "mydspace.messages.title": "Messages", + + // "mydspace.messages.to": "To", + // TODO New key - Add a translation + "mydspace.messages.to": "To", + + // "mydspace.new-submission": "New submission", + // TODO New key - Add a translation + "mydspace.new-submission": "New submission", + + // "mydspace.new-submission-external": "Import metadata from external source", + // TODO New key - Add a translation + "mydspace.new-submission-external": "Import metadata from external source", + + // "mydspace.new-submission-external-short": "Import metadata", + // TODO New key - Add a translation + "mydspace.new-submission-external-short": "Import metadata", + + // "mydspace.results.head": "Your submissions", + // TODO New key - Add a translation + "mydspace.results.head": "Your submissions", + + // "mydspace.results.no-abstract": "No Abstract", + // TODO New key - Add a translation + "mydspace.results.no-abstract": "No Abstract", + + // "mydspace.results.no-authors": "No Authors", + // TODO New key - Add a translation + "mydspace.results.no-authors": "No Authors", + + // "mydspace.results.no-collections": "No Collections", + // TODO New key - Add a translation + "mydspace.results.no-collections": "No Collections", + + // "mydspace.results.no-date": "No Date", + // TODO New key - Add a translation + "mydspace.results.no-date": "No Date", + + // "mydspace.results.no-files": "No Files", + // TODO New key - Add a translation + "mydspace.results.no-files": "No Files", + + // "mydspace.results.no-results": "There were no items to show", + // TODO New key - Add a translation + "mydspace.results.no-results": "There were no items to show", + + // "mydspace.results.no-title": "No title", + // TODO New key - Add a translation + "mydspace.results.no-title": "No title", + + // "mydspace.results.no-uri": "No Uri", + // TODO New key - Add a translation + "mydspace.results.no-uri": "No Uri", + + // "mydspace.show.workflow": "All tasks", + // TODO New key - Add a translation + "mydspace.show.workflow": "All tasks", + + // "mydspace.show.workspace": "Your Submissions", + // TODO New key - Add a translation + "mydspace.show.workspace": "Your Submissions", + + // "mydspace.status.archived": "Archived", + // TODO New key - Add a translation + "mydspace.status.archived": "Archived", + + // "mydspace.status.validation": "Validation", + // TODO New key - Add a translation + "mydspace.status.validation": "Validation", + + // "mydspace.status.waiting-for-controller": "Waiting for controller", + // TODO New key - Add a translation + "mydspace.status.waiting-for-controller": "Waiting for controller", + + // "mydspace.status.workflow": "Workflow", + // TODO New key - Add a translation + "mydspace.status.workflow": "Workflow", + + // "mydspace.status.workspace": "Workspace", + // TODO New key - Add a translation + "mydspace.status.workspace": "Workspace", + + // "mydspace.title": "MyDSpace", + // TODO New key - Add a translation + "mydspace.title": "MyDSpace", + + // "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", + // TODO New key - Add a translation + "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", + + // "mydspace.upload.upload-failed-manyentries": "Unprocessable file. Detected too many entries but allowed only one for file.", + // TODO New key - Add a translation + "mydspace.upload.upload-failed-manyentries": "Unprocessable file. Detected too many entries but allowed only one for file.", + + // "mydspace.upload.upload-failed-moreonefile": "Unprocessable request. Only one file is allowed.", + // TODO New key - Add a translation + "mydspace.upload.upload-failed-moreonefile": "Unprocessable request. Only one file is allowed.", + + // "mydspace.upload.upload-multiple-successful": "{{qty}} new workspace items created.", + // TODO New key - Add a translation + "mydspace.upload.upload-multiple-successful": "{{qty}} new workspace items created.", + + // "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", + // TODO New key - Add a translation + "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", + + // "mydspace.view-btn": "View", + // TODO New key - Add a translation + "mydspace.view-btn": "View", + + + + // "nav.browse.header": "All of DSpace", + // TODO New key - Add a translation + "nav.browse.header": "All of DSpace", + + // "nav.community-browse.header": "By Community", + // TODO New key - Add a translation + "nav.community-browse.header": "By Community", + + // "nav.language": "Language switch", + // TODO New key - Add a translation + "nav.language": "Language switch", + + // "nav.login": "Log In", + // TODO New key - Add a translation + "nav.login": "Log In", + + // "nav.logout": "Log Out", + // TODO New key - Add a translation + "nav.logout": "Log Out", + + // "nav.mydspace": "MyDSpace", + // TODO New key - Add a translation + "nav.mydspace": "MyDSpace", + + // "nav.profile": "Profile", + // TODO New key - Add a translation + "nav.profile": "Profile", + + // "nav.search": "Search", + // TODO New key - Add a translation + "nav.search": "Search", + + // "nav.statistics.header": "Statistics", + // TODO New key - Add a translation + "nav.statistics.header": "Statistics", + + // "nav.stop-impersonating": "Stop impersonating EPerson", + // TODO New key - Add a translation + "nav.stop-impersonating": "Stop impersonating EPerson", + + + + // "orgunit.listelement.badge": "Organizational Unit", + // TODO New key - Add a translation + "orgunit.listelement.badge": "Organizational Unit", + + // "orgunit.page.city": "City", + // TODO New key - Add a translation + "orgunit.page.city": "City", + + // "orgunit.page.country": "Country", + // TODO New key - Add a translation + "orgunit.page.country": "Country", + + // "orgunit.page.dateestablished": "Date established", + // TODO New key - Add a translation + "orgunit.page.dateestablished": "Date established", + + // "orgunit.page.description": "Description", + // TODO New key - Add a translation + "orgunit.page.description": "Description", + + // "orgunit.page.edit": "Edit this item", + // TODO New key - Add a translation + "orgunit.page.edit": "Edit this item", + + // "orgunit.page.id": "ID", + // TODO New key - Add a translation + "orgunit.page.id": "ID", + + // "orgunit.page.titleprefix": "Organizational Unit: ", + // TODO New key - Add a translation + "orgunit.page.titleprefix": "Organizational Unit: ", + + + + // "pagination.results-per-page": "Results Per Page", + // TODO New key - Add a translation + "pagination.results-per-page": "Results Per Page", + + // "pagination.showing.detail": "{{ range }} of {{ total }}", + // TODO New key - Add a translation + "pagination.showing.detail": "{{ range }} of {{ total }}", + + // "pagination.showing.label": "Now showing ", + // TODO New key - Add a translation + "pagination.showing.label": "Now showing ", + + // "pagination.sort-direction": "Sort Options", + // TODO New key - Add a translation + "pagination.sort-direction": "Sort Options", + + + + // "person.listelement.badge": "Person", + // TODO New key - Add a translation + "person.listelement.badge": "Person", + + // "person.listelement.no-title": "No name found", + // TODO New key - Add a translation + "person.listelement.no-title": "No name found", + + // "person.page.birthdate": "Birth Date", + // TODO New key - Add a translation + "person.page.birthdate": "Birth Date", + + // "person.page.edit": "Edit this item", + // TODO New key - Add a translation + "person.page.edit": "Edit this item", + + // "person.page.email": "Email Address", + // TODO New key - Add a translation + "person.page.email": "Email Address", + + // "person.page.firstname": "First Name", + // TODO New key - Add a translation + "person.page.firstname": "First Name", + + // "person.page.jobtitle": "Job Title", + // TODO New key - Add a translation + "person.page.jobtitle": "Job Title", + + // "person.page.lastname": "Last Name", + // TODO New key - Add a translation + "person.page.lastname": "Last Name", + + // "person.page.link.full": "Show all metadata", + // TODO New key - Add a translation + "person.page.link.full": "Show all metadata", + + // "person.page.orcid": "ORCID", + // TODO New key - Add a translation + "person.page.orcid": "ORCID", + + // "person.page.staffid": "Staff ID", + // TODO New key - Add a translation + "person.page.staffid": "Staff ID", + + // "person.page.titleprefix": "Person: ", + // TODO New key - Add a translation + "person.page.titleprefix": "Person: ", + + // "person.search.results.head": "Person Search Results", + // TODO New key - Add a translation + "person.search.results.head": "Person Search Results", + + // "person.search.title": "DSpace Angular :: Person Search", + // TODO New key - Add a translation + "person.search.title": "DSpace Angular :: Person Search", + + + + // "process.new.select-parameters": "Parameters", + // TODO New key - Add a translation + "process.new.select-parameters": "Parameters", + + // "process.new.cancel": "Cancel", + // TODO New key - Add a translation + "process.new.cancel": "Cancel", + + // "process.new.submit": "Submit", + // TODO New key - Add a translation + "process.new.submit": "Submit", + + // "process.new.select-script": "Script", + // TODO New key - Add a translation + "process.new.select-script": "Script", + + // "process.new.select-script.placeholder": "Choose a script...", + // TODO New key - Add a translation + "process.new.select-script.placeholder": "Choose a script...", + + // "process.new.select-script.required": "Script is required", + // TODO New key - Add a translation + "process.new.select-script.required": "Script is required", + + // "process.new.parameter.file.upload-button": "Select file...", + // TODO New key - Add a translation + "process.new.parameter.file.upload-button": "Select file...", + + // "process.new.parameter.file.required": "Please select a file", + // TODO New key - Add a translation + "process.new.parameter.file.required": "Please select a file", + + // "process.new.parameter.string.required": "Parameter value is required", + // TODO New key - Add a translation + "process.new.parameter.string.required": "Parameter value is required", + + // "process.new.parameter.type.value": "value", + // TODO New key - Add a translation + "process.new.parameter.type.value": "value", + + // "process.new.parameter.type.file": "file", + // TODO New key - Add a translation + "process.new.parameter.type.file": "file", + + // "process.new.parameter.required.missing": "The following parameters are required but still missing:", + // TODO New key - Add a translation + "process.new.parameter.required.missing": "The following parameters are required but still missing:", + + // "process.new.notification.success.title": "Success", + // TODO New key - Add a translation + "process.new.notification.success.title": "Success", + + // "process.new.notification.success.content": "The process was successfully created", + // TODO New key - Add a translation + "process.new.notification.success.content": "The process was successfully created", + + // "process.new.notification.error.title": "Error", + // TODO New key - Add a translation + "process.new.notification.error.title": "Error", + + // "process.new.notification.error.content": "An error occurred while creating this process", + // TODO New key - Add a translation + "process.new.notification.error.content": "An error occurred while creating this process", + + // "process.new.header": "Create a new process", + // TODO New key - Add a translation + "process.new.header": "Create a new process", + + // "process.new.title": "Create a new process", + // TODO New key - Add a translation + "process.new.title": "Create a new process", + + // "process.new.breadcrumbs": "Create a new process", + // TODO New key - Add a translation + "process.new.breadcrumbs": "Create a new process", + + + + // "process.detail.arguments" : "Arguments", + // TODO New key - Add a translation + "process.detail.arguments" : "Arguments", + + // "process.detail.arguments.empty" : "This process doesn't contain any arguments", + // TODO New key - Add a translation + "process.detail.arguments.empty" : "This process doesn't contain any arguments", + + // "process.detail.back" : "Back", + // TODO New key - Add a translation + "process.detail.back" : "Back", + + // "process.detail.output" : "Process Output", + // TODO New key - Add a translation + "process.detail.output" : "Process Output", + + // "process.detail.logs.button": "Retrieve process output", + // TODO New key - Add a translation + "process.detail.logs.button": "Retrieve process output", + + // "process.detail.logs.loading": "Retrieving", + // TODO New key - Add a translation + "process.detail.logs.loading": "Retrieving", + + // "process.detail.logs.none": "This process has no output", + // TODO New key - Add a translation + "process.detail.logs.none": "This process has no output", + + // "process.detail.output-files" : "Output Files", + // TODO New key - Add a translation + "process.detail.output-files" : "Output Files", + + // "process.detail.output-files.empty" : "This process doesn't contain any output files", + // TODO New key - Add a translation + "process.detail.output-files.empty" : "This process doesn't contain any output files", + + // "process.detail.script" : "Script", + // TODO New key - Add a translation + "process.detail.script" : "Script", + + // "process.detail.title" : "Process: {{ id }} - {{ name }}", + // TODO New key - Add a translation + "process.detail.title" : "Process: {{ id }} - {{ name }}", + + // "process.detail.start-time" : "Start time", + // TODO New key - Add a translation + "process.detail.start-time" : "Start time", + + // "process.detail.end-time" : "Finish time", + // TODO New key - Add a translation + "process.detail.end-time" : "Finish time", + + // "process.detail.status" : "Status", + // TODO New key - Add a translation + "process.detail.status" : "Status", + + // "process.detail.create" : "Create similar process", + // TODO New key - Add a translation + "process.detail.create" : "Create similar process", + + + + // "process.overview.table.finish" : "Finish time", + // TODO New key - Add a translation + "process.overview.table.finish" : "Finish time", + + // "process.overview.table.id" : "Process ID", + // TODO New key - Add a translation + "process.overview.table.id" : "Process ID", + + // "process.overview.table.name" : "Name", + // TODO New key - Add a translation + "process.overview.table.name" : "Name", + + // "process.overview.table.start" : "Start time", + // TODO New key - Add a translation + "process.overview.table.start" : "Start time", + + // "process.overview.table.status" : "Status", + // TODO New key - Add a translation + "process.overview.table.status" : "Status", + + // "process.overview.table.user" : "User", + // TODO New key - Add a translation + "process.overview.table.user" : "User", + + // "process.overview.title": "Processes Overview", + // TODO New key - Add a translation + "process.overview.title": "Processes Overview", + + // "process.overview.breadcrumbs": "Processes Overview", + // TODO New key - Add a translation + "process.overview.breadcrumbs": "Processes Overview", + + // "process.overview.new": "New", + // TODO New key - Add a translation + "process.overview.new": "New", + + + // "profile.breadcrumbs": "Update Profile", + // TODO New key - Add a translation + "profile.breadcrumbs": "Update Profile", + + // "profile.card.identify": "Identify", + // TODO New key - Add a translation + "profile.card.identify": "Identify", + + // "profile.card.security": "Security", + // TODO New key - Add a translation + "profile.card.security": "Security", + + // "profile.form.submit": "Update Profile", + // TODO New key - Add a translation + "profile.form.submit": "Update Profile", + + // "profile.groups.head": "Authorization groups you belong to", + // TODO New key - Add a translation + "profile.groups.head": "Authorization groups you belong to", + + // "profile.head": "Update Profile", + // TODO New key - Add a translation + "profile.head": "Update Profile", + + // "profile.metadata.form.error.firstname.required": "First Name is required", + // TODO New key - Add a translation + "profile.metadata.form.error.firstname.required": "First Name is required", + + // "profile.metadata.form.error.lastname.required": "Last Name is required", + // TODO New key - Add a translation + "profile.metadata.form.error.lastname.required": "Last Name is required", + + // "profile.metadata.form.label.email": "Email Address", + // TODO New key - Add a translation + "profile.metadata.form.label.email": "Email Address", + + // "profile.metadata.form.label.firstname": "First Name", + // TODO New key - Add a translation + "profile.metadata.form.label.firstname": "First Name", + + // "profile.metadata.form.label.language": "Language", + // TODO New key - Add a translation + "profile.metadata.form.label.language": "Language", + + // "profile.metadata.form.label.lastname": "Last Name", + // TODO New key - Add a translation + "profile.metadata.form.label.lastname": "Last Name", + + // "profile.metadata.form.label.phone": "Contact Telephone", + // TODO New key - Add a translation + "profile.metadata.form.label.phone": "Contact Telephone", + + // "profile.metadata.form.notifications.success.content": "Your changes to the profile were saved.", + // TODO New key - Add a translation + "profile.metadata.form.notifications.success.content": "Your changes to the profile were saved.", + + // "profile.metadata.form.notifications.success.title": "Profile saved", + // TODO New key - Add a translation + "profile.metadata.form.notifications.success.title": "Profile saved", + + // "profile.notifications.warning.no-changes.content": "No changes were made to the Profile.", + // TODO New key - Add a translation + "profile.notifications.warning.no-changes.content": "No changes were made to the Profile.", + + // "profile.notifications.warning.no-changes.title": "No changes", + // TODO New key - Add a translation + "profile.notifications.warning.no-changes.title": "No changes", + + // "profile.security.form.error.matching-passwords": "The passwords do not match.", + // TODO New key - Add a translation + "profile.security.form.error.matching-passwords": "The passwords do not match.", + + // "profile.security.form.error.password-length": "The password should be at least 6 characters long.", + // TODO New key - Add a translation + "profile.security.form.error.password-length": "The password should be at least 6 characters long.", + + // "profile.security.form.info": "Optionally, you can enter a new password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", + // TODO New key - Add a translation + "profile.security.form.info": "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.label.password": "Password", + // TODO New key - Add a translation + "profile.security.form.label.password": "Password", + + // "profile.security.form.label.passwordrepeat": "Retype to confirm", + // TODO New key - Add a translation + "profile.security.form.label.passwordrepeat": "Retype to confirm", + + // "profile.security.form.notifications.success.content": "Your changes to the password were saved.", + // TODO New key - Add a translation + "profile.security.form.notifications.success.content": "Your changes to the password were saved.", + + // "profile.security.form.notifications.success.title": "Password saved", + // TODO New key - Add a translation + "profile.security.form.notifications.success.title": "Password saved", + + // "profile.security.form.notifications.error.title": "Error changing passwords", + // TODO New key - Add a translation + "profile.security.form.notifications.error.title": "Error changing passwords", + + // "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", + // TODO New key - Add a translation + "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", + + // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", + // TODO New key - Add a translation + "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", + + // "profile.title": "Update Profile", + // TODO New key - Add a translation + "profile.title": "Update Profile", + + + + // "project.listelement.badge": "Research Project", + // TODO New key - Add a translation + "project.listelement.badge": "Research Project", + + // "project.page.contributor": "Contributors", + // TODO New key - Add a translation + "project.page.contributor": "Contributors", + + // "project.page.description": "Description", + // TODO New key - Add a translation + "project.page.description": "Description", + + // "project.page.edit": "Edit this item", + // TODO New key - Add a translation + "project.page.edit": "Edit this item", + + // "project.page.expectedcompletion": "Expected Completion", + // TODO New key - Add a translation + "project.page.expectedcompletion": "Expected Completion", + + // "project.page.funder": "Funders", + // TODO New key - Add a translation + "project.page.funder": "Funders", + + // "project.page.id": "ID", + // TODO New key - Add a translation + "project.page.id": "ID", + + // "project.page.keyword": "Keywords", + // TODO New key - Add a translation + "project.page.keyword": "Keywords", + + // "project.page.status": "Status", + // TODO New key - Add a translation + "project.page.status": "Status", + + // "project.page.titleprefix": "Research Project: ", + // TODO New key - Add a translation + "project.page.titleprefix": "Research Project: ", + + // "project.search.results.head": "Project Search Results", + // TODO New key - Add a translation + "project.search.results.head": "Project Search Results", + + + + // "publication.listelement.badge": "Publication", + // TODO New key - Add a translation + "publication.listelement.badge": "Publication", + + // "publication.page.description": "Description", + // TODO New key - Add a translation + "publication.page.description": "Description", + + // "publication.page.edit": "Edit this item", + // TODO New key - Add a translation + "publication.page.edit": "Edit this item", + + // "publication.page.journal-issn": "Journal ISSN", + // TODO New key - Add a translation + "publication.page.journal-issn": "Journal ISSN", + + // "publication.page.journal-title": "Journal Title", + // TODO New key - Add a translation + "publication.page.journal-title": "Journal Title", + + // "publication.page.publisher": "Publisher", + // TODO New key - Add a translation + "publication.page.publisher": "Publisher", + + // "publication.page.titleprefix": "Publication: ", + // TODO New key - Add a translation + "publication.page.titleprefix": "Publication: ", + + // "publication.page.volume-title": "Volume Title", + // TODO New key - Add a translation + "publication.page.volume-title": "Volume Title", + + // "publication.search.results.head": "Publication Search Results", + // TODO New key - Add a translation + "publication.search.results.head": "Publication Search Results", + + // "publication.search.title": "DSpace Angular :: Publication Search", + // TODO New key - Add a translation + "publication.search.title": "DSpace Angular :: Publication Search", + + + // "register-email.title": "New user registration", + // TODO New key - Add a translation + "register-email.title": "New user registration", + + // "register-page.create-profile.header": "Create Profile", + // TODO New key - Add a translation + "register-page.create-profile.header": "Create Profile", + + // "register-page.create-profile.identification.header": "Identify", + // TODO New key - Add a translation + "register-page.create-profile.identification.header": "Identify", + + // "register-page.create-profile.identification.email": "Email Address", + // TODO New key - Add a translation + "register-page.create-profile.identification.email": "Email Address", + + // "register-page.create-profile.identification.first-name": "First Name *", + // TODO New key - Add a translation + "register-page.create-profile.identification.first-name": "First Name *", + + // "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", + // TODO New key - Add a translation + "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", + + // "register-page.create-profile.identification.last-name": "Last Name *", + // TODO New key - Add a translation + "register-page.create-profile.identification.last-name": "Last Name *", + + // "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", + // TODO New key - Add a translation + "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", + + // "register-page.create-profile.identification.contact": "Contact Telephone", + // TODO New key - Add a translation + "register-page.create-profile.identification.contact": "Contact Telephone", + + // "register-page.create-profile.identification.language": "Language", + // TODO New key - Add a translation + "register-page.create-profile.identification.language": "Language", + + // "register-page.create-profile.security.header": "Security", + // TODO New key - Add a translation + "register-page.create-profile.security.header": "Security", + + // "register-page.create-profile.security.info": "Please enter a password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", + // TODO New key - Add a translation + "register-page.create-profile.security.info": "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.label.password": "Password *", + // TODO New key - Add a translation + "register-page.create-profile.security.label.password": "Password *", + + // "register-page.create-profile.security.label.passwordrepeat": "Retype to confirm *", + // TODO New key - Add a translation + "register-page.create-profile.security.label.passwordrepeat": "Retype to confirm *", + + // "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", + // TODO New key - Add a translation + "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", + + // "register-page.create-profile.security.error.matching-passwords": "The passwords do not match.", + // TODO New key - Add a translation + "register-page.create-profile.security.error.matching-passwords": "The passwords do not match.", + + // "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", + // TODO New key - Add a translation + "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", + + // "register-page.create-profile.submit": "Complete Registration", + // TODO New key - Add a translation + "register-page.create-profile.submit": "Complete Registration", + + // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", + // TODO New key - Add a translation + "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", + + // "register-page.create-profile.submit.error.head": "Registration failed", + // TODO New key - Add a translation + "register-page.create-profile.submit.error.head": "Registration failed", + + // "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", + // TODO New key - Add a translation + "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", + + // "register-page.create-profile.submit.success.head": "Registration completed", + // TODO New key - Add a translation + "register-page.create-profile.submit.success.head": "Registration completed", + + + // "register-page.registration.header": "New user registration", + // TODO New key - Add a translation + "register-page.registration.header": "New user registration", + + // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + // TODO New key - Add a translation + "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + + // "register-page.registration.email": "Email Address *", + // TODO New key - Add a translation + "register-page.registration.email": "Email Address *", + + // "register-page.registration.email.error.required": "Please fill in an email address", + // TODO New key - Add a translation + "register-page.registration.email.error.required": "Please fill in an email address", + + // "register-page.registration.email.error.pattern": "Please fill in a valid email address", + // TODO New key - Add a translation + "register-page.registration.email.error.pattern": "Please fill in a valid email address", + + // "register-page.registration.email.hint": "This address will be verified and used as your login name.", + // TODO New key - Add a translation + "register-page.registration.email.hint": "This address will be verified and used as your login name.", + + // "register-page.registration.submit": "Register", + // TODO New key - Add a translation + "register-page.registration.submit": "Register", + + // "register-page.registration.success.head": "Verification email sent", + // TODO New key - Add a translation + "register-page.registration.success.head": "Verification email sent", + + // "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + // TODO New key - Add a translation + "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + + // "register-page.registration.error.head": "Error when trying to register email", + // TODO New key - Add a translation + "register-page.registration.error.head": "Error when trying to register email", + + // "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", + // TODO New key - Add a translation + "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", + + + + // "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", + // TODO New key - Add a translation + "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", + + // "relationships.add.error.server.content": "The server returned an error", + // TODO New key - Add a translation + "relationships.add.error.server.content": "The server returned an error", + + // "relationships.add.error.title": "Unable to add relationship", + // TODO New key - Add a translation + "relationships.add.error.title": "Unable to add relationship", + + // "relationships.isAuthorOf": "Authors", + // TODO New key - Add a translation + "relationships.isAuthorOf": "Authors", + + // "relationships.isAuthorOf.Person": "Authors (persons)", + // TODO New key - Add a translation + "relationships.isAuthorOf.Person": "Authors (persons)", + + // "relationships.isAuthorOf.OrgUnit": "Authors (organizational units)", + // TODO New key - Add a translation + "relationships.isAuthorOf.OrgUnit": "Authors (organizational units)", + + // "relationships.isIssueOf": "Journal Issues", + // TODO New key - Add a translation + "relationships.isIssueOf": "Journal Issues", + + // "relationships.isJournalIssueOf": "Journal Issue", + // TODO New key - Add a translation + "relationships.isJournalIssueOf": "Journal Issue", + + // "relationships.isJournalOf": "Journals", + // TODO New key - Add a translation + "relationships.isJournalOf": "Journals", + + // "relationships.isOrgUnitOf": "Organizational Units", + // TODO New key - Add a translation + "relationships.isOrgUnitOf": "Organizational Units", + + // "relationships.isPersonOf": "Authors", + // TODO New key - Add a translation + "relationships.isPersonOf": "Authors", + + // "relationships.isProjectOf": "Research Projects", + // TODO New key - Add a translation + "relationships.isProjectOf": "Research Projects", + + // "relationships.isPublicationOf": "Publications", + // TODO New key - Add a translation + "relationships.isPublicationOf": "Publications", + + // "relationships.isPublicationOfJournalIssue": "Articles", + // TODO New key - Add a translation + "relationships.isPublicationOfJournalIssue": "Articles", + + // "relationships.isSingleJournalOf": "Journal", + // TODO New key - Add a translation + "relationships.isSingleJournalOf": "Journal", + + // "relationships.isSingleVolumeOf": "Journal Volume", + // TODO New key - Add a translation + "relationships.isSingleVolumeOf": "Journal Volume", + + // "relationships.isVolumeOf": "Journal Volumes", + // TODO New key - Add a translation + "relationships.isVolumeOf": "Journal Volumes", + + // "relationships.isContributorOf": "Contributors", + // TODO New key - Add a translation + "relationships.isContributorOf": "Contributors", + + + + // "resource-policies.add.button": "Add", + // TODO New key - Add a translation + "resource-policies.add.button": "Add", + + // "resource-policies.add.for.": "Add a new policy", + // TODO New key - Add a translation + "resource-policies.add.for.": "Add a new policy", + + // "resource-policies.add.for.bitstream": "Add a new Bitstream policy", + // TODO New key - Add a translation + "resource-policies.add.for.bitstream": "Add a new Bitstream policy", + + // "resource-policies.add.for.bundle": "Add a new Bundle policy", + // TODO New key - Add a translation + "resource-policies.add.for.bundle": "Add a new Bundle policy", + + // "resource-policies.add.for.item": "Add a new Item policy", + // TODO New key - Add a translation + "resource-policies.add.for.item": "Add a new Item policy", + + // "resource-policies.add.for.community": "Add a new Community policy", + // TODO New key - Add a translation + "resource-policies.add.for.community": "Add a new Community policy", + + // "resource-policies.add.for.collection": "Add a new Collection policy", + // TODO New key - Add a translation + "resource-policies.add.for.collection": "Add a new Collection policy", + + // "resource-policies.create.page.heading": "Create new resource policy for ", + // TODO New key - Add a translation + "resource-policies.create.page.heading": "Create new resource policy for ", + + // "resource-policies.create.page.failure.content": "An error occurred while creating the resource policy.", + // TODO New key - Add a translation + "resource-policies.create.page.failure.content": "An error occurred while creating the resource policy.", + + // "resource-policies.create.page.success.content": "Operation successful", + // TODO New key - Add a translation + "resource-policies.create.page.success.content": "Operation successful", + + // "resource-policies.create.page.title": "Create new resource policy", + // TODO New key - Add a translation + "resource-policies.create.page.title": "Create new resource policy", + + // "resource-policies.delete.btn": "Delete selected", + // TODO New key - Add a translation + "resource-policies.delete.btn": "Delete selected", + + // "resource-policies.delete.btn.title": "Delete selected resource policies", + // TODO New key - Add a translation + "resource-policies.delete.btn.title": "Delete selected resource policies", + + // "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", + // TODO New key - Add a translation + "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", + + // "resource-policies.delete.success.content": "Operation successful", + // TODO New key - Add a translation + "resource-policies.delete.success.content": "Operation successful", + + // "resource-policies.edit.page.heading": "Edit resource policy ", + // TODO New key - Add a translation + "resource-policies.edit.page.heading": "Edit resource policy ", + + // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", + // TODO New key - Add a translation + "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", + + // "resource-policies.edit.page.success.content": "Operation successful", + // TODO New key - Add a translation + "resource-policies.edit.page.success.content": "Operation successful", + + // "resource-policies.edit.page.title": "Edit resource policy", + // TODO New key - Add a translation + "resource-policies.edit.page.title": "Edit resource policy", + + // "resource-policies.form.action-type.label": "Select the action type", + // TODO New key - Add a translation + "resource-policies.form.action-type.label": "Select the action type", + + // "resource-policies.form.action-type.required": "You must select the resource policy action.", + // TODO New key - Add a translation + "resource-policies.form.action-type.required": "You must select the resource policy action.", + + // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", + + // "resource-policies.form.eperson-group-list.select.btn": "Select", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.select.btn": "Select", + + // "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", + + // "resource-policies.form.eperson-group-list.tab.group": "Search for a group", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.tab.group": "Search for a group", + + // "resource-policies.form.eperson-group-list.table.headers.action": "Action", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.table.headers.action": "Action", + + // "resource-policies.form.eperson-group-list.table.headers.id": "ID", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.table.headers.id": "ID", + + // "resource-policies.form.eperson-group-list.table.headers.name": "Name", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.table.headers.name": "Name", + + // "resource-policies.form.date.end.label": "End Date", + // TODO New key - Add a translation + "resource-policies.form.date.end.label": "End Date", + + // "resource-policies.form.date.start.label": "Start Date", + // TODO New key - Add a translation + "resource-policies.form.date.start.label": "Start Date", + + // "resource-policies.form.description.label": "Description", + // TODO New key - Add a translation + "resource-policies.form.description.label": "Description", + + // "resource-policies.form.name.label": "Name", + // TODO New key - Add a translation + "resource-policies.form.name.label": "Name", + + // "resource-policies.form.policy-type.label": "Select the policy type", + // TODO New key - Add a translation + "resource-policies.form.policy-type.label": "Select the policy type", + + // "resource-policies.form.policy-type.required": "You must select the resource policy type.", + // TODO New key - Add a translation + "resource-policies.form.policy-type.required": "You must select the resource policy type.", + + // "resource-policies.table.headers.action": "Action", + // TODO New key - Add a translation + "resource-policies.table.headers.action": "Action", + + // "resource-policies.table.headers.date.end": "End Date", + // TODO New key - Add a translation + "resource-policies.table.headers.date.end": "End Date", + + // "resource-policies.table.headers.date.start": "Start Date", + // TODO New key - Add a translation + "resource-policies.table.headers.date.start": "Start Date", + + // "resource-policies.table.headers.edit": "Edit", + // TODO New key - Add a translation + "resource-policies.table.headers.edit": "Edit", + + // "resource-policies.table.headers.edit.group": "Edit group", + // TODO New key - Add a translation + "resource-policies.table.headers.edit.group": "Edit group", + + // "resource-policies.table.headers.edit.policy": "Edit policy", + // TODO New key - Add a translation + "resource-policies.table.headers.edit.policy": "Edit policy", + + // "resource-policies.table.headers.eperson": "EPerson", + // TODO New key - Add a translation + "resource-policies.table.headers.eperson": "EPerson", + + // "resource-policies.table.headers.group": "Group", + // TODO New key - Add a translation + "resource-policies.table.headers.group": "Group", + + // "resource-policies.table.headers.id": "ID", + // TODO New key - Add a translation + "resource-policies.table.headers.id": "ID", + + // "resource-policies.table.headers.name": "Name", + // TODO New key - Add a translation + "resource-policies.table.headers.name": "Name", + + // "resource-policies.table.headers.policyType": "type", + // TODO New key - Add a translation + "resource-policies.table.headers.policyType": "type", + + // "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", + // TODO New key - Add a translation + "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", + + // "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", + // TODO New key - Add a translation + "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", + + // "resource-policies.table.headers.title.for.item": "Policies for Item", + // TODO New key - Add a translation + "resource-policies.table.headers.title.for.item": "Policies for Item", + + // "resource-policies.table.headers.title.for.community": "Policies for Community", + // TODO New key - Add a translation + "resource-policies.table.headers.title.for.community": "Policies for Community", + + // "resource-policies.table.headers.title.for.collection": "Policies for Collection", + // TODO New key - Add a translation + "resource-policies.table.headers.title.for.collection": "Policies for Collection", + + + + // "search.description": "", + // TODO New key - Add a translation + "search.description": "", + + // "search.switch-configuration.title": "Show", + // TODO New key - Add a translation + "search.switch-configuration.title": "Show", + + // "search.title": "DSpace Angular :: Search", + // TODO New key - Add a translation + "search.title": "DSpace Angular :: Search", + + // "search.breadcrumbs": "Search", + // TODO New key - Add a translation + "search.breadcrumbs": "Search", + + + // "search.filters.applied.f.author": "Author", + // TODO New key - Add a translation + "search.filters.applied.f.author": "Author", + + // "search.filters.applied.f.dateIssued.max": "End date", + // TODO New key - Add a translation + "search.filters.applied.f.dateIssued.max": "End date", + + // "search.filters.applied.f.dateIssued.min": "Start date", + // TODO New key - Add a translation + "search.filters.applied.f.dateIssued.min": "Start date", + + // "search.filters.applied.f.dateSubmitted": "Date submitted", + // TODO New key - Add a translation + "search.filters.applied.f.dateSubmitted": "Date submitted", + + // "search.filters.applied.f.discoverable": "Private", + // TODO New key - Add a translation + "search.filters.applied.f.discoverable": "Private", + + // "search.filters.applied.f.entityType": "Item Type", + // TODO New key - Add a translation + "search.filters.applied.f.entityType": "Item Type", + + // "search.filters.applied.f.has_content_in_original_bundle": "Has files", + // TODO New key - Add a translation + "search.filters.applied.f.has_content_in_original_bundle": "Has files", + + // "search.filters.applied.f.itemtype": "Type", + // TODO New key - Add a translation + "search.filters.applied.f.itemtype": "Type", + + // "search.filters.applied.f.namedresourcetype": "Status", + // TODO New key - Add a translation + "search.filters.applied.f.namedresourcetype": "Status", + + // "search.filters.applied.f.subject": "Subject", + // TODO New key - Add a translation + "search.filters.applied.f.subject": "Subject", + + // "search.filters.applied.f.submitter": "Submitter", + // TODO New key - Add a translation + "search.filters.applied.f.submitter": "Submitter", + + // "search.filters.applied.f.jobTitle": "Job Title", + // TODO New key - Add a translation + "search.filters.applied.f.jobTitle": "Job Title", + + // "search.filters.applied.f.birthDate.max": "End birth date", + // TODO New key - Add a translation + "search.filters.applied.f.birthDate.max": "End birth date", + + // "search.filters.applied.f.birthDate.min": "Start birth date", + // TODO New key - Add a translation + "search.filters.applied.f.birthDate.min": "Start birth date", + + // "search.filters.applied.f.withdrawn": "Withdrawn", + // TODO New key - Add a translation + "search.filters.applied.f.withdrawn": "Withdrawn", + + + + // "search.filters.filter.author.head": "Author", + // TODO New key - Add a translation + "search.filters.filter.author.head": "Author", + + // "search.filters.filter.author.placeholder": "Author name", + // TODO New key - Add a translation + "search.filters.filter.author.placeholder": "Author name", + + // "search.filters.filter.birthDate.head": "Birth Date", + // TODO New key - Add a translation + "search.filters.filter.birthDate.head": "Birth Date", + + // "search.filters.filter.birthDate.placeholder": "Birth Date", + // TODO New key - Add a translation + "search.filters.filter.birthDate.placeholder": "Birth Date", + + // "search.filters.filter.creativeDatePublished.head": "Date Published", + // TODO New key - Add a translation + "search.filters.filter.creativeDatePublished.head": "Date Published", + + // "search.filters.filter.creativeDatePublished.placeholder": "Date Published", + // TODO New key - Add a translation + "search.filters.filter.creativeDatePublished.placeholder": "Date Published", + + // "search.filters.filter.creativeWorkEditor.head": "Editor", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkEditor.head": "Editor", + + // "search.filters.filter.creativeWorkEditor.placeholder": "Editor", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkEditor.placeholder": "Editor", + + // "search.filters.filter.creativeWorkKeywords.head": "Subject", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkKeywords.head": "Subject", + + // "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", + + // "search.filters.filter.creativeWorkPublisher.head": "Publisher", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkPublisher.head": "Publisher", + + // "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", + + // "search.filters.filter.dateIssued.head": "Date", + // TODO New key - Add a translation + "search.filters.filter.dateIssued.head": "Date", + + // "search.filters.filter.dateIssued.max.placeholder": "Minimum Date", + // TODO New key - Add a translation + "search.filters.filter.dateIssued.max.placeholder": "Minimum Date", + + // "search.filters.filter.dateIssued.min.placeholder": "Maximum Date", + // TODO New key - Add a translation + "search.filters.filter.dateIssued.min.placeholder": "Maximum Date", + + // "search.filters.filter.dateSubmitted.head": "Date submitted", + // TODO New key - Add a translation + "search.filters.filter.dateSubmitted.head": "Date submitted", + + // "search.filters.filter.dateSubmitted.placeholder": "Date submitted", + // TODO New key - Add a translation + "search.filters.filter.dateSubmitted.placeholder": "Date submitted", + + // "search.filters.filter.discoverable.head": "Private", + // TODO New key - Add a translation + "search.filters.filter.discoverable.head": "Private", + + // "search.filters.filter.withdrawn.head": "Withdrawn", + // TODO New key - Add a translation + "search.filters.filter.withdrawn.head": "Withdrawn", + + // "search.filters.filter.entityType.head": "Item Type", + // TODO New key - Add a translation + "search.filters.filter.entityType.head": "Item Type", + + // "search.filters.filter.entityType.placeholder": "Item Type", + // TODO New key - Add a translation + "search.filters.filter.entityType.placeholder": "Item Type", + + // "search.filters.filter.has_content_in_original_bundle.head": "Has files", + // TODO New key - Add a translation + "search.filters.filter.has_content_in_original_bundle.head": "Has files", + + // "search.filters.filter.itemtype.head": "Type", + // TODO New key - Add a translation + "search.filters.filter.itemtype.head": "Type", + + // "search.filters.filter.itemtype.placeholder": "Type", + // TODO New key - Add a translation + "search.filters.filter.itemtype.placeholder": "Type", + + // "search.filters.filter.jobTitle.head": "Job Title", + // TODO New key - Add a translation + "search.filters.filter.jobTitle.head": "Job Title", + + // "search.filters.filter.jobTitle.placeholder": "Job Title", + // TODO New key - Add a translation + "search.filters.filter.jobTitle.placeholder": "Job Title", + + // "search.filters.filter.knowsLanguage.head": "Known language", + // TODO New key - Add a translation + "search.filters.filter.knowsLanguage.head": "Known language", + + // "search.filters.filter.knowsLanguage.placeholder": "Known language", + // TODO New key - Add a translation + "search.filters.filter.knowsLanguage.placeholder": "Known language", + + // "search.filters.filter.namedresourcetype.head": "Status", + // TODO New key - Add a translation + "search.filters.filter.namedresourcetype.head": "Status", + + // "search.filters.filter.namedresourcetype.placeholder": "Status", + // TODO New key - Add a translation + "search.filters.filter.namedresourcetype.placeholder": "Status", + + // "search.filters.filter.objectpeople.head": "People", + // TODO New key - Add a translation + "search.filters.filter.objectpeople.head": "People", + + // "search.filters.filter.objectpeople.placeholder": "People", + // TODO New key - Add a translation + "search.filters.filter.objectpeople.placeholder": "People", + + // "search.filters.filter.organizationAddressCountry.head": "Country", + // TODO New key - Add a translation + "search.filters.filter.organizationAddressCountry.head": "Country", + + // "search.filters.filter.organizationAddressCountry.placeholder": "Country", + // TODO New key - Add a translation + "search.filters.filter.organizationAddressCountry.placeholder": "Country", + + // "search.filters.filter.organizationAddressLocality.head": "City", + // TODO New key - Add a translation + "search.filters.filter.organizationAddressLocality.head": "City", + + // "search.filters.filter.organizationAddressLocality.placeholder": "City", + // TODO New key - Add a translation + "search.filters.filter.organizationAddressLocality.placeholder": "City", + + // "search.filters.filter.organizationFoundingDate.head": "Date Founded", + // TODO New key - Add a translation + "search.filters.filter.organizationFoundingDate.head": "Date Founded", + + // "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", + // TODO New key - Add a translation + "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", + + // "search.filters.filter.scope.head": "Scope", + // TODO New key - Add a translation + "search.filters.filter.scope.head": "Scope", + + // "search.filters.filter.scope.placeholder": "Scope filter", + // TODO New key - Add a translation + "search.filters.filter.scope.placeholder": "Scope filter", + + // "search.filters.filter.show-less": "Collapse", + // TODO New key - Add a translation + "search.filters.filter.show-less": "Collapse", + + // "search.filters.filter.show-more": "Show more", + // TODO New key - Add a translation + "search.filters.filter.show-more": "Show more", + + // "search.filters.filter.subject.head": "Subject", + // TODO New key - Add a translation + "search.filters.filter.subject.head": "Subject", + + // "search.filters.filter.subject.placeholder": "Subject", + // TODO New key - Add a translation + "search.filters.filter.subject.placeholder": "Subject", + + // "search.filters.filter.submitter.head": "Submitter", + // TODO New key - Add a translation + "search.filters.filter.submitter.head": "Submitter", + + // "search.filters.filter.submitter.placeholder": "Submitter", + // TODO New key - Add a translation + "search.filters.filter.submitter.placeholder": "Submitter", + + + + // "search.filters.entityType.JournalIssue": "Journal Issue", + // TODO New key - Add a translation + "search.filters.entityType.JournalIssue": "Journal Issue", + + // "search.filters.entityType.JournalVolume": "Journal Volume", + // TODO New key - Add a translation + "search.filters.entityType.JournalVolume": "Journal Volume", + + // "search.filters.entityType.OrgUnit": "Organizational Unit", + // TODO New key - Add a translation + "search.filters.entityType.OrgUnit": "Organizational Unit", + + // "search.filters.has_content_in_original_bundle.true": "Yes", + // TODO New key - Add a translation + "search.filters.has_content_in_original_bundle.true": "Yes", + + // "search.filters.has_content_in_original_bundle.false": "No", + // TODO New key - Add a translation + "search.filters.has_content_in_original_bundle.false": "No", + + // "search.filters.discoverable.true": "No", + // TODO New key - Add a translation + "search.filters.discoverable.true": "No", + + // "search.filters.discoverable.false": "Yes", + // TODO New key - Add a translation + "search.filters.discoverable.false": "Yes", + + // "search.filters.withdrawn.true": "Yes", + // TODO New key - Add a translation + "search.filters.withdrawn.true": "Yes", + + // "search.filters.withdrawn.false": "No", + // TODO New key - Add a translation + "search.filters.withdrawn.false": "No", + + + // "search.filters.head": "Filters", + // TODO New key - Add a translation + "search.filters.head": "Filters", + + // "search.filters.reset": "Reset filters", + // TODO New key - Add a translation + "search.filters.reset": "Reset filters", + + + + // "search.form.search": "Search", + // TODO New key - Add a translation + "search.form.search": "Search", + + // "search.form.search_dspace": "Search DSpace", + // TODO New key - Add a translation + "search.form.search_dspace": "Search DSpace", + + // "search.form.search_mydspace": "Search MyDSpace", + // TODO New key - Add a translation + "search.form.search_mydspace": "Search MyDSpace", + + + + // "search.results.head": "Search Results", + // TODO New key - Add a translation + "search.results.head": "Search Results", + + // "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", + // TODO New key - Add a translation + "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", + + // "search.results.no-results-link": "quotes around it", + // TODO New key - Add a translation + "search.results.no-results-link": "quotes around it", + + // "search.results.empty": "Your search returned no results.", + // TODO New key - Add a translation + "search.results.empty": "Your search returned no results.", + + + + // "search.sidebar.close": "Back to results", + // TODO New key - Add a translation + "search.sidebar.close": "Back to results", + + // "search.sidebar.filters.title": "Filters", + // TODO New key - Add a translation + "search.sidebar.filters.title": "Filters", + + // "search.sidebar.open": "Search Tools", + // TODO New key - Add a translation + "search.sidebar.open": "Search Tools", + + // "search.sidebar.results": "results", + // TODO New key - Add a translation + "search.sidebar.results": "results", + + // "search.sidebar.settings.rpp": "Results per page", + // TODO New key - Add a translation + "search.sidebar.settings.rpp": "Results per page", + + // "search.sidebar.settings.sort-by": "Sort By", + // TODO New key - Add a translation + "search.sidebar.settings.sort-by": "Sort By", + + // "search.sidebar.settings.title": "Settings", + // TODO New key - Add a translation + "search.sidebar.settings.title": "Settings", + + + + // "search.view-switch.show-detail": "Show detail", + // TODO New key - Add a translation + "search.view-switch.show-detail": "Show detail", + + // "search.view-switch.show-grid": "Show as grid", + // TODO New key - Add a translation + "search.view-switch.show-grid": "Show as grid", + + // "search.view-switch.show-list": "Show as list", + // TODO New key - Add a translation + "search.view-switch.show-list": "Show as list", + + + + // "sorting.ASC": "Ascending", + // TODO New key - Add a translation + "sorting.ASC": "Ascending", + + // "sorting.DESC": "Descending", + // TODO New key - Add a translation + "sorting.DESC": "Descending", + + // "sorting.dc.title.ASC": "Title Ascending", + // TODO New key - Add a translation + "sorting.dc.title.ASC": "Title Ascending", + + // "sorting.dc.title.DESC": "Title Descending", + // TODO New key - Add a translation + "sorting.dc.title.DESC": "Title Descending", + + // "sorting.score.DESC": "Relevance", + // TODO New key - Add a translation + "sorting.score.DESC": "Relevance", + + + + // "statistics.title": "Statistics", + // TODO New key - Add a translation + "statistics.title": "Statistics", + + // "statistics.header": "Statistics for {{ scope }}", + // TODO New key - Add a translation + "statistics.header": "Statistics for {{ scope }}", + + // "statistics.breadcrumbs": "Statistics", + // TODO New key - Add a translation + "statistics.breadcrumbs": "Statistics", + + // "statistics.page.no-data": "No data available", + // TODO New key - Add a translation + "statistics.page.no-data": "No data available", + + // "statistics.table.no-data": "No data available", + // TODO New key - Add a translation + "statistics.table.no-data": "No data available", + + // "statistics.table.title.TotalVisits": "Total visits", + // TODO New key - Add a translation + "statistics.table.title.TotalVisits": "Total visits", + + // "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", + // TODO New key - Add a translation + "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", + + // "statistics.table.title.TotalDownloads": "File Visits", + // TODO New key - Add a translation + "statistics.table.title.TotalDownloads": "File Visits", + + // "statistics.table.title.TopCountries": "Top country views", + // TODO New key - Add a translation + "statistics.table.title.TopCountries": "Top country views", + + // "statistics.table.title.TopCities": "Top city views", + // TODO New key - Add a translation + "statistics.table.title.TopCities": "Top city views", + + // "statistics.table.header.views": "Views", + // TODO New key - Add a translation + "statistics.table.header.views": "Views", + + + + // "submission.edit.title": "Edit Submission", + // TODO New key - Add a translation + "submission.edit.title": "Edit Submission", + + // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", + // TODO New key - Add a translation + "submission.general.cannot_submit": "You have not the privilege to make a new submission.", + + // "submission.general.deposit": "Deposit", + // TODO New key - Add a translation + "submission.general.deposit": "Deposit", + + // "submission.general.discard.confirm.cancel": "Cancel", + // TODO New key - Add a translation + "submission.general.discard.confirm.cancel": "Cancel", + + // "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?", + // TODO New key - Add a translation + "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?", + + // "submission.general.discard.confirm.submit": "Yes, I'm sure", + // TODO New key - Add a translation + "submission.general.discard.confirm.submit": "Yes, I'm sure", + + // "submission.general.discard.confirm.title": "Discard submission", + // TODO New key - Add a translation + "submission.general.discard.confirm.title": "Discard submission", + + // "submission.general.discard.submit": "Discard", + // TODO New key - Add a translation + "submission.general.discard.submit": "Discard", + + // "submission.general.save": "Save", + // TODO New key - Add a translation + "submission.general.save": "Save", + + // "submission.general.save-later": "Save for later", + // TODO New key - Add a translation + "submission.general.save-later": "Save for later", + + + // "submission.import-external.page.title": "Import metadata from an external source", + // TODO New key - Add a translation + "submission.import-external.page.title": "Import metadata from an external source", + + // "submission.import-external.title": "Import metadata from an external source", + // TODO New key - Add a translation + "submission.import-external.title": "Import metadata from an external source", + + // "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", + // TODO New key - Add a translation + "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", + + // "submission.import-external.back-to-my-dspace": "Back to MyDSpace", + // TODO New key - Add a translation + "submission.import-external.back-to-my-dspace": "Back to MyDSpace", + + // "submission.import-external.search.placeholder": "Search the external source", + // TODO New key - Add a translation + "submission.import-external.search.placeholder": "Search the external source", + + // "submission.import-external.search.button": "Search", + // TODO New key - Add a translation + "submission.import-external.search.button": "Search", + + // "submission.import-external.search.button.hint": "Write some words to search", + // TODO New key - Add a translation + "submission.import-external.search.button.hint": "Write some words to search", + + // "submission.import-external.search.source.hint": "Pick an external source", + // TODO New key - Add a translation + "submission.import-external.search.source.hint": "Pick an external source", + + // "submission.import-external.source.arxiv": "arXiv", + // TODO New key - Add a translation + "submission.import-external.source.arxiv": "arXiv", + + // "submission.import-external.source.loading": "Loading ...", + // TODO New key - Add a translation + "submission.import-external.source.loading": "Loading ...", + + // "submission.import-external.source.sherpaJournal": "SHERPA Journals", + // TODO New key - Add a translation + "submission.import-external.source.sherpaJournal": "SHERPA Journals", + + // "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", + // TODO New key - Add a translation + "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", + + // "submission.import-external.source.orcid": "ORCID", + // TODO New key - Add a translation + "submission.import-external.source.orcid": "ORCID", + + // "submission.import-external.source.pubmed": "Pubmed", + // TODO New key - Add a translation + "submission.import-external.source.pubmed": "Pubmed", + + // "submission.import-external.source.lcname": "Library of Congress Names", + // TODO New key - Add a translation + "submission.import-external.source.lcname": "Library of Congress Names", + + // "submission.import-external.preview.title": "Item Preview", + // TODO New key - Add a translation + "submission.import-external.preview.title": "Item Preview", + + // "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", + // TODO New key - Add a translation + "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", + + // "submission.import-external.preview.button.import": "Start submission", + // TODO New key - Add a translation + "submission.import-external.preview.button.import": "Start submission", + + // "submission.import-external.preview.error.import.title": "Submission error", + // TODO New key - Add a translation + "submission.import-external.preview.error.import.title": "Submission error", + + // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", + // TODO New key - Add a translation + "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", + + // "submission.sections.describe.relationship-lookup.close": "Close", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.close": "Close", + + // "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Successfully imported and added external author to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Successfully imported and added external author to the selection", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Authority", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Authority", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Import as a new local authority entry", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Import as a new local authority entry", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Import as a new local entity", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Import as a new local entity", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Import Remote Journal Volume", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Import Remote Journal Volume", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", + + // "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", + + // "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", + + // "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", + + // "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", + + // "submission.sections.describe.relationship-lookup.search-tab.search": "Go", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.search": "Go", + + // "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", + + // "submission.sections.describe.relationship-lookup.search-tab.select-page": "Select page", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.select-page": "Select page", + + // "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", + // TODO New key - Add a translation + "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 }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Sherpa Publishers ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Search for Funding Agencies", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Search for Funding Agencies", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", + + // "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", + + // "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", + // "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", + + // "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", + // "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", + + // "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", + + // "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Authors", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Authors", + + // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", + // "submission.sections.describe.relationship-lookup.title.Project": "Projects", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.Project": "Projects", + + // "submission.sections.describe.relationship-lookup.title.Publication": "Publications", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.Publication": "Publications", + + // "submission.sections.describe.relationship-lookup.title.Person": "Authors", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.Person": "Authors", + + // "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", + + // "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", + + // "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", + + // "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", + + // "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", + + // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", + + // "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", + + // "submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings", + + // "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Authors", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Authors", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", + // "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Authors", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Authors", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Selected Data Files", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Selected Data Files", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", + + // "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.name-variant.notification.content": "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.confirm": "Save a new name variant", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", + + // "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", + + // "submission.sections.ccLicense.type": "License Type", + // TODO New key - Add a translation + "submission.sections.ccLicense.type": "License Type", + + // "submission.sections.ccLicense.select": "Select a license type…", + // TODO New key - Add a translation + "submission.sections.ccLicense.select": "Select a license type…", + + // "submission.sections.ccLicense.change": "Change your license type…", + // TODO New key - Add a translation + "submission.sections.ccLicense.change": "Change your license type…", + + // "submission.sections.ccLicense.none": "No licenses available", + // TODO New key - Add a translation + "submission.sections.ccLicense.none": "No licenses available", + + // "submission.sections.ccLicense.option.select": "Select an option…", + // TODO New key - Add a translation + "submission.sections.ccLicense.option.select": "Select an option…", + + // "submission.sections.ccLicense.link": "You’ve selected the following license:", + // TODO New key - Add a translation + "submission.sections.ccLicense.link": "You’ve selected the following license:", + + // "submission.sections.ccLicense.confirmation": "I grant the license above", + // TODO New key - Add a translation + "submission.sections.ccLicense.confirmation": "I grant the license above", + + // "submission.sections.general.add-more": "Add more", + // TODO New key - Add a translation + "submission.sections.general.add-more": "Add more", + + // "submission.sections.general.collection": "Collection", + // TODO New key - Add a translation + "submission.sections.general.collection": "Collection", + + // "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", + // TODO New key - Add a translation + "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", + + // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", + // TODO New key - Add a translation + "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", + + // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", + // TODO New key - Add a translation + "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", + + // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", + // TODO New key - Add a translation + "submission.sections.general.discard_success_notice": "Submission discarded successfully.", + + // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", + // TODO New key - Add a translation + "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", + + // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", + // TODO New key - Add a translation + "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", + + // "submission.sections.general.no-collection": "No collection found", + // TODO New key - Add a translation + "submission.sections.general.no-collection": "No collection found", + + // "submission.sections.general.no-sections": "No options available", + // TODO New key - Add a translation + "submission.sections.general.no-sections": "No options available", + + // "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", + // TODO New key - Add a translation + "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", + + // "submission.sections.general.save_success_notice": "Submission saved successfully.", + // TODO New key - Add a translation + "submission.sections.general.save_success_notice": "Submission saved successfully.", + + // "submission.sections.general.search-collection": "Search for a collection", + // TODO New key - Add a translation + "submission.sections.general.search-collection": "Search for a collection", + + // "submission.sections.general.sections_not_valid": "There are incomplete sections.", + // TODO New key - Add a translation + "submission.sections.general.sections_not_valid": "There are incomplete sections.", + + + + // "submission.sections.submit.progressbar.CClicense": "Creative commons license", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.CClicense": "Creative commons license", + + // "submission.sections.submit.progressbar.describe.recycle": "Recycle", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.describe.recycle": "Recycle", + + // "submission.sections.submit.progressbar.describe.stepcustom": "Describe", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.describe.stepcustom": "Describe", + + // "submission.sections.submit.progressbar.describe.stepone": "Describe", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.describe.stepone": "Describe", + + // "submission.sections.submit.progressbar.describe.steptwo": "Describe", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.describe.steptwo": "Describe", + + // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", + + // "submission.sections.submit.progressbar.license": "Deposit license", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.license": "Deposit license", + + // "submission.sections.submit.progressbar.upload": "Upload files", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.upload": "Upload files", + + + + // "submission.sections.upload.delete.confirm.cancel": "Cancel", + // TODO New key - Add a translation + "submission.sections.upload.delete.confirm.cancel": "Cancel", + + // "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?", + // TODO New key - Add a translation + "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?", + + // "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", + // TODO New key - Add a translation + "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", + + // "submission.sections.upload.delete.confirm.title": "Delete bitstream", + // TODO New key - Add a translation + "submission.sections.upload.delete.confirm.title": "Delete bitstream", + + // "submission.sections.upload.delete.submit": "Delete", + // TODO New key - Add a translation + "submission.sections.upload.delete.submit": "Delete", + + // "submission.sections.upload.drop-message": "Drop files to attach them to the item", + // TODO New key - Add a translation + "submission.sections.upload.drop-message": "Drop files to attach them to the item", + + // "submission.sections.upload.form.access-condition-label": "Access condition type", + // TODO New key - Add a translation + "submission.sections.upload.form.access-condition-label": "Access condition type", + + // "submission.sections.upload.form.date-required": "Date is required.", + // TODO New key - Add a translation + "submission.sections.upload.form.date-required": "Date is required.", + + // "submission.sections.upload.form.from-label": "Grant access from", + // TODO New key - Add a translation + "submission.sections.upload.form.from-label": "Grant access from", + + // "submission.sections.upload.form.from-placeholder": "From", + // TODO New key - Add a translation + "submission.sections.upload.form.from-placeholder": "From", + + // "submission.sections.upload.form.group-label": "Group", + // TODO New key - Add a translation + "submission.sections.upload.form.group-label": "Group", + + // "submission.sections.upload.form.group-required": "Group is required.", + // TODO New key - Add a translation + "submission.sections.upload.form.group-required": "Group is required.", + + // "submission.sections.upload.form.until-label": "Grant access until", + // TODO New key - Add a translation + "submission.sections.upload.form.until-label": "Grant access until", + + // "submission.sections.upload.form.until-placeholder": "Until", + // TODO New key - Add a translation + "submission.sections.upload.form.until-placeholder": "Until", + + // "submission.sections.upload.header.policy.default.nolist": "Uploaded files in the {{collectionName}} collection will be accessible according to the following group(s):", + // TODO New key - Add a translation + "submission.sections.upload.header.policy.default.nolist": "Uploaded files in the {{collectionName}} collection will be accessible according to the following group(s):", + + // "submission.sections.upload.header.policy.default.withlist": "Please note that uploaded files in the {{collectionName}} collection will be accessible, in addition to what is explicitly decided for the single file, with the following group(s):", + // TODO New key - Add a translation + "submission.sections.upload.header.policy.default.withlist": "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.info": "Here you will find all the files currently in the item. You can update the file metadata and access conditions or upload additional files just dragging & dropping them everywhere in the page", + // TODO New key - Add a translation + "submission.sections.upload.info": "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.no-entry": "No", + // TODO New key - Add a translation + "submission.sections.upload.no-entry": "No", + + // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", + // TODO New key - Add a translation + "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", + + // "submission.sections.upload.save-metadata": "Save metadata", + // TODO New key - Add a translation + "submission.sections.upload.save-metadata": "Save metadata", + + // "submission.sections.upload.undo": "Cancel", + // TODO New key - Add a translation + "submission.sections.upload.undo": "Cancel", + + // "submission.sections.upload.upload-failed": "Upload failed", + // TODO New key - Add a translation + "submission.sections.upload.upload-failed": "Upload failed", + + // "submission.sections.upload.upload-successful": "Upload successful", + // TODO New key - Add a translation + "submission.sections.upload.upload-successful": "Upload successful", + + + + // "submission.submit.title": "Submission", + // TODO New key - Add a translation + "submission.submit.title": "Submission", + + + + // "submission.workflow.generic.delete": "Delete", + "submission.workflow.generic.delete": "Өшіру", + + // "submission.workflow.generic.delete-help": "If you would to discard this item, select \"Delete\". You will then be asked to confirm it.", + // TODO New key - Add a translation + "submission.workflow.generic.delete-help": "If you would to discard this item, select \"Delete\". You will then be asked to confirm it.", + + // "submission.workflow.generic.edit": "Edit", + // TODO New key - Add a translation + "submission.workflow.generic.edit": "Edit", + + // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", + // TODO New key - Add a translation + "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", + + // "submission.workflow.generic.view": "View", + // TODO New key - Add a translation + "submission.workflow.generic.view": "View", + + // "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", + // TODO New key - Add a translation + "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", + + + + // "submission.workflow.tasks.claimed.approve": "Approve", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.approve": "Approve", + + // "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", + + // "submission.workflow.tasks.claimed.edit": "Edit", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.edit": "Edit", + + // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", + + // "submission.workflow.tasks.claimed.reject.reason.info": "Please enter your reason for rejecting the submission into the box below, indicating whether the submitter may fix a problem and resubmit.", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject.reason.info": "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.placeholder": "Describe the reason of reject", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", + + // "submission.workflow.tasks.claimed.reject.reason.submit": "Reject item", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject.reason.submit": "Reject item", + + // "submission.workflow.tasks.claimed.reject.reason.title": "Reason", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject.reason.title": "Reason", + + // "submission.workflow.tasks.claimed.reject.submit": "Reject", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject.submit": "Reject", + + // "submission.workflow.tasks.claimed.reject_help": "If you have reviewed the item and found it is not suitable for inclusion in the collection, select \"Reject\". You will then be asked to enter a message indicating why the item is unsuitable, and whether the submitter should change something and resubmit.", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject_help": "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.return": "Return to pool", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.return": "Return to pool", + + // "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", + + + + // "submission.workflow.tasks.generic.error": "Error occurred during operation...", + // TODO New key - Add a translation + "submission.workflow.tasks.generic.error": "Error occurred during operation...", + + // "submission.workflow.tasks.generic.processing": "Processing...", + // TODO New key - Add a translation + "submission.workflow.tasks.generic.processing": "Processing...", + + // "submission.workflow.tasks.generic.submitter": "Submitter", + // TODO New key - Add a translation + "submission.workflow.tasks.generic.submitter": "Submitter", + + // "submission.workflow.tasks.generic.success": "Operation successful", + // TODO New key - Add a translation + "submission.workflow.tasks.generic.success": "Operation successful", + + + + // "submission.workflow.tasks.pool.claim": "Claim", + // TODO New key - Add a translation + "submission.workflow.tasks.pool.claim": "Claim", + + // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", + // TODO New key - Add a translation + "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", + + // "submission.workflow.tasks.pool.hide-detail": "Hide detail", + // TODO New key - Add a translation + "submission.workflow.tasks.pool.hide-detail": "Hide detail", + + // "submission.workflow.tasks.pool.show-detail": "Show detail", + // TODO New key - Add a translation + "submission.workflow.tasks.pool.show-detail": "Show detail", + + + + // "title": "DSpace", + // TODO New key - Add a translation + "title": "DSpace", + + + + // "vocabulary-treeview.header": "Hierarchical tree view", + // TODO New key - Add a translation + "vocabulary-treeview.header": "Hierarchical tree view", + + // "vocabulary-treeview.load-more": "Load more", + // TODO New key - Add a translation + "vocabulary-treeview.load-more": "Load more", + + // "vocabulary-treeview.search.form.reset": "Reset", + // TODO New key - Add a translation + "vocabulary-treeview.search.form.reset": "Reset", + + // "vocabulary-treeview.search.form.search": "Search", + // TODO New key - Add a translation + "vocabulary-treeview.search.form.search": "Search", + + // "vocabulary-treeview.search.no-result": "There were no items to show", + // TODO New key - Add a translation + "vocabulary-treeview.search.no-result": "There were no items to show", + + // "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", + // TODO New key - Add a translation + "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", + + // "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", + // TODO New key - Add a translation + "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", + + + + // "uploader.browse": "browse", + // TODO New key - Add a translation + "uploader.browse": "browse", + + // "uploader.drag-message": "Drag & Drop your files here", + // TODO New key - Add a translation + "uploader.drag-message": "Drag & Drop your files here", + + // "uploader.or": ", or ", + // TODO New key - Add a translation + "uploader.or": ", or ", + + // "uploader.processing": "Processing", + // TODO New key - Add a translation + "uploader.processing": "Processing", + + // "uploader.queue-length": "Queue length", + // TODO New key - Add a translation + "uploader.queue-length": "Queue length", + + // "virtual-metadata.delete-item.info": "Select the types for which you want to save the virtual metadata as real metadata", + // TODO New key - Add a translation + "virtual-metadata.delete-item.info": "Select the types for which you want to save the virtual metadata as real metadata", + + // "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", + // TODO New key - Add a translation + "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", + + // "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", + // TODO New key - Add a translation + "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", + + + + // "workflowAdmin.search.results.head": "Administer Workflow", + // TODO New key - Add a translation + "workflowAdmin.search.results.head": "Administer Workflow", + + + + // "workflow-item.delete.notification.success.title": "Deleted", + // TODO New key - Add a translation + "workflow-item.delete.notification.success.title": "Deleted", + + // "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", + // TODO New key - Add a translation + "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", + + // "workflow-item.delete.notification.error.title": "Something went wrong", + // TODO New key - Add a translation + "workflow-item.delete.notification.error.title": "Something went wrong", + + // "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", + // TODO New key - Add a translation + "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", + + // "workflow-item.delete.title": "Delete workflow item", + // TODO New key - Add a translation + "workflow-item.delete.title": "Delete workflow item", + + // "workflow-item.delete.header": "Delete workflow item", + // TODO New key - Add a translation + "workflow-item.delete.header": "Delete workflow item", + + // "workflow-item.delete.button.cancel": "Cancel", + // TODO New key - Add a translation + "workflow-item.delete.button.cancel": "Cancel", + + // "workflow-item.delete.button.confirm": "Delete", + // TODO New key - Add a translation + "workflow-item.delete.button.confirm": "Delete", + + + // "workflow-item.send-back.notification.success.title": "Sent back to submitter", + // TODO New key - Add a translation + "workflow-item.send-back.notification.success.title": "Sent back to submitter", + + // "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", + // TODO New key - Add a translation + "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", + + // "workflow-item.send-back.notification.error.title": "Something went wrong", + // TODO New key - Add a translation + "workflow-item.send-back.notification.error.title": "Something went wrong", + + // "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", + // TODO New key - Add a translation + "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", + + // "workflow-item.send-back.title": "Send workflow item back to submitter", + // TODO New key - Add a translation + "workflow-item.send-back.title": "Send workflow item back to submitter", + + // "workflow-item.send-back.header": "Send workflow item back to submitter", + // TODO New key - Add a translation + "workflow-item.send-back.header": "Send workflow item back to submitter", + + // "workflow-item.send-back.button.cancel": "Cancel", + "workflow-item.send-back.button.cancel": "Алып тастау", + + // "workflow-item.send-back.button.confirm": "Send back" + // TODO New key - Add a translation + "workflow-item.send-back.button.confirm": "Send back" + + +} From 72a5e4b0c7aa3f6f2fc7e32cd53f8e6fc2fa0760 Mon Sep 17 00:00:00 2001 From: myrza1 Date: Mon, 25 Oct 2021 03:45:39 +0600 Subject: [PATCH 002/119] Update kz.json5 --- src/assets/i18n/kz.json5 | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index e18e846d17..6b6284c0ad 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -3906,24 +3906,20 @@ "menu.section.browse_global": "All of DSpace", // "menu.section.browse_global_by_author": "By Author", - // TODO New key - Add a translation - "menu.section.browse_global_by_author": "By Author", + "menu.section.browse_global_by_author": "Авторымен", // "menu.section.browse_global_by_dateissued": "By Issue Date", // TODO New key - Add a translation "menu.section.browse_global_by_dateissued": "By Issue Date", // "menu.section.browse_global_by_subject": "By Subject", - // TODO New key - Add a translation - "menu.section.browse_global_by_subject": "By Subject", + "menu.section.browse_global_by_subject": "Тақырыбымен", // "menu.section.browse_global_by_title": "By Title", - // TODO New key - Add a translation - "menu.section.browse_global_by_title": "By Title", + "menu.section.browse_global_by_title": "Атауымен", // "menu.section.browse_global_communities_and_collections": "Communities & Collections", - // TODO New key - Add a translation - "menu.section.browse_global_communities_and_collections": "Communities & Collections", + "menu.section.browse_global_communities_and_collections": "Қауымдастықтар мен коллекциялар", From 5dfa82322ed1c0da709ed128806385eac507aabb Mon Sep 17 00:00:00 2001 From: myrza1 Date: Fri, 12 Nov 2021 16:16:33 +0600 Subject: [PATCH 003/119] Update kz.json5 Collection, cookies, beatstream, 404, browse - transated --- src/assets/i18n/kz.json5 | 581 ++++++++++++--------------------------- 1 file changed, 179 insertions(+), 402 deletions(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index 6b6284c0ad..1f82a1681b 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -8,36 +8,27 @@ "401.link.home-page": "Басты бетке өту", // "401.unauthorized": "unauthorized", - // TODO New key - Add a translation - "401.unauthorized": "unauthorized", + "401.unauthorized": "Тіркелмеген", - // "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", - // TODO New key - Add a translation - "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", + // "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": "Сізде бұл параққа кіруге рұқсат жоқ. Басты бетке оралу үшін төмендегі батырманы пайдалануға болады.", // "403.link.home-page": "Take me to the home page", - // TODO New key - Add a translation - "403.link.home-page": "Take me to the home page", + "403.link.home-page": "Басты бетке өту", // "403.forbidden": "forbidden", - // TODO New key - Add a translation - "403.forbidden": "forbidden", - - + "403.forbidden": "Тыйым салынған", // "404.help": "We can't find the page you're looking for. The page may have been moved or deleted. You can use the button below to get back to the home page. ", - // TODO New key - Add a translation - "404.help": "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": "Сіз іздеген бет табылмады. Бұл бет алмастырылған немесе жойылған болуы мүмкін. Басты бетке оралу үшін төмендегі батырманы пайдалануға болады. ", // "404.link.home-page": "Take me to the home page", - // TODO New key - Add a translation - "404.link.home-page": "Take me to the home page", + "404.link.home-page": "Басты бетке өту", // "404.page-not-found": "page not found", - // TODO New key - Add a translation - "404.page-not-found": "page not found", + "404.page-not-found": "Бұл бет табылмады", // "admin.curation-tasks.breadcrumbs": "System curation tasks", // TODO New key - Add a translation @@ -997,626 +988,456 @@ // "bitstream.edit.bitstream": "Bitstream: ", - // TODO New key - Add a translation - "bitstream.edit.bitstream": "Bitstream: ", + "bitstream.edit.bitstream": "Битстрим: ", // "bitstream.edit.form.description.hint": "Optionally, provide a brief description of the file, for example \"Main article\" or \"Experiment data readings\".", - // TODO New key - Add a translation - "bitstream.edit.form.description.hint": "Optionally, provide a brief description of the file, for example \"Main article\" or \"Experiment data readings\".", + "bitstream.edit.form.description.hint": "Қажет болса, файлдың қысқаша сипаттамасын беріңіз, мысалы \"Негізгі мақала\" немесе \"Тәжірибелік деректер көрсеткіштері\".", // "bitstream.edit.form.description.label": "Description", - // TODO New key - Add a translation - "bitstream.edit.form.description.label": "Description", + "bitstream.edit.form.description.label": "Сипаттамасы", // "bitstream.edit.form.embargo.hint": "The first day from which access is allowed. This date cannot be modified on this form. To set an embargo date for a bitstream, go to the Item Status tab, click Authorizations..., create or edit the bitstream's READ policy, and set the Start Date as desired.", - // TODO New key - Add a translation - "bitstream.edit.form.embargo.hint": "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": "Кіруге рұқсат етілген бірінші күн. Бұл күнді осы формада өзгерту мүмкін емес. Бит ағынына тыйым салу күнін белгілеу үшін, мына жерге өтіңіз "элемент дәрежесі қойындысын басыңыз Тіркелу..., бит ағынын жасау немесе өңдеу ОҚУ ереже және орнату Басталу Күні қалауы бойынша.", // "bitstream.edit.form.embargo.label": "Embargo until specific date", - // TODO New key - Add a translation - "bitstream.edit.form.embargo.label": "Embargo until specific date", + "bitstream.edit.form.embargo.label": "Белгілі бір күнге дейін тыйым салу(шектеу)", // "bitstream.edit.form.fileName.hint": "Change the filename for the bitstream. Note that this will change the display bitstream URL, but old links will still resolve as long as the sequence ID does not change.", - // TODO New key - Add a translation - "bitstream.edit.form.fileName.hint": "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": "Бит ағыны үшін файл атауын өзгертіңіз. Бұл көрсетілген бит ағынының URL мекенжайын өзгертетініне назар аударыңыз, бірақ бірізділік идентификаторы өзгергенге дейін ескі сілтемелер әлі де жарамды болады.", // "bitstream.edit.form.fileName.label": "Filename", - // TODO New key - Add a translation - "bitstream.edit.form.fileName.label": "Filename", + "bitstream.edit.form.fileName.label": "Файл атауы", // "bitstream.edit.form.newFormat.label": "Describe new format", - // TODO New key - Add a translation - "bitstream.edit.form.newFormat.label": "Describe new format", + "bitstream.edit.form.newFormat.label": "Жаңа форматты сипаттаңыз", // "bitstream.edit.form.newFormat.hint": "The application you used to create the file, and the version number (for example, \"ACMESoft SuperApp version 1.5\").", - // TODO New key - Add a translation - "bitstream.edit.form.newFormat.hint": "The application you used to create the file, and the version number (for example, \"ACMESoft SuperApp version 1.5\").", + "bitstream.edit.form.newFormat.hint": "Файлды жасау үшін пайдаланған бағдарлама, және нұсқа нөмірі (мысалы, \"ACMESoft SuperApp version 1.5\").", // "bitstream.edit.form.primaryBitstream.label": "Primary bitstream", - // TODO New key - Add a translation - "bitstream.edit.form.primaryBitstream.label": "Primary bitstream", + "bitstream.edit.form.primaryBitstream.label": "Негізгі бит ағыны", // "bitstream.edit.form.selectedFormat.hint": "If the format is not in the above list, select \"format not in list\" above and describe it under \"Describe new format\".", - // TODO New key - Add a translation - "bitstream.edit.form.selectedFormat.hint": "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": "Егер формат жоғарыда көрсетілген тізімде болмаса, таңдау \"формат тізімде жоқ\" жоғары және оны бөлімде сипаттаңыз \"Жаңа форматты сипаттаңыз\".", // "bitstream.edit.form.selectedFormat.label": "Selected Format", - // TODO New key - Add a translation - "bitstream.edit.form.selectedFormat.label": "Selected Format", + "bitstream.edit.form.selectedFormat.label": "Таңдалған Формат", // "bitstream.edit.form.selectedFormat.unknown": "Format not in list", - // TODO New key - Add a translation - "bitstream.edit.form.selectedFormat.unknown": "Format not in list", + "bitstream.edit.form.selectedFormat.unknown": "Формат тізімде жоқ", // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", - // TODO New key - Add a translation - "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", + "bitstream.edit.notifications.error.format.title": "Бит ағынының форматын сақтау кезінде қате пайда болды", // "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", - // TODO New key - Add a translation - "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", + "bitstream.edit.notifications.saved.content": "Осы бит ағынында сіз енгізген өзгерістер сақталды.", // "bitstream.edit.notifications.saved.title": "Bitstream saved", - // TODO New key - Add a translation - "bitstream.edit.notifications.saved.title": "Bitstream saved", + "bitstream.edit.notifications.saved.title": "Бит ағыны сақталды", // "bitstream.edit.title": "Edit bitstream", - // TODO New key - Add a translation - "bitstream.edit.title": "Edit bitstream", + "bitstream.edit.title": "Бит ағынын өзгерту", // "browse.comcol.by.author": "By Author", - // TODO New key - Add a translation - "browse.comcol.by.author": "By Author", + "browse.comcol.by.author": "Авторы", // "browse.comcol.by.dateissued": "By Issue Date", - // TODO New key - Add a translation - "browse.comcol.by.dateissued": "By Issue Date", + "browse.comcol.by.dateissued": "Шығарылған Күні Бойынша", // "browse.comcol.by.subject": "By Subject", - // TODO New key - Add a translation - "browse.comcol.by.subject": "By Subject", + "browse.comcol.by.subject": "Пәні Бойынша", // "browse.comcol.by.title": "By Title", - // TODO New key - Add a translation - "browse.comcol.by.title": "By Title", + "browse.comcol.by.title": "Тақырыбы Бойынша", // "browse.comcol.head": "Browse", - // TODO New key - Add a translation - "browse.comcol.head": "Browse", + "browse.comcol.head": "Көру", // "browse.empty": "No items to show.", - // TODO New key - Add a translation - "browse.empty": "No items to show.", + "browse.empty": "Көрсету үшін элементтер жоқ.", // "browse.metadata.author": "Author", - // TODO New key - Add a translation - "browse.metadata.author": "Author", + "browse.metadata.author": "Автор", // "browse.metadata.dateissued": "Issue Date", - // TODO New key - Add a translation - "browse.metadata.dateissued": "Issue Date", + "browse.metadata.dateissued": "Шығарылған күні", // "browse.metadata.subject": "Subject", - // TODO New key - Add a translation - "browse.metadata.subject": "Subject", + "browse.metadata.subject": "Пән", // "browse.metadata.title": "Title", - // TODO New key - Add a translation - "browse.metadata.title": "Title", + "browse.metadata.title": "Тақырып", // "browse.metadata.author.breadcrumbs": "Browse by Author", - // TODO New key - Add a translation - "browse.metadata.author.breadcrumbs": "Browse by Author", + "browse.metadata.author.breadcrumbs": "Автор бойынша қарау", // "browse.metadata.dateissued.breadcrumbs": "Browse by Date", - // TODO New key - Add a translation - "browse.metadata.dateissued.breadcrumbs": "Browse by Date", + "browse.metadata.dateissued.breadcrumbs": "Күні бойынша қарау", // "browse.metadata.subject.breadcrumbs": "Browse by Subject", - // TODO New key - Add a translation - "browse.metadata.subject.breadcrumbs": "Browse by Subject", + "browse.metadata.subject.breadcrumbs": "Пәні бойынша қарау", // "browse.metadata.title.breadcrumbs": "Browse by Title", - // TODO New key - Add a translation - "browse.metadata.title.breadcrumbs": "Browse by Title", + "browse.metadata.title.breadcrumbs": "Тақырыбы бойынша қарау", // "browse.startsWith.choose_start": "(Choose start)", - // TODO New key - Add a translation - "browse.startsWith.choose_start": "(Choose start)", + "browse.startsWith.choose_start": "(басталуын таңдаңыз)", // "browse.startsWith.choose_year": "(Choose year)", - // TODO New key - Add a translation - "browse.startsWith.choose_year": "(Choose year)", + "browse.startsWith.choose_year": "(Жылды таңдаңыз)", // "browse.startsWith.jump": "Jump to a point in the index:", - // TODO New key - Add a translation - "browse.startsWith.jump": "Jump to a point in the index:", + "browse.startsWith.jump": "Индекстегі нүктеге өту:", // "browse.startsWith.months.april": "April", - // TODO New key - Add a translation - "browse.startsWith.months.april": "April", + "browse.startsWith.months.april": "Сәуір", // "browse.startsWith.months.august": "August", - // TODO New key - Add a translation - "browse.startsWith.months.august": "August", + "browse.startsWith.months.august": "Тамыз", // "browse.startsWith.months.december": "December", - // TODO New key - Add a translation - "browse.startsWith.months.december": "December", + "browse.startsWith.months.december": "Желтоқсан", // "browse.startsWith.months.february": "February", - // TODO New key - Add a translation - "browse.startsWith.months.february": "February", + "browse.startsWith.months.february": "Ақпан", // "browse.startsWith.months.january": "January", - // TODO New key - Add a translation - "browse.startsWith.months.january": "January", + "browse.startsWith.months.january": "Қаңтар", // "browse.startsWith.months.july": "July", - // TODO New key - Add a translation - "browse.startsWith.months.july": "July", + "browse.startsWith.months.july": "Шілде", // "browse.startsWith.months.june": "June", - // TODO New key - Add a translation - "browse.startsWith.months.june": "June", + "browse.startsWith.months.june": "Маусым", // "browse.startsWith.months.march": "March", - // TODO New key - Add a translation - "browse.startsWith.months.march": "March", + "browse.startsWith.months.march": "Наурыз", // "browse.startsWith.months.may": "May", - // TODO New key - Add a translation - "browse.startsWith.months.may": "May", + "browse.startsWith.months.may": "Мамыр", // "browse.startsWith.months.none": "(Choose month)", - // TODO New key - Add a translation - "browse.startsWith.months.none": "(Choose month)", + "browse.startsWith.months.none": "(Айды таңдаңыз)", // "browse.startsWith.months.november": "November", - // TODO New key - Add a translation - "browse.startsWith.months.november": "November", + "browse.startsWith.months.november": "Қараша", // "browse.startsWith.months.october": "October", - // TODO New key - Add a translation - "browse.startsWith.months.october": "October", + "browse.startsWith.months.october": "Қазан", // "browse.startsWith.months.september": "September", - // TODO New key - Add a translation - "browse.startsWith.months.september": "September", + "browse.startsWith.months.september": "Қыркүйек", // "browse.startsWith.submit": "Go", - // TODO New key - Add a translation "browse.startsWith.submit": "Go", // "browse.startsWith.type_date": "Or type in a date (year-month):", - // TODO New key - Add a translation - "browse.startsWith.type_date": "Or type in a date (year-month):", + "browse.startsWith.type_date": "Немесе күнді енгізіңіз (жыл-ай):", // "browse.startsWith.type_text": "Or enter first few letters:", - // TODO New key - Add a translation - "browse.startsWith.type_text": "Or enter first few letters:", + "browse.startsWith.type_text": "Немесе алғашқы бірнеше әріптерді енгізіңіз:", // "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", - // TODO New key - Add a translation - "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", + "browse.title": "{{collection}} {{field}} {{value}} бойынша қараңыз", // "chips.remove": "Remove chip", - // TODO New key - Add a translation - "chips.remove": "Remove chip", - - - + "chips.remove": "Чипті жою", + // "collection.create.head": "Create a Collection", - // TODO New key - Add a translation - "collection.create.head": "Create a Collection", + "collection.create.head": "Топтама Жасау", // "collection.create.notifications.success": "Successfully created the Collection", - // TODO New key - Add a translation - "collection.create.notifications.success": "Successfully created the Collection", + "collection.create.notifications.success": "Топтама сәтті жасалды", // "collection.create.sub-head": "Create a Collection for Community {{ parent }}", - // TODO New key - Add a translation - "collection.create.sub-head": "Create a Collection for Community {{ parent }}", + "collection.create.sub-head": "Қауымдастық үшін Топтама жасау {{ parent }}", // "collection.curate.header": "Curate Collection: {{collection}}", - // TODO New key - Add a translation - "collection.curate.header": "Curate Collection: {{collection}}", + "collection.curate.header": "Кураторлық Топтама: {{collection}}", // "collection.delete.cancel": "Cancel", - // TODO New key - Add a translation - "collection.delete.cancel": "Cancel", + "collection.delete.cancel": "Бас тарту", // "collection.delete.confirm": "Confirm", - // TODO New key - Add a translation - "collection.delete.confirm": "Confirm", + "collection.delete.confirm": "Растау", // "collection.delete.head": "Delete Collection", - // TODO New key - Add a translation - "collection.delete.head": "Delete Collection", + "collection.delete.head": "Топтаманы жою", // "collection.delete.notification.fail": "Collection could not be deleted", - // TODO New key - Add a translation - "collection.delete.notification.fail": "Collection could not be deleted", + "collection.delete.notification.fail": "Топтаманы жою мүмкін емес", // "collection.delete.notification.success": "Successfully deleted collection", - // TODO New key - Add a translation - "collection.delete.notification.success": "Successfully deleted collection", + "collection.delete.notification.success": "Топтама сәтті жойылды", // "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", - // TODO New key - Add a translation - "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", - - + "collection.delete.text": "Сіз шынымен топтаманы жойғыңыз келеді ме\"{{ dso }}\"", // "collection.edit.delete": "Delete this collection", - // TODO New key - Add a translation - "collection.edit.delete": "Delete this collection", + "collection.edit.delete": "Осы топтаманы жою", // "collection.edit.head": "Edit Collection", - // TODO New key - Add a translation - "collection.edit.head": "Edit Collection", + "collection.edit.head": "Топтаманы Өңдеу", // "collection.edit.breadcrumbs": "Edit Collection", - // TODO New key - Add a translation - "collection.edit.breadcrumbs": "Edit Collection", - - + "collection.edit.breadcrumbs": "Топтаманы Өңдеу", // "collection.edit.tabs.mapper.head": "Item Mapper", - // TODO New key - Add a translation - "collection.edit.tabs.mapper.head": "Item Mapper", + "collection.edit.tabs.mapper.head": "Элементті Түрлендіру", // "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", - // TODO New key - Add a translation - "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", + "collection.edit.tabs.item-mapper.title": "Топтаманы Өңдеу - Элементті Түрлендіру", // "collection.edit.item-mapper.cancel": "Cancel", - // TODO New key - Add a translation - "collection.edit.item-mapper.cancel": "Cancel", + "collection.edit.item-mapper.cancel": "Бас тарту", // "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", - // TODO New key - Add a translation - "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", + "collection.edit.item-mapper.collection": "Топтама: \"{{name}}\"", // "collection.edit.item-mapper.confirm": "Map selected items", - // TODO New key - Add a translation - "collection.edit.item-mapper.confirm": "Map selected items", + "collection.edit.item-mapper.confirm": "Таңдалған элементтерді көрсету", // "collection.edit.item-mapper.description": "This is the item mapper tool that allows collection administrators to map items from other collections into this collection. You can search for items from other collections and map them, or browse the list of currently mapped items.", - // TODO New key - Add a translation - "collection.edit.item-mapper.description": "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": "Бұл топтама әкімшілеріне басқа топтамалардан осы топтамаға элементтерді көрсетуге мүмкіндік беретін элементтерді көрсету құралы. Сіз басқа топтамалардандан заттарды іздей аласыз және оларды картаға түсіре аласыз немесе ағымдағы көрсетілген элементтердің тізімін көре аласыз.", // "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", - // TODO New key - Add a translation - "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", + "collection.edit.item-mapper.head": "Элементті Түрлендіру - Басқа топтамалардан элементтерді көрсету", // "collection.edit.item-mapper.no-search": "Please enter a query to search", - // TODO New key - Add a translation - "collection.edit.item-mapper.no-search": "Please enter a query to search", + "collection.edit.item-mapper.no-search": "Іздеу үшін ақпаратты енгізіңіз", // "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", - // TODO New key - Add a translation - "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", + "collection.edit.item-mapper.notifications.map.error.content": "Элементтерді салыстыру кезінде қателер орын алды {{amount}}.", // "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", - // TODO New key - Add a translation - "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", + "collection.edit.item-mapper.notifications.map.error.head": "Түрлендіру қателері", // "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", - // TODO New key - Add a translation - "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", + "collection.edit.item-mapper.notifications.map.success.content": "Элементтер сәтті салыстырылды {{amount}} .", // "collection.edit.item-mapper.notifications.map.success.head": "Mapping completed", - // TODO New key - Add a translation - "collection.edit.item-mapper.notifications.map.success.head": "Mapping completed", + "collection.edit.item-mapper.notifications.map.success.head": "Салыстыру аяқталды", // "collection.edit.item-mapper.notifications.unmap.error.content": "Errors occurred for removing the mappings of {{amount}} items.", - // TODO New key - Add a translation - "collection.edit.item-mapper.notifications.unmap.error.content": "Errors occurred for removing the mappings of {{amount}} items.", + "collection.edit.item-mapper.notifications.unmap.error.content": "Элементтердің салыстыруларын жою кезінде қателер орын алды {{amount}} .", // "collection.edit.item-mapper.notifications.unmap.error.head": "Remove mapping errors", - // TODO New key - Add a translation - "collection.edit.item-mapper.notifications.unmap.error.head": "Remove mapping errors", + "collection.edit.item-mapper.notifications.unmap.error.head": "Салыстыру қателерін жою", // "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", - // TODO New key - Add a translation - "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", + "collection.edit.item-mapper.notifications.unmap.success.content": "Элементтердің салыстырулары сәтті жойылды {{amount}} .", // "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", - // TODO New key - Add a translation - "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", + "collection.edit.item-mapper.notifications.unmap.success.head": "Салыстыруды жою аяқталды", // "collection.edit.item-mapper.remove": "Remove selected item mappings", - // TODO New key - Add a translation - "collection.edit.item-mapper.remove": "Remove selected item mappings", + "collection.edit.item-mapper.remove": "Таңдалған элементтердің салыстыруларын жою", // "collection.edit.item-mapper.tabs.browse": "Browse mapped items", - // TODO New key - Add a translation - "collection.edit.item-mapper.tabs.browse": "Browse mapped items", + "collection.edit.item-mapper.tabs.browse": "Салыстырылған элементтерді қарау", // "collection.edit.item-mapper.tabs.map": "Map new items", - // TODO New key - Add a translation - "collection.edit.item-mapper.tabs.map": "Map new items", - - + "collection.edit.item-mapper.tabs.map": "Жаңа элементтерді көрсету", // "collection.edit.logo.label": "Collection logo", - // TODO New key - Add a translation - "collection.edit.logo.label": "Collection logo", + "collection.edit.logo.label": "Топтама логотипі", // "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", - // TODO New key - Add a translation - "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", + "collection.edit.logo.notifications.add.error": "Топтама логотипін жүктеу мүмкін емес. Қайта қолданар алдында мазмұның тексеріңіз.", // "collection.edit.logo.notifications.add.success": "Upload Collection logo successful.", - // TODO New key - Add a translation - "collection.edit.logo.notifications.add.success": "Upload Collection logo successful.", + "collection.edit.logo.notifications.add.success": "Топтама логотипін жүктеу сәтті өтті.", // "collection.edit.logo.notifications.delete.success.title": "Logo deleted", - // TODO New key - Add a translation - "collection.edit.logo.notifications.delete.success.title": "Logo deleted", + "collection.edit.logo.notifications.delete.success.title": "Логотип жойылды", // "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", - // TODO New key - Add a translation - "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", + "collection.edit.logo.notifications.delete.success.content": "Топтама логотипі сәтті жойылды", // "collection.edit.logo.notifications.delete.error.title": "Error deleting logo", - // TODO New key - Add a translation - "collection.edit.logo.notifications.delete.error.title": "Error deleting logo", + "collection.edit.logo.notifications.delete.error.title": "Логотипті өшіру кезінде қате орын алды", // "collection.edit.logo.upload": "Drop a Collection Logo to upload", - // TODO New key - Add a translation - "collection.edit.logo.upload": "Drop a Collection Logo to upload", - - + "collection.edit.logo.upload": "Жүктеу үшін топтама логотипін жойыңыз", // "collection.edit.notifications.success": "Successfully edited the Collection", - // TODO New key - Add a translation - "collection.edit.notifications.success": "Successfully edited the Collection", + "collection.edit.notifications.success": "Сәтті өзгертілген топтама", // "collection.edit.return": "Return", - // TODO New key - Add a translation - "collection.edit.return": "Return", - - + "collection.edit.return": "Қайтару", // "collection.edit.tabs.curate.head": "Curate", - // TODO New key - Add a translation - "collection.edit.tabs.curate.head": "Curate", + "collection.edit.tabs.curate.head": "Куратор", // "collection.edit.tabs.curate.title": "Collection Edit - Curate", - // TODO New key - Add a translation - "collection.edit.tabs.curate.title": "Collection Edit - Curate", + "collection.edit.tabs.curate.title": "Топтаманы өзгерту-Куратор", // "collection.edit.tabs.authorizations.head": "Authorizations", - // TODO New key - Add a translation - "collection.edit.tabs.authorizations.head": "Authorizations", + "collection.edit.tabs.authorizations.head": "Авторизациялар", // "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", - // TODO New key - Add a translation - "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", + "collection.edit.tabs.authorizations.title": "Топтаманы өзгерту - Авторизациялар", // "collection.edit.tabs.metadata.head": "Edit Metadata", - // TODO New key - Add a translation - "collection.edit.tabs.metadata.head": "Edit Metadata", + "collection.edit.tabs.metadata.head": "Метадеректерді өңдеу", - // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", - // TODO New key - Add a translation - "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", + // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", + "collection.edit.tabs.metadata.title": "Топтаманы өзгерту - Метадеректер", // "collection.edit.tabs.roles.head": "Assign Roles", - // TODO New key - Add a translation - "collection.edit.tabs.roles.head": "Assign Roles", + "collection.edit.tabs.roles.head": "Рөлдерді тағайындау", // "collection.edit.tabs.roles.title": "Collection Edit - Roles", - // TODO New key - Add a translation - "collection.edit.tabs.roles.title": "Collection Edit - Roles", + "collection.edit.tabs.roles.title": "Топтаманы өзгерту - Рөлдер", // "collection.edit.tabs.source.external": "This collection harvests its content from an external source", - // TODO New key - Add a translation - "collection.edit.tabs.source.external": "This collection harvests its content from an external source", + "collection.edit.tabs.source.external": "Топтама өзінің мазмұнын сыртқы дереккөзден жинайды", // "collection.edit.tabs.source.form.errors.oaiSource.required": "You must provide a set id of the target collection.", - // TODO New key - Add a translation - "collection.edit.tabs.source.form.errors.oaiSource.required": "You must provide a set id of the target collection.", + "collection.edit.tabs.source.form.errors.oaiSource.required": "Негізгі топтама жиынтығының идентификаторын көрсету керек.", // "collection.edit.tabs.source.form.harvestType": "Content being harvested", - // TODO New key - Add a translation - "collection.edit.tabs.source.form.harvestType": "Content being harvested", + "collection.edit.tabs.source.form.harvestType": "Мазмұн жиналуда", // "collection.edit.tabs.source.form.head": "Configure an external source", - // TODO New key - Add a translation - "collection.edit.tabs.source.form.head": "Configure an external source", + "collection.edit.tabs.source.form.head": "Сыртқы дереккөзді баптау", // "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", - // TODO New key - Add a translation - "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", + "collection.edit.tabs.source.form.metadataConfigId": "Метадеректер форматы", // "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", - // TODO New key - Add a translation - "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", + "collection.edit.tabs.source.form.oaiSetId": "OAI арнайы жиын идентификаторы", // "collection.edit.tabs.source.form.oaiSource": "OAI Provider", - // TODO New key - Add a translation - "collection.edit.tabs.source.form.oaiSource": "OAI Provider", + "collection.edit.tabs.source.form.oaiSource": "OAI Провайдер (Жеткізуші)", // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Harvest metadata and bitstreams (requires ORE support)", - // TODO New key - Add a translation - "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Harvest metadata and bitstreams (requires ORE support)", + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Метадеректер мен бит ағындарын жинау (requires ORE support)(ORE қолдауын қажет етеді)", // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest metadata and references to bitstreams (requires ORE support)", - // TODO New key - Add a translation - "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest metadata and references to bitstreams (requires ORE support)", + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Метадеректер мен биттік ағындарға сілтемелерді жинау (requires ORE support)(ORE қолдауын қажет етеді)", // "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvest metadata only", - // TODO New key - Add a translation - "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvest metadata only", + "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Тек метадеректерді жинау", // "collection.edit.tabs.source.head": "Content Source", - // TODO New key - Add a translation - "collection.edit.tabs.source.head": "Content Source", + "collection.edit.tabs.source.head": "Дереккөз мазмұны", // "collection.edit.tabs.source.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - // TODO New key - Add a translation - "collection.edit.tabs.source.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "collection.edit.tabs.source.notifications.discarded.content": "Өзгерістеріңіз алынып тасталынды (жойылды). Өзгерістерді қалпына келтіру үшін «Болдырмау» түймесін басыңыз", // "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", - // TODO New key - Add a translation - "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", + "collection.edit.tabs.source.notifications.discarded.title": "Өзгерістер алынып тасталынды (жойылды)", // "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", - // TODO New key - Add a translation - "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + "collection.edit.tabs.source.notifications.invalid.content": "Сіз енгізген өзгерістер сақталмады. Сақтау алдында барлық өзгерістердің жарамды екеніне көз жеткізіңіз.", // "collection.edit.tabs.source.notifications.invalid.title": "Metadata invalid", - // TODO New key - Add a translation - "collection.edit.tabs.source.notifications.invalid.title": "Metadata invalid", + "collection.edit.tabs.source.notifications.invalid.title": "Метадеректер жарамсыз", // "collection.edit.tabs.source.notifications.saved.content": "Your changes to this collection's content source were saved.", - // TODO New key - Add a translation - "collection.edit.tabs.source.notifications.saved.content": "Your changes to this collection's content source were saved.", + "collection.edit.tabs.source.notifications.saved.content": "Топтаманың мазмұн дереккөзіне енгізілген өзгертулеріңіз сақталды.", // "collection.edit.tabs.source.notifications.saved.title": "Content Source saved", - // TODO New key - Add a translation - "collection.edit.tabs.source.notifications.saved.title": "Content Source saved", + "collection.edit.tabs.source.notifications.saved.title": "Мазмұн Дереккөзі сақталды", // "collection.edit.tabs.source.title": "Collection Edit - Content Source", - // TODO New key - Add a translation - "collection.edit.tabs.source.title": "Collection Edit - Content Source", - - + "collection.edit.tabs.source.title": "Топтаманы Өзгерту - Мазмұн Дереккөзі", // "collection.edit.template.add-button": "Add", - // TODO New key - Add a translation - "collection.edit.template.add-button": "Add", + "collection.edit.template.add-button": "Қосу", // "collection.edit.template.breadcrumbs": "Item template", - // TODO New key - Add a translation - "collection.edit.template.breadcrumbs": "Item template", + "collection.edit.template.breadcrumbs": "Элемент үлгісі", // "collection.edit.template.cancel": "Cancel", - // TODO New key - Add a translation - "collection.edit.template.cancel": "Cancel", + "collection.edit.template.cancel": "Бас тарту", // "collection.edit.template.delete-button": "Delete", - // TODO New key - Add a translation - "collection.edit.template.delete-button": "Delete", + "collection.edit.template.delete-button": "Жою", // "collection.edit.template.edit-button": "Edit", - // TODO New key - Add a translation - "collection.edit.template.edit-button": "Edit", + "collection.edit.template.edit-button": "Өзгерту", // "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", - // TODO New key - Add a translation - "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", + "collection.edit.template.head": "Топтамаға арналған үлгі элементін өзгерту \"{{ collection }}\"", // "collection.edit.template.label": "Template item", - // TODO New key - Add a translation - "collection.edit.template.label": "Template item", + "collection.edit.template.label": "Үлгі элементі", // "collection.edit.template.notifications.delete.error": "Failed to delete the item template", - // TODO New key - Add a translation - "collection.edit.template.notifications.delete.error": "Failed to delete the item template", + "collection.edit.template.notifications.delete.error": "Элемент үлгісін жою мүмкін емес", // "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", - // TODO New key - Add a translation - "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", + "collection.edit.template.notifications.delete.success": "Элемент үлгісі сәтті жойылды", // "collection.edit.template.title": "Edit Template Item", - // TODO New key - Add a translation - "collection.edit.template.title": "Edit Template Item", - - + "collection.edit.template.title": "Үлгі элементін өзгерту", // "collection.form.abstract": "Short Description", - // TODO New key - Add a translation - "collection.form.abstract": "Short Description", + "collection.form.abstract": "Қысқаша сипаттамасы", // "collection.form.description": "Introductory text (HTML)", - // TODO New key - Add a translation - "collection.form.description": "Introductory text (HTML)", + "collection.form.description": "Кіріспе мәтін (HTML)", // "collection.form.errors.title.required": "Please enter a collection name", - // TODO New key - Add a translation - "collection.form.errors.title.required": "Please enter a collection name", + "collection.form.errors.title.required": "Топтаманың атауын енгізіңіз", // "collection.form.license": "License", - // TODO New key - Add a translation - "collection.form.license": "License", + "collection.form.license": "Лицензия", // "collection.form.provenance": "Provenance", - // TODO New key - Add a translation - "collection.form.provenance": "Provenance", + "collection.form.provenance": "Шығу тегі", // "collection.form.rights": "Copyright text (HTML)", - // TODO New key - Add a translation - "collection.form.rights": "Copyright text (HTML)", + "collection.form.rights": "Авторлық мәтін (HTML)", // "collection.form.tableofcontents": "News (HTML)", - // TODO New key - Add a translation - "collection.form.tableofcontents": "News (HTML)", + "collection.form.tableofcontents": "Жаңалықтар (HTML)", // "collection.form.title": "Name", - // TODO New key - Add a translation - "collection.form.title": "Name", - - + "collection.form.title": "Атауы", // "collection.listelement.badge": "Collection", - // TODO New key - Add a translation - "collection.listelement.badge": "Collection", - - + "collection.listelement.badge": "Топтама", // "collection.page.browse.recent.head": "Recent Submissions", - // TODO New key - Add a translation - "collection.page.browse.recent.head": "Recent Submissions", + "collection.page.browse.recent.head": "Соңғы Материалдар", // "collection.page.browse.recent.empty": "No items to show", - // TODO New key - Add a translation - "collection.page.browse.recent.empty": "No items to show", + "collection.page.browse.recent.empty": "Көрсету үшін элементтер жоқ", // "collection.page.edit": "Edit this collection", - // TODO New key - Add a translation - "collection.page.edit": "Edit this collection", + "collection.page.edit": "Жинақты өңдеңіз", // "collection.page.handle": "Permanent URI for this collection", // TODO New key - Add a translation - "collection.page.handle": "Permanent URI for this collection", + "collection.page.handle": "Тұрақты URI коллекция үшін", // "collection.page.license": "License", - // TODO New key - Add a translation - "collection.page.license": "License", + "collection.page.license": "Лицензия", // "collection.page.news": "News", "collection.page.news": "Жаңалықтар", - - // "collection.select.confirm": "Confirm selected", - // TODO New key - Add a translation - "collection.select.confirm": "Confirm selected", + "collection.select.confirm": "Таңдалғанды растау", // "collection.select.empty": "No collections to show", - // TODO New key - Add a translation - "collection.select.empty": "No collections to show", + "collection.select.empty": "Көрсету үшін топтамалар жоқ", // "collection.select.table.title": "Title", - // TODO New key - Add a translation - "collection.select.table.title": "Title", - - + "collection.select.table.title": "Тақырыбы", // "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", - // TODO New key - Add a translation - "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", + "collection.source.update.notifications.error.content": "Берілген параметрлер тексерілді және жұмыс істемеді.", // "collection.source.update.notifications.error.title": "Server Error", // TODO New key - Add a translation - "collection.source.update.notifications.error.title": "Server Error", + "collection.source.update.notifications.error.title": "Сервер қатесі", @@ -1927,118 +1748,74 @@ - // "cookies.consent.accept-all": "Accept all", - // TODO New key - Add a translation - "cookies.consent.accept-all": "Accept all", - - // "cookies.consent.accept-selected": "Accept selected", - // TODO New key - Add a translation - "cookies.consent.accept-selected": "Accept selected", - - // "cookies.consent.app.opt-out.description": "This app is loaded by default (but you can opt out)", - // TODO New key - Add a translation - "cookies.consent.app.opt-out.description": "This app is loaded by default (but you can opt out)", - // "cookies.consent.app.opt-out.title": "(opt-out)", - // TODO New key - Add a translation "cookies.consent.app.opt-out.title": "(opt-out)", // "cookies.consent.app.purpose": "purpose", - // TODO New key - Add a translation - "cookies.consent.app.purpose": "purpose", + "cookies.consent.app.purpose": Мақсаты", // "cookies.consent.app.required.description": "This application is always required", - // TODO New key - Add a translation - "cookies.consent.app.required.description": "This application is always required", + "cookies.consent.app.required.description": "Бұл бағдарлама әрқашан қажет", // "cookies.consent.app.required.title": "(always required)", - // TODO New key - Add a translation - "cookies.consent.app.required.title": "(always required)", + "cookies.consent.app.required.title": "(әрқашан қажет)", // "cookies.consent.update": "There were changes since your last visit, please update your consent.", - // TODO New key - Add a translation - "cookies.consent.update": "There were changes since your last visit, please update your consent.", + "cookies.consent.update": "Сіздің соңғы рет болғаңыздан бері өзгерістер болды, келісіміңізді жаңартыңыз.", // "cookies.consent.close": "Close", - // TODO New key - Add a translation - "cookies.consent.close": "Close", + "cookies.consent.close": "Жабу", // "cookies.consent.decline": "Decline", - // TODO New key - Add a translation - "cookies.consent.decline": "Decline", + "cookies.consent.decline": "Қабылдамау", // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", - // TODO New key - Add a translation - "cookies.consent.content-notice.description": "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": "Біз сіздің жеке ақпаратыңызды келесі мақсаттарда жинаймыз және өңдейміз: Аутентификация, Параметрлері, Растау және Статистикалар.
Көбірек білу үшін, біздің {privacyPolicy} оқуыңызды өтінеміз.", // "cookies.consent.content-notice.learnMore": "Customize", - // TODO New key - Add a translation - "cookies.consent.content-notice.learnMore": "Customize", + "cookies.consent.content-notice.learnMore": "Баптау", // "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", - // TODO New key - Add a translation - "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", + "cookies.consent.content-modal.description": "Мұнда сіз туралы жиналған ақпаратты көре және баптай аласыз", // "cookies.consent.content-modal.privacy-policy.name": "privacy policy", - // TODO New key - Add a translation - "cookies.consent.content-modal.privacy-policy.name": "privacy policy", + "cookies.consent.content-modal.privacy-policy.name": "Конфиденциальді ақпарат ережелері", // "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", - // TODO New key - Add a translation - "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", + "cookies.consent.content-modal.privacy-policy.text": "Көбірек білу үшін, біздің {privacyPolicy} оқуыңызды өтінеміз..", // "cookies.consent.content-modal.title": "Information that we collect", - // TODO New key - Add a translation - "cookies.consent.content-modal.title": "Information that we collect", - - + "cookies.consent.content-modal.title": "Біз жинайтын ақпарат", // "cookies.consent.app.title.authentication": "Authentication", - // TODO New key - Add a translation - "cookies.consent.app.title.authentication": "Authentication", + "cookies.consent.app.title.authentication": "Аутентификация", // "cookies.consent.app.description.authentication": "Required for signing you in", - // TODO New key - Add a translation - "cookies.consent.app.description.authentication": "Required for signing you in", - + "cookies.consent.app.description.authentication": "Жүйеге кіру үшін қажет", // "cookies.consent.app.title.preferences": "Preferences", - // TODO New key - Add a translation - "cookies.consent.app.title.preferences": "Preferences", + "cookies.consent.app.title.preferences": "Параметрлері", // "cookies.consent.app.description.preferences": "Required for saving your preferences", - // TODO New key - Add a translation - "cookies.consent.app.description.preferences": "Required for saving your preferences", - - + "cookies.consent.app.description.preferences": "Параметрлерді сақтау үшін қажет", // "cookies.consent.app.title.acknowledgement": "Acknowledgement", - // TODO New key - Add a translation - "cookies.consent.app.title.acknowledgement": "Acknowledgement", + "cookies.consent.app.title.acknowledgement": "Растау", // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", - // TODO New key - Add a translation - "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", - - + "cookies.consent.app.description.acknowledgement": "Сіздің растауыңызбен келісімдеріңізді сақтау үшін қажет", // "cookies.consent.app.title.google-analytics": "Google Analytics", - // TODO New key - Add a translation - "cookies.consent.app.title.google-analytics": "Google Analytics", + "cookies.consent.app.title.google-analytics": "Google Аналитикасы", // "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", - // TODO New key - Add a translation - "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", - - + "cookies.consent.app.description.google-analytics": "Бізге статистикалық мәліметтерді бақылауға мүмкіндік береді", // "cookies.consent.purpose.functional": "Functional", - // TODO New key - Add a translation - "cookies.consent.purpose.functional": "Functional", + "cookies.consent.purpose.functional": "Функционалды", // "cookies.consent.purpose.statistical": "Statistical", - // TODO New key - Add a translation - "cookies.consent.purpose.statistical": "Statistical", + "cookies.consent.purpose.statistical": "Статистикалық", // "curation-task.task.checklinks.label": "Check Links in Metadata", From c332db4a3236f9f7a33e7dfae1cbcf88a801437e Mon Sep 17 00:00:00 2001 From: myrza1 Date: Fri, 12 Nov 2021 16:51:35 +0600 Subject: [PATCH 004/119] Update kz.json5 1000 el --- src/assets/i18n/kz.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index 1f82a1681b..7c2dc468d3 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -997,7 +997,7 @@ "bitstream.edit.form.description.label": "Сипаттамасы", // "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": "Кіруге рұқсат етілген бірінші күн. Бұл күнді осы формада өзгерту мүмкін емес. Бит ағынына тыйым салу күнін белгілеу үшін, мына жерге өтіңіз "элемент дәрежесі қойындысын басыңыз Тіркелу..., бит ағынын жасау немесе өңдеу ОҚУ ереже және орнату Басталу Күні қалауы бойынша.", + "bitstream.edit.form.embargo.hint": "Кіруге рұқсат етілген бірінші күн. Бұл күнді осы формада өзгерту мүмкін емес. Бит ағынына тыйым салу күнін белгілеу үшін, мына жерге өтіңіз элемент дәрежесі қойындысын басыңыз Тіркелу..., бит ағынын жасау немесе өңдеу ОҚУ ереже және орнату Басталу Күні қалауы бойынша.", // "bitstream.edit.form.embargo.label": "Embargo until specific date", "bitstream.edit.form.embargo.label": "Белгілі бір күнге дейін тыйым салу(шектеу)", From df87c892f011e5d1dd1b2165cb2ef2c666c34978 Mon Sep 17 00:00:00 2001 From: myrza1 Date: Fri, 12 Nov 2021 16:57:37 +0600 Subject: [PATCH 005/119] Update kz.json5 1755 m --- src/assets/i18n/kz.json5 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index 7c2dc468d3..9a215f9dff 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -1752,7 +1752,7 @@ "cookies.consent.app.opt-out.title": "(opt-out)", // "cookies.consent.app.purpose": "purpose", - "cookies.consent.app.purpose": Мақсаты", + "cookies.consent.app.purpose": "Мақсаты", // "cookies.consent.app.required.description": "This application is always required", "cookies.consent.app.required.description": "Бұл бағдарлама әрқашан қажет", From ef7bd1df57f95b1d0b30202e3dc7498673e76ec8 Mon Sep 17 00:00:00 2001 From: myrza1 Date: Sun, 10 Apr 2022 02:24:28 +0600 Subject: [PATCH 006/119] Update kz.json5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Екінші аударым --- src/assets/i18n/kz.json5 | 396 +++++++++++++-------------------------- 1 file changed, 135 insertions(+), 261 deletions(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index 9a215f9dff..70fb701168 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -1,8 +1,7 @@ { // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", - // TODO New key - Add a translation - "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", + "401.help": "Сіз бұл бетке өтуге тіркелемегенсіз. Басты бетке оралу үшін төмендегі батырманы пайдалануға болады", // "401.link.home-page": "Take me to the home page", "401.link.home-page": "Басты бетке өту", @@ -1436,163 +1435,126 @@ "collection.source.update.notifications.error.content": "Берілген параметрлер тексерілді және жұмыс істемеді.", // "collection.source.update.notifications.error.title": "Server Error", - // TODO New key - Add a translation "collection.source.update.notifications.error.title": "Сервер қатесі", // "communityList.tabTitle": "DSpace - Community List", - // TODO New key - Add a translation - "communityList.tabTitle": "DSpace - Community List", + "communityList.tabTitle": "DSpace - Қауымдастық Тізімі", // "communityList.title": "List of Communities", - // TODO New key - Add a translation - "communityList.title": "List of Communities", + "communityList.title": "Қауымдастықтар Тізімі", // "communityList.showMore": "Show More", - // TODO New key - Add a translation - "communityList.showMore": "Show More", + "communityList.showMore": "Көбірек Көрсету", // "community.create.head": "Create a Community", - // TODO New key - Add a translation - "community.create.head": "Create a Community", + "community.create.head": "Қауымдастық Құру", // "community.create.notifications.success": "Successfully created the Community", - // TODO New key - Add a translation - "community.create.notifications.success": "Successfully created the Community", + "community.create.notifications.success": "Қауымдастық Сәтті құрылды", // "community.create.sub-head": "Create a Sub-Community for Community {{ parent }}", - // TODO New key - Add a translation - "community.create.sub-head": "Create a Sub-Community for Community {{ parent }}", + "community.create.sub-head": "Қауымдастық үшін Қосалқы Қауымдастық Жасаңыз {{ parent }}", // "community.curate.header": "Curate Community: {{community}}", - // TODO New key - Add a translation - "community.curate.header": "Curate Community: {{community}}", + "community.curate.header": "Кураторлық Қауымдастық: {{community}}", // "community.delete.cancel": "Cancel", - // TODO New key - Add a translation - "community.delete.cancel": "Cancel", + "community.delete.cancel": "Бас тарту", // "community.delete.confirm": "Confirm", - // TODO New key - Add a translation - "community.delete.confirm": "Confirm", + "community.delete.confirm": "Растау", // "community.delete.head": "Delete Community", - // TODO New key - Add a translation - "community.delete.head": "Delete Community", + "community.delete.head": "Қауымдастықты Жою", // "community.delete.notification.fail": "Community could not be deleted", - // TODO New key - Add a translation - "community.delete.notification.fail": "Community could not be deleted", + "community.delete.notification.fail": "Қауымдастықты жою мүмкін емес", // "community.delete.notification.success": "Successfully deleted community", - // TODO New key - Add a translation - "community.delete.notification.success": "Successfully deleted community", + "community.delete.notification.success": "Қауымдастық сәтті жойылды", // "community.delete.text": "Are you sure you want to delete community \"{{ dso }}\"", - // TODO New key - Add a translation - "community.delete.text": "Are you sure you want to delete community \"{{ dso }}\"", + "community.delete.text": "Қауымдастықты жойғыңыз келетініне сенімдісіз бе \"{{ dso }}\"", // "community.edit.delete": "Delete this community", - // TODO New key - Add a translation - "community.edit.delete": "Delete this community", + "community.edit.delete": "Бұл қауымдастықты жойыңыз", // "community.edit.head": "Edit Community", - // TODO New key - Add a translation - "community.edit.head": "Edit Community", + "community.edit.head": "Қауымдастықты Өзгерту", // "community.edit.breadcrumbs": "Edit Community", - // TODO New key - Add a translation "community.edit.breadcrumbs": "Edit Community", // "community.edit.logo.label": "Community logo", - // TODO New key - Add a translation - "community.edit.logo.label": "Community logo", + "community.edit.logo.label": "Қауымдастық логотипі", // "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", - // TODO New key - Add a translation - "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", + "community.edit.logo.notifications.add.error": "Қауымдастық логотипін жүктеу мүмкін емес. Қайта қолданар алдында мазмұның тексеріңіз.", // "community.edit.logo.notifications.add.success": "Upload Community logo successful.", - // TODO New key - Add a translation - "community.edit.logo.notifications.add.success": "Upload Community logo successful.", + "community.edit.logo.notifications.add.success": "Қауымдастық логотипін жүктеу сәтті өтті.", // "community.edit.logo.notifications.delete.success.title": "Logo deleted", - // TODO New key - Add a translation - "community.edit.logo.notifications.delete.success.title": "Logo deleted", + "community.edit.logo.notifications.delete.success.title": "Логотип жойылды", // "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", - // TODO New key - Add a translation - "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", + "community.edit.logo.notifications.delete.success.content": "Қауымдастық логотипі сәтті жойылды", // "community.edit.logo.notifications.delete.error.title": "Error deleting logo", - // TODO New key - Add a translation - "community.edit.logo.notifications.delete.error.title": "Error deleting logo", + "community.edit.logo.notifications.delete.error.title": "Логотипті жою қатесі", // "community.edit.logo.upload": "Drop a Community Logo to upload", - // TODO New key - Add a translation - "community.edit.logo.upload": "Drop a Community Logo to upload", + "community.edit.logo.upload": "Жүктеу үшін Қауымдастық Логотипін жойыңыз", - // "community.edit.notifications.success": "Successfully edited the Community", - // TODO New key - Add a translation - "community.edit.notifications.success": "Successfully edited the Community", + // "community.edit.notifications.success": "Successfully edited the Community", + "community.edit.notifications.success": "Сәтті өзгертілген Қауымдастық", // "community.edit.notifications.unauthorized": "You do not have privileges to make this change", - // TODO New key - Add a translation - "community.edit.notifications.unauthorized": "You do not have privileges to make this change", + "community.edit.notifications.unauthorized": "Бұл өзгерісті жасауға Сіздің құқығыңыз жоқ", // "community.edit.notifications.error": "An error occured while editing the Community", - // TODO New key - Add a translation - "community.edit.notifications.error": "An error occured while editing the Community", + "community.edit.notifications.error": "Қауымдастықты өзгерту кезінде қате орын алды", // "community.edit.return": "Return", - // TODO New key - Add a translation - "community.edit.return": "Return", + "community.edit.return": "Қайтару", // "community.edit.tabs.curate.head": "Curate", - // TODO New key - Add a translation - "community.edit.tabs.curate.head": "Curate", + "community.edit.tabs.curate.head": "Куратор", // "community.edit.tabs.curate.title": "Community Edit - Curate", - // TODO New key - Add a translation - "community.edit.tabs.curate.title": "Community Edit - Curate", + "community.edit.tabs.curate.title": "Қауымдастық Өзгерту - Куратор", // "community.edit.tabs.metadata.head": "Edit Metadata", - // TODO New key - Add a translation - "community.edit.tabs.metadata.head": "Edit Metadata", + "community.edit.tabs.metadata.head": "Метадеректерді Өзгерту", // "community.edit.tabs.metadata.title": "Community Edit - Metadata", - // TODO New key - Add a translation - "community.edit.tabs.metadata.title": "Community Edit - Metadata", + "community.edit.tabs.metadata.title": "Қауымдастықты Өзгерту-Метадеректер", // "community.edit.tabs.roles.head": "Assign Roles", - // TODO New key - Add a translation - "community.edit.tabs.roles.head": "Assign Roles", + "community.edit.tabs.roles.head": "Рөлдерді Бөлу", // "community.edit.tabs.roles.title": "Community Edit - Roles", - // TODO New key - Add a translation - "community.edit.tabs.roles.title": "Community Edit - Roles", + "community.edit.tabs.roles.title": "Қауымдастықты Өзгерту - Рөлдер", // "community.edit.tabs.authorizations.head": "Authorizations", - // TODO New key - Add a translation - "community.edit.tabs.authorizations.head": "Authorizations", + "community.edit.tabs.authorizations.head": "Рұқсаттар", // "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", - // TODO New key - Add a translation - "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", + "community.edit.tabs.authorizations.title": "Қауымдастықты Өзгерту - Рұқсаттар", // "community.listelement.badge": "Community", - // TODO New key - Add a translation - "community.listelement.badge": "Community", + "community.listelement.badge": "Қауымдастық", @@ -1695,56 +1657,43 @@ // "community.form.abstract": "Short Description", - // TODO New key - Add a translation - "community.form.abstract": "Short Description", + "community.form.abstract": "Қысқаша Сипаттамасы", // "community.form.description": "Introductory text (HTML)", - // TODO New key - Add a translation - "community.form.description": "Introductory text (HTML)", + "community.form.description": "Кіріспе мәтін (HTML)", // "community.form.errors.title.required": "Please enter a community name", - // TODO New key - Add a translation - "community.form.errors.title.required": "Please enter a community name", + "community.form.errors.title.required": "Қауымдастық атын енгізіңіз", // "community.form.rights": "Copyright text (HTML)", - // TODO New key - Add a translation - "community.form.rights": "Copyright text (HTML)", + "community.form.rights": "Авторлық мәтін (HTML)", // "community.form.tableofcontents": "News (HTML)", - // TODO New key - Add a translation - "community.form.tableofcontents": "News (HTML)", + "community.form.tableofcontents": "Жаңалықтар (HTML)", // "community.form.title": "Name", - // TODO New key - Add a translation - "community.form.title": "Name", + "community.form.title": "Атауы", // "community.page.edit": "Edit this community", - // TODO New key - Add a translation - "community.page.edit": "Edit this community", + "community.page.edit": "Қауымдастықты өзгерту", // "community.page.handle": "Permanent URI for this community", - // TODO New key - Add a translation - "community.page.handle": "Permanent URI for this community", + "community.page.handle": "Осы қауымдастық үшін Тұрақты URI", // "community.page.license": "License", - // TODO New key - Add a translation - "community.page.license": "License", + "community.page.license": "Лицензия", // "community.page.news": "News", - // TODO New key - Add a translation - "community.page.news": "News", + "community.page.news": "Жаңалықтыр", // "community.all-lists.head": "Subcommunities and Collections", - // TODO New key - Add a translation - "community.all-lists.head": "Subcommunities and Collections", + "community.all-lists.head": "Қосалқы қауымдамтықтар мен топтамалар", // "community.sub-collection-list.head": "Collections of this Community", - // TODO New key - Add a translation - "community.sub-collection-list.head": "Collections of this Community", + "community.sub-collection-list.head": "Қауымдастық Топтамалары", // "community.sub-community-list.head": "Communities of this Community", - // TODO New key - Add a translation - "community.sub-community-list.head": "Communities of this Community", + "community.sub-community-list.head": "Осы қоғамдастық шеңберіндегі қауымдастықтар", @@ -1819,327 +1768,252 @@ // "curation-task.task.checklinks.label": "Check Links in Metadata", - // TODO New key - Add a translation - "curation-task.task.checklinks.label": "Check Links in Metadata", + "curation-task.task.checklinks.label": "Метадеректердегі Сілтемелерді Тексеріңіз", // "curation-task.task.noop.label": "NOOP", - // TODO New key - Add a translation - "curation-task.task.noop.label": "NOOP", + "curation-task.task.noop.label": "NOOP бағдарлама тілі", // "curation-task.task.profileformats.label": "Profile Bitstream Formats", - // TODO New key - Add a translation - "curation-task.task.profileformats.label": "Profile Bitstream Formats", + "curation-task.task.profileformats.label": "Бит ағыны Профильдерінің Форматы", // "curation-task.task.requiredmetadata.label": "Check for Required Metadata", - // TODO New key - Add a translation - "curation-task.task.requiredmetadata.label": "Check for Required Metadata", + "curation-task.task.requiredmetadata.label": "Қажетті Деректерді Тексеріңіз", // "curation-task.task.translate.label": "Microsoft Translator", - // TODO New key - Add a translation - "curation-task.task.translate.label": "Microsoft Translator", + "curation-task.task.translate.label": "Microsoft Аудармашысы", // "curation-task.task.vscan.label": "Virus Scan", - // TODO New key - Add a translation - "curation-task.task.vscan.label": "Virus Scan", + "curation-task.task.vscan.label": "Вирустарды тексеру", // "curation.form.task-select.label": "Task:", - // TODO New key - Add a translation - "curation.form.task-select.label": "Task:", + "curation.form.task-select.label": "Міндет(Тапсырма):", // "curation.form.submit": "Start", - // TODO New key - Add a translation - "curation.form.submit": "Start", + "curation.form.submit": "Бастау", // "curation.form.submit.success.head": "The curation task has been started successfully", - // TODO New key - Add a translation - "curation.form.submit.success.head": "The curation task has been started successfully", + "curation.form.submit.success.head": "Кураторлық(Жетекшілік) міндет сәтті басталды", // "curation.form.submit.success.content": "You will be redirected to the corresponding process page.", - // TODO New key - Add a translation - "curation.form.submit.success.content": "You will be redirected to the corresponding process page.", + "curation.form.submit.success.content": "Сіз процестің тиісті бетіне қайта бағытталасыз.", // "curation.form.submit.error.head": "Running the curation task failed", - // TODO New key - Add a translation - "curation.form.submit.error.head": "Running the curation task failed", + "curation.form.submit.error.head": "Кураторлық(Жетекшілік) тапсырманы орындау мүмкін емес", // "curation.form.submit.error.content": "An error occured when trying to start the curation task.", - // TODO New key - Add a translation - "curation.form.submit.error.content": "An error occured when trying to start the curation task.", + "curation.form.submit.error.content": "Тапсырманы іске қосу кезіндегі қателік.", // "curation.form.handle.label": "Handle:", - // TODO New key - Add a translation - "curation.form.handle.label": "Handle:", + "curation.form.handle.label": "Қалам:", // "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", - // TODO New key - Add a translation - "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", + "curation.form.handle.hint": "Кеңес: Енгізіңіз [your-handle-prefix]/0 бүкіл сайт бойынша тапсырманы орындау үшін(барлық тапсырмалар бұл мүмкіндікті қолдамауы мүмкін)", // "dso-selector.create.collection.head": "New collection", - // TODO New key - Add a translation - "dso-selector.create.collection.head": "New collection", + "dso-selector.create.collection.head": "Жаңа топтама", // "dso-selector.create.collection.sub-level": "Create a new collection in", - // TODO New key - Add a translation - "dso-selector.create.collection.sub-level": "Create a new collection in", + "dso-selector.create.collection.sub-level": "Жаңа топтама жасаңыз", // "dso-selector.create.community.head": "New community", - // TODO New key - Add a translation - "dso-selector.create.community.head": "New community", + "dso-selector.create.community.head": "Жаңа қауымдастық", // "dso-selector.create.community.sub-level": "Create a new community in", - // TODO New key - Add a translation - "dso-selector.create.community.sub-level": "Create a new community in", + "dso-selector.create.community.sub-level": "Жаңңа қауымдастық жасаңыз", // "dso-selector.create.community.top-level": "Create a new top-level community", - // TODO New key - Add a translation - "dso-selector.create.community.top-level": "Create a new top-level community", + "dso-selector.create.community.top-level": "Жаңа жоғары деңгейлі қауымдастық құрыңыз", // "dso-selector.create.item.head": "New item", - // TODO New key - Add a translation - "dso-selector.create.item.head": "New item", + "dso-selector.create.item.head": "Жаңа элемент", // "dso-selector.create.item.sub-level": "Create a new item in", - // TODO New key - Add a translation - "dso-selector.create.item.sub-level": "Create a new item in", + "dso-selector.create.item.sub-level": "Жаңа элемент жасаңыз", // "dso-selector.create.submission.head": "New submission", - // TODO New key - Add a translation - "dso-selector.create.submission.head": "New submission", + "dso-selector.create.submission.head": "Жаңа өтініш", // "dso-selector.edit.collection.head": "Edit collection", - // TODO New key - Add a translation - "dso-selector.edit.collection.head": "Edit collection", + "dso-selector.edit.collection.head": "Топтаманы өзгерту", // "dso-selector.edit.community.head": "Edit community", - // TODO New key - Add a translation - "dso-selector.edit.community.head": "Edit community", + "dso-selector.edit.community.head": "Қауымдастықты өзгерту", // "dso-selector.edit.item.head": "Edit item", - // TODO New key - Add a translation - "dso-selector.edit.item.head": "Edit item", + "dso-selector.edit.item.head": "Элементті өзгерту", // "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", - // TODO New key - Add a translation - "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", + "dso-selector.export-metadata.dspaceobject.head": "Метадеректерді экспорттау", // "dso-selector.no-results": "No {{ type }} found", - // TODO New key - Add a translation - "dso-selector.no-results": "No {{ type }} found", - + "dso-selector.no-results": "Табылған жоқ {{ type }}", + // "dso-selector.placeholder": "Search for a {{ type }}", - // TODO New key - Add a translation - "dso-selector.placeholder": "Search for a {{ type }}", + "dso-selector.placeholder": "{{ type }} іздеу", // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", - // TODO New key - Add a translation - "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", + "confirmation-modal.export-metadata.header": "{{ dsoName }} метадеректерін экспорттау", // "confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}", - // TODO New key - Add a translation - "confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}", - + "confirmation-modal.export-metadata.info": "{{ dsoName }} метадеректерін экспорттағыңыз келетініне сенімдісіз бе", + // "confirmation-modal.export-metadata.cancel": "Cancel", - // TODO New key - Add a translation - "confirmation-modal.export-metadata.cancel": "Cancel", + "confirmation-modal.export-metadata.cancel":"Болдырмау", // "confirmation-modal.export-metadata.confirm": "Export", - // TODO New key - Add a translation - "confirmation-modal.export-metadata.confirm": "Export", + "confirmation-modal.export-metadata.confirm":"Экспорт", // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", - // TODO New key - Add a translation - "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", + "confirmation-modal.delete-eperson.header": "EPerson \"{{ dsoName }}\" жою, // "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", - // TODO New key - Add a translation - "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", + + "confirmation-modal.delete-eperson.info": "EPerson \"{{ dsoName }}\ қолданбасын жойғыңыз келетініне сенімдісіз бе"", // "confirmation-modal.delete-eperson.cancel": "Cancel", - // TODO New key - Add a translation - "confirmation-modal.delete-eperson.cancel": "Cancel", + + "confirmation-modal.delete-eperson.cancel": "Болдырмау", // "confirmation-modal.delete-eperson.confirm": "Delete", - // TODO New key - Add a translation - "confirmation-modal.delete-eperson.confirm": "Delete", + "confirmation-modal.delete-eperson.confirm": "Жою", // "error.bitstream": "Error fetching bitstream", - // TODO New key - Add a translation - "error.bitstream": "Error fetching bitstream", + "error.bitstream": "Бақыттық ағынды алу қатесі", // "error.browse-by": "Error fetching items", - // TODO New key - Add a translation - "error.browse-by": "Error fetching items", + "error.browse-by": "Элементтерді алу қатесі", // "error.collection": "Error fetching collection", - // TODO New key - Add a translation - "error.collection": "Error fetching collection", + "error.collection": "Жинауды алу қатесі", // "error.collections": "Error fetching collections", - // TODO New key - Add a translation - "error.collections": "Error fetching collections", + "error.collections": "Жинақтарды алу қатесі", // "error.community": "Error fetching community", - // TODO New key - Add a translation - "error.community": "Error fetching community", + "error.community": "Қауымдастықты алу қатесі", // "error.identifier": "No item found for the identifier", - // TODO New key - Add a translation - "error.identifier": "No item found for the identifier", + "error.identifier": "Идентификатор үшін ешбір элемент табылмады", // "error.default": "Error", - // TODO New key - Add a translation - "error.default": "Error", + "error.default": "Қате", // "error.item": "Error fetching item", - // TODO New key - Add a translation - "error.item": "Error fetching item", - + "error.item": "Элементті алу қатесі", + // "error.items": "Error fetching items", - // TODO New key - Add a translation - "error.items": "Error fetching items", + "error.items": "Элементтерді алу қатесі", // "error.objects": "Error fetching objects", - // TODO New key - Add a translation - "error.objects": "Error fetching objects", + "error.objects":"Нысандарды алу қатесі", // "error.recent-submissions": "Error fetching recent submissions", - // TODO New key - Add a translation - "error.recent-submissions": "Error fetching recent submissions", + "error.recent-submissions":"Соңғы жіберілімдерді алу қатесі", // "error.search-results": "Error fetching search results", - // TODO New key - Add a translation - "error.search-results": "Error fetching search results", + "error.search-results": "Іздеу нәтижелерін алу қатесі", // "error.sub-collections": "Error fetching sub-collections", - // TODO New key - Add a translation - "error.sub-collections": "Error fetching sub-collections", + "error.sub-collections":"Ішкі жинақтарды алу қатесі", // "error.sub-communities": "Error fetching sub-communities", - // TODO New key - Add a translation - "error.sub-communities": "Error fetching sub-communities", + "error.sub-communities": "Қосымша қауымдастықтарды алу қатесі", // "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

", - // TODO New key - Add a translation - "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":"Бөлімді инициализациялау кезінде қате орын алды, енгізу пішінінің конфигурациясын тексеріңіз. Мәліметтер төменде берілген:

", - // "error.top-level-communities": "Error fetching top-level communities", - // TODO New key - Add a translation - "error.top-level-communities": "Error fetching top-level communities", + // "error.top-level-communities": "Error fetching top-level communities", + "error.top-level-communities": "Жоғары деңгейлі қауымдастықтарды алу қатесі", + + // "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": "Жіберуді аяқтау үшін осы лицензияны беруіңіз керек. Бұл лицензияны қазір бере алмасаңыз, жұмысыңызды сақтап, кейінірек оралуыңызға немесе жіберуді жоюға болады.", - // "error.validation.license.notgranted": "You must grant this license to complete your submission. If you are unable to grant this license at this time you may save your work and return later or remove the submission.", - // TODO New key - Add a translation - "error.validation.license.notgranted": "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.pattern": "This input is restricted by the current pattern: {{ pattern }}.", - // TODO New key - Add a translation - "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", + // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", + "error.validation.pattern": "Бұл енгізу ағымдағы үлгімен шектелген: {{ үлгі }}.", // "error.validation.filerequired": "The file upload is mandatory", - // TODO New key - Add a translation - "error.validation.filerequired": "The file upload is mandatory", + "error.validation.filerequired": "Файлды жүктеп салу міндетті", // "file-section.error.header": "Error obtaining files for this item", - // TODO New key - Add a translation - "file-section.error.header": "Error obtaining files for this item", + "file-section.error.header": "Осы элемент үшін файлдарды алу қатесі", // "footer.copyright": "copyright © 2002-{{ year }}", - // TODO New key - Add a translation - "footer.copyright": "copyright © 2002-{{ year }}", + "footer.copyright": "Авторлық құқық © 2002-{{ year }}", // "footer.link.dspace": "DSpace software", - // TODO New key - Add a translation - "footer.link.dspace": "DSpace software", + "footer.link.dspace": "DSpace бағдарламалық құралы", // "footer.link.lyrasis": "LYRASIS", - // TODO New key - Add a translation "footer.link.lyrasis": "LYRASIS", // "footer.link.cookies": "Cookie settings", - // TODO New key - Add a translation - "footer.link.cookies": "Cookie settings", + "footer.link.cookies": "Cookie параметрлері", // "footer.link.privacy-policy": "Privacy policy", - // TODO New key - Add a translation - "footer.link.privacy-policy": "Privacy policy", + "footer.link.privacy-policy": "Құпиялылық саясаты", // "footer.link.end-user-agreement":"End User Agreement", - // TODO New key - Add a translation - "footer.link.end-user-agreement":"End User Agreement", + "footer.link.end-user-agreement":"Соңғы пайдаланушы келісімі", // "forgot-email.form.header": "Forgot Password", - // TODO New key - Add a translation - "forgot-email.form.header": "Forgot Password", + "forgot-email.form.header": "Парольді Ұмыттыңыз Ба", // "forgot-email.form.info": "Enter Register an account to subscribe to collections for email updates, and submit new items to DSpace.", - // TODO New key - Add a translation - "forgot-email.form.info": "Enter Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + "forgot-email.form.info": "Электрондық пошта жаңартуларына арналған жинақтарға жазылу және DSpace қызметіне жаңа элементтерді жіберу үшін тіркелгіні тіркеңіз.", // "forgot-email.form.email": "Email Address *", - // TODO New key - Add a translation - "forgot-email.form.email": "Email Address *", + "forgot-email.form.email": "Электрондық пошта *", // "forgot-email.form.email.error.required": "Please fill in an email address", - // TODO New key - Add a translation - "forgot-email.form.email.error.required": "Please fill in an email address", + "forgot-email.form.email.error.required": "Электрондық пошта мекенжайын толтырыңыз", // "forgot-email.form.email.error.pattern": "Please fill in a valid email address", - // TODO New key - Add a translation - "forgot-email.form.email.error.pattern": "Please fill in a valid email address", + "forgot-email.form.email.error.pattern": "Жарамды электрондық пошта мекенжайын толтырыңыз", // "forgot-email.form.email.hint": "This address will be verified and used as your login name.", - // TODO New key - Add a translation - "forgot-email.form.email.hint": "This address will be verified and used as your login name.", + "forgot-email.form.email.hint": "Бұл мекенжай тексеріледі және сіздің логин атыңыз ретінде пайдаланылады.", // "forgot-email.form.submit": "Submit", - // TODO New key - Add a translation - "forgot-email.form.submit": "Submit", + "forgot-email.form.submit": "Жіберу", // "forgot-email.form.success.head": "Verification email sent", - // TODO New key - Add a translation - "forgot-email.form.success.head": "Verification email sent", + "forgot-email.form.success.head": "Растау электрондық поштасы жіберілді", // "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", - // TODO New key - Add a translation - "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + "forgot-email.form.success.content": "Арнайы URL мекенжайы және қосымша нұсқаулары бар электрондық пошта {{ email }} мекенжайына жіберілді.", // "forgot-email.form.error.head": "Error when trying to register email", - // TODO New key - Add a translation - "forgot-email.form.error.head": "Error when trying to register email", + "forgot-email.form.error.head": "Электрондық поштаны тіркеу кезіндегі қате", // "forgot-email.form.error.content": "An error occured when registering the following email address: {{ email }}", - // TODO New key - Add a translation - "forgot-email.form.error.content": "An error occured when registering the following email address: {{ email }}", + "forgot-email.form.error.content": "Келесі электрондық пошта мекенжайын тіркеу кезінде қате орын алды: {{ email }}", // "forgot-password.title": "Forgot Password", - // TODO New key - Add a translation - "forgot-password.title": "Forgot Password", + "forgot-password.title": "Құпия сөзді ұмыттыңыз ба", // "forgot-password.form.head": "Forgot Password", - // TODO New key - Add a translation - "forgot-password.form.head": "Forgot Password", + "forgot-password.form.head": "Құпия сөзді ұмыттыңыз ба", // "forgot-password.form.info": "Enter a new password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", - // TODO New key - Add a translation - "forgot-password.form.info": "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": "Төмендегі жолаққа жаңа құпия сөзді енгізіп, оны екінші жолаққа қайта теру арқылы растаңыз. Оның ұзындығы кемінде алты таңба болуы керек.", // "forgot-password.form.card.security": "Security", - // TODO New key - Add a translation - "forgot-password.form.card.security": "Security", + "forgot-password.form.card.security": "Қауіпсіздік", // "forgot-password.form.identification.header": "Identify", // TODO New key - Add a translation From 1e47da0a51af94544d8cf07245d121770c6f7cc5 Mon Sep 17 00:00:00 2001 From: myrza1 Date: Sun, 10 Apr 2022 02:35:15 +0600 Subject: [PATCH 007/119] Update kz.json5 --- src/assets/i18n/kz.json5 | 123 +++++++++++++-------------------------- 1 file changed, 41 insertions(+), 82 deletions(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index 70fb701168..9f33e0ee7b 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -2016,172 +2016,131 @@ "forgot-password.form.card.security": "Қауіпсіздік", // "forgot-password.form.identification.header": "Identify", - // TODO New key - Add a translation - "forgot-password.form.identification.header": "Identify", + "forgot-password.form.identification.header": "Анықтау", // "forgot-password.form.identification.email": "Email address: ", - // TODO New key - Add a translation - "forgot-password.form.identification.email": "Email address: ", + "forgot-password.form.identification.email": "Электрондық пошта: ", // "forgot-password.form.label.password": "Password", - // TODO New key - Add a translation - "forgot-password.form.label.password": "Password", + "forgot-password.form.label.password": "Құпия сөз", // "forgot-password.form.label.passwordrepeat": "Retype to confirm", - // TODO New key - Add a translation - "forgot-password.form.label.passwordrepeat": "Retype to confirm", + "forgot-password.form.label.passwordrepeat": "Растау үшін қайта теріңіз", // "forgot-password.form.error.empty-password": "Please enter a password in the box below.", - // TODO New key - Add a translation - "forgot-password.form.error.empty-password": "Please enter a password in the box below.", + "forgot-password.form.error.empty-password": "Төмендегі ұяшыққа құпия сөзді енгізіңіз.", // "forgot-password.form.error.matching-passwords": "The passwords do not match.", - // TODO New key - Add a translation - "forgot-password.form.error.matching-passwords": "The passwords do not match.", - + "forgot-password.form.error.matching-passwords": "Құпия сөздер сәйкес келмейді.", // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", - // TODO New key - Add a translation - "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", + + "forgot-password.form.error.password-length":"Құпия сөз кемінде 6 таңбадан тұруы керек.", // "forgot-password.form.notification.error.title": "Error when trying to submit new password", - // TODO New key - Add a translation - "forgot-password.form.notification.error.title": "Error when trying to submit new password", + "forgot-password.form.notification.error.title": "Жаңа құпия сөзді жіберу әрекеті кезіндегі қате", // "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", - // TODO New key - Add a translation - "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", - + "forgot-password.form.notification.success.content": "Құпия сөзді қалпына келтіру сәтті аяқталды. Сіз құрылған пайдаланушы ретінде жүйеге кірдіңіз.", + // "forgot-password.form.notification.success.title": "Password reset completed", - // TODO New key - Add a translation - "forgot-password.form.notification.success.title": "Password reset completed", + "forgot-password.form.notification.success.title": "Құпия сөзді қалпына келтіру аяқталды", // "forgot-password.form.submit": "Submit password", - // TODO New key - Add a translation - "forgot-password.form.submit": "Submit password", + "forgot-password.form.submit": "Құпия сөзді жіберу", // "form.add": "Add", - // TODO New key - Add a translation - "form.add": "Add", + "form.add": "Қосу", // "form.add-help": "Click here to add the current entry and to add another one", - // TODO New key - Add a translation - "form.add-help": "Click here to add the current entry and to add another one", + "form.add-help": "Ағымдағы жазбаны қосу және басқасын қосу үшін осы жерді басыңыз", // "form.cancel": "Cancel", - // TODO New key - Add a translation - "form.cancel": "Cancel", + "form.cancel": "Бас тарту", // "form.clear": "Clear", - // TODO New key - Add a translation - "form.clear": "Clear", + "form.clear": "Түсінікті", // "form.clear-help": "Click here to remove the selected value", - // TODO New key - Add a translation - "form.clear-help": "Click here to remove the selected value", + "form.clear-help": "Таңдалған мәнді жою үшін осы жерді басыңыз", // "form.edit": "Edit", - // TODO New key - Add a translation - "form.edit": "Edit", + "form.edit": "Өзгерту", // "form.edit-help": "Click here to edit the selected value", - // TODO New key - Add a translation - "form.edit-help": "Click here to edit the selected value", + "form.edit-help": "Таңдалған мәнді өзгерту үшін осы жерді басыңыз", // "form.first-name": "First name", - // TODO New key - Add a translation - "form.first-name": "First name", + "form.first-name": "Есімі", // "form.group-collapse": "Collapse", - // TODO New key - Add a translation - "form.group-collapse": "Collapse", + "form.group-collapse": "Ықшамдау", // "form.group-collapse-help": "Click here to collapse", - // TODO New key - Add a translation - "form.group-collapse-help": "Click here to collapse", + "form.group-collapse-help": "Ықшамдау үшін осы жерді басыңыз", // "form.group-expand": "Expand", - // TODO New key - Add a translation - "form.group-expand": "Expand", + "form.group-expand": "Ретке келтіру", // "form.group-expand-help": "Click here to expand and add more elements", - // TODO New key - Add a translation - "form.group-expand-help": "Click here to expand and add more elements", + "form.group-expand-help": "Қосымша элементтерді кеңейту және қосу үшін мына жерді басыңыз", // "form.last-name": "Last name", - // TODO New key - Add a translation - "form.last-name": "Last name", + "form.last-name": "Тегі(Фамилия)", // "form.loading": "Loading...", - // TODO New key - Add a translation - "form.loading": "Loading...", + "form.loading": "Жүктелуде...", // "form.lookup": "Lookup", - // TODO New key - Add a translation - "form.lookup": "Lookup", + "form.lookup": "Іздеу", // "form.lookup-help": "Click here to look up an existing relation", - // TODO New key - Add a translation - "form.lookup-help": "Click here to look up an existing relation", + "form.lookup-help": "Қазіргі қатынасты іздеу/көру үшін осы жерді басыңыз", // "form.no-results": "No results found", - // TODO New key - Add a translation - "form.no-results": "No results found", + "form.no-results": "Нәтижесіз", // "form.no-value": "No value entered", - // TODO New key - Add a translation - "form.no-value": "No value entered", + "form.no-value": "Мәні енгізілмеді", // "form.other-information": {}, - // TODO New key - Add a translation "form.other-information": {}, // "form.remove": "Remove", - // TODO New key - Add a translation - "form.remove": "Remove", + "form.remove": "Өшіру", // "form.save": "Save", - // TODO New key - Add a translation - "form.save": "Save", + "form.save": "Сақтау", // "form.save-help": "Save changes", - // TODO New key - Add a translation - "form.save-help": "Save changes", + "form.save-help": "Өзгерістерді сақтау", // "form.search": "Search", - // TODO New key - Add a translation - "form.search": "Search", + "form.search": "Іздеу", // "form.search-help": "Click here to look for an existing correspondence", - // TODO New key - Add a translation - "form.search-help": "Click here to look for an existing correspondence", + "form.search-help": "Хат алмасуды табу үшін мына жерді басыңыз", // "form.submit": "Submit", - // TODO New key - Add a translation - "form.submit": "Submit", + "form.submit": "Жіберу", // "home.description": "", - // TODO New key - Add a translation "home.description": "", // "home.breadcrumbs": "Home", - // TODO New key - Add a translation - "home.breadcrumbs": "Home", + "home.breadcrumbs": "Басты", // "home.title": "DSpace Angular :: Home", - // TODO New key - Add a translation - "home.title": "DSpace Angular :: Home", + "home.title": "DSpace Angular :: Басты», // "home.top-level-communities.head": "Communities in DSpace", - // TODO New key - Add a translation - "home.top-level-communities.head": "Communities in DSpace", + "home.top-level-communities.head": "DSpace-тегі қауымдастықтар", // "home.top-level-communities.help": "Select a community to browse its collections.", - // TODO New key - Add a translation - "home.top-level-communities.help": "Select a community to browse its collections.", + "home.top-level-communities.help": "Оның жинақтарын шолу үшін қауымдастықты таңдаңыз.", From 5379b14c2cb3cfe7ba4cce2ea86a378c811b1a4a Mon Sep 17 00:00:00 2001 From: myrza1 Date: Tue, 12 Apr 2022 19:44:00 +0600 Subject: [PATCH 008/119] Update kz.json5 --- src/assets/i18n/kz.json5 | 910 +++++++++++++-------------------------- 1 file changed, 306 insertions(+), 604 deletions(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index 9f33e0ee7b..f2e545f804 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -2145,1087 +2145,789 @@ // "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", - // TODO New key - Add a translation - "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", + "info.end-user-agreement.accept": "Мен Түпкі пайдаланушы келісімін оқыдым және келісемін", // "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", - // TODO New key - Add a translation - "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", + "info.end-user-agreement.accept.error": "Түпкілікті пайдаланушы келісімін қабылдау кезінде қате орын алды", // "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", - // TODO New key - Add a translation - "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", + "info.end-user-agreement.accept.success": "Соңғы пайдаланушы келісімі сәтті жаңартылды", // "info.end-user-agreement.breadcrumbs": "End User Agreement", - // TODO New key - Add a translation - "info.end-user-agreement.breadcrumbs": "End User Agreement", + "info.end-user-agreement.breadcrumbs":"Соңғы пайдаланушы келісімі", // "info.end-user-agreement.buttons.cancel": "Cancel", - // TODO New key - Add a translation - "info.end-user-agreement.buttons.cancel": "Cancel", + "info.end-user-agreement.buttons.cancel": "Болдырмау", // "info.end-user-agreement.buttons.save": "Save", - // TODO New key - Add a translation - "info.end-user-agreement.buttons.save": "Save", + "info.end-user-agreement.buttons.save": "Сақтау", // "info.end-user-agreement.head": "End User Agreement", - // TODO New key - Add a translation - "info.end-user-agreement.head": "End User Agreement", +"info.end-user-agreement.head": "Соңғы пайдаланушы келісімі", // "info.end-user-agreement.title": "End User Agreement", - // TODO New key - Add a translation - "info.end-user-agreement.title": "End User Agreement", +"info.end-user-agreement.title": "Түпкі пайдаланушы келісімі", // "info.privacy.breadcrumbs": "Privacy Statement", - // TODO New key - Add a translation - "info.privacy.breadcrumbs": "Privacy Statement", +"info.privacy.breadcrumbs": "Құпиялылық туралы мәлімдеме", // "info.privacy.head": "Privacy Statement", - // TODO New key - Add a translation - "info.privacy.head": "Privacy Statement", - +"info.privacy.head": "Құпиялылық туралы мәлімдеме", + // "info.privacy.title": "Privacy Statement", - // TODO New key - Add a translation - "info.privacy.title": "Privacy Statement", +"info.privacy.title": "Құпиялылық туралы мәлімдеме", + - - - // "item.alerts.private": "This item is private", - // TODO New key - Add a translation - "item.alerts.private": "This item is private", + +// "item.alerts.private": "This item is private", +"item.alerts.private": "Бұл элемент жеке", // "item.alerts.withdrawn": "This item has been withdrawn", - // TODO New key - Add a translation - "item.alerts.withdrawn": "This item has been withdrawn", - - + "item.alerts.withdrawn": "Бұл тармақ алынып тасталды", // "item.edit.authorizations.heading": "With this editor you can view and alter the policies of an item, plus alter policies of individual item components: bundles and bitstreams. Briefly, an item is a container of bundles, and bundles are containers of bitstreams. Containers usually have ADD/REMOVE/READ/WRITE policies, while bitstreams only have READ/WRITE policies.", - // TODO New key - Add a translation - "item.edit.authorizations.heading": "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": "Осы өңдегіштің көмегімен элементтің саясаттарын көруге және өзгертуге, сонымен қатар жеке элемент құрамдастарының саясаттарын өзгертуге болады: байламдар және бит ағындары. Қысқаша айтқанда, элемент - бумалардың контейнері, ал бумалар - биттік ағындардың контейнерлері. Контейнерлерде әдетте ҚОСУ/ЖОЮ мүмкіндігі болады. /READ/WRITE саясаттары, ал биттік ағындарда тек ОҚУ/ЖАЗУ саясаттары бар.", + // "item.edit.authorizations.title": "Edit item's Policies", - // TODO New key - Add a translation - "item.edit.authorizations.title": "Edit item's Policies", - - - + "item.edit.authorizations.title": "Элемент саясаттарын өңдеу", + // "item.badge.private": "Private", - // TODO New key - Add a translation - "item.badge.private": "Private", +"item.badge.private": "Жеке", // "item.badge.withdrawn": "Withdrawn", - // TODO New key - Add a translation - "item.badge.withdrawn": "Withdrawn", - - - - // "item.bitstreams.upload.bundle": "Bundle", - // TODO New key - Add a translation - "item.bitstreams.upload.bundle": "Bundle", + "item.badge.withdrawn": "Шығарылды", + +// "item.bitstreams.upload.bundle": "Bundle", +"item.bitstreams.upload.bundle": "Бума", // "item.bitstreams.upload.bundle.placeholder": "Select a bundle", - // TODO New key - Add a translation - "item.bitstreams.upload.bundle.placeholder": "Select a bundle", +"item.bitstreams.upload.bundle.placeholder": "Буманы таңдау", // "item.bitstreams.upload.bundle.new": "Create bundle", - // TODO New key - Add a translation - "item.bitstreams.upload.bundle.new": "Create bundle", +"item.bitstreams.upload.bundle.new": "Буманы жасау", // "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.", - // TODO New key - Add a translation - "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.", + "item.bitstreams.upload.bundles.empty": "Бұл элементте биттік ағынды жүктеп салуға арналған бумалар жоқ.", // "item.bitstreams.upload.cancel": "Cancel", - // TODO New key - Add a translation - "item.bitstreams.upload.cancel": "Cancel", +"item.bitstreams.upload.cancel": "Болдырмау", // "item.bitstreams.upload.drop-message": "Drop a file to upload", - // TODO New key - Add a translation - "item.bitstreams.upload.drop-message": "Drop a file to upload", +"item.bitstreams.upload.drop-message": "Жүктеп салу үшін файлды тастаңыз", // "item.bitstreams.upload.item": "Item: ", - // TODO New key - Add a translation - "item.bitstreams.upload.item": "Item: ", +"item.bitstreams.upload.item":"Элемент:", // "item.bitstreams.upload.notifications.bundle.created.content": "Successfully created new bundle.", - // TODO New key - Add a translation - "item.bitstreams.upload.notifications.bundle.created.content": "Successfully created new bundle.", +"item.bitstreams.upload.notifications.bundle.created.content": "Жаңа топтама сәтті жасалды.", // "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", - // TODO New key - Add a translation - "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", +"item.bitstreams.upload.notifications.bundle.created.title": "Жасалған топтама", // "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", - // TODO New key - Add a translation - "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", + "item.bitstreams.upload.notifications.upload.failed": "Жүктеп салу сәтсіз аяқталды. Әрекетті қайталаудан бұрын мазмұнды тексеріңіз.", // "item.bitstreams.upload.title": "Upload bitstream", - // TODO New key - Add a translation - "item.bitstreams.upload.title": "Upload bitstream", - - +"item.bitstreams.upload.title": "Бақыттық ағынды жүктеп салу", // "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", - // TODO New key - Add a translation - "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", +"item.edit.bitstreams.bundle.edit.buttons.upload": "Жүктеп салу", // "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", - // TODO New key - Add a translation - "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", - + "item.edit.bitstreams.bundle.displaying": "Қазір {{ amount }} {{ total }} бит ағыны көрсетілуде.", + // "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", - // TODO New key - Add a translation - "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", +"item.edit.bitstreams.bundle.load.all": "Барлығын жүктеу ({{ total }})", // "item.edit.bitstreams.bundle.load.more": "Load more", - // TODO New key - Add a translation - "item.edit.bitstreams.bundle.load.more": "Load more", +"item.edit.bitstreams.bundle.load.more":"Көбірек жүктеңіз", // "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", - // TODO New key - Add a translation - "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", +"item.edit.bitstreams.bundle.name": "БАНДЛ: {{ name }}", // "item.edit.bitstreams.discard-button": "Discard", - // TODO New key - Add a translation - "item.edit.bitstreams.discard-button": "Discard", + "item.edit.bitstreams.discard-button": "Тастау", // "item.edit.bitstreams.edit.buttons.download": "Download", - // TODO New key - Add a translation - "item.edit.bitstreams.edit.buttons.download": "Download", + "item.edit.bitstreams.edit.buttons.download": "Жүктеп алу", // "item.edit.bitstreams.edit.buttons.drag": "Drag", - // TODO New key - Add a translation - "item.edit.bitstreams.edit.buttons.drag": "Drag", +"item.edit.bitstreams.edit.buttons.drag": "Сүйреу", // "item.edit.bitstreams.edit.buttons.edit": "Edit", - // TODO New key - Add a translation - "item.edit.bitstreams.edit.buttons.edit": "Edit", +"item.edit.bitstreams.edit.buttons.edit": "Өңдеу", // "item.edit.bitstreams.edit.buttons.remove": "Remove", - // TODO New key - Add a translation - "item.edit.bitstreams.edit.buttons.remove": "Remove", +"item.edit.bitstreams.edit.buttons.remove": "Жою", // "item.edit.bitstreams.edit.buttons.undo": "Undo changes", - // TODO New key - Add a translation - "item.edit.bitstreams.edit.buttons.undo": "Undo changes", +"item.edit.bitstreams.edit.buttons.undo": "Өзгерістерді болдырмау", // "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", - // TODO New key - Add a translation - "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", +"item.edit.bitstreams.empty":"Бұл элементте биттік ағындар жоқ. Біреуін жасау үшін жүктеп салу түймесін басыңыз.", // "item.edit.bitstreams.headers.actions": "Actions", - // TODO New key - Add a translation - "item.edit.bitstreams.headers.actions": "Actions", +"item.edit.bitstreams.headers.actions":"Әрекеттер", // "item.edit.bitstreams.headers.bundle": "Bundle", - // TODO New key - Add a translation - "item.edit.bitstreams.headers.bundle": "Bundle", +"item.edit.bitstreams.headers.bundle": "Бума", // "item.edit.bitstreams.headers.description": "Description", - // TODO New key - Add a translation - "item.edit.bitstreams.headers.description": "Description", + "item.edit.bitstreams.headers.description": "Сипаттамасы", // "item.edit.bitstreams.headers.format": "Format", - // TODO New key - Add a translation - "item.edit.bitstreams.headers.format": "Format", +"item.edit.bitstreams.headers.format": "Формат", // "item.edit.bitstreams.headers.name": "Name", - // TODO New key - Add a translation - "item.edit.bitstreams.headers.name": "Name", - + "item.edit.bitstreams.headers.name":"Аты", + // "item.edit.bitstreams.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - // TODO New key - Add a translation - "item.edit.bitstreams.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "item.edit.bitstreams.notifications.discarded.content": "Өзгертулеріңіз жойылды. Өзгерістерді қалпына келтіру үшін 'Болдырмау' түймесін басыңыз", // "item.edit.bitstreams.notifications.discarded.title": "Changes discarded", - // TODO New key - Add a translation - "item.edit.bitstreams.notifications.discarded.title": "Changes discarded", +"item.edit.bitstreams.notifications.discarded.title": "Өзгерістер жойылды", // "item.edit.bitstreams.notifications.move.failed.title": "Error moving bitstreams", - // TODO New key - Add a translation - "item.edit.bitstreams.notifications.move.failed.title": "Error moving bitstreams", +"item.edit.bitstreams.notifications.move.failed.title": "Бақыттық ағындарды жылжыту қатесі", // "item.edit.bitstreams.notifications.move.saved.content": "Your move changes to this item's bitstreams and bundles have been saved.", - // TODO New key - Add a translation - "item.edit.bitstreams.notifications.move.saved.content": "Your move changes to this item's bitstreams and bundles have been saved.", +"item.edit.bitstreams.notifications.move.saved.content": "Сіздің жылжытуыңыз осы элементтің бит ағындары мен бумаларына жасалған өзгерістер сақталды.", // "item.edit.bitstreams.notifications.move.saved.title": "Move changes saved", - // TODO New key - Add a translation - "item.edit.bitstreams.notifications.move.saved.title": "Move changes saved", +"item.edit.bitstreams.notifications.move.saved.title": "Өзгерістерді жылжыту сақталды", // "item.edit.bitstreams.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", - // TODO New key - Add a translation - "item.edit.bitstreams.notifications.outdated.content": "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": "Сіз қазір жұмыс істеп жатқан элементті басқа пайдаланушы өзгертті. Қайшылықтарды болдырмау үшін ағымдағы өзгертулеріңіз жойылды", // "item.edit.bitstreams.notifications.outdated.title": "Changes outdated", - // TODO New key - Add a translation - "item.edit.bitstreams.notifications.outdated.title": "Changes outdated", +"item.edit.bitstreams.notifications.outdated.title": "Өзгерістер ескірген", // "item.edit.bitstreams.notifications.remove.failed.title": "Error deleting bitstream", - // TODO New key - Add a translation - "item.edit.bitstreams.notifications.remove.failed.title": "Error deleting bitstream", +"item.edit.bitstreams.notifications.remove.failed.title": "Бақыттық ағынды жою қатесі", // "item.edit.bitstreams.notifications.remove.saved.content": "Your removal changes to this item's bitstreams have been saved.", - // TODO New key - Add a translation - "item.edit.bitstreams.notifications.remove.saved.content": "Your removal changes to this item's bitstreams have been saved.", + "item.edit.bitstreams.notifications.remove.saved.content": "Осы элементтің бит ағындарына жасалған жою өзгерістеріңіз сақталды.", // "item.edit.bitstreams.notifications.remove.saved.title": "Removal changes saved", - // TODO New key - Add a translation - "item.edit.bitstreams.notifications.remove.saved.title": "Removal changes saved", +"item.edit.bitstreams.notifications.remove.saved.title": "Жою өзгерістері сақталды", // "item.edit.bitstreams.reinstate-button": "Undo", - // TODO New key - Add a translation - "item.edit.bitstreams.reinstate-button": "Undo", +"item.edit.bitstreams.reinstate-button": "Болдырмау", // "item.edit.bitstreams.save-button": "Save", - // TODO New key - Add a translation - "item.edit.bitstreams.save-button": "Save", +"item.edit.bitstreams.save-button": "Сақтау", // "item.edit.bitstreams.upload-button": "Upload", - // TODO New key - Add a translation - "item.edit.bitstreams.upload-button": "Upload", - - - +"item.edit.bitstreams.upload-button": "Жүктеп салу", + // "item.edit.delete.cancel": "Cancel", - // TODO New key - Add a translation - "item.edit.delete.cancel": "Cancel", +"item.edit.delete.cancel": "Болдырмау", // "item.edit.delete.confirm": "Delete", - // TODO New key - Add a translation - "item.edit.delete.confirm": "Delete", + "item.edit.delete.confirm": "Жою", // "item.edit.delete.description": "Are you sure this item should be completely deleted? Caution: At present, no tombstone would be left.", - // TODO New key - Add a translation - "item.edit.delete.description": "Are you sure this item should be completely deleted? Caution: At present, no tombstone would be left.", + "item.edit.delete.description": "Бұл элемент толығымен жойылуы керек екеніне сенімдісіз бе? Абайлаңыз: Қазіргі уақытта құлпытас қалмас еді"., // "item.edit.delete.error": "An error occurred while deleting the item", - // TODO New key - Add a translation - "item.edit.delete.error": "An error occurred while deleting the item", +"item.edit.delete.error": "Элементті жою кезінде қате орын алды", // "item.edit.delete.header": "Delete item: {{ id }}", - // TODO New key - Add a translation - "item.edit.delete.header": "Delete item: {{ id }}", +"item.edit.delete.header": "Элементті жою: {{ id }}", // "item.edit.delete.success": "The item has been deleted", - // TODO New key - Add a translation - "item.edit.delete.success": "The item has been deleted", - +"item.edit.delete.success": "Элемент жойылды", + // "item.edit.head": "Edit Item", - // TODO New key - Add a translation - "item.edit.head": "Edit Item", + "item.edit.head": "Элементті өңдеу", // "item.edit.breadcrumbs": "Edit Item", - // TODO New key - Add a translation - "item.edit.breadcrumbs": "Edit Item", - - - // "item.edit.tabs.mapper.head": "Collection Mapper", - // TODO New key - Add a translation - "item.edit.tabs.mapper.head": "Collection Mapper", + "item.edit.breadcrumbs": "Элементті өңдеу", + +// "item.edit.tabs.mapper.head": "Collection Mapper", + "item.edit.tabs.mapper.head": "Коллекция картасы", // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", - // TODO New key - Add a translation - "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", - + "item.edit.tabs.item-mapper.title": "Item Edit - Коллекция картасы", + // "item.edit.item-mapper.buttons.add": "Map item to selected collections", - // TODO New key - Add a translation - "item.edit.item-mapper.buttons.add": "Map item to selected collections", + "item.edit.item-mapper.buttons.add": "Таңдалған жинақтарға элементті картаға салу", // "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", - // TODO New key - Add a translation - "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", +"item.edit.item-mapper.buttons.remove": "Таңдалған жинақтар үшін элементтің салыстыруын жою", // "item.edit.item-mapper.cancel": "Cancel", - // TODO New key - Add a translation - "item.edit.item-mapper.cancel": "Cancel", + "item.edit.item-mapper.cancel":"Болдырмау", // "item.edit.item-mapper.description": "This is the item mapper tool that allows administrators to map this item to other collections. You can search for collections and map them, or browse the list of collections the item is currently mapped to.", - // TODO New key - Add a translation - "item.edit.item-mapper.description": "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": "Бұл әкімшілерге осы элементті басқа жинақтармен салыстыруға мүмкіндік беретін элементті салыстыру құралы. Жинақтарды іздеуге және оларды салыстыруға немесе элемент қазіргі уақытта салыстырылған жинақтар тізімін шолуға болады.", // "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", - // TODO New key - Add a translation - "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", +"item.edit.item-mapper.head":"Элемент салыстырушы - Элементті коллекциялармен салыстыру", // "item.edit.item-mapper.item": "Item: \"{{name}}\"", - // TODO New key - Add a translation - "item.edit.item-mapper.item": "Item: \"{{name}}\"", + "item.edit.item-mapper.item": "Элемент: \"{{name}}\"", // "item.edit.item-mapper.no-search": "Please enter a query to search", - // TODO New key - Add a translation - "item.edit.item-mapper.no-search": "Please enter a query to search", + "item.edit.item-mapper.no-search": "Іздеу үшін сұрауды енгізіңіз", // "item.edit.item-mapper.notifications.add.error.content": "Errors occurred for mapping of item to {{amount}} collections.", - // TODO New key - Add a translation - "item.edit.item-mapper.notifications.add.error.content": "Errors occurred for mapping of item to {{amount}} collections.", - + "item.edit.item-mapper.notifications.add.error.content": "Элементті {{amount}} жинаққа салыстыру кезінде қателер орын алды.", + // "item.edit.item-mapper.notifications.add.error.head": "Mapping errors", - // TODO New key - Add a translation - "item.edit.item-mapper.notifications.add.error.head": "Mapping errors", + "item.edit.item-mapper.notifications.add.error.head": "Карталау қателері", // "item.edit.item-mapper.notifications.add.success.content": "Successfully mapped item to {{amount}} collections.", - // TODO New key - Add a translation - "item.edit.item-mapper.notifications.add.success.content": "Successfully mapped item to {{amount}} collections.", + "item.edit.item-mapper.notifications.add.success.content": "Элемент {{amount}} жинаққа сәтті салыстырылды.", // "item.edit.item-mapper.notifications.add.success.head": "Mapping completed", - // TODO New key - Add a translation - "item.edit.item-mapper.notifications.add.success.head": "Mapping completed", + "item.edit.item-mapper.notifications.add.success.head":"Карталау аяқталды", // "item.edit.item-mapper.notifications.remove.error.content": "Errors occurred for the removal of the mapping to {{amount}} collections.", - // TODO New key - Add a translation - "item.edit.item-mapper.notifications.remove.error.content": "Errors occurred for the removal of the mapping to {{amount}} collections.", + "item.edit.item-mapper.notifications.remove.error.content": "{{amount}} жинаққа салыстыруды жою кезінде қателер орын алды.", // "item.edit.item-mapper.notifications.remove.error.head": "Removal of mapping errors", - // TODO New key - Add a translation - "item.edit.item-mapper.notifications.remove.error.head": "Removal of mapping errors", + "item.edit.item-mapper.notifications.remove.error.head": "Карталау қателерін жою", // "item.edit.item-mapper.notifications.remove.success.content": "Successfully removed mapping of item to {{amount}} collections.", - // TODO New key - Add a translation - "item.edit.item-mapper.notifications.remove.success.content": "Successfully removed mapping of item to {{amount}} collections.", + "item.edit.item-mapper.notifications.remove.success.content": "Элементтің {{amount}} жинаққа салыстыруы сәтті жойылды.", // "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", - // TODO New key - Add a translation - "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", + "item.edit.item-mapper.notifications.remove.success.head": "Карталауды жою аяқталды", // "item.edit.item-mapper.tabs.browse": "Browse mapped collections", - // TODO New key - Add a translation - "item.edit.item-mapper.tabs.browse": "Browse mapped collections", + "item.edit.item-mapper.tabs.browse": "Карталанған жинақтарды шолу", // "item.edit.item-mapper.tabs.map": "Map new collections", - // TODO New key - Add a translation - "item.edit.item-mapper.tabs.map": "Map new collections", - - - + "item.edit.item-mapper.tabs.map": "Жаңа жинақтарды картаға түсіру", + // "item.edit.metadata.add-button": "Add", - // TODO New key - Add a translation - "item.edit.metadata.add-button": "Add", + "item.edit.metadata.add-button": "Қосу", // "item.edit.metadata.discard-button": "Discard", - // TODO New key - Add a translation - "item.edit.metadata.discard-button": "Discard", + "item.edit.metadata.discard-button": "Тастау", // "item.edit.metadata.edit.buttons.edit": "Edit", - // TODO New key - Add a translation - "item.edit.metadata.edit.buttons.edit": "Edit", + "item.edit.metadata.edit.buttons.edit": "Өңдеу", // "item.edit.metadata.edit.buttons.remove": "Remove", - // TODO New key - Add a translation - "item.edit.metadata.edit.buttons.remove": "Remove", + "item.edit.metadata.edit.buttons.remove": "Жою", // "item.edit.metadata.edit.buttons.undo": "Undo changes", - // TODO New key - Add a translation - "item.edit.metadata.edit.buttons.undo": "Undo changes", + "item.edit.metadata.edit.buttons.undo": "Өзгерістерді болдырмау", // "item.edit.metadata.edit.buttons.unedit": "Stop editing", - // TODO New key - Add a translation - "item.edit.metadata.edit.buttons.unedit": "Stop editing", + "item.edit.metadata.edit.buttons.unedit": "Өңдеуді тоқтату", // "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", - // TODO New key - Add a translation - "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", + "item.edit.metadata.empty": "Элементте қазір ешбір метадеректер жоқ. Метадеректер мәнін қосуды бастау үшін Қосу түймесін басыңыз.", // "item.edit.metadata.headers.edit": "Edit", - // TODO New key - Add a translation - "item.edit.metadata.headers.edit": "Edit", + "item.edit.metadata.headers.edit": "Өңдеу", // "item.edit.metadata.headers.field": "Field", - // TODO New key - Add a translation - "item.edit.metadata.headers.field": "Field", - - // "item.edit.metadata.headers.language": "Lang", - // TODO New key - Add a translation - "item.edit.metadata.headers.language": "Lang", - + "item.edit.metadata.headers.field": "Жолақ", + + + "item.edit.metadata.headers.language": "Тіл", + // "item.edit.metadata.headers.value": "Value", - // TODO New key - Add a translation - "item.edit.metadata.headers.value": "Value", + "item.edit.metadata.headers.value": "құн", // "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", - // TODO New key - Add a translation - "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", + "item.edit.metadata.metadatafield.invalid": "Жарамды метадеректер өрісін таңдаңыз", // "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - // TODO New key - Add a translation - "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "item.edit.metadata.notifications.discarded.content": "Өзгерістеріңіз жойылды. Өзгерістерді қалпына келтіру үшін 'Болдырмау' түймесін басыңыз", // "item.edit.metadata.notifications.discarded.title": "Changed discarded", - // TODO New key - Add a translation - "item.edit.metadata.notifications.discarded.title": "Changed discarded", + "item.edit.metadata.notifications.discarded.title": "Өзгертілген жойылды", // "item.edit.metadata.notifications.error.title": "An error occurred", - // TODO New key - Add a translation - "item.edit.metadata.notifications.error.title": "An error occurred", - + "item.edit.metadata.notifications.error.title": "Қате орын алды", + // "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", - // TODO New key - Add a translation - "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + "item.edit.metadata.notifications.invalid.content": "Өзгертулеріңіз сақталмады. Сақтамас бұрын барлық өрістердің жарамды екеніне көз жеткізіңіз.", // "item.edit.metadata.notifications.invalid.title": "Metadata invalid", - // TODO New key - Add a translation - "item.edit.metadata.notifications.invalid.title": "Metadata invalid", + "item.edit.metadata.notifications.invalid.title": "Метадеректер жарамсыз", // "item.edit.metadata.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", - // TODO New key - Add a translation - "item.edit.metadata.notifications.outdated.content": "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": "Сіз қазір жұмыс істеп жатқан элементті басқа пайдаланушы өзгертті. Қақтығыстардың алдын алу үшін сіздің қазіргі өзгерістеріңіз жойылады", // "item.edit.metadata.notifications.outdated.title": "Changed outdated", - // TODO New key - Add a translation - "item.edit.metadata.notifications.outdated.title": "Changed outdated", + "item.edit.metadata.notifications.outdated.title": "Өзгертілген ескірген", // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", - // TODO New key - Add a translation - "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", + "item.edit.metadata.notifications.saved.content": "Осы элементтің метадеректеріндегі өзгерістер сақталды"., // "item.edit.metadata.notifications.saved.title": "Metadata saved", - // TODO New key - Add a translation - "item.edit.metadata.notifications.saved.title": "Metadata saved", - + "item.edit.metadata.notifications.saved.title": "Сақталған метадеректер", + // "item.edit.metadata.reinstate-button": "Undo", - // TODO New key - Add a translation - "item.edit.metadata.reinstate-button": "Undo", + "item.edit.metadata.reinstate-button": "Болдырмау", // "item.edit.metadata.save-button": "Save", - // TODO New key - Add a translation - "item.edit.metadata.save-button": "Save", - - - + "item.edit.metadata.save-button":"Сақтау", + // "item.edit.modify.overview.field": "Field", - // TODO New key - Add a translation - "item.edit.modify.overview.field": "Field", + "item.edit.modify.overview.field": "Өріс", // "item.edit.modify.overview.language": "Language", - // TODO New key - Add a translation - "item.edit.modify.overview.language": "Language", + "item.edit.modify.overview.language": "Тіл", // "item.edit.modify.overview.value": "Value", - // TODO New key - Add a translation - "item.edit.modify.overview.value": "Value", - - - + "item.edit.modify.overview.value": "Құндылық", + // "item.edit.move.cancel": "Cancel", - // TODO New key - Add a translation "item.edit.move.cancel": "Cancel", // "item.edit.move.description": "Select the collection you wish to move this item to. To narrow down the list of displayed collections, you can enter a search query in the box.", - // TODO New key - Add a translation - "item.edit.move.description": "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": "Осы элементті жылжытқыңыз келетін коллекцияны таңдаңыз. Көрсетілген жинақтардың тізімін тарылту үшін өріске іздеу сұрауын енгізуге болады.", // "item.edit.move.error": "An error occurred when attempting to move the item", - // TODO New key - Add a translation - "item.edit.move.error": "An error occurred when attempting to move the item", + "item.edit.move.error": "Элементті жылжыту кезінде қате пайда болды", // "item.edit.move.head": "Move item: {{id}}", - // TODO New key - Add a translation - "item.edit.move.head": "Move item: {{id}}", + "item.edit.move.head": "Элементті жылжыту: {{id}}", // "item.edit.move.inheritpolicies.checkbox": "Inherit policies", - // TODO New key - Add a translation - "item.edit.move.inheritpolicies.checkbox": "Inherit policies", + "item.edit.move.inheritpolicies.checkbox": "Мұрагерлік саясат", // "item.edit.move.inheritpolicies.description": "Inherit the default policies of the destination collection", - // TODO New key - Add a translation - "item.edit.move.inheritpolicies.description": "Inherit the default policies of the destination collection", + "item.edit.move.inheritpolicies.description": "Мақсатты жинақтың әдепкі саясатын мұра ету", // "item.edit.move.move": "Move", - // TODO New key - Add a translation - "item.edit.move.move": "Move", + "item.edit.move.move": "Жылжыту", // "item.edit.move.processing": "Moving...", - // TODO New key - Add a translation - "item.edit.move.processing": "Moving...", + "item.edit.move.processing": "Ысырулыда...", // "item.edit.move.search.placeholder": "Enter a search query to look for collections", - // TODO New key - Add a translation - "item.edit.move.search.placeholder": "Enter a search query to look for collections", + "item.edit.move.search.placeholder": "Жинақтарды іздеу үшін іздеу сұрауын енгізіңіз", // "item.edit.move.success": "The item has been moved successfully", - // TODO New key - Add a translation - "item.edit.move.success": "The item has been moved successfully", + "item.edit.move.success": "Элемент сәтті көшірілді", // "item.edit.move.title": "Move item", - // TODO New key - Add a translation - "item.edit.move.title": "Move item", - - - + "item.edit.move.title": "Элементті жылжыту", + // "item.edit.private.cancel": "Cancel", - // TODO New key - Add a translation - "item.edit.private.cancel": "Cancel", + "item.edit.private.cancel":"Болдырмау", // "item.edit.private.confirm": "Make it Private", - // TODO New key - Add a translation - "item.edit.private.confirm": "Make it Private", + "item.edit.private.confirm": "Мұны жеке жаса", // "item.edit.private.description": "Are you sure this item should be made private in the archive?", - // TODO New key - Add a translation - "item.edit.private.description": "Are you sure this item should be made private in the archive?", + "item.edit.private.description": "Сіз бұл затты мұрағатта жабу керек екеніне сенімдісіз бе?", // "item.edit.private.error": "An error occurred while making the item private", - // TODO New key - Add a translation - "item.edit.private.error": "An error occurred while making the item private", + "item.edit.private.error": "Элементті жабу кезінде қате пайда болды", // "item.edit.private.header": "Make item private: {{ id }}", - // TODO New key - Add a translation - "item.edit.private.header": "Make item private: {{ id }}", + "item.edit.private.header": "Элементті жеке ету: {{ id }}", // "item.edit.private.success": "The item is now private", - // TODO New key - Add a translation - "item.edit.private.success": "The item is now private", - - - + "item.edit.private.success": "Тауар қазір жеке", + // "item.edit.public.cancel": "Cancel", - // TODO New key - Add a translation - "item.edit.public.cancel": "Cancel", + "item.edit.public.cancel": "Болдырмау", // "item.edit.public.confirm": "Make it Public", - // TODO New key - Add a translation - "item.edit.public.confirm": "Make it Public", + "item.edit.public.confirm": "Мұны көпшілікке жария ету", // "item.edit.public.description": "Are you sure this item should be made public in the archive?", - // TODO New key - Add a translation - "item.edit.public.description": "Are you sure this item should be made public in the archive?", - + "item.edit.public.description": "Сіз бұл материалды мұрағатта жариялау керек екеніне сенімдісіз бе?", + // "item.edit.public.error": "An error occurred while making the item public", - // TODO New key - Add a translation - "item.edit.public.error": "An error occurred while making the item public", + "item.edit.public.error": "Элементті жариялау кезінде қате пайда болды", // "item.edit.public.header": "Make item public: {{ id }}", - // TODO New key - Add a translation - "item.edit.public.header": "Make item public: {{ id }}", + "item.edit.public.header": "Элементті жалпыға қол жетімді ету: {{ id }}", // "item.edit.public.success": "The item is now public", - // TODO New key - Add a translation - "item.edit.public.success": "The item is now public", - - - + "item.edit.public.success": "Тауар қазір көпшілікке қол жетімді", + // "item.edit.reinstate.cancel": "Cancel", - // TODO New key - Add a translation - "item.edit.reinstate.cancel": "Cancel", + "item.edit.reinstate.cancel": "Болдырмау", // "item.edit.reinstate.confirm": "Reinstate", - // TODO New key - Add a translation - "item.edit.reinstate.confirm": "Reinstate", - - // "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?", - // TODO New key - Add a translation - "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?", + "item.edit.reinstate.confirm": "Қалпына келтіру", + + // "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?" + "item.edit.reinstate.description": "Сіз бұл элементті мұрағатта қалпына келтіру керек екеніне сенімдісіз бе?", // "item.edit.reinstate.error": "An error occurred while reinstating the item", - // TODO New key - Add a translation - "item.edit.reinstate.error": "An error occurred while reinstating the item", + "item.edit.reinstate.error": "Элементті қалпына келтіру кезінде қате пайда болды", // "item.edit.reinstate.header": "Reinstate item: {{ id }}", - // TODO New key - Add a translation - "item.edit.reinstate.header": "Reinstate item: {{ id }}", + "item.edit.reinstate.header": "Элементті қалпына келтіру: {{ id }}", // "item.edit.reinstate.success": "The item was reinstated successfully", - // TODO New key - Add a translation - "item.edit.reinstate.success": "The item was reinstated successfully", - - - + "item.edit.reinstate.success": "Элемент сәтті қалпына келтірілді", + // "item.edit.relationships.discard-button": "Discard", - // TODO New key - Add a translation - "item.edit.relationships.discard-button": "Discard", + "item.edit.relationships.discard-button": "Тастау", // "item.edit.relationships.edit.buttons.add": "Add", - // TODO New key - Add a translation - "item.edit.relationships.edit.buttons.add": "Add", + "item.edit.relationships.edit.buttons.add":"Қосу", // "item.edit.relationships.edit.buttons.remove": "Remove", - // TODO New key - Add a translation - "item.edit.relationships.edit.buttons.remove": "Remove", + "item.edit.relationships.edit.buttons.remove": "Жою", // "item.edit.relationships.edit.buttons.undo": "Undo changes", - // TODO New key - Add a translation - "item.edit.relationships.edit.buttons.undo": "Undo changes", + "item.edit.relationships.edit.buttons.undo": "Өзгерістерді болдырмау", // "item.edit.relationships.no-relationships": "No relationships", - // TODO New key - Add a translation - "item.edit.relationships.no-relationships": "No relationships", + "item.edit.relationships.no-relationships": "Қарым-қатынас жоқ", // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - // TODO New key - Add a translation - "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + "item.edit.relationships.notifications.discarded.content": "Сіздің өзгертулеріңіз жойылды. Енгізілген өзгертулерді қалпына келтіру үшін 'Болдырмау' түймесін басыңыз, // "item.edit.relationships.notifications.discarded.title": "Changes discarded", - // TODO New key - Add a translation - "item.edit.relationships.notifications.discarded.title": "Changes discarded", + "item.edit.relationships.notifications.discarded.title": "Өзгерістер жойылды", // "item.edit.relationships.notifications.failed.title": "Error editing relationships", - // TODO New key - Add a translation - "item.edit.relationships.notifications.failed.title": "Error editing relationships", + "item.edit.relationships.notifications.failed.title": "Қарым-қатынасты өңдеу қатесі", // "item.edit.relationships.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", - // TODO New key - Add a translation - "item.edit.relationships.notifications.outdated.content": "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": "Сіз қазір жұмыс істеп жатқан элементті басқа пайдаланушы өзгертті. Қақтығыстардың алдын алу үшін сіздің қазіргі өзгерістеріңіз жойылады", // "item.edit.relationships.notifications.outdated.title": "Changes outdated", - // TODO New key - Add a translation - "item.edit.relationships.notifications.outdated.title": "Changes outdated", + "item.edit.relationships.notifications.outdated.title": "Өзгерістер ескірген", // "item.edit.relationships.notifications.saved.content": "Your changes to this item's relationships were saved.", - // TODO New key - Add a translation - "item.edit.relationships.notifications.saved.content": "Your changes to this item's relationships were saved.", - + "item.edit.relationships.notifications.saved.content": "Осы элементтің қарым-қатынасындағы өзгерістер сақталды.", + // "item.edit.relationships.notifications.saved.title": "Relationships saved", - // TODO New key - Add a translation - "item.edit.relationships.notifications.saved.title": "Relationships saved", + "item.edit.relationships.notifications.saved.title": "Сақталған қатынастар", // "item.edit.relationships.reinstate-button": "Undo", - // TODO New key - Add a translation - "item.edit.relationships.reinstate-button": "Undo", + "item.edit.relationships.reinstate-button":"Болдырмау", // "item.edit.relationships.save-button": "Save", - // TODO New key - Add a translation - "item.edit.relationships.save-button": "Save", + "item.edit.relationships.save-button": "Сақтау", // "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", - // TODO New key - Add a translation - "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", + "item.edit.relationships.no-entity-type": "Метадеректерін элемент үшін байланыстарды қосу үшін 'dspace.entity.type' басыныз", - - - // "item.edit.tabs.bitstreams.head": "Bitstreams", - // TODO New key - Add a translation - "item.edit.tabs.bitstreams.head": "Bitstreams", +// "item.edit.tabs.bitstreams.head": "Bitstreams", + "item.edit.tabs.bitstreams.head": "Бит ағындары", // "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", - // TODO New key - Add a translation - "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", + "item.edit.tabs.bitstreams.title": "Item Edit - Бит ағындары", // "item.edit.tabs.curate.head": "Curate", - // TODO New key - Add a translation - "item.edit.tabs.curate.head": "Curate", + "item.edit.tabs.curate.head": "Викар", // "item.edit.tabs.curate.title": "Item Edit - Curate", - // TODO New key - Add a translation - "item.edit.tabs.curate.title": "Item Edit - Curate", + "item.edit.tabs.curate.title": "Өңдеу элементі-Куратор", // "item.edit.tabs.metadata.head": "Metadata", - // TODO New key - Add a translation - "item.edit.tabs.metadata.head": "Metadata", + "item.edit.tabs.metadata.head": "Метадеректер", // "item.edit.tabs.metadata.title": "Item Edit - Metadata", - // TODO New key - Add a translation - "item.edit.tabs.metadata.title": "Item Edit - Metadata", + "item.edit.tabs.metadata.title": "Item Edit - Метадеректер", // "item.edit.tabs.relationships.head": "Relationships", - // TODO New key - Add a translation - "item.edit.tabs.relationships.head": "Relationships", + "item.edit.tabs.relationships.head": "Қатынастар", // "item.edit.tabs.relationships.title": "Item Edit - Relationships", - // TODO New key - Add a translation - "item.edit.tabs.relationships.title": "Item Edit - Relationships", + "item.edit.tabs.relationships.title": "Элементті өңдеу - қарым-қатынас", // "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", + "item.edit.tabs.status.buttons.authorizations.button": "Рұқсат...", // "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", + "item.edit.tabs.status.buttons.authorizations.label":"Элементті авторизациялау саясатын өзгерту", // "item.edit.tabs.status.buttons.delete.button": "Permanently delete", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.delete.button": "Permanently delete", + "item.edit.tabs.status.buttons.delete.button":"Біржола жою", // "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", - + "item.edit.tabs.status.buttons.delete.label": "Элементті толығымен алып тастаңыз", + // "item.edit.tabs.status.buttons.mappedCollections.button": "Mapped collections", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.mappedCollections.button": "Mapped collections", + "item.edit.tabs.status.buttons.mappedCollections.button": "Салыстырмалы коллекциялар", // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", + "item.edit.tabs.status.buttons.mappedCollections.label": "Салыстырмалы коллекцияларды басқару", // "item.edit.tabs.status.buttons.move.button": "Move...", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.move.button": "Move...", + "item.edit.tabs.status.buttons.move.button": "Ысыру...", // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.move.label": "Move item to another collection", + "item.edit.tabs.status.buttons.move.label": "Элементті басқа жинаққа жылжытыңыз", // "item.edit.tabs.status.buttons.private.button": "Make it private...", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.private.button": "Make it private...", + "item.edit.tabs.status.buttons.private.button": "Мұны жеке етіңіз...", // "item.edit.tabs.status.buttons.private.label": "Make item private", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.private.label": "Make item private", + "item.edit.tabs.status.buttons.private.label": "Затты жеке ету", // "item.edit.tabs.status.buttons.public.button": "Make it public...", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.public.button": "Make it public...", + "item.edit.tabs.status.buttons.public.button": "Мұны көпшілікке жария етіңіз...", // "item.edit.tabs.status.buttons.public.label": "Make item public", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.public.label": "Make item public", + "item.edit.tabs.status.buttons.public.label": "Өнімді жалпыға қол жетімді ету", // "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", + "item.edit.tabs.status.buttons.reinstate.button": "Қалпына келтіру...", // "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", + "item.edit.tabs.status.buttons.reinstate.label": "Сақтау ішіндегі элементті қалпына келтіру", // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", + "item.edit.tabs.status.buttons.withdraw.button": "Шегінуге...", // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", - // TODO New key - Add a translation - "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", + "item.edit.tabs.status.buttons.withdraw.label": "Қоймадан тауарды алып қою", // "item.edit.tabs.status.description": "Welcome to the item management page. From here you can withdraw, reinstate, move or delete the item. You may also update or add new metadata / bitstreams on the other tabs.", - // TODO New key - Add a translation - "item.edit.tabs.status.description": "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": "Тауарларды басқару бетіне қош келдіңіз. Осы жерден элементті алып тастауға, қалпына келтіруге, жылжытуға немесе жоюға болады. Басқа қойындыларда жаңа метадеректерді / бит ағындарын жаңартуға немесе қосуға болады.", // "item.edit.tabs.status.head": "Status", - // TODO New key - Add a translation - "item.edit.tabs.status.head": "Status", + "item.edit.tabs.status.head":"Мәртебе", // "item.edit.tabs.status.labels.handle": "Handle", - // TODO New key - Add a translation - "item.edit.tabs.status.labels.handle": "Handle", + "item.edit.tabs.status.labels.handle": "Қалам", // "item.edit.tabs.status.labels.id": "Item Internal ID", - // TODO New key - Add a translation - "item.edit.tabs.status.labels.id": "Item Internal ID", + "item.edit.tabs.status.labels.id": "Ішкі элемент идентификаторы", // "item.edit.tabs.status.labels.itemPage": "Item Page", - // TODO New key - Add a translation - "item.edit.tabs.status.labels.itemPage": "Item Page", + "item.edit.tabs.status.labels.itemPage": "Өнім беті", // "item.edit.tabs.status.labels.lastModified": "Last Modified", - // TODO New key - Add a translation - "item.edit.tabs.status.labels.lastModified": "Last Modified", + "item.edit.tabs.status.labels.lastModified": "Соңғы өзгеріс", // "item.edit.tabs.status.title": "Item Edit - Status", - // TODO New key - Add a translation - "item.edit.tabs.status.title": "Item Edit - Status", + "item.edit.tabs.status.title": "Item Edit - Мәртебесі", // "item.edit.tabs.versionhistory.head": "Version History", - // TODO New key - Add a translation - "item.edit.tabs.versionhistory.head": "Version History", + "item.edit.tabs.versionhistory.head": "Нұсқа тарихы", // "item.edit.tabs.versionhistory.title": "Item Edit - Version History", - // TODO New key - Add a translation - "item.edit.tabs.versionhistory.title": "Item Edit - Version History", + "item.edit.tabs.versionhistory.title": "Элементті өңдеу-нұсқа тарихы", // "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", - // TODO New key - Add a translation - "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", + "item.edit.tabs.versionhistory.under-construction": "Бұл пайдаланушы интерфейсінде жаңа нұсқаларды өңдеу немесе қосу әлі мүмкін емес"., // "item.edit.tabs.view.head": "View Item", - // TODO New key - Add a translation - "item.edit.tabs.view.head": "View Item", + "item.edit.tabs.view.head": "Элементті қарау", // "item.edit.tabs.view.title": "Item Edit - View", - // TODO New key - Add a translation - "item.edit.tabs.view.title": "Item Edit - View", - - - + "item.edit.tabs.view.title": "Элементті өңдеу-қарау", + // "item.edit.withdraw.cancel": "Cancel", - // TODO New key - Add a translation - "item.edit.withdraw.cancel": "Cancel", + "item.edit.withdraw.cancel": "Болдырмау", // "item.edit.withdraw.confirm": "Withdraw", - // TODO New key - Add a translation - "item.edit.withdraw.confirm": "Withdraw", + "item.edit.withdraw.confirm": "Шақыру", // "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?", - // TODO New key - Add a translation - "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?", - + "item.edit.withdraw.description": "Сіз бұл затты мұрағаттан алып тастау керек деп ойлайсыз ба?", + // "item.edit.withdraw.error": "An error occurred while withdrawing the item", - // TODO New key - Add a translation - "item.edit.withdraw.error": "An error occurred while withdrawing the item", + "item.edit.withdraw.error": "Тауарды алып қою кезінде қате кетті", // "item.edit.withdraw.header": "Withdraw item: {{ id }}", - // TODO New key - Add a translation - "item.edit.withdraw.header": "Withdraw item: {{ id }}", + "item.edit.withdraw.header": "Өнім шығару: {{ id }}", // "item.edit.withdraw.success": "The item was withdrawn successfully", - // TODO New key - Add a translation - "item.edit.withdraw.success": "The item was withdrawn successfully", - - - + "item.edit.withdraw.success": "Тауар сәтті алынды", + // "item.listelement.badge": "Item", - // TODO New key - Add a translation - "item.listelement.badge": "Item", + "item.listelement.badge": "Пән", // "item.page.description": "Description", - // TODO New key - Add a translation - "item.page.description": "Description", + "item.page.description": "Сипаттама", // "item.page.edit": "Edit this item", - // TODO New key - Add a translation - "item.page.edit": "Edit this item", + "item.page.edit": "Бұл элементті өңдеу", // "item.page.journal-issn": "Journal ISSN", - // TODO New key - Add a translation - "item.page.journal-issn": "Journal ISSN", + "item.page.journal-issn": "ISSN журналы", // "item.page.journal-title": "Journal Title", - // TODO New key - Add a translation - "item.page.journal-title": "Journal Title", + "item.page.journal-title": "Журналдың атауы", // "item.page.publisher": "Publisher", - // TODO New key - Add a translation - "item.page.publisher": "Publisher", + "item.page.publisher": "Баспагер", // "item.page.titleprefix": "Item: ", - // TODO New key - Add a translation - "item.page.titleprefix": "Item: ", + "item.page.titleprefix": "Пән:", // "item.page.volume-title": "Volume Title", - // TODO New key - Add a translation - "item.page.volume-title": "Volume Title", - + "item.page.volume-title": "Томның атауы", + // "item.search.results.head": "Item Search Results", - // TODO New key - Add a translation - "item.search.results.head": "Item Search Results", + "item.search.results.head": "Өнімді іздеу нәтижелері", // "item.search.title": "DSpace Angular :: Item Search", - // TODO New key - Add a translation - "item.search.title": "DSpace Angular :: Item Search", - - - + "item.search.title": "DSpace Angular :: элементтерді іздеу", + // "item.page.abstract": "Abstract", - // TODO New key - Add a translation - "item.page.abstract": "Abstract", + "item.page.abstract": "Дерексіз", // "item.page.author": "Authors", - // TODO New key - Add a translation - "item.page.author": "Authors", + "item.page.author": "Авторлар", // "item.page.citation": "Citation", - // TODO New key - Add a translation - "item.page.citation": "Citation", + "item.page.citation":"Дәйексөз", // "item.page.collections": "Collections", - // TODO New key - Add a translation - "item.page.collections": "Collections", + "item.page.collections": "Жинақтар", // "item.page.date": "Date", - // TODO New key - Add a translation - "item.page.date": "Date", + "item.page.date": "Кездесуге", // "item.page.edit": "Edit this item", - // TODO New key - Add a translation - "item.page.edit": "Edit this item", + "item.page.edit": "Бұл элементті өңдеңіз", // "item.page.files": "Files", - // TODO New key - Add a translation - "item.page.files": "Files", + "item.page.files": "Файлдар", // "item.page.filesection.description": "Description:", - // TODO New key - Add a translation - "item.page.filesection.description": "Description:", + "item.page.filesection.description": "Сипаттама:" // "item.page.filesection.download": "Download", - // TODO New key - Add a translation - "item.page.filesection.download": "Download", + "item.page.filesection.download": "Жүктеу", // "item.page.filesection.format": "Format:", - // TODO New key - Add a translation - "item.page.filesection.format": "Format:", + "item.page.filesection.format": "Формат:", // "item.page.filesection.name": "Name:", - // TODO New key - Add a translation - "item.page.filesection.name": "Name:", + "item.page.filesection.name": "Аты:", // "item.page.filesection.size": "Size:", - // TODO New key - Add a translation - "item.page.filesection.size": "Size:", - + "item.page.filesection.size": "Көлемі:", + // "item.page.journal.search.title": "Articles in this journal", - // TODO New key - Add a translation - "item.page.journal.search.title": "Articles in this journal", + "item.page.journal.search.title": "Осы журналдағы мақалалар", // "item.page.link.full": "Full item page", - // TODO New key - Add a translation - "item.page.link.full": "Full item page", + "item.page.link.full": "Өнімнің толық беті", // "item.page.link.simple": "Simple item page", - // TODO New key - Add a translation - "item.page.link.simple": "Simple item page", + "item.page.link.simple": "Тауардың қарапайым беті", // "item.page.person.search.title": "Articles by this author", - // TODO New key - Add a translation - "item.page.person.search.title": "Articles by this author", + "item.page.person.search.title": "Осы автордың мақалалары", // "item.page.related-items.view-more": "Show {{ amount }} more", - // TODO New key - Add a translation - "item.page.related-items.view-more": "Show {{ amount }} more", + "item.page.related-items.view-more": "{{ amount }} көбірек көрсету", // "item.page.related-items.view-less": "Hide last {{ amount }}", - // TODO New key - Add a translation - "item.page.related-items.view-less": "Hide last {{ amount }}", + "item.page.related-items.view-less": "Соңғы {{ amount }} жасыру", // "item.page.relationships.isAuthorOfPublication": "Publications", - // TODO New key - Add a translation - "item.page.relationships.isAuthorOfPublication": "Publications", + "item.page.relationships.isAuthorOfPublication": "Жарияланымдар", // "item.page.relationships.isJournalOfPublication": "Publications", - // TODO New key - Add a translation - "item.page.relationships.isJournalOfPublication": "Publications", + "item.page.relationships.isJournalOfPublication": "Жарияланымдар", // "item.page.relationships.isOrgUnitOfPerson": "Authors", - // TODO New key - Add a translation - "item.page.relationships.isOrgUnitOfPerson": "Authors", + "item.page.relationships.isOrgUnitOfPerson": "Авторлары", // "item.page.relationships.isOrgUnitOfProject": "Research Projects", - // TODO New key - Add a translation - "item.page.relationships.isOrgUnitOfProject": "Research Projects", + "item.page.relationships.isOrgUnitOfProject": "Зерттеу жобалары", // "item.page.subject": "Keywords", - // TODO New key - Add a translation - "item.page.subject": "Keywords", + "item.page.subject": "Кілт сөздер", // "item.page.uri": "URI", - // TODO New key - Add a translation "item.page.uri": "URI", // "item.page.bitstreams.view-more": "Show more", - // TODO New key - Add a translation - "item.page.bitstreams.view-more": "Show more", + "item.page.bitstreams.view-more": "Көбірек көрсету", // "item.page.bitstreams.collapse": "Collapse", - // TODO New key - Add a translation - "item.page.bitstreams.collapse": "Collapse", + "item.page.bitstreams.collapse": "Коллапс", // "item.page.filesection.original.bundle" : "Original bundle", - // TODO New key - Add a translation - "item.page.filesection.original.bundle" : "Original bundle", - + "item.page.filesection.original.bundle" : "Түпнұсқа жинақ", + // "item.page.filesection.license.bundle" : "License bundle", - // TODO New key - Add a translation - "item.page.filesection.license.bundle" : "License bundle", - + "item.page.filesection.license.bundle" : "Лицензиялық пакет", + // "item.preview.dc.identifier.uri": "Identifier:", - // TODO New key - Add a translation - "item.preview.dc.identifier.uri": "Identifier:", - + "item.preview.dc.identifier.uri": "Идентификатор:", + // "item.preview.dc.contributor.author": "Authors:", - // TODO New key - Add a translation - "item.preview.dc.contributor.author": "Authors:", - + "item.preview.dc.contributor.author":"Авторлар:", + // "item.preview.dc.date.issued": "Published date:", - // TODO New key - Add a translation - "item.preview.dc.date.issued": "Published date:", + "item.preview.dc.date.issued": "Жарияланған күні:", // "item.preview.dc.description.abstract": "Abstract:", - // TODO New key - Add a translation - "item.preview.dc.description.abstract": "Abstract:", + "item.preview.dc.description.abstract": "Аннотация:, // "item.preview.dc.identifier.other": "Other identifier:", - // TODO New key - Add a translation - "item.preview.dc.identifier.other": "Other identifier:", + "item.preview.dc.identifier.other": "Басқа идентификатор:", // "item.preview.dc.language.iso": "Language:", - // TODO New key - Add a translation - "item.preview.dc.language.iso": "Language:", + "item.preview.dc.language.iso": "Тіл:", // "item.preview.dc.subject": "Subjects:", - // TODO New key - Add a translation - "item.preview.dc.subject": "Subjects:", + "item.preview.dc.subject": "Тақырыбы:", // "item.preview.dc.title": "Title:", - // TODO New key - Add a translation - "item.preview.dc.title": "Title:", - + "item.preview.dc.title": "Атауы:", + // "item.preview.person.familyName": "Surname:", - // TODO New key - Add a translation - "item.preview.person.familyName": "Surname:", + "item.preview.person.familyName": "Тегі:", // "item.preview.person.givenName": "Name:", - // TODO New key - Add a translation - "item.preview.person.givenName": "Name:", + "item.preview.person.givenName": "Аты:", // "item.preview.person.identifier.orcid": "ORCID:", - // TODO New key - Add a translation "item.preview.person.identifier.orcid": "ORCID:", - - // "item.select.confirm": "Confirm selected", - // TODO New key - Add a translation - "item.select.confirm": "Confirm selected", +// "item.select.confirm": "Confirm selected", + "item.select.confirm": "Таңдауды растау", // "item.select.empty": "No items to show", - // TODO New key - Add a translation - "item.select.empty": "No items to show", + "item.select.empty":"Көрсету үшін элементтер жоқ", // "item.select.table.author": "Author", - // TODO New key - Add a translation - "item.select.table.author": "Author", + "item.select.table.author": "Автор", // "item.select.table.collection": "Collection", - // TODO New key - Add a translation - "item.select.table.collection": "Collection", + "item.select.table.collection": "Жинақ", // "item.select.table.title": "Title", - // TODO New key - Add a translation - "item.select.table.title": "Title", + "item.select.table.title": "Атауы", - - // "item.version.history.empty": "There are no other versions for this item yet.", - // TODO New key - Add a translation - "item.version.history.empty": "There are no other versions for this item yet.", +// "item.version.history.empty": "There are no other versions for this item yet.", + "item.version.history.empty": "Бұл тақырыпқа арналған басқа нұсқалар әлі жоқ"., // "item.version.history.head": "Version History", - // TODO New key - Add a translation - "item.version.history.head": "Version History", + "item.version.history.head": "Нұсқа тарихы", // "item.version.history.return": "Return", - // TODO New key - Add a translation - "item.version.history.return": "Return", + "item.version.history.return": "Возвращение", // "item.version.history.selected": "Selected version", - // TODO New key - Add a translation - "item.version.history.selected": "Selected version", + "item.version.history.selected": "Таңдалған нұсқа", // "item.version.history.table.version": "Version", - // TODO New key - Add a translation - "item.version.history.table.version": "Version", + "item.version.history.table.version": "Нұсқа", // "item.version.history.table.item": "Item", - // TODO New key - Add a translation - "item.version.history.table.item": "Item", + "item.version.history.table.item": "Пән", // "item.version.history.table.editor": "Editor", - // TODO New key - Add a translation - "item.version.history.table.editor": "Editor", + "item.version.history.table.editor": "Редакторы", // "item.version.history.table.date": "Date", - // TODO New key - Add a translation - "item.version.history.table.date": "Date", + "item.version.history.table.date":"Кездесуге", // "item.version.history.table.summary": "Summary", - // TODO New key - Add a translation - "item.version.history.table.summary": "Summary", + "item.version.history.table.summary": "Қысқаша мазмұны", - - - // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", - // TODO New key - Add a translation - "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", +// "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", + "item.version.notice": "Бұл өнімнің соңғы нұсқасы емес. Соңғы нұсқаны мына жердентабуға болады.", From 6a91a9c3e17f37891d19accc977a236710157772 Mon Sep 17 00:00:00 2001 From: myrza1 Date: Sat, 23 Apr 2022 17:59:49 +0600 Subject: [PATCH 009/119] Update kz.json5 transalte without admin section. Is it needs? --- src/assets/i18n/kz.json5 | 2576 +++++++++++++------------------------- 1 file changed, 865 insertions(+), 1711 deletions(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index f2e545f804..1da5fa5e0f 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -2932,297 +2932,211 @@ // "journal.listelement.badge": "Journal", - // TODO New key - Add a translation - "journal.listelement.badge": "Journal", + "journal.listelement.badge": "Журнал", // "journal.page.description": "Description", - // TODO New key - Add a translation - "journal.page.description": "Description", + "journal.page.description": "Сипаттама", // "journal.page.edit": "Edit this item", - // TODO New key - Add a translation - "journal.page.edit": "Edit this item", + "journal.page.edit": "Бұл элементті өңдеңіз", // "journal.page.editor": "Editor-in-Chief", - // TODO New key - Add a translation - "journal.page.editor": "Editor-in-Chief", + "journal.page.editor": "Бас редактор", // "journal.page.issn": "ISSN", - // TODO New key - Add a translation "journal.page.issn": "ISSN", // "journal.page.publisher": "Publisher", - // TODO New key - Add a translation - "journal.page.publisher": "Publisher", + "journal.page.publisher": "Баспагер", // "journal.page.titleprefix": "Journal: ", - // TODO New key - Add a translation - "journal.page.titleprefix": "Journal: ", + "journal.page.titleprefix": "Күнделік:", // "journal.search.results.head": "Journal Search Results", - // TODO New key - Add a translation - "journal.search.results.head": "Journal Search Results", + "journal.search.results.head":"Журналдағы іздеу нәтижелері", // "journal.search.title": "DSpace Angular :: Journal Search", - // TODO New key - Add a translation - "journal.search.title": "DSpace Angular :: Journal Search", - - - + "journal.search.title": "DSpace Angular :: Журналдағы іздеу", + // "journalissue.listelement.badge": "Journal Issue", - // TODO New key - Add a translation - "journalissue.listelement.badge": "Journal Issue", + "journalissue.listelement.badge": "Журнал шығару", // "journalissue.page.description": "Description", - // TODO New key - Add a translation - "journalissue.page.description": "Description", + "journalissue.page.description": "Сипаттамасы", // "journalissue.page.edit": "Edit this item", - // TODO New key - Add a translation - "journalissue.page.edit": "Edit this item", + "journalissue.page.edit": "Бұл элементті өңдеу", // "journalissue.page.issuedate": "Issue Date", - // TODO New key - Add a translation - "journalissue.page.issuedate": "Issue Date", + "journalissue.page.issuedate": "Шығарылған күні", // "journalissue.page.journal-issn": "Journal ISSN", - // TODO New key - Add a translation - "journalissue.page.journal-issn": "Journal ISSN", + "journalissue.page.journal-issn":"ISSN журналы", // "journalissue.page.journal-title": "Journal Title", - // TODO New key - Add a translation - "journalissue.page.journal-title": "Journal Title", + "journalissue.page.journal-title": "Журнал атауы", // "journalissue.page.keyword": "Keywords", - // TODO New key - Add a translation - "journalissue.page.keyword": "Keywords", + "journalissue.page.keyword":"Түйінді сөздер", // "journalissue.page.number": "Number", - // TODO New key - Add a translation - "journalissue.page.number": "Number", + "journalissue.page.number": "Саны", // "journalissue.page.titleprefix": "Journal Issue: ", - // TODO New key - Add a translation - "journalissue.page.titleprefix": "Journal Issue: ", + "journalissue.page.titleprefix": "Журнал нөмірі:", - - - // "journalvolume.listelement.badge": "Journal Volume", - // TODO New key - Add a translation - "journalvolume.listelement.badge": "Journal Volume", +// "journalvolume.listelement.badge": "Journal Volume", + "journalvolume.listelement.badge":"Журнал көлемі", // "journalvolume.page.description": "Description", - // TODO New key - Add a translation - "journalvolume.page.description": "Description", + "journalvolume.page.description": "Сипаттама", // "journalvolume.page.edit": "Edit this item", - // TODO New key - Add a translation - "journalvolume.page.edit": "Edit this item", + "journalvolume.page.edit": "Бұл элементті өңдеу", // "journalvolume.page.issuedate": "Issue Date", - // TODO New key - Add a translation - "journalvolume.page.issuedate": "Issue Date", + "journalvolume.page.issuedate": "Шығарылған күні", // "journalvolume.page.titleprefix": "Journal Volume: ", - // TODO New key - Add a translation - "journalvolume.page.titleprefix": "Journal Volume: ", + "journalvolume.page.titleprefix":"Журнал көлемі:", // "journalvolume.page.volume": "Volume", - // TODO New key - Add a translation - "journalvolume.page.volume": "Volume", + "journalvolume.page.volume": "Көлемі", - - - // "loading.bitstream": "Loading bitstream...", - // TODO New key - Add a translation - "loading.bitstream": "Loading bitstream...", +// "loading.bitstream": "Loading bitstream...", + "loading.bitstream": "Бит ағынын жүктеу...", // "loading.bitstreams": "Loading bitstreams...", - // TODO New key - Add a translation - "loading.bitstreams": "Loading bitstreams...", - + "loading.bitstreams": "Бит ағындарын жүктеу...", + // "loading.browse-by": "Loading items...", - // TODO New key - Add a translation - "loading.browse-by": "Loading items...", + "loading.browse-by": "Заттарды жүктеу...", // "loading.browse-by-page": "Loading page...", - // TODO New key - Add a translation - "loading.browse-by-page": "Loading page...", + "loading.browse-by-page": "Жүктеу беті...", // "loading.collection": "Loading collection...", - // TODO New key - Add a translation - "loading.collection": "Loading collection...", + "loading.collection": "Жинақты жүктеу...", // "loading.collections": "Loading collections...", - // TODO New key - Add a translation - "loading.collections": "Loading collections...", + "loading.collections":"Топтамаларды жүктеу...", // "loading.content-source": "Loading content source...", - // TODO New key - Add a translation - "loading.content-source": "Loading content source...", + "loading.content-source": "Мазмұн көзін жүктеу...", // "loading.community": "Loading community...", - // TODO New key - Add a translation - "loading.community": "Loading community...", + "loading.community": "Жүктеу қауымдастығы...", // "loading.default": "Loading...", - // TODO New key - Add a translation - "loading.default": "Loading...", + "loading.default": "Жүктеу...", // "loading.item": "Loading item...", - // TODO New key - Add a translation - "loading.item": "Loading item...", + "loading.item": "Тауарды жүктеу...", // "loading.items": "Loading items...", - // TODO New key - Add a translation - "loading.items": "Loading items...", + "loading.items": "Заттарды жүктеу...", // "loading.mydspace-results": "Loading items...", - // TODO New key - Add a translation - "loading.mydspace-results": "Loading items...", + "loading.mydspace-results": "Заттарды жүктеу...", // "loading.objects": "Loading...", - // TODO New key - Add a translation - "loading.objects": "Loading...", + "loading.objects":"Жүктеу...", // "loading.recent-submissions": "Loading recent submissions...", - // TODO New key - Add a translation - "loading.recent-submissions": "Loading recent submissions...", + "loading.recent-submissions": "Соңғы жіберілімдер жүктелуде...", // "loading.search-results": "Loading search results...", - // TODO New key - Add a translation - "loading.search-results": "Loading search results...", + "loading.search-results": "Іздеу нәтижелері жүктелуде...", // "loading.sub-collections": "Loading sub-collections...", - // TODO New key - Add a translation - "loading.sub-collections": "Loading sub-collections...", + "loading.sub-collections": "Ішкі жинақтар жүктелуде...", // "loading.sub-communities": "Loading sub-communities...", - // TODO New key - Add a translation - "loading.sub-communities": "Loading sub-communities...", + "loading.sub-communities":"Қосымша қауымдастықтар жүктелуде...", // "loading.top-level-communities": "Loading top-level communities...", - // TODO New key - Add a translation - "loading.top-level-communities": "Loading top-level communities...", - - - + "loading.top-level-communities": "Жоғарғы деңгейдегі қауымдастықтар жүктелуде...", + // "login.form.email": "Email address", - // TODO New key - Add a translation - "login.form.email": "Email address", + "login.form.email": "Электрондық пошта", // "login.form.forgot-password": "Have you forgotten your password?", - // TODO New key - Add a translation - "login.form.forgot-password": "Have you forgotten your password?", + "login.form.forgot-password":"Сіз парольді ұмыттыңыз ба?", // "login.form.header": "Please log in to DSpace", - // TODO New key - Add a translation - "login.form.header": "Please log in to DSpace", + "login.form.header":"DSpace жүйесіне кіріңіз", // "login.form.new-user": "New user? Click here to register.", - // TODO New key - Add a translation - "login.form.new-user": "New user? Click here to register.", + "login.form.new-user":"Жаңа пайдаланушы? Тіркелу үшін осы жерді басыңыз.", // "login.form.or-divider": "or", - // TODO New key - Add a translation - "login.form.or-divider": "or", + "login.form.or-divider": "немесе", // "login.form.password": "Password", - // TODO New key - Add a translation - "login.form.password": "Password", + "login.form.password":"Пароль", // "login.form.shibboleth": "Log in with Shibboleth", - // TODO New key - Add a translation - "login.form.shibboleth": "Log in with Shibboleth", + "login.form.shibboleth": "Шибболетпен кіру", // "login.form.submit": "Log in", - // TODO New key - Add a translation - "login.form.submit": "Log in", + "login.form.submit": "Кіру", // "login.title": "Login", - // TODO New key - Add a translation - "login.title": "Login", + "login.title": "Кіру", // "login.breadcrumbs": "Login", - // TODO New key - Add a translation - "login.breadcrumbs": "Login", - - - + "login.breadcrumbs": "Кіру", + // "logout.form.header": "Log out from DSpace", - // TODO New key - Add a translation - "logout.form.header": "Log out from DSpace", + "logout.form.header": "DSpace жүйесінен шығу", // "logout.form.submit": "Log out", - // TODO New key - Add a translation - "logout.form.submit": "Log out", + "logout.form.submit": "Шығу", // "logout.title": "Logout", - // TODO New key - Add a translation - "logout.title": "Logout", - - - + "logout.title":"Шығу", + // "menu.header.admin": "Admin", - // TODO New key - Add a translation - "menu.header.admin": "Admin", + "menu.header.admin": "Әкімші", // "menu.header.image.logo": "Repository logo", - // TODO New key - Add a translation - "menu.header.image.logo": "Repository logo", - - - + "menu.header.image.logo": "Репозиторий логотипі", + // "menu.section.access_control": "Access Control", - // TODO New key - Add a translation - "menu.section.access_control": "Access Control", + "menu.section.access_control": "Қатынасты басқару", // "menu.section.access_control_authorizations": "Authorizations", - // TODO New key - Add a translation - "menu.section.access_control_authorizations": "Authorizations", + "menu.section.access_control_authorizations":"Рұқсаттар", // "menu.section.access_control_groups": "Groups", - // TODO New key - Add a translation - "menu.section.access_control_groups": "Groups", + "menu.section.access_control_groups": "Топтар", // "menu.section.access_control_people": "People", - // TODO New key - Add a translation - "menu.section.access_control_people": "People", - - - + "menu.section.access_control_people": "Адамдар", + // "menu.section.admin_search": "Admin Search", - // TODO New key - Add a translation - "menu.section.admin_search": "Admin Search", - - - + "menu.section.admin_search":"Әкімші іздеу", + // "menu.section.browse_community": "This Community", - // TODO New key - Add a translation - "menu.section.browse_community": "This Community", + "menu.section.browse_community": "Бұл қауымдастық", // "menu.section.browse_community_by_author": "By Author", - // TODO New key - Add a translation - "menu.section.browse_community_by_author": "By Author", + "menu.section.browse_community_by_author": "Автор бойынша", // "menu.section.browse_community_by_issue_date": "By Issue Date", - // TODO New key - Add a translation - "menu.section.browse_community_by_issue_date": "By Issue Date", + "menu.section.browse_community_by_issue_date": "Шығарылған күні бойынша", // "menu.section.browse_community_by_title": "By Title", - // TODO New key - Add a translation - "menu.section.browse_community_by_title": "By Title", + "menu.section.browse_community_by_title": "Тақырып бойынша", // "menu.section.browse_global": "All of DSpace", - // TODO New key - Add a translation - "menu.section.browse_global": "All of DSpace", + "menu.section.browse_global": "Барлық DSpace", // "menu.section.browse_global_by_author": "By Author", "menu.section.browse_global_by_author": "Авторымен", // "menu.section.browse_global_by_dateissued": "By Issue Date", - // TODO New key - Add a translation - "menu.section.browse_global_by_dateissued": "By Issue Date", + "menu.section.browse_global_by_dateissued": "Шығарылған күні бойынша", // "menu.section.browse_global_by_subject": "By Subject", "menu.section.browse_global_by_subject": "Тақырыбымен", @@ -3232,2820 +3146,2060 @@ // "menu.section.browse_global_communities_and_collections": "Communities & Collections", "menu.section.browse_global_communities_and_collections": "Қауымдастықтар мен коллекциялар", - - - + // "menu.section.control_panel": "Control Panel", - // TODO New key - Add a translation - "menu.section.control_panel": "Control Panel", + "menu.section.control_panel":"Басқару панелі", // "menu.section.curation_task": "Curation Task", - // TODO New key - Add a translation - "menu.section.curation_task": "Curation Task", + "menu.section.curation_task": "Тапсырма" - - - // "menu.section.edit": "Edit", - // TODO New key - Add a translation - "menu.section.edit": "Edit", +// "menu.section.edit": "Edit", + "menu.section.edit":"Өңдеу", // "menu.section.edit_collection": "Collection", - // TODO New key - Add a translation - "menu.section.edit_collection": "Collection", + "menu.section.edit_collection": "Жинақ", // "menu.section.edit_community": "Community", - // TODO New key - Add a translation - "menu.section.edit_community": "Community", + "menu.section.edit_community": "Қауымдастық", // "menu.section.edit_item": "Item", - // TODO New key - Add a translation - "menu.section.edit_item": "Item", - - - + "menu.section.edit_item": "Жол", + // "menu.section.export": "Export", - // TODO New key - Add a translation - "menu.section.export": "Export", + "menu.section.export": "Экспорт", // "menu.section.export_collection": "Collection", - // TODO New key - Add a translation - "menu.section.export_collection": "Collection", - + "menu.section.export_collection": "Жинақ", + // "menu.section.export_community": "Community", - // TODO New key - Add a translation - "menu.section.export_community": "Community", + "menu.section.export_community": "Қауымдастық", // "menu.section.export_item": "Item", - // TODO New key - Add a translation - "menu.section.export_item": "Item", + "menu.section.export_item": "Жол" // "menu.section.export_metadata": "Metadata", - // TODO New key - Add a translation - "menu.section.export_metadata": "Metadata", - - - + "menu.section.export_metadata": "Метадеректер", + // "menu.section.icon.access_control": "Access Control menu section", - // TODO New key - Add a translation - "menu.section.icon.access_control": "Access Control menu section", + "menu.section.icon.access_control": "Қатынасты басқару мәзірі бөлімі", // "menu.section.icon.admin_search": "Admin search menu section", - // TODO New key - Add a translation - "menu.section.icon.admin_search": "Admin search menu section", + "menu.section.icon.admin_search": "Әкімші іздеу мәзірі бөлімі", // "menu.section.icon.control_panel": "Control Panel menu section", - // TODO New key - Add a translation - "menu.section.icon.control_panel": "Control Panel menu section", + "menu.section.icon.control_panel": "Басқару тақтасының мәзір бөлімі", // "menu.section.icon.curation_task": "Curation Task menu section", - // TODO New key - Add a translation - "menu.section.icon.curation_task": "Curation Task menu section", + "menu.section.icon.curation_task": "Кураторлық тапсырма мәзірі бөлімі", // "menu.section.icon.edit": "Edit menu section", - // TODO New key - Add a translation - "menu.section.icon.edit": "Edit menu section", - + "menu.section.icon.edit": "Өңдеу мәзір бөлімі", + // "menu.section.icon.export": "Export menu section", - // TODO New key - Add a translation - "menu.section.icon.export": "Export menu section", + "menu.section.icon.export": "Экспорт мәзірі бөлімі", // "menu.section.icon.find": "Find menu section", - // TODO New key - Add a translation - "menu.section.icon.find": "Find menu section", + "menu.section.icon.find": "Мәзір бөлімін табу", // "menu.section.icon.import": "Import menu section", - // TODO New key - Add a translation - "menu.section.icon.import": "Import menu section", + "menu.section.icon.import": "Импорттау мәзірі бөлімі", // "menu.section.icon.new": "New menu section", - // TODO New key - Add a translation - "menu.section.icon.new": "New menu section", + "menu.section.icon.new": "Жаңа мәзір бөлімі", // "menu.section.icon.pin": "Pin sidebar", - // TODO New key - Add a translation - "menu.section.icon.pin": "Pin sidebar", + "menu.section.icon.pin": "Бүйірлік тақтаны бекіту", // "menu.section.icon.processes": "Processes menu section", - // TODO New key - Add a translation - "menu.section.icon.processes": "Processes menu section", + "menu.section.icon.processes": "Процесстер мәзірі бөлімі", // "menu.section.icon.registries": "Registries menu section", - // TODO New key - Add a translation - "menu.section.icon.registries": "Registries menu section", + "menu.section.icon.registries": "Тіркеулер мәзірі бөлімі", // "menu.section.icon.statistics_task": "Statistics Task menu section", - // TODO New key - Add a translation - "menu.section.icon.statistics_task": "Statistics Task menu section", + "menu.section.icon.statistics_task": "Статистика тапсырмалары мәзірі бөлімі", // "menu.section.icon.unpin": "Unpin sidebar", - // TODO New key - Add a translation - "menu.section.icon.unpin": "Unpin sidebar", - - + "menu.section.icon.unpin": "Бүйірлік тақтаны босату", // "menu.section.import": "Import", - // TODO New key - Add a translation - "menu.section.import": "Import", + "menu.section.import": "Импорттау", // "menu.section.import_batch": "Batch Import (ZIP)", - // TODO New key - Add a translation - "menu.section.import_batch": "Batch Import (ZIP)", + "menu.section.import_batch": "Пакеттік импорт (ZIP)", // "menu.section.import_metadata": "Metadata", - // TODO New key - Add a translation - "menu.section.import_metadata": "Metadata", - - - + "menu.section.import_metadata": "Метадеректер", + // "menu.section.new": "New", - // TODO New key - Add a translation - "menu.section.new": "New", + "menu.section.new": "Жаңа", // "menu.section.new_collection": "Collection", - // TODO New key - Add a translation - "menu.section.new_collection": "Collection", + "menu.section.new_collection": "Жинақ", // "menu.section.new_community": "Community", - // TODO New key - Add a translation - "menu.section.new_community": "Community", + "menu.section.new_community": "Қауымдастық", // "menu.section.new_item": "Item", - // TODO New key - Add a translation - "menu.section.new_item": "Item", + "menu.section.new_item": "Жол", // "menu.section.new_item_version": "Item Version", - // TODO New key - Add a translation - "menu.section.new_item_version": "Item Version", + "menu.section.new_item_version": "Элемент нұсқасы", // "menu.section.new_process": "Process", - // TODO New key - Add a translation - "menu.section.new_process": "Process", - - - + "menu.section.new_process": "Процесс", + // "menu.section.pin": "Pin sidebar", - // TODO New key - Add a translation - "menu.section.pin": "Pin sidebar", + "menu.section.pin": "Бүйірлік тақтаны бекіту", // "menu.section.unpin": "Unpin sidebar", - // TODO New key - Add a translation - "menu.section.unpin": "Unpin sidebar", - - - + "menu.section.unpin": "Бүйірлік тақтаны босату", + // "menu.section.processes": "Processes", - // TODO New key - Add a translation - "menu.section.processes": "Processes", - - - + "menu.section.processes": "процестер", + // "menu.section.registries": "Registries", - // TODO New key - Add a translation - "menu.section.registries": "Registries", + "menu.section.registries": "Тіркеулер", // "menu.section.registries_format": "Format", - // TODO New key - Add a translation - "menu.section.registries_format": "Format", + "menu.section.registries_format": "Формат", // "menu.section.registries_metadata": "Metadata", - // TODO New key - Add a translation - "menu.section.registries_metadata": "Metadata", - - - + "menu.section.registries_metadata": "Метадеректер", + // "menu.section.statistics": "Statistics", - // TODO New key - Add a translation - "menu.section.statistics": "Statistics", + "menu.section.statistics": "Статистика", // "menu.section.statistics_task": "Statistics Task", - // TODO New key - Add a translation - "menu.section.statistics_task": "Statistics Task", - - - + "menu.section.statistics_task": "Статистика тапсырмасы", + // "menu.section.toggle.access_control": "Toggle Access Control section", - // TODO New key - Add a translation - "menu.section.toggle.access_control": "Toggle Access Control section", + "menu.section.toggle.access_control": "Қатынасты басқару бөлімін ауыстырып-қосқыш", // "menu.section.toggle.control_panel": "Toggle Control Panel section", - // TODO New key - Add a translation - "menu.section.toggle.control_panel": "Toggle Control Panel section", + "menu.section.toggle.control_panel": "Басқару тақтасы бөлімін ауыстыру", // "menu.section.toggle.curation_task": "Toggle Curation Task section", - // TODO New key - Add a translation - "menu.section.toggle.curation_task": "Toggle Curation Task section", + "menu.section.toggle.curation_task": "Тапсырма бөлімін өзгерту", // "menu.section.toggle.edit": "Toggle Edit section", - // TODO New key - Add a translation - "menu.section.toggle.edit": "Toggle Edit section", + "menu.section.toggle.edit": "Өңдеу бөлімін ауыстырып қосу", // "menu.section.toggle.export": "Toggle Export section", - // TODO New key - Add a translation - "menu.section.toggle.export": "Toggle Export section", + "menu.section.toggle.export": "Экспорттау бөлімін ауыстыру", // "menu.section.toggle.find": "Toggle Find section", - // TODO New key - Add a translation - "menu.section.toggle.find": "Toggle Find section", + "menu.section.toggle.find": "Табу бөлімін қосу/өшіру", // "menu.section.toggle.import": "Toggle Import section", - // TODO New key - Add a translation - "menu.section.toggle.import": "Toggle Import section", - + "menu.section.toggle.import": "Импорттау бөлімін ауыстырып қосу", + // "menu.section.toggle.new": "Toggle New section", - // TODO New key - Add a translation - "menu.section.toggle.new": "Toggle New section", + "menu.section.toggle.new": "Жаңа бөлімді ауыстыру", // "menu.section.toggle.registries": "Toggle Registries section", - // TODO New key - Add a translation - "menu.section.toggle.registries": "Toggle Registries section", + "menu.section.toggle.registries": "Тізілімдер бөлімін ауыстырып қосу", // "menu.section.toggle.statistics_task": "Toggle Statistics Task section", - // TODO New key - Add a translation - "menu.section.toggle.statistics_task": "Toggle Statistics Task section", - + "menu.section.toggle.statistics_task": "Статистика тапсырмасы бөлімін ауыстыру", // "menu.section.workflow": "Administer Workflow", - // TODO New key - Add a translation - "menu.section.workflow": "Administer Workflow", + "menu.section.workflow": "Жұмыс процесін басқару", // "mydspace.description": "", - // TODO New key - Add a translation "mydspace.description": "", // "mydspace.general.text-here": "here", - // TODO New key - Add a translation - "mydspace.general.text-here": "here", + "mydspace.general.text-here":"Мұнда", // "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", - // TODO New key - Add a translation - "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", + "mydspace.messages.controller-help": "Элемент жіберушіге хабарлама жіберу үшін осы опцияны таңдаңыз.", // "mydspace.messages.description-placeholder": "Insert your message here...", - // TODO New key - Add a translation - "mydspace.messages.description-placeholder": "Insert your message here...", + "mydspace.messages.description-placeholder": "Хабарыңызды осында енгізіңіз...", // "mydspace.messages.hide-msg": "Hide message", - // TODO New key - Add a translation - "mydspace.messages.hide-msg": "Hide message", + "mydspace.messages.hide-msg": "Хабарламаны жасыру", // "mydspace.messages.mark-as-read": "Mark as read", - // TODO New key - Add a translation - "mydspace.messages.mark-as-read": "Mark as read", + "mydspace.messages.mark-as-read": "Оқылған деп белгілеу", // "mydspace.messages.mark-as-unread": "Mark as unread", - // TODO New key - Add a translation - "mydspace.messages.mark-as-unread": "Mark as unread", + "mydspace.messages.mark-as-unread": "Оқылмаған деп белгілеу", // "mydspace.messages.no-content": "No content.", - // TODO New key - Add a translation - "mydspace.messages.no-content": "No content.", + "mydspace.messages.no-content":"Мазмұн жоқ.", // "mydspace.messages.no-messages": "No messages yet.", - // TODO New key - Add a translation - "mydspace.messages.no-messages": "No messages yet.", + "mydspace.messages.no-messages": "Әлі хабарлар жоқ.", // "mydspace.messages.send-btn": "Send", - // TODO New key - Add a translation - "mydspace.messages.send-btn": "Send", + "mydspace.messages.send-btn": "Жіберу", // "mydspace.messages.show-msg": "Show message", - // TODO New key - Add a translation - "mydspace.messages.show-msg": "Show message", + "mydspace.messages.show-msg": "Хабарды көрсету", // "mydspace.messages.subject-placeholder": "Subject...", - // TODO New key - Add a translation - "mydspace.messages.subject-placeholder": "Subject...", + "mydspace.messages.subject-placeholder": "Тақырып...", // "mydspace.messages.submitter-help": "Select this option to send a message to controller.", - // TODO New key - Add a translation - "mydspace.messages.submitter-help": "Select this option to send a message to controller.", + "mydspace.messages.submitter-help": "Контроллерге хабарлама жіберу үшін осы опцияны таңдаңыз.", // "mydspace.messages.title": "Messages", - // TODO New key - Add a translation - "mydspace.messages.title": "Messages", + "mydspace.messages.title":"Хабарлар", // "mydspace.messages.to": "To", - // TODO New key - Add a translation - "mydspace.messages.to": "To", + "mydspace.messages.to": "Кімге", // "mydspace.new-submission": "New submission", - // TODO New key - Add a translation - "mydspace.new-submission": "New submission", + "mydspace.new-submission": "Жаңа жіберу", // "mydspace.new-submission-external": "Import metadata from external source", - // TODO New key - Add a translation - "mydspace.new-submission-external": "Import metadata from external source", + "mydspace.new-submission-external": "Сыртқы көзден метадеректерді импорттау", // "mydspace.new-submission-external-short": "Import metadata", - // TODO New key - Add a translation - "mydspace.new-submission-external-short": "Import metadata", + "mydspace.new-submission-external-short": "Метадеректерді импорттау", // "mydspace.results.head": "Your submissions", - // TODO New key - Add a translation - "mydspace.results.head": "Your submissions", + "mydspace.results.head": "Сіздің өтініштеріңіз", // "mydspace.results.no-abstract": "No Abstract", - // TODO New key - Add a translation - "mydspace.results.no-abstract": "No Abstract", + "mydspace.results.no-abstract": "Реферат жоқ", // "mydspace.results.no-authors": "No Authors", - // TODO New key - Add a translation - "mydspace.results.no-authors": "No Authors", + "mydspace.results.no-authors": "Авторлар жоқ", // "mydspace.results.no-collections": "No Collections", - // TODO New key - Add a translation - "mydspace.results.no-collections": "No Collections", - + "mydspace.results.no-collections": "Жинақтар жоқ", + // "mydspace.results.no-date": "No Date", - // TODO New key - Add a translation - "mydspace.results.no-date": "No Date", + "mydspace.results.no-date": "Күні жоқ", // "mydspace.results.no-files": "No Files", - // TODO New key - Add a translation - "mydspace.results.no-files": "No Files", + "mydspace.results.no-files": "Файлдар жоқ", // "mydspace.results.no-results": "There were no items to show", - // TODO New key - Add a translation - "mydspace.results.no-results": "There were no items to show", + "mydspace.results.no-results": "Көрсетілетін заттар жоқ", // "mydspace.results.no-title": "No title", - // TODO New key - Add a translation - "mydspace.results.no-title": "No title", + "mydspace.results.no-title": "Атауы жоқ", // "mydspace.results.no-uri": "No Uri", - // TODO New key - Add a translation - "mydspace.results.no-uri": "No Uri", + "mydspace.results.no-uri": "Uri жоқ", // "mydspace.show.workflow": "All tasks", - // TODO New key - Add a translation - "mydspace.show.workflow": "All tasks", + "mydspace.show.workflow": "Барлық тапсырмалар", // "mydspace.show.workspace": "Your Submissions", - // TODO New key - Add a translation - "mydspace.show.workspace": "Your Submissions", + "mydspace.show.workspace":"Сіздің өтініштеріңіз", // "mydspace.status.archived": "Archived", - // TODO New key - Add a translation - "mydspace.status.archived": "Archived", + "mydspace.status.archived": "Мұрағатталған", // "mydspace.status.validation": "Validation", - // TODO New key - Add a translation - "mydspace.status.validation": "Validation", + "mydspace.status.validation": "Валидация", // "mydspace.status.waiting-for-controller": "Waiting for controller", - // TODO New key - Add a translation - "mydspace.status.waiting-for-controller": "Waiting for controller", + "mydspace.status.waiting-for-controller": "Контроллерді күтуде", // "mydspace.status.workflow": "Workflow", - // TODO New key - Add a translation - "mydspace.status.workflow": "Workflow", + "mydspace.status.workflow":"Жұмыс барысы", // "mydspace.status.workspace": "Workspace", - // TODO New key - Add a translation - "mydspace.status.workspace": "Workspace", + "mydspace.status.workspace": "Жұмыс кеңістігі", // "mydspace.title": "MyDSpace", - // TODO New key - Add a translation - "mydspace.title": "MyDSpace", - + "mydspace.title":"MyDSpace", + // "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", - // TODO New key - Add a translation - "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", + "mydspace.upload.upload-failed": "Жаңа жұмыс кеңістігін жасау қатесі. Қайталаудан бұрын жүктеп салынған мазмұнды тексеріңіз.", // "mydspace.upload.upload-failed-manyentries": "Unprocessable file. Detected too many entries but allowed only one for file.", - // TODO New key - Add a translation - "mydspace.upload.upload-failed-manyentries": "Unprocessable file. Detected too many entries but allowed only one for file.", - + "mydspace.upload.upload-failed-manyentries": "Өңделмейтін файл. Тым көп жазбалар анықталды, бірақ файл үшін тек біреуіне рұқсат етілді.", + // "mydspace.upload.upload-failed-moreonefile": "Unprocessable request. Only one file is allowed.", - // TODO New key - Add a translation - "mydspace.upload.upload-failed-moreonefile": "Unprocessable request. Only one file is allowed.", - + "mydspace.upload.upload-failed-moreonefile": "Өңделмейтін сұрау. Тек бір файлға рұқсат етілген.", + // "mydspace.upload.upload-multiple-successful": "{{qty}} new workspace items created.", - // TODO New key - Add a translation - "mydspace.upload.upload-multiple-successful": "{{qty}} new workspace items created.", - + "mydspace.upload.upload-multiple-successful": "{{qty}} жаңа жұмыс кеңістігі элементтері жасалды.", + // "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", - // TODO New key - Add a translation - "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", + "mydspace.upload.upload-successful": "Жаңа жұмыс кеңістігі элементі жасалды. Оны өңдеу үшін {{осында}} басыңыз.", // "mydspace.view-btn": "View", - // TODO New key - Add a translation - "mydspace.view-btn": "View", + "mydspace.view-btn": "Көру", - - - // "nav.browse.header": "All of DSpace", - // TODO New key - Add a translation - "nav.browse.header": "All of DSpace", +// "nav.browse.header": "All of DSpace", + "nav.browse.header": "Барлық DSpace", // "nav.community-browse.header": "By Community", - // TODO New key - Add a translation - "nav.community-browse.header": "By Community", + "nav.community-browse.header": "Қауымдастық бойынша", // "nav.language": "Language switch", - // TODO New key - Add a translation - "nav.language": "Language switch", + "nav.language": "Тілді ауыстыру", // "nav.login": "Log In", - // TODO New key - Add a translation - "nav.login": "Log In", + "nav.login": "Кіру", // "nav.logout": "Log Out", - // TODO New key - Add a translation - "nav.logout": "Log Out", + "nav.logout": "Шығу" // "nav.mydspace": "MyDSpace", - // TODO New key - Add a translation "nav.mydspace": "MyDSpace", // "nav.profile": "Profile", - // TODO New key - Add a translation - "nav.profile": "Profile", + "nav.profile": "Профиль", // "nav.search": "Search", - // TODO New key - Add a translation - "nav.search": "Search", + "nav.search": "Іздеу", // "nav.statistics.header": "Statistics", - // TODO New key - Add a translation - "nav.statistics.header": "Statistics", + "nav.statistics.header": "Статистика", // "nav.stop-impersonating": "Stop impersonating EPerson", - // TODO New key - Add a translation - "nav.stop-impersonating": "Stop impersonating EPerson", - - - + "nav.stop-impersonating": "Eperson атын шығаруды тоқтатыңыз", + // "orgunit.listelement.badge": "Organizational Unit", - // TODO New key - Add a translation - "orgunit.listelement.badge": "Organizational Unit", - + "orgunit.listelement.badge": "Ұйымдық бөлімше", + // "orgunit.page.city": "City", - // TODO New key - Add a translation - "orgunit.page.city": "City", + "orgunit.page.city": "Қала", // "orgunit.page.country": "Country", - // TODO New key - Add a translation - "orgunit.page.country": "Country", + "orgunit.page.country": "Ел", // "orgunit.page.dateestablished": "Date established", - // TODO New key - Add a translation - "orgunit.page.dateestablished": "Date established", + "orgunit.page.dateestablished": "Орнатылған күні", // "orgunit.page.description": "Description", - // TODO New key - Add a translation - "orgunit.page.description": "Description", + "orgunit.page.description":"Сипаттамасы", // "orgunit.page.edit": "Edit this item", - // TODO New key - Add a translation - "orgunit.page.edit": "Edit this item", - + "orgunit.page.edit": "Осы элементті өңдеу", + // "orgunit.page.id": "ID", - // TODO New key - Add a translation "orgunit.page.id": "ID", // "orgunit.page.titleprefix": "Organizational Unit: ", - // TODO New key - Add a translation - "orgunit.page.titleprefix": "Organizational Unit: ", - - - + "orgunit.page.titleprefix": "Ұйымдық бөлімше:", + // "pagination.results-per-page": "Results Per Page", - // TODO New key - Add a translation - "pagination.results-per-page": "Results Per Page", + "pagination.results-per-page": "Әр беттегі нәтижелер", // "pagination.showing.detail": "{{ range }} of {{ total }}", - // TODO New key - Add a translation - "pagination.showing.detail": "{{ range }} of {{ total }}", + "pagination.showing.detail": "{{ жалпы }} ішінен {{ диапазон }}", // "pagination.showing.label": "Now showing ", - // TODO New key - Add a translation - "pagination.showing.label": "Now showing ", - + "pagination.showing.label": "Қазір көрсету", + // "pagination.sort-direction": "Sort Options", - // TODO New key - Add a translation - "pagination.sort-direction": "Sort Options", - - - + "pagination.sort-direction": "Сұрыптау опциялары", + // "person.listelement.badge": "Person", - // TODO New key - Add a translation - "person.listelement.badge": "Person", + "person.listelement.badge": "Адам", // "person.listelement.no-title": "No name found", - // TODO New key - Add a translation - "person.listelement.no-title": "No name found", + "person.listelement.no-title":"Ешқандай атау табылмады", // "person.page.birthdate": "Birth Date", - // TODO New key - Add a translation - "person.page.birthdate": "Birth Date", + "person.page.birthdate": "Туылған күні", // "person.page.edit": "Edit this item", - // TODO New key - Add a translation - "person.page.edit": "Edit this item", + "person.page.edit": "Бұл элементті өңдеу", // "person.page.email": "Email Address", - // TODO New key - Add a translation - "person.page.email": "Email Address", + "person.page.email": "Электрондық мекенжайы", // "person.page.firstname": "First Name", - // TODO New key - Add a translation - "person.page.firstname": "First Name", + "person.page.firstname":"Имя", // "person.page.jobtitle": "Job Title", - // TODO New key - Add a translation - "person.page.jobtitle": "Job Title", - + "person.page.jobtitle": "Жұмыс атауы", + // "person.page.lastname": "Last Name", - // TODO New key - Add a translation - "person.page.lastname": "Last Name", + "person.page.lastname": "Фамилия", // "person.page.link.full": "Show all metadata", - // TODO New key - Add a translation - "person.page.link.full": "Show all metadata", + "person.page.link.full": "Барлық метамәліметті көрсету", // "person.page.orcid": "ORCID", - // TODO New key - Add a translation "person.page.orcid": "ORCID", // "person.page.staffid": "Staff ID", - // TODO New key - Add a translation - "person.page.staffid": "Staff ID", + "person.page.staffid": "Қызметкерлердің жеке куәлігі", // "person.page.titleprefix": "Person: ", - // TODO New key - Add a translation - "person.page.titleprefix": "Person: ", + "person.page.titleprefix":"Адам:", // "person.search.results.head": "Person Search Results", - // TODO New key - Add a translation - "person.search.results.head": "Person Search Results", + "person.search.results.head": "Тұлға іздеу нәтижелері", // "person.search.title": "DSpace Angular :: Person Search", - // TODO New key - Add a translation - "person.search.title": "DSpace Angular :: Person Search", - - - + "person.search.title": "DSpace Angular :: Адамды іздеу", + // "process.new.select-parameters": "Parameters", - // TODO New key - Add a translation - "process.new.select-parameters": "Parameters", + "process.new.select-parameters":"Параметрлер", // "process.new.cancel": "Cancel", - // TODO New key - Add a translation - "process.new.cancel": "Cancel", + "process.new.cancel": "Болдырмау", // "process.new.submit": "Submit", - // TODO New key - Add a translation - "process.new.submit": "Submit", + "process.new.submit": "Жіберу", // "process.new.select-script": "Script", - // TODO New key - Add a translation - "process.new.select-script": "Script", + "process.new.select-script": "Сценарий", // "process.new.select-script.placeholder": "Choose a script...", - // TODO New key - Add a translation - "process.new.select-script.placeholder": "Choose a script...", + "process.new.select-script.placeholder": "Сценарий таңдаңыз...", // "process.new.select-script.required": "Script is required", - // TODO New key - Add a translation - "process.new.select-script.required": "Script is required", + "process.new.select-script.required": "Сценарий қажет", // "process.new.parameter.file.upload-button": "Select file...", - // TODO New key - Add a translation - "process.new.parameter.file.upload-button": "Select file...", - + "process.new.parameter.file.upload-button":"Файлды таңдау...", + // "process.new.parameter.file.required": "Please select a file", - // TODO New key - Add a translation - "process.new.parameter.file.required": "Please select a file", + "process.new.parameter.file.required":"Файлды таңдаңыз", // "process.new.parameter.string.required": "Parameter value is required", - // TODO New key - Add a translation - "process.new.parameter.string.required": "Parameter value is required", - + "process.new.parameter.string.required": "Параметр мәні қажет", + // "process.new.parameter.type.value": "value", - // TODO New key - Add a translation - "process.new.parameter.type.value": "value", + "process.new.parameter.type.value": "құны", // "process.new.parameter.type.file": "file", - // TODO New key - Add a translation - "process.new.parameter.type.file": "file", + "process.new.parameter.type.file": "файл", // "process.new.parameter.required.missing": "The following parameters are required but still missing:", - // TODO New key - Add a translation - "process.new.parameter.required.missing": "The following parameters are required but still missing:", + "process.new.parameter.required.missing": "Келесі параметрлер қажет, бірақ әлі жоқ:", // "process.new.notification.success.title": "Success", - // TODO New key - Add a translation - "process.new.notification.success.title": "Success", + "process.new.notification.success.title": "Жетістік", // "process.new.notification.success.content": "The process was successfully created", - // TODO New key - Add a translation - "process.new.notification.success.content": "The process was successfully created", + "process.new.notification.success.content": "Процесс сәтті құрылды", // "process.new.notification.error.title": "Error", - // TODO New key - Add a translation - "process.new.notification.error.title": "Error", + "process.new.notification.error.title": "Қате", // "process.new.notification.error.content": "An error occurred while creating this process", - // TODO New key - Add a translation - "process.new.notification.error.content": "An error occurred while creating this process", + "process.new.notification.error.content": "Бұл процесті жасау кезінде қате орын алды", // "process.new.header": "Create a new process", - // TODO New key - Add a translation - "process.new.header": "Create a new process", + "process.new.header": "Жаңа процесс жасау", // "process.new.title": "Create a new process", - // TODO New key - Add a translation - "process.new.title": "Create a new process", + "process.new.title": "Жаңа процесс жасау", // "process.new.breadcrumbs": "Create a new process", - // TODO New key - Add a translation - "process.new.breadcrumbs": "Create a new process", - - - + "process.new.breadcrumbs": "Жаңа процесс жасау", + // "process.detail.arguments" : "Arguments", - // TODO New key - Add a translation - "process.detail.arguments" : "Arguments", + "process.detail.arguments" :"Аргументтер", // "process.detail.arguments.empty" : "This process doesn't contain any arguments", - // TODO New key - Add a translation - "process.detail.arguments.empty" : "This process doesn't contain any arguments", + "process.detail.arguments.empty" : "Бұл процесс ешқандай аргументтерді қамтымайды", // "process.detail.back" : "Back", - // TODO New key - Add a translation - "process.detail.back" : "Back", + "process.detail.back" : "Артқа", // "process.detail.output" : "Process Output", - // TODO New key - Add a translation - "process.detail.output" : "Process Output", + "process.detail.output" : "Процесс шығысы", // "process.detail.logs.button": "Retrieve process output", - // TODO New key - Add a translation - "process.detail.logs.button": "Retrieve process output", - + "process.detail.logs.button": "Процесс шығысын шығарып алу", + // "process.detail.logs.loading": "Retrieving", - // TODO New key - Add a translation - "process.detail.logs.loading": "Retrieving", + "process.detail.logs.loading": "Алу", // "process.detail.logs.none": "This process has no output", - // TODO New key - Add a translation - "process.detail.logs.none": "This process has no output", + "process.detail.logs.none": "Бұл процесте нәтиже жоқ", // "process.detail.output-files" : "Output Files", - // TODO New key - Add a translation - "process.detail.output-files" : "Output Files", + "process.detail.output-files" : "Шығару файлдары", // "process.detail.output-files.empty" : "This process doesn't contain any output files", - // TODO New key - Add a translation - "process.detail.output-files.empty" : "This process doesn't contain any output files", + "process.detail.output-files.empty" : "Бұл процесте ешқандай шығыс файлдары жоқ", // "process.detail.script" : "Script", - // TODO New key - Add a translation - "process.detail.script" : "Script", + "process.detail.script" : "Сценарий", // "process.detail.title" : "Process: {{ id }} - {{ name }}", - // TODO New key - Add a translation - "process.detail.title" : "Process: {{ id }} - {{ name }}", + "process.detail.title" :"Процесс: {{ id }} - {{ аты }}", // "process.detail.start-time" : "Start time", - // TODO New key - Add a translation - "process.detail.start-time" : "Start time", + "process.detail.start-time" : "Бастау уақыты", // "process.detail.end-time" : "Finish time", - // TODO New key - Add a translation - "process.detail.end-time" : "Finish time", + "process.detail.end-time" : "Аяқтау уақыты", // "process.detail.status" : "Status", - // TODO New key - Add a translation - "process.detail.status" : "Status", + "process.detail.status" : "Мәртебе", // "process.detail.create" : "Create similar process", - // TODO New key - Add a translation - "process.detail.create" : "Create similar process", - - - + "process.detail.create" : "Ұқсас процесті жасау", + // "process.overview.table.finish" : "Finish time", - // TODO New key - Add a translation - "process.overview.table.finish" : "Finish time", + "process.overview.table.finish" :"Аяқтау уақыты", // "process.overview.table.id" : "Process ID", - // TODO New key - Add a translation - "process.overview.table.id" : "Process ID", + "process.overview.table.id" :"Процесс идентификаторы", // "process.overview.table.name" : "Name", - // TODO New key - Add a translation - "process.overview.table.name" : "Name", + "process.overview.table.name" :"Аты", // "process.overview.table.start" : "Start time", - // TODO New key - Add a translation - "process.overview.table.start" : "Start time", + "process.overview.table.start" : "Бастау уақыты", - // "process.overview.table.status" : "Status", - // TODO New key - Add a translation - "process.overview.table.status" : "Status", + + "process.overview.table.status" : "Мәртебе", // "process.overview.table.user" : "User", - // TODO New key - Add a translation - "process.overview.table.user" : "User", + "process.overview.table.user" : "Пайдаланушы", // "process.overview.title": "Processes Overview", - // TODO New key - Add a translation - "process.overview.title": "Processes Overview", + "process.overview.title": "Процестерге шолу", // "process.overview.breadcrumbs": "Processes Overview", - // TODO New key - Add a translation - "process.overview.breadcrumbs": "Processes Overview", - + "process.overview.breadcrumbs":"Процестерге шолу", + // "process.overview.new": "New", - // TODO New key - Add a translation - "process.overview.new": "New", + "process.overview.new": "Жаңа", // "profile.breadcrumbs": "Update Profile", - // TODO New key - Add a translation - "profile.breadcrumbs": "Update Profile", + "profile.breadcrumbs": "Профильді жаңарту", // "profile.card.identify": "Identify", - // TODO New key - Add a translation - "profile.card.identify": "Identify", + "profile.card.identify":"Анықтау", // "profile.card.security": "Security", - // TODO New key - Add a translation - "profile.card.security": "Security", + "profile.card.security": "Қауіпсіздік", // "profile.form.submit": "Update Profile", - // TODO New key - Add a translation - "profile.form.submit": "Update Profile", + "profile.form.submit": "Профильді жаңарту", // "profile.groups.head": "Authorization groups you belong to", - // TODO New key - Add a translation - "profile.groups.head": "Authorization groups you belong to", + "profile.groups.head": "Сіз тиесілі авторизация топтары", // "profile.head": "Update Profile", - // TODO New key - Add a translation - "profile.head": "Update Profile", + "profile.head": "Профильді жаңарту", // "profile.metadata.form.error.firstname.required": "First Name is required", - // TODO New key - Add a translation - "profile.metadata.form.error.firstname.required": "First Name is required", - + "profile.metadata.form.error.firstname.required": "Аты қажет", + // "profile.metadata.form.error.lastname.required": "Last Name is required", - // TODO New key - Add a translation - "profile.metadata.form.error.lastname.required": "Last Name is required", + "profile.metadata.form.error.lastname.required": "Тегі қажет", // "profile.metadata.form.label.email": "Email Address", - // TODO New key - Add a translation - "profile.metadata.form.label.email": "Email Address", + "profile.metadata.form.label.email": "Электрондық пошта", // "profile.metadata.form.label.firstname": "First Name", - // TODO New key - Add a translation - "profile.metadata.form.label.firstname": "First Name", + "profile.metadata.form.label.firstname": "Аты", // "profile.metadata.form.label.language": "Language", - // TODO New key - Add a translation - "profile.metadata.form.label.language": "Language", + "profile.metadata.form.label.language": "Тіл", // "profile.metadata.form.label.lastname": "Last Name", - // TODO New key - Add a translation - "profile.metadata.form.label.lastname": "Last Name", + "profile.metadata.form.label.lastname": "Тек", // "profile.metadata.form.label.phone": "Contact Telephone", - // TODO New key - Add a translation - "profile.metadata.form.label.phone": "Contact Telephone", + "profile.metadata.form.label.phone": "Байланыс телефоны", // "profile.metadata.form.notifications.success.content": "Your changes to the profile were saved.", - // TODO New key - Add a translation - "profile.metadata.form.notifications.success.content": "Your changes to the profile were saved.", + "profile.metadata.form.notifications.success.content": "Сіздің профильдегі өзгертулеріңіз сақталды.", // "profile.metadata.form.notifications.success.title": "Profile saved", - // TODO New key - Add a translation - "profile.metadata.form.notifications.success.title": "Profile saved", + "profile.metadata.form.notifications.success.title": "Профиль сақталды", // "profile.notifications.warning.no-changes.content": "No changes were made to the Profile.", - // TODO New key - Add a translation - "profile.notifications.warning.no-changes.content": "No changes were made to the Profile.", + "profile.notifications.warning.no-changes.content": "Профильге ешқандай өзгерістер енгізілген жоқ.", // "profile.notifications.warning.no-changes.title": "No changes", - // TODO New key - Add a translation - "profile.notifications.warning.no-changes.title": "No changes", + "profile.notifications.warning.no-changes.title": "Өзгеріс жоқ", // "profile.security.form.error.matching-passwords": "The passwords do not match.", - // TODO New key - Add a translation - "profile.security.form.error.matching-passwords": "The passwords do not match.", - + "profile.security.form.error.matching-passwords": "Құпия сөздер сәйкес келмейді.", + // "profile.security.form.error.password-length": "The password should be at least 6 characters long.", - // TODO New key - Add a translation - "profile.security.form.error.password-length": "The password should be at least 6 characters long.", + "profile.security.form.error.password-length": "Құпия сөздің ұзындығы кемінде 6 таңба болуы керек.", // "profile.security.form.info": "Optionally, you can enter a new password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", - // TODO New key - Add a translation - "profile.security.form.info": "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": "Қосымша, төмендегі жолаққа жаңа құпия сөзді енгізіп, оны екінші жолаққа қайта теру арқылы растай аласыз. Оның ұзындығы кемінде алты таңба болуы керек.", + // "profile.security.form.label.password": "Password", - // TODO New key - Add a translation - "profile.security.form.label.password": "Password", + "profile.security.form.label.password": "Құпия сөз", // "profile.security.form.label.passwordrepeat": "Retype to confirm", - // TODO New key - Add a translation - "profile.security.form.label.passwordrepeat": "Retype to confirm", + "profile.security.form.label.passwordrepeat":"Растау үшін қайта теріңіз", // "profile.security.form.notifications.success.content": "Your changes to the password were saved.", - // TODO New key - Add a translation - "profile.security.form.notifications.success.content": "Your changes to the password were saved.", - + "profile.security.form.notifications.success.content": "Құпия сөзге енгізілген өзгертулеріңіз сақталды.", + // "profile.security.form.notifications.success.title": "Password saved", - // TODO New key - Add a translation - "profile.security.form.notifications.success.title": "Password saved", + "profile.security.form.notifications.success.title": "Құпия сөз сақталды", // "profile.security.form.notifications.error.title": "Error changing passwords", - // TODO New key - Add a translation - "profile.security.form.notifications.error.title": "Error changing passwords", + "profile.security.form.notifications.error.title": "Құпия сөздерді өзгерту қатесі", // "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", - // TODO New key - Add a translation - "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", + "profile.security.form.notifications.error.not-long-enough": "Құпия сөз кемінде 6 таңбадан тұруы керек.", // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", - // TODO New key - Add a translation - "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", + "profile.security.form.notifications.error.not-same": "Берілген құпия сөздер бірдей емес"., // "profile.title": "Update Profile", - // TODO New key - Add a translation - "profile.title": "Update Profile", - - - + "profile.title":"Профильді жаңарту", + // "project.listelement.badge": "Research Project", - // TODO New key - Add a translation - "project.listelement.badge": "Research Project", + "project.listelement.badge":"Зерттеу жобасы", // "project.page.contributor": "Contributors", - // TODO New key - Add a translation - "project.page.contributor": "Contributors", + "project.page.contributor": "Қалымдар", // "project.page.description": "Description", - // TODO New key - Add a translation - "project.page.description": "Description", + "project.page.description": "Сипаттама", // "project.page.edit": "Edit this item", - // TODO New key - Add a translation - "project.page.edit": "Edit this item", - + "project.page.edit": "Осы элементті өңдеу", + // "project.page.expectedcompletion": "Expected Completion", - // TODO New key - Add a translation - "project.page.expectedcompletion": "Expected Completion", + "project.page.expectedcompletion": "Күтілетін аяқталу", // "project.page.funder": "Funders", - // TODO New key - Add a translation - "project.page.funder": "Funders", + "project.page.funder": "Қаржыландырушылар", // "project.page.id": "ID", - // TODO New key - Add a translation "project.page.id": "ID", // "project.page.keyword": "Keywords", - // TODO New key - Add a translation - "project.page.keyword": "Keywords", + "project.page.keyword": "Негізгі сөздер", // "project.page.status": "Status", - // TODO New key - Add a translation - "project.page.status": "Status", + "project.page.status": "Мәртебе", // "project.page.titleprefix": "Research Project: ", - // TODO New key - Add a translation - "project.page.titleprefix": "Research Project: ", + "project.page.titleprefix": "Зерттеу жобасы:", // "project.search.results.head": "Project Search Results", - // TODO New key - Add a translation - "project.search.results.head": "Project Search Results", - - - + "project.search.results.head": "Жобаны іздеу нәтижелері", + // "publication.listelement.badge": "Publication", - // TODO New key - Add a translation - "publication.listelement.badge": "Publication", + "publication.listelement.badge": "Басылым", // "publication.page.description": "Description", - // TODO New key - Add a translation - "publication.page.description": "Description", + "publication.page.description": "Сипаттамасы", // "publication.page.edit": "Edit this item", - // TODO New key - Add a translation - "publication.page.edit": "Edit this item", + "publication.page.edit": "Осы элементті өңдеу", // "publication.page.journal-issn": "Journal ISSN", - // TODO New key - Add a translation - "publication.page.journal-issn": "Journal ISSN", + "publication.page.journal-issn": "ISSN журналы", // "publication.page.journal-title": "Journal Title", - // TODO New key - Add a translation - "publication.page.journal-title": "Journal Title", + "publication.page.journal-title": "Журнал атауы", // "publication.page.publisher": "Publisher", - // TODO New key - Add a translation - "publication.page.publisher": "Publisher", + "publication.page.publisher": "Баспагер", // "publication.page.titleprefix": "Publication: ", - // TODO New key - Add a translation - "publication.page.titleprefix": "Publication: ", + "publication.page.titleprefix": "Басылым: ", // "publication.page.volume-title": "Volume Title", - // TODO New key - Add a translation - "publication.page.volume-title": "Volume Title", - + "publication.page.volume-title": "Том атауы",, + // "publication.search.results.head": "Publication Search Results", - // TODO New key - Add a translation - "publication.search.results.head": "Publication Search Results", + "publication.search.results.head": "Жарияланымдарды іздеу нәтижелері", // "publication.search.title": "DSpace Angular :: Publication Search", - // TODO New key - Add a translation - "publication.search.title": "DSpace Angular :: Publication Search", - + "publication.search.title": "DSpace Angular :: Жарияланымдарды іздеу", // "register-email.title": "New user registration", - // TODO New key - Add a translation - "register-email.title": "New user registration", - + "register-email.title": "Жаңа пайдаланушыны тіркеу", + // "register-page.create-profile.header": "Create Profile", - // TODO New key - Add a translation - "register-page.create-profile.header": "Create Profile", + "register-page.create-profile.header":"Профиль жасау", // "register-page.create-profile.identification.header": "Identify", - // TODO New key - Add a translation - "register-page.create-profile.identification.header": "Identify", + "register-page.create-profile.identification.header": "Анықтау", // "register-page.create-profile.identification.email": "Email Address", - // TODO New key - Add a translation - "register-page.create-profile.identification.email": "Email Address", + "register-page.create-profile.identification.email": "Электрондық пошта", // "register-page.create-profile.identification.first-name": "First Name *", - // TODO New key - Add a translation - "register-page.create-profile.identification.first-name": "First Name *", + "register-page.create-profile.identification.first-name": "Аты *", // "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", - // TODO New key - Add a translation - "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", + "register-page.create-profile.identification.first-name.error": "Аты-жөніңізді толтырыңыз", // "register-page.create-profile.identification.last-name": "Last Name *", - // TODO New key - Add a translation - "register-page.create-profile.identification.last-name": "Last Name *", + "register-page.create-profile.identification.last-name":"Тек *", // "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", - // TODO New key - Add a translation - "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", + "register-page.create-profile.identification.last-name.error":"Тегін енгізіңіз", // "register-page.create-profile.identification.contact": "Contact Telephone", - // TODO New key - Add a translation - "register-page.create-profile.identification.contact": "Contact Telephone", - + "register-page.create-profile.identification.contact": "Байланыс телефоны", + // "register-page.create-profile.identification.language": "Language", - // TODO New key - Add a translation - "register-page.create-profile.identification.language": "Language", + "register-page.create-profile.identification.language": "Тіл", // "register-page.create-profile.security.header": "Security", - // TODO New key - Add a translation - "register-page.create-profile.security.header": "Security", - + "register-page.create-profile.security.header": "Қауіпсіздік", + // "register-page.create-profile.security.info": "Please enter a password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", - // TODO New key - Add a translation - "register-page.create-profile.security.info": "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": "Төмендегі өріске парольді енгізіп, оны екінші өріске қайта енгізу арқылы растаңыз. Онда кемінде алты таңба болуы керек.", + // "register-page.create-profile.security.label.password": "Password *", - // TODO New key - Add a translation - "register-page.create-profile.security.label.password": "Password *", + "register-page.create-profile.security.label.password": "Пароль *", // "register-page.create-profile.security.label.passwordrepeat": "Retype to confirm *", - // TODO New key - Add a translation - "register-page.create-profile.security.label.passwordrepeat": "Retype to confirm *", + "register-page.create-profile.security.label.passwordrepeat":"Растау үшін қайта енгізіңіз*", // "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", - // TODO New key - Add a translation - "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", + "register-page.create-profile.security.error.empty-password": "Төмендегі өріске құпия сөзді енгізіңіз"., // "register-page.create-profile.security.error.matching-passwords": "The passwords do not match.", - // TODO New key - Add a translation - "register-page.create-profile.security.error.matching-passwords": "The passwords do not match.", - + "register-page.create-profile.security.error.matching-passwords": "Парольдер бірдей емес"., + // "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", - // TODO New key - Add a translation - "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", + "register-page.create-profile.security.error.password-length": "Пароль кем дегенде 6 таңбадан тұруы керек"., // "register-page.create-profile.submit": "Complete Registration", - // TODO New key - Add a translation - "register-page.create-profile.submit": "Complete Registration", + "register-page.create-profile.submit": "Тіркеуді аяқтау", // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", - // TODO New key - Add a translation - "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", + "register-page.create-profile.submit.error.content": "Жаңа пайдаланушыны тіркеу кезінде бір нәрсе дұрыс болмады"., // "register-page.create-profile.submit.error.head": "Registration failed", - // TODO New key - Add a translation - "register-page.create-profile.submit.error.head": "Registration failed", - + "register-page.create-profile.submit.error.head": "Тіркеу сәтсіз аяқталды", + // "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", - // TODO New key - Add a translation - "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", + "register-page.create-profile.submit.success.content":"Тіркеу сәтті өтті. Сіз құрылған пайдаланушы ретінде кірдіңіз.", // "register-page.create-profile.submit.success.head": "Registration completed", - // TODO New key - Add a translation - "register-page.create-profile.submit.success.head": "Registration completed", + "register-page.create-profile.submit.success.head":"Тіркеу аяқталды", - - // "register-page.registration.header": "New user registration", - // TODO New key - Add a translation - "register-page.registration.header": "New user registration", +// "register-page.registration.header": "New user registration", + "register-page.registration.header": "Жаңа пайдаланушыны тіркеу", // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", - // TODO New key - Add a translation - "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + "register-page.registration.info":"Электрондық пошта арқылы жаңартулар алу және DSpace-ке жаңа өнімдер жіберу үшін жинақтарға жазылу үшін есептік жазбаны тіркеңіз"., // "register-page.registration.email": "Email Address *", - // TODO New key - Add a translation - "register-page.registration.email": "Email Address *", + "register-page.registration.email": "Электрондық пошта мекенжайы *", // "register-page.registration.email.error.required": "Please fill in an email address", - // TODO New key - Add a translation - "register-page.registration.email.error.required": "Please fill in an email address", + "register-page.registration.email.error.required": "Электрондық пошта мекенжайын толтырыңыз", // "register-page.registration.email.error.pattern": "Please fill in a valid email address", - // TODO New key - Add a translation - "register-page.registration.email.error.pattern": "Please fill in a valid email address", + "register-page.registration.email.error.pattern": "Жарамды электрондық пошта мекенжайын енгізіңіз", // "register-page.registration.email.hint": "This address will be verified and used as your login name.", - // TODO New key - Add a translation - "register-page.registration.email.hint": "This address will be verified and used as your login name.", + "register-page.registration.email.hint":"Бұл мекен-жай тексеріліп, сіздің логиніңіз ретінде пайдаланылады"., // "register-page.registration.submit": "Register", - // TODO New key - Add a translation - "register-page.registration.submit": "Register", + "register-page.registration.submit": "Тіркелу", // "register-page.registration.success.head": "Verification email sent", - // TODO New key - Add a translation - "register-page.registration.success.head": "Verification email sent", + "register-page.registration.success.head": "Растау электрондық поштасы жіберілді", // "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", - // TODO New key - Add a translation - "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + "register-page.registration.success.content": "{{Email}} мекен-жайына арнайы URL мекен-жайы мен қосымша нұсқаулары бар электрондық пошта жіберіледі"., // "register-page.registration.error.head": "Error when trying to register email", - // TODO New key - Add a translation - "register-page.registration.error.head": "Error when trying to register email", + "register-page.registration.error.head": "Электрондық поштаны тіркеу кезінде қате", // "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", - // TODO New key - Add a translation - "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", - - - + "register-page.registration.error.content":"Келесі электрондық пошта мекенжайын тіркеу кезінде қате пайда болды: {{ email }}", + // "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", - // TODO New key - Add a translation - "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", + "relationships.add.error.relationship-type.content":"Екі элемент арасындағы байланыс түрі {{ type }} үшін сәйкес сәйкестікті табу мүмкін емес", // "relationships.add.error.server.content": "The server returned an error", - // TODO New key - Add a translation - "relationships.add.error.server.content": "The server returned an error", + "relationships.add.error.server.content": "Сервер қате туралы хабарламаны қайтарды", // "relationships.add.error.title": "Unable to add relationship", - // TODO New key - Add a translation - "relationships.add.error.title": "Unable to add relationship", + "relationships.add.error.title": "Байланыс қосу мүмкін емес", // "relationships.isAuthorOf": "Authors", - // TODO New key - Add a translation - "relationships.isAuthorOf": "Authors", + "relationships.isAuthorOf":"Авторлар", // "relationships.isAuthorOf.Person": "Authors (persons)", - // TODO New key - Add a translation - "relationships.isAuthorOf.Person": "Authors (persons)", + "relationships.isAuthorOf.Person": "Авторлар (тұлғалар)", // "relationships.isAuthorOf.OrgUnit": "Authors (organizational units)", - // TODO New key - Add a translation - "relationships.isAuthorOf.OrgUnit": "Authors (organizational units)", + "relationships.isAuthorOf.OrgUnit": "Авторлар (ұйымдастыру бөлімшелері)", // "relationships.isIssueOf": "Journal Issues", - // TODO New key - Add a translation - "relationships.isIssueOf": "Journal Issues", + "relationships.isIssueOf": "Журналдың шығарылымдары", // "relationships.isJournalIssueOf": "Journal Issue", - // TODO New key - Add a translation - "relationships.isJournalIssueOf": "Journal Issue", + "relationships.isJournalIssueOf":"Журнал шығару", // "relationships.isJournalOf": "Journals", - // TODO New key - Add a translation - "relationships.isJournalOf": "Journals", + "relationships.isJournalOf": "Күнделіктер", // "relationships.isOrgUnitOf": "Organizational Units", - // TODO New key - Add a translation - "relationships.isOrgUnitOf": "Organizational Units", + "relationships.isOrgUnitOf": "Ұйымдастыру бөлімшелері", // "relationships.isPersonOf": "Authors", - // TODO New key - Add a translation - "relationships.isPersonOf": "Authors", + "relationships.isPersonOf": "Авторлары", // "relationships.isProjectOf": "Research Projects", - // TODO New key - Add a translation - "relationships.isProjectOf": "Research Projects", - + "relationships.isProjectOf": "Зерттеу жобалары", + // "relationships.isPublicationOf": "Publications", - // TODO New key - Add a translation - "relationships.isPublicationOf": "Publications", + "relationships.isPublicationOf": "Жарияланымдар", // "relationships.isPublicationOfJournalIssue": "Articles", - // TODO New key - Add a translation - "relationships.isPublicationOfJournalIssue": "Articles", + "relationships.isPublicationOfJournalIssue": "Мақалалар", // "relationships.isSingleJournalOf": "Journal", - // TODO New key - Add a translation - "relationships.isSingleJournalOf": "Journal", - + "relationships.isSingleJournalOf":"Күнделік", + // "relationships.isSingleVolumeOf": "Journal Volume", - // TODO New key - Add a translation - "relationships.isSingleVolumeOf": "Journal Volume", + "relationships.isSingleVolumeOf": "Журнал көлемі", // "relationships.isVolumeOf": "Journal Volumes", - // TODO New key - Add a translation - "relationships.isVolumeOf": "Journal Volumes", + "relationships.isVolumeOf": "Журнал томдары", // "relationships.isContributorOf": "Contributors", - // TODO New key - Add a translation - "relationships.isContributorOf": "Contributors", - - - + "relationships.isContributorOf": "Қатысушылар", + // "resource-policies.add.button": "Add", - // TODO New key - Add a translation - "resource-policies.add.button": "Add", + "resource-policies.add.button": "Қосу", // "resource-policies.add.for.": "Add a new policy", - // TODO New key - Add a translation - "resource-policies.add.for.": "Add a new policy", + "resource-policies.add.for.": "Жаңа саясат қосу", // "resource-policies.add.for.bitstream": "Add a new Bitstream policy", - // TODO New key - Add a translation - "resource-policies.add.for.bitstream": "Add a new Bitstream policy", + "resource-policies.add.for.bitstream": "Жаңа бит ағынының саясатын қосыңыз", // "resource-policies.add.for.bundle": "Add a new Bundle policy", - // TODO New key - Add a translation - "resource-policies.add.for.bundle": "Add a new Bundle policy", + "resource-policies.add.for.bundle": "Жаңа пакет саясатын қосу", // "resource-policies.add.for.item": "Add a new Item policy", - // TODO New key - Add a translation - "resource-policies.add.for.item": "Add a new Item policy", + "resource-policies.add.for.item":"Жаңа элемент саясатын қосу", // "resource-policies.add.for.community": "Add a new Community policy", - // TODO New key - Add a translation - "resource-policies.add.for.community": "Add a new Community policy", + "resource-policies.add.for.community": "Жаңа қауымдастық саясатын қосу", // "resource-policies.add.for.collection": "Add a new Collection policy", - // TODO New key - Add a translation - "resource-policies.add.for.collection": "Add a new Collection policy", + "resource-policies.add.for.collection":"Жаңа деректерді жинау саясатын қосу", // "resource-policies.create.page.heading": "Create new resource policy for ", - // TODO New key - Add a translation - "resource-policies.create.page.heading": "Create new resource policy for ", - + "resource-policies.create.page.heading": "Ресурстарға қатысты жаңа саясат құру ", + // "resource-policies.create.page.failure.content": "An error occurred while creating the resource policy.", - // TODO New key - Add a translation - "resource-policies.create.page.failure.content": "An error occurred while creating the resource policy.", + "resource-policies.create.page.failure.content": "Ресурстық саясатты құру кезінде қате пайда болды.", // "resource-policies.create.page.success.content": "Operation successful", - // TODO New key - Add a translation - "resource-policies.create.page.success.content": "Operation successful", + "resource-policies.create.page.success.content":"Операция сәтті өтті", // "resource-policies.create.page.title": "Create new resource policy", - // TODO New key - Add a translation - "resource-policies.create.page.title": "Create new resource policy", + "resource-policies.create.page.title": "Ресурстар саласында жаңа саясат құру", // "resource-policies.delete.btn": "Delete selected", - // TODO New key - Add a translation - "resource-policies.delete.btn": "Delete selected", + "resource-policies.delete.btn": "Жою таңдалған", // "resource-policies.delete.btn.title": "Delete selected resource policies", - // TODO New key - Add a translation - "resource-policies.delete.btn.title": "Delete selected resource policies", + "resource-policies.delete.btn.title": "Таңдалған ресурстар саясатын жою", // "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", - // TODO New key - Add a translation - "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", - + "resource-policies.delete.failure.content": "Таңдалған ресурстық саясатты жою кезінде қате пайда болды"., + // "resource-policies.delete.success.content": "Operation successful", - // TODO New key - Add a translation - "resource-policies.delete.success.content": "Operation successful", - + "resource-policies.delete.success.content": "Операция сәтті өтті", + // "resource-policies.edit.page.heading": "Edit resource policy ", - // TODO New key - Add a translation - "resource-policies.edit.page.heading": "Edit resource policy ", + "resource-policies.edit.page.heading": "Ресурстар саясатын өзгерту", // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", - // TODO New key - Add a translation - "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", - + "resource-policies.edit.page.failure.content":"Ресурстар саясатын өңдеуде қате пайда болды"., + // "resource-policies.edit.page.success.content": "Operation successful", - // TODO New key - Add a translation - "resource-policies.edit.page.success.content": "Operation successful", + "resource-policies.edit.page.success.content": "Операция сәтті өтті", // "resource-policies.edit.page.title": "Edit resource policy", - // TODO New key - Add a translation - "resource-policies.edit.page.title": "Edit resource policy", + "resource-policies.edit.page.title": "Ресурстар саясатын түзету", // "resource-policies.form.action-type.label": "Select the action type", - // TODO New key - Add a translation - "resource-policies.form.action-type.label": "Select the action type", + "resource-policies.form.action-type.label": "Әрекет түрін таңдаңыз", // "resource-policies.form.action-type.required": "You must select the resource policy action.", - // TODO New key - Add a translation - "resource-policies.form.action-type.required": "You must select the resource policy action.", - + "resource-policies.form.action-type.required":"Сіз ресурстар саясатының әрекетін таңдауыңыз керек"., + // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", - // TODO New key - Add a translation - "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", + "resource-policies.form.eperson-group-list.label": "Рұқсат берілетін тұлға немесе топ", // "resource-policies.form.eperson-group-list.select.btn": "Select", - // TODO New key - Add a translation - "resource-policies.form.eperson-group-list.select.btn": "Select", - + "resource-policies.form.eperson-group-list.select.btn": "Таңдау", + // "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", - // TODO New key - Add a translation - "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", + "resource-policies.form.eperson-group-list.tab.eperson": "Адамды іздеу", // "resource-policies.form.eperson-group-list.tab.group": "Search for a group", - // TODO New key - Add a translation - "resource-policies.form.eperson-group-list.tab.group": "Search for a group", + "resource-policies.form.eperson-group-list.tab.group":"Топты іздеу", // "resource-policies.form.eperson-group-list.table.headers.action": "Action", - // TODO New key - Add a translation - "resource-policies.form.eperson-group-list.table.headers.action": "Action", + "resource-policies.form.eperson-group-list.table.headers.action": "Әрекет", // "resource-policies.form.eperson-group-list.table.headers.id": "ID", - // TODO New key - Add a translation "resource-policies.form.eperson-group-list.table.headers.id": "ID", // "resource-policies.form.eperson-group-list.table.headers.name": "Name", - // TODO New key - Add a translation - "resource-policies.form.eperson-group-list.table.headers.name": "Name", + "resource-policies.form.eperson-group-list.table.headers.name": "Аты", // "resource-policies.form.date.end.label": "End Date", - // TODO New key - Add a translation - "resource-policies.form.date.end.label": "End Date", + "resource-policies.form.date.end.label": "Аяқталу күні", // "resource-policies.form.date.start.label": "Start Date", - // TODO New key - Add a translation - "resource-policies.form.date.start.label": "Start Date", + "resource-policies.form.date.start.label":"Басталу күні", // "resource-policies.form.description.label": "Description", - // TODO New key - Add a translation - "resource-policies.form.description.label": "Description", + "resource-policies.form.description.label": "Сипаттама", // "resource-policies.form.name.label": "Name", - // TODO New key - Add a translation - "resource-policies.form.name.label": "Name", + "resource-policies.form.name.label": "Аты", // "resource-policies.form.policy-type.label": "Select the policy type", - // TODO New key - Add a translation - "resource-policies.form.policy-type.label": "Select the policy type", + "resource-policies.form.policy-type.label": "Саясат түрін таңдаңыз", // "resource-policies.form.policy-type.required": "You must select the resource policy type.", - // TODO New key - Add a translation - "resource-policies.form.policy-type.required": "You must select the resource policy type.", + "resource-policies.form.policy-type.required": "Сіз ресурстар саясатының түрін таңдауыңыз керек"., // "resource-policies.table.headers.action": "Action", - // TODO New key - Add a translation - "resource-policies.table.headers.action": "Action", + "resource-policies.table.headers.action": "Әрекет", // "resource-policies.table.headers.date.end": "End Date", - // TODO New key - Add a translation - "resource-policies.table.headers.date.end": "End Date", + "resource-policies.table.headers.date.end": "Аяқталу күні", // "resource-policies.table.headers.date.start": "Start Date", - // TODO New key - Add a translation - "resource-policies.table.headers.date.start": "Start Date", + "resource-policies.table.headers.date.start": "Басталу күні", // "resource-policies.table.headers.edit": "Edit", - // TODO New key - Add a translation - "resource-policies.table.headers.edit": "Edit", + "resource-policies.table.headers.edit": "Редакциялау", // "resource-policies.table.headers.edit.group": "Edit group", - // TODO New key - Add a translation - "resource-policies.table.headers.edit.group": "Edit group", + "resource-policies.table.headers.edit.group": "Топты өңдеу", // "resource-policies.table.headers.edit.policy": "Edit policy", - // TODO New key - Add a translation - "resource-policies.table.headers.edit.policy": "Edit policy", + "resource-policies.table.headers.edit.policy": "Саясатты өзгерту", // "resource-policies.table.headers.eperson": "EPerson", - // TODO New key - Add a translation - "resource-policies.table.headers.eperson": "EPerson", + "resource-policies.table.headers.eperson": "Адам", // "resource-policies.table.headers.group": "Group", - // TODO New key - Add a translation - "resource-policies.table.headers.group": "Group", + "resource-policies.table.headers.group": "Топ", // "resource-policies.table.headers.id": "ID", - // TODO New key - Add a translation "resource-policies.table.headers.id": "ID", // "resource-policies.table.headers.name": "Name", - // TODO New key - Add a translation - "resource-policies.table.headers.name": "Name", + "resource-policies.table.headers.name": "Аты", // "resource-policies.table.headers.policyType": "type", - // TODO New key - Add a translation - "resource-policies.table.headers.policyType": "type", + "resource-policies.table.headers.policyType": "түрі", // "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", - // TODO New key - Add a translation - "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", + "resource-policies.table.headers.title.for.bitstream": "Бит ағынына арналған саясат", // "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", - // TODO New key - Add a translation - "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", + "resource-policies.table.headers.title.for.bundle": "Пакетке арналған саясат", // "resource-policies.table.headers.title.for.item": "Policies for Item", - // TODO New key - Add a translation - "resource-policies.table.headers.title.for.item": "Policies for Item", + "resource-policies.table.headers.title.for.item": "Өнімге арналған саясат", // "resource-policies.table.headers.title.for.community": "Policies for Community", - // TODO New key - Add a translation - "resource-policies.table.headers.title.for.community": "Policies for Community", + "resource-policies.table.headers.title.for.community": "Қоғамға арналған саясат", // "resource-policies.table.headers.title.for.collection": "Policies for Collection", - // TODO New key - Add a translation - "resource-policies.table.headers.title.for.collection": "Policies for Collection", - - - + "resource-policies.table.headers.title.for.collection": "Деректерді жинау саясаты", + // "search.description": "", - // TODO New key - Add a translation "search.description": "", // "search.switch-configuration.title": "Show", - // TODO New key - Add a translation - "search.switch-configuration.title": "Show", + "search.switch-configuration.title": "Шоу", // "search.title": "DSpace Angular :: Search", - // TODO New key - Add a translation - "search.title": "DSpace Angular :: Search", + "search.title": "DSpace Angular :: Іздеу", // "search.breadcrumbs": "Search", - // TODO New key - Add a translation - "search.breadcrumbs": "Search", + "search.breadcrumbs": "Іздеу", - - // "search.filters.applied.f.author": "Author", - // TODO New key - Add a translation - "search.filters.applied.f.author": "Author", +// "search.filters.applied.f.author": "Author", + "search.filters.applied.f.author": "Автор", // "search.filters.applied.f.dateIssued.max": "End date", - // TODO New key - Add a translation - "search.filters.applied.f.dateIssued.max": "End date", + "search.filters.applied.f.dateIssued.max": "Аяқталу күні", // "search.filters.applied.f.dateIssued.min": "Start date", - // TODO New key - Add a translation - "search.filters.applied.f.dateIssued.min": "Start date", + "search.filters.applied.f.dateIssued.min": "Басталу күні", // "search.filters.applied.f.dateSubmitted": "Date submitted", - // TODO New key - Add a translation - "search.filters.applied.f.dateSubmitted": "Date submitted", + "search.filters.applied.f.dateSubmitted": "Ұсыну күні", // "search.filters.applied.f.discoverable": "Private", - // TODO New key - Add a translation - "search.filters.applied.f.discoverable": "Private", + "search.filters.applied.f.discoverable": "Жеке", // "search.filters.applied.f.entityType": "Item Type", - // TODO New key - Add a translation - "search.filters.applied.f.entityType": "Item Type", + "search.filters.applied.f.entityType": "Өнім түрі", // "search.filters.applied.f.has_content_in_original_bundle": "Has files", - // TODO New key - Add a translation - "search.filters.applied.f.has_content_in_original_bundle": "Has files", + "search.filters.applied.f.has_content_in_original_bundle":"Файлдар бар", // "search.filters.applied.f.itemtype": "Type", - // TODO New key - Add a translation - "search.filters.applied.f.itemtype": "Type", + "search.filters.applied.f.itemtype": "Түрі", // "search.filters.applied.f.namedresourcetype": "Status", - // TODO New key - Add a translation - "search.filters.applied.f.namedresourcetype": "Status", + "search.filters.applied.f.namedresourcetype":"Мәртебе", // "search.filters.applied.f.subject": "Subject", - // TODO New key - Add a translation - "search.filters.applied.f.subject": "Subject", + "search.filters.applied.f.subject": "Тақырып", // "search.filters.applied.f.submitter": "Submitter", - // TODO New key - Add a translation - "search.filters.applied.f.submitter": "Submitter", + "search.filters.applied.f.submitter": "Жіберуші", // "search.filters.applied.f.jobTitle": "Job Title", - // TODO New key - Add a translation - "search.filters.applied.f.jobTitle": "Job Title", + "search.filters.applied.f.jobTitle": "Лауазым", // "search.filters.applied.f.birthDate.max": "End birth date", - // TODO New key - Add a translation - "search.filters.applied.f.birthDate.max": "End birth date", + "search.filters.applied.f.birthDate.max": "Соңғы туған күні", // "search.filters.applied.f.birthDate.min": "Start birth date", - // TODO New key - Add a translation - "search.filters.applied.f.birthDate.min": "Start birth date", + "search.filters.applied.f.birthDate.min":"Бастауыш туған күні", // "search.filters.applied.f.withdrawn": "Withdrawn", - // TODO New key - Add a translation - "search.filters.applied.f.withdrawn": "Withdrawn", - - - + "search.filters.applied.f.withdrawn": "Отозванный", + // "search.filters.filter.author.head": "Author", - // TODO New key - Add a translation - "search.filters.filter.author.head": "Author", + "search.filters.filter.author.head": "Автор", // "search.filters.filter.author.placeholder": "Author name", - // TODO New key - Add a translation - "search.filters.filter.author.placeholder": "Author name", + "search.filters.filter.author.placeholder": "Автордың аты", // "search.filters.filter.birthDate.head": "Birth Date", - // TODO New key - Add a translation - "search.filters.filter.birthDate.head": "Birth Date", + "search.filters.filter.birthDate.head": "Туған күні", // "search.filters.filter.birthDate.placeholder": "Birth Date", - // TODO New key - Add a translation - "search.filters.filter.birthDate.placeholder": "Birth Date", + "search.filters.filter.birthDate.placeholder":"Туған күні", // "search.filters.filter.creativeDatePublished.head": "Date Published", - // TODO New key - Add a translation - "search.filters.filter.creativeDatePublished.head": "Date Published", + "search.filters.filter.creativeDatePublished.head": "Жарияланған күні", // "search.filters.filter.creativeDatePublished.placeholder": "Date Published", - // TODO New key - Add a translation - "search.filters.filter.creativeDatePublished.placeholder": "Date Published", + "search.filters.filter.creativeDatePublished.placeholder": "Жарияланған күні", // "search.filters.filter.creativeWorkEditor.head": "Editor", - // TODO New key - Add a translation - "search.filters.filter.creativeWorkEditor.head": "Editor", + "search.filters.filter.creativeWorkEditor.head": "Редактор", // "search.filters.filter.creativeWorkEditor.placeholder": "Editor", - // TODO New key - Add a translation - "search.filters.filter.creativeWorkEditor.placeholder": "Editor", + "search.filters.filter.creativeWorkEditor.placeholder": "Редактор", // "search.filters.filter.creativeWorkKeywords.head": "Subject", - // TODO New key - Add a translation - "search.filters.filter.creativeWorkKeywords.head": "Subject", + "search.filters.filter.creativeWorkKeywords.head": "Тақырып", // "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", - // TODO New key - Add a translation - "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", + "search.filters.filter.creativeWorkKeywords.placeholder": "Тақырыбы", // "search.filters.filter.creativeWorkPublisher.head": "Publisher", - // TODO New key - Add a translation - "search.filters.filter.creativeWorkPublisher.head": "Publisher", + "search.filters.filter.creativeWorkPublisher.head": "Баспагер", // "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", - // TODO New key - Add a translation - "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", + "search.filters.filter.creativeWorkPublisher.placeholder":"Баспагер", // "search.filters.filter.dateIssued.head": "Date", - // TODO New key - Add a translation - "search.filters.filter.dateIssued.head": "Date", + "search.filters.filter.dateIssued.head": "Кездесуге", // "search.filters.filter.dateIssued.max.placeholder": "Minimum Date", - // TODO New key - Add a translation - "search.filters.filter.dateIssued.max.placeholder": "Minimum Date", + "search.filters.filter.dateIssued.max.placeholder": "Ең төменгі күн", // "search.filters.filter.dateIssued.min.placeholder": "Maximum Date", - // TODO New key - Add a translation - "search.filters.filter.dateIssued.min.placeholder": "Maximum Date", + "search.filters.filter.dateIssued.min.placeholder":"Максималды күн", // "search.filters.filter.dateSubmitted.head": "Date submitted", - // TODO New key - Add a translation - "search.filters.filter.dateSubmitted.head": "Date submitted", + "search.filters.filter.dateSubmitted.head": "Жіберілген күні", // "search.filters.filter.dateSubmitted.placeholder": "Date submitted", - // TODO New key - Add a translation - "search.filters.filter.dateSubmitted.placeholder": "Date submitted", + "search.filters.filter.dateSubmitted.placeholder": "Ұсыну күні", // "search.filters.filter.discoverable.head": "Private", - // TODO New key - Add a translation - "search.filters.filter.discoverable.head": "Private", + "search.filters.filter.discoverable.head": "Жеке", // "search.filters.filter.withdrawn.head": "Withdrawn", - // TODO New key - Add a translation - "search.filters.filter.withdrawn.head": "Withdrawn", + "search.filters.filter.withdrawn.head": "Отозванный", // "search.filters.filter.entityType.head": "Item Type", - // TODO New key - Add a translation - "search.filters.filter.entityType.head": "Item Type", + "search.filters.filter.entityType.head": "Өнім түрі", // "search.filters.filter.entityType.placeholder": "Item Type", - // TODO New key - Add a translation - "search.filters.filter.entityType.placeholder": "Item Type", + "search.filters.filter.entityType.placeholder": "Өнім түрі", // "search.filters.filter.has_content_in_original_bundle.head": "Has files", - // TODO New key - Add a translation - "search.filters.filter.has_content_in_original_bundle.head": "Has files", + "search.filters.filter.has_content_in_original_bundle.head": "Файлдар бар", // "search.filters.filter.itemtype.head": "Type", - // TODO New key - Add a translation - "search.filters.filter.itemtype.head": "Type", + "search.filters.filter.itemtype.head": "Түрі", // "search.filters.filter.itemtype.placeholder": "Type", - // TODO New key - Add a translation - "search.filters.filter.itemtype.placeholder": "Type", + "search.filters.filter.itemtype.placeholder":"Түрі", // "search.filters.filter.jobTitle.head": "Job Title", - // TODO New key - Add a translation - "search.filters.filter.jobTitle.head": "Job Title", + "search.filters.filter.jobTitle.head": "Лауазымы", // "search.filters.filter.jobTitle.placeholder": "Job Title", - // TODO New key - Add a translation - "search.filters.filter.jobTitle.placeholder": "Job Title", + "search.filters.filter.jobTitle.placeholder":"Лауазымы", // "search.filters.filter.knowsLanguage.head": "Known language", - // TODO New key - Add a translation - "search.filters.filter.knowsLanguage.head": "Known language", + "search.filters.filter.knowsLanguage.head": "Белгілі тіл", // "search.filters.filter.knowsLanguage.placeholder": "Known language", - // TODO New key - Add a translation - "search.filters.filter.knowsLanguage.placeholder": "Known language", + "search.filters.filter.knowsLanguage.placeholder": "Белгілі тіл", // "search.filters.filter.namedresourcetype.head": "Status", - // TODO New key - Add a translation - "search.filters.filter.namedresourcetype.head": "Status", + "search.filters.filter.namedresourcetype.head": "Мәртебе", // "search.filters.filter.namedresourcetype.placeholder": "Status", - // TODO New key - Add a translation - "search.filters.filter.namedresourcetype.placeholder": "Status", + "search.filters.filter.namedresourcetype.placeholder": "Мәртебе", // "search.filters.filter.objectpeople.head": "People", - // TODO New key - Add a translation - "search.filters.filter.objectpeople.head": "People", + "search.filters.filter.objectpeople.head": "Адамдар", // "search.filters.filter.objectpeople.placeholder": "People", - // TODO New key - Add a translation - "search.filters.filter.objectpeople.placeholder": "People", + "search.filters.filter.objectpeople.placeholder": "Адамдар", // "search.filters.filter.organizationAddressCountry.head": "Country", - // TODO New key - Add a translation - "search.filters.filter.organizationAddressCountry.head": "Country", + "search.filters.filter.organizationAddressCountry.head": "Ел", // "search.filters.filter.organizationAddressCountry.placeholder": "Country", - // TODO New key - Add a translation - "search.filters.filter.organizationAddressCountry.placeholder": "Country", + "search.filters.filter.organizationAddressCountry.placeholder": "Ел", // "search.filters.filter.organizationAddressLocality.head": "City", - // TODO New key - Add a translation - "search.filters.filter.organizationAddressLocality.head": "City", + "search.filters.filter.organizationAddressLocality.head": "Қала", // "search.filters.filter.organizationAddressLocality.placeholder": "City", - // TODO New key - Add a translation - "search.filters.filter.organizationAddressLocality.placeholder": "City", + "search.filters.filter.organizationAddressLocality.placeholder": "Қаласы", // "search.filters.filter.organizationFoundingDate.head": "Date Founded", - // TODO New key - Add a translation - "search.filters.filter.organizationFoundingDate.head": "Date Founded", + "search.filters.filter.organizationFoundingDate.head": "Құрылған күні", // "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", - // TODO New key - Add a translation - "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", + "search.filters.filter.organizationFoundingDate.placeholder": "Құрылған күні", // "search.filters.filter.scope.head": "Scope", - // TODO New key - Add a translation - "search.filters.filter.scope.head": "Scope", + "search.filters.filter.scope.head": "Қолдану саласы", // "search.filters.filter.scope.placeholder": "Scope filter", - // TODO New key - Add a translation - "search.filters.filter.scope.placeholder": "Scope filter", + "search.filters.filter.scope.placeholder": "Ауқым сүзгісі", // "search.filters.filter.show-less": "Collapse", - // TODO New key - Add a translation - "search.filters.filter.show-less": "Collapse", + "search.filters.filter.show-less": "Коллапс", // "search.filters.filter.show-more": "Show more", - // TODO New key - Add a translation - "search.filters.filter.show-more": "Show more", + "search.filters.filter.show-more":"Көбірек көрсету", // "search.filters.filter.subject.head": "Subject", - // TODO New key - Add a translation - "search.filters.filter.subject.head": "Subject", + "search.filters.filter.subject.head":"Тақырып", // "search.filters.filter.subject.placeholder": "Subject", - // TODO New key - Add a translation - "search.filters.filter.subject.placeholder": "Subject", + "search.filters.filter.subject.placeholder": "Тақырып", // "search.filters.filter.submitter.head": "Submitter", - // TODO New key - Add a translation - "search.filters.filter.submitter.head": "Submitter", + "search.filters.filter.submitter.head": "Жіберуші", // "search.filters.filter.submitter.placeholder": "Submitter", - // TODO New key - Add a translation - "search.filters.filter.submitter.placeholder": "Submitter", - - - + "search.filters.filter.submitter.placeholder":"Жіберуші", + // "search.filters.entityType.JournalIssue": "Journal Issue", - // TODO New key - Add a translation - "search.filters.entityType.JournalIssue": "Journal Issue", + "search.filters.entityType.JournalIssue": "Журналдың нөмірі", // "search.filters.entityType.JournalVolume": "Journal Volume", - // TODO New key - Add a translation - "search.filters.entityType.JournalVolume": "Journal Volume", + "search.filters.entityType.JournalVolume":"Журнал көлемі", // "search.filters.entityType.OrgUnit": "Organizational Unit", - // TODO New key - Add a translation - "search.filters.entityType.OrgUnit": "Organizational Unit", + "search.filters.entityType.OrgUnit":"Ұйымдастыру бөлімшесі", // "search.filters.has_content_in_original_bundle.true": "Yes", - // TODO New key - Add a translation - "search.filters.has_content_in_original_bundle.true": "Yes", + "search.filters.has_content_in_original_bundle.true": "Иә", // "search.filters.has_content_in_original_bundle.false": "No", - // TODO New key - Add a translation - "search.filters.has_content_in_original_bundle.false": "No", + "search.filters.has_content_in_original_bundle.false": "Жоқ", // "search.filters.discoverable.true": "No", - // TODO New key - Add a translation - "search.filters.discoverable.true": "No", + "search.filters.discoverable.true": "Жоқ", // "search.filters.discoverable.false": "Yes", - // TODO New key - Add a translation - "search.filters.discoverable.false": "Yes", + "search.filters.discoverable.false": "Иә", // "search.filters.withdrawn.true": "Yes", - // TODO New key - Add a translation - "search.filters.withdrawn.true": "Yes", + "search.filters.withdrawn.true": "Иә", // "search.filters.withdrawn.false": "No", - // TODO New key - Add a translation - "search.filters.withdrawn.false": "No", + "search.filters.withdrawn.false": "Жоқ", - - // "search.filters.head": "Filters", - // TODO New key - Add a translation - "search.filters.head": "Filters", +// "search.filters.head": "Filters", + "search.filters.head":"Сүзгілер", // "search.filters.reset": "Reset filters", - // TODO New key - Add a translation - "search.filters.reset": "Reset filters", + "search.filters.reset": "Сүзгілерді қалпына келтіру", - - - // "search.form.search": "Search", - // TODO New key - Add a translation - "search.form.search": "Search", +// "search.form.search": "Search", + "search.form.search":"Іздеу", // "search.form.search_dspace": "Search DSpace", - // TODO New key - Add a translation - "search.form.search_dspace": "Search DSpace", + "search.form.search_dspace": "Іздеу кеңістігі", // "search.form.search_mydspace": "Search MyDSpace", - // TODO New key - Add a translation - "search.form.search_mydspace": "Search MyDSpace", - - - + "search.form.search_mydspace":"Myspace іздеу", + // "search.results.head": "Search Results", - // TODO New key - Add a translation - "search.results.head": "Search Results", + "search.results.head": "Іздеу нәтижелері", // "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", - // TODO New key - Add a translation - "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", + "search.results.no-results": "Сіздің іздеуіңіз нәтиже бермеді. Қиындықтар іздеумен қатар, сіз іздеген? Қоюға тырысыңыз", // "search.results.no-results-link": "quotes around it", - // TODO New key - Add a translation - "search.results.no-results-link": "quotes around it", + "search.results.no-results-link": "оның айналасындағы тырнақшалар", // "search.results.empty": "Your search returned no results.", - // TODO New key - Add a translation - "search.results.empty": "Your search returned no results.", - - - + "search.results.empty": "Сіздің іздеуіңіз нәтиже бермеді"., + // "search.sidebar.close": "Back to results", - // TODO New key - Add a translation - "search.sidebar.close": "Back to results", + "search.sidebar.close": "Нәтижелерге оралайық", // "search.sidebar.filters.title": "Filters", - // TODO New key - Add a translation - "search.sidebar.filters.title": "Filters", + "search.sidebar.filters.title": "Сүзгілер", // "search.sidebar.open": "Search Tools", - // TODO New key - Add a translation - "search.sidebar.open": "Search Tools", + "search.sidebar.open": "Іздеу құралдары", // "search.sidebar.results": "results", - // TODO New key - Add a translation - "search.sidebar.results": "results", + "search.sidebar.results":"нәтижелер", // "search.sidebar.settings.rpp": "Results per page", - // TODO New key - Add a translation - "search.sidebar.settings.rpp": "Results per page", + "search.sidebar.settings.rpp": "Беттегі нәтижелер", // "search.sidebar.settings.sort-by": "Sort By", - // TODO New key - Add a translation - "search.sidebar.settings.sort-by": "Sort By", + "search.sidebar.settings.sort-by": "Сұрыптау", // "search.sidebar.settings.title": "Settings", - // TODO New key - Add a translation - "search.sidebar.settings.title": "Settings", - - - + "search.sidebar.settings.title": "Параметрлер", + // "search.view-switch.show-detail": "Show detail", - // TODO New key - Add a translation - "search.view-switch.show-detail": "Show detail", + "search.view-switch.show-detail": "Толығырақ көрсету", // "search.view-switch.show-grid": "Show as grid", - // TODO New key - Add a translation - "search.view-switch.show-grid": "Show as grid", + "search.view-switch.show-grid": "Тор түрінде көрсету", // "search.view-switch.show-list": "Show as list", - // TODO New key - Add a translation - "search.view-switch.show-list": "Show as list", + "search.view-switch.show-list": "Тізім ретінде көрсету", // "sorting.ASC": "Ascending", - // TODO New key - Add a translation - "sorting.ASC": "Ascending", + "sorting.ASC": "Жоғарылайтын", // "sorting.DESC": "Descending", - // TODO New key - Add a translation - "sorting.DESC": "Descending", + "sorting.DESC": "Төмен", // "sorting.dc.title.ASC": "Title Ascending", - // TODO New key - Add a translation - "sorting.dc.title.ASC": "Title Ascending", + "sorting.dc.title.ASC": "Өсу бойынша тақырып", // "sorting.dc.title.DESC": "Title Descending", - // TODO New key - Add a translation - "sorting.dc.title.DESC": "Title Descending", + "sorting.dc.title.DESC": "Кему тақырыбы", // "sorting.score.DESC": "Relevance", - // TODO New key - Add a translation - "sorting.score.DESC": "Relevance", - - - + "sorting.score.DESC": "Өзектілігі", + // "statistics.title": "Statistics", - // TODO New key - Add a translation - "statistics.title": "Statistics", + "statistics.title":"Статистика", // "statistics.header": "Statistics for {{ scope }}", - // TODO New key - Add a translation - "statistics.header": "Statistics for {{ scope }}", + "statistics.header": "{{ scope }} үшін Статистика", // "statistics.breadcrumbs": "Statistics", - // TODO New key - Add a translation - "statistics.breadcrumbs": "Statistics", + "statistics.breadcrumbs": "Статистика", // "statistics.page.no-data": "No data available", - // TODO New key - Add a translation - "statistics.page.no-data": "No data available", + "statistics.page.no-data": "Деректер жоқ", // "statistics.table.no-data": "No data available", - // TODO New key - Add a translation - "statistics.table.no-data": "No data available", + "statistics.table.no-data": "Деректер жоқ", // "statistics.table.title.TotalVisits": "Total visits", - // TODO New key - Add a translation - "statistics.table.title.TotalVisits": "Total visits", + "statistics.table.title.TotalVisits": "Келушілердің жалпы саны", // "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", - // TODO New key - Add a translation - "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", + "statistics.table.title.TotalVisitsPerMonth": "Айына келушілердің жалпы саны", // "statistics.table.title.TotalDownloads": "File Visits", - // TODO New key - Add a translation - "statistics.table.title.TotalDownloads": "File Visits", + "statistics.table.title.TotalDownloads": "Қаралған файлдарды", // "statistics.table.title.TopCountries": "Top country views", - // TODO New key - Add a translation - "statistics.table.title.TopCountries": "Top country views", + "statistics.table.title.TopCountries": "Елге ең жақсы көріністер", // "statistics.table.title.TopCities": "Top city views", - // TODO New key - Add a translation - "statistics.table.title.TopCities": "Top city views", + "statistics.table.title.TopCities": "Қаланың үздік көріністері", // "statistics.table.header.views": "Views", - // TODO New key - Add a translation - "statistics.table.header.views": "Views", - - - + "statistics.table.header.views": "Түрлері", + // "submission.edit.title": "Edit Submission", - // TODO New key - Add a translation - "submission.edit.title": "Edit Submission", + "submission.edit.title": "Жіберуді өңдеу", // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", - // TODO New key - Add a translation - "submission.general.cannot_submit": "You have not the privilege to make a new submission.", + "submission.general.cannot_submit": "Сізде жаңа қойылым жасау артықшылығы жоқ"., // "submission.general.deposit": "Deposit", - // TODO New key - Add a translation - "submission.general.deposit": "Deposit", + "submission.general.deposit": "Депозит", // "submission.general.discard.confirm.cancel": "Cancel", - // TODO New key - Add a translation - "submission.general.discard.confirm.cancel": "Cancel", + "submission.general.discard.confirm.cancel": "Болдырмау", // "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?", - // TODO New key - Add a translation - "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?", + "submission.general.discard.confirm.info":"Бұл операцияны болдырмау мүмкін емес. Сен сенімді?", // "submission.general.discard.confirm.submit": "Yes, I'm sure", - // TODO New key - Add a translation - "submission.general.discard.confirm.submit": "Yes, I'm sure", + "submission.general.discard.confirm.submit": "Ия, мен сенімдімін", // "submission.general.discard.confirm.title": "Discard submission", - // TODO New key - Add a translation - "submission.general.discard.confirm.title": "Discard submission", + "submission.general.discard.confirm.title": "Қабылдамау жіберуді", // "submission.general.discard.submit": "Discard", - // TODO New key - Add a translation - "submission.general.discard.submit": "Discard", + "submission.general.discard.submit": "Тастау", // "submission.general.save": "Save", - // TODO New key - Add a translation - "submission.general.save": "Save", + "submission.general.save": "Сақтау", // "submission.general.save-later": "Save for later", - // TODO New key - Add a translation - "submission.general.save-later": "Save for later", + "submission.general.save-later": "Кейінірек сақтаңыз", - - // "submission.import-external.page.title": "Import metadata from an external source", - // TODO New key - Add a translation - "submission.import-external.page.title": "Import metadata from an external source", +// "submission.import-external.page.title": "Import metadata from an external source", + "submission.import-external.page.title":"Метадеректерді сыртқы көзден импорттау", // "submission.import-external.title": "Import metadata from an external source", - // TODO New key - Add a translation - "submission.import-external.title": "Import metadata from an external source", + "submission.import-external.title":"Метадеректерді сыртқы көзден импорттау", // "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", - // TODO New key - Add a translation - "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", + "submission.import-external.page.hint": "Ғарышқа импорттау үшін интернеттен элементтерді табу үшін жоғарыдағы сұрауды енгізіңіз"., // "submission.import-external.back-to-my-dspace": "Back to MyDSpace", - // TODO New key - Add a translation - "submission.import-external.back-to-my-dspace": "Back to MyDSpace", + "submission.import-external.back-to-my-dspace": "Myspace-ке оралу", // "submission.import-external.search.placeholder": "Search the external source", - // TODO New key - Add a translation - "submission.import-external.search.placeholder": "Search the external source", + "submission.import-external.search.placeholder": "Сыртқы көзден іздеу", // "submission.import-external.search.button": "Search", - // TODO New key - Add a translation - "submission.import-external.search.button": "Search", + "submission.import-external.search.button": "Іздеу", // "submission.import-external.search.button.hint": "Write some words to search", - // TODO New key - Add a translation - "submission.import-external.search.button.hint": "Write some words to search", + "submission.import-external.search.button.hint": "Іздеу үшін бірнеше сөз жазыңыз", // "submission.import-external.search.source.hint": "Pick an external source", - // TODO New key - Add a translation - "submission.import-external.search.source.hint": "Pick an external source", + "submission.import-external.search.source.hint": "Сыртқы көзді таңдаңыз", // "submission.import-external.source.arxiv": "arXiv", - // TODO New key - Add a translation "submission.import-external.source.arxiv": "arXiv", // "submission.import-external.source.loading": "Loading ...", - // TODO New key - Add a translation - "submission.import-external.source.loading": "Loading ...", + "submission.import-external.source.loading": "Жүктеу...", // "submission.import-external.source.sherpaJournal": "SHERPA Journals", - // TODO New key - Add a translation - "submission.import-external.source.sherpaJournal": "SHERPA Journals", + "submission.import-external.source.sherpaJournal": "ШЕРПА күнделіктері", // "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", - // TODO New key - Add a translation - "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", + "submission.import-external.source.sherpaPublisher": "ШЕРПА баспасы", // "submission.import-external.source.orcid": "ORCID", - // TODO New key - Add a translation - "submission.import-external.source.orcid": "ORCID", + "submission.import-external.source.orcid": "ОРКИД", // "submission.import-external.source.pubmed": "Pubmed", - // TODO New key - Add a translation "submission.import-external.source.pubmed": "Pubmed", // "submission.import-external.source.lcname": "Library of Congress Names", - // TODO New key - Add a translation - "submission.import-external.source.lcname": "Library of Congress Names", + "submission.import-external.source.lcname": "Конгресс Кітапханасының Атаулары", // "submission.import-external.preview.title": "Item Preview", - // TODO New key - Add a translation - "submission.import-external.preview.title": "Item Preview", + "submission.import-external.preview.title": "Элементті алдын-ала қарау", // "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", - // TODO New key - Add a translation - "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", + "submission.import-external.preview.subtitle": "Төмендегі метадеректер сыртқы көзден импортталды. Сіз жіберуді бастаған кезде ол алдын-ала толтырылады.", // "submission.import-external.preview.button.import": "Start submission", - // TODO New key - Add a translation - "submission.import-external.preview.button.import": "Start submission", + "submission.import-external.preview.button.import": "Жіберуді бастау", // "submission.import-external.preview.error.import.title": "Submission error", - // TODO New key - Add a translation - "submission.import-external.preview.error.import.title": "Submission error", + "submission.import-external.preview.error.import.title": "Жіберу қатесі", // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", - // TODO New key - Add a translation - "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", + "submission.import-external.preview.error.import.body": "Қате жазбаны сыртқы көзден импорттау кезінде пайда болады"., // "submission.sections.describe.relationship-lookup.close": "Close", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.close": "Close", + "submission.sections.describe.relationship-lookup.close": "Жабу", // "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", + "submission.sections.describe.relationship-lookup.external-source.added":"Үлгіге жергілікті жазба сәтті қосылды", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Қашықтағы авторды импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Қашықтағы журналды импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Журналдың қашықтан шығарылымын импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Журналдың қашықтағы томын импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Қашықтағы авторды импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Үлгіге жергілікті автор сәтті қосылды", // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Successfully imported and added external author to the selection", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Successfully imported and added external author to the selection", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Үлгіге сыртқы автор сәтті импортталды және қосылды", // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Authority", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Authority", + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Беделі", // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Import as a new local authority entry", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Import as a new local authority entry", + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Импорт жергілікті биліктің жаңа жазбасы ретінде", // "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", + "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel":"Болдырмау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", + "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Жаңа жазбаларды импорттау үшін коллекцияны таңдаңыз", // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Нысандар", // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Import as a new local entity", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Import as a new local entity", + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Импорт Жаңа жергілікті нысан ретінде", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname":"LC Name-ден импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "ORCID-тен Импорт", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Шерпа журналынан импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Sherpa Publisher-ден импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "PubMed-тен импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "ArXiv-тен Импорт", // "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Импорт", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Қашықтағы журналды импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Үлгіге жергілікті журнал сәтті қосылды", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Үлгіге сыртқы журнал сәтті импортталды және қосылды", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Журналдың қашықтан шығарылымын импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Іріктемеге жергілікті журналдың шығарылымы сәтті қосылды", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Үлгіге сыртқы журналдың шығарылымы сәтті импортталды және қосылды", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Import Remote Journal Volume", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Import Remote Journal Volume", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Журналдың қашықтағы томын импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Үлгіге журналдың жергілікті көлемі сәтті қосылды", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Үлгіге журналдың сыртқы көлемі сәтті импортталды және қосылды", // "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", - + + "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Жергілікті сәйкестікті таңдаңыз:", + // "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", + "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Жойылсын таңдау барлық", // "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", + "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Бетті таңдаудан бас тарту", // "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", + "submission.sections.describe.relationship-lookup.search-tab.loading":"Жүктеу...", // "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", + "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Іздеу сұранысы", // "submission.sections.describe.relationship-lookup.search-tab.search": "Go", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.search": "Go", + "submission.sections.describe.relationship-lookup.search-tab.search": "Бару", // "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", + "submission.sections.describe.relationship-lookup.search-tab.select-all": "Барлығын таңдау", // "submission.sections.describe.relationship-lookup.search-tab.select-page": "Select page", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.select-page": "Select page", + "submission.sections.describe.relationship-lookup.search-tab.select-page": "Бетті таңдау", // "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", + "submission.sections.describe.relationship-lookup.selected": "Таңдалған элементтер {{ өлшемі }}", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Жергілікті авторлар ({{саны}})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Жергілікті журналдар ({{саны}})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Жергілікті жобалар ({{ саны }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Жергілікті басылымдар ({{ саны }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Жергілікті авторлар ({{ саны }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Жергілікті ұйымдастыру бөлімшелері ({{саны }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Жергілікті деректер пакеттері ({{ саны }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Жергілікті деректер файлдары ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Жергілікті журналдар ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Жергілікті журнал мәселелері ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Жергілікті журнал мәселелері ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Жергілікті журнал томдары ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Жергілікті журнал томдары ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal":"Sherpa журналдары ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Sherpa Publishers ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Sherpa Publishers ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC атаулары ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed":"PubMed ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", - // TODO New key - Add a translation "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Search for Funding Agencies", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Search for Funding Agencies", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Қаржыландыру агенттіктерін іздеу", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", - + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication":"Қаржыландыруды іздеу", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Ұйымдастырушылық бірліктерді іздеу", // "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", + "submission.sections.describe.relationship-lookup.selection-tab.tab-title":"Ағымдағы таңдау ({{ count }})", // "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", + "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Журналдың шығарылымдары", + // "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", + "submission.sections.describe.relationship-lookup.title.JournalIssue":"Журналдың шығарылымдары", // "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", + "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication":"Журнал томдары", + // "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", + "submission.sections.describe.relationship-lookup.title.JournalVolume": "Журнал томдары", // "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", - + "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Журналдар", + // "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Authors", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Authors", + "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Авторлар", // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Қаржыландыру агенттігі", + // "submission.sections.describe.relationship-lookup.title.Project": "Projects", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.Project": "Projects", + "submission.sections.describe.relationship-lookup.title.Project": "Жобалар", // "submission.sections.describe.relationship-lookup.title.Publication": "Publications", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.Publication": "Publications", + "submission.sections.describe.relationship-lookup.title.Publication": "Жарияланымдар", // "submission.sections.describe.relationship-lookup.title.Person": "Authors", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.Person": "Authors", + "submission.sections.describe.relationship-lookup.title.Person": "Авторлар", // "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", + "submission.sections.describe.relationship-lookup.title.OrgUnit": "Ұйымдастыру бөлімшелері", // "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", + "submission.sections.describe.relationship-lookup.title.DataPackage": "Деректер пакеттері", // "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", + "submission.sections.describe.relationship-lookup.title.DataFile": "Деректер файлдары", // "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", + "submission.sections.describe.relationship-lookup.title.Funding Agency":"Қаржыландыру агенттігі", // "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", + "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Қаржыландыру", // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", + "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Бас ұйымдастыру бөлімшесі", // "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", + "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Ашылмалы тізімді ауыстыру", // "submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings", + "submission.sections.describe.relationship-lookup.selection-tab.settings": "Баптаулар", // "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", + "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Сіздің таңдауыңыз қазір бос"., // "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Authors", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Authors", + "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Таңдалған авторлар", // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Таңдаулы журналдар", // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Журналдың таңдалған көлемі", + // "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", + "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Таңдаулы жобалар", // "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", + "submission.sections.describe.relationship-lookup.selection-tab.title.Publication":"Таңдамалы Жарияланымдар", // "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Authors", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Authors", + "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Таңдалған авторлар", // "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", + "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Жеке ұйымдастыру бөлімшелері", // "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", + "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Таңдалған деректер пакеттері", // "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Selected Data Files", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Selected Data Files", + "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Таңдалған деректер файлдары", // "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", + "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Таңдаулы журналдар", // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Таңдалған сұрақ", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", - + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume":"Журналдың таңдалған көлемі", + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Таңдалған қаржыландыру агенттігі", // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Таңдалған қаржыландыру", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Таңдалған шығарылым", // "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", + "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Таңдалған ұйымдастыру бөлімі", // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", - + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal":"Іздеу нәтижелері", + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Іздеу нәтижелері", // "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Іздеу нәтижелері", // "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Іздеу нәтижелері", // "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Іздеу нәтижесі", // "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Іздеу нәтижелері", // "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Іздеу нәтижесі", // "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.name-variant.notification.content": "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": "Сіз \"{{ value }}\" сол адамға арналған атау опциясы ретінде сақтағыңыз келе ме, сондықтан сіз және басқалар оны болашақ жіберу үшін қайта пайдалана аласыз ба? Егер жоқ болса, сіз оны осы жіберу үшін пайдалана аласыз "., // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", - + "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Атаудың жаңа нұсқасын сақтау", + // "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", - // TODO New key - Add a translation - "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", + "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Тек осы жіберу үшін пайдаланыңыз", // "submission.sections.ccLicense.type": "License Type", - // TODO New key - Add a translation - "submission.sections.ccLicense.type": "License Type", + "submission.sections.ccLicense.type": "Лицензияның типі", // "submission.sections.ccLicense.select": "Select a license type…", - // TODO New key - Add a translation - "submission.sections.ccLicense.select": "Select a license type…", - + "submission.sections.ccLicense.select": "Лицензия түрін таңдаңыз...", + // "submission.sections.ccLicense.change": "Change your license type…", - // TODO New key - Add a translation - "submission.sections.ccLicense.change": "Change your license type…", + "submission.sections.ccLicense.change": "Лицензия түрін өзгертіңіз...", // "submission.sections.ccLicense.none": "No licenses available", - // TODO New key - Add a translation - "submission.sections.ccLicense.none": "No licenses available", - + "submission.sections.ccLicense.none": "Лицензиялар жоқ", + // "submission.sections.ccLicense.option.select": "Select an option…", - // TODO New key - Add a translation - "submission.sections.ccLicense.option.select": "Select an option…", + "submission.sections.ccLicense.option.select": "Опцияны таңдаңыз...", // "submission.sections.ccLicense.link": "You’ve selected the following license:", - // TODO New key - Add a translation - "submission.sections.ccLicense.link": "You’ve selected the following license:", + "submission.sections.ccLicense.link": "Сіз келесі лицензияны таңдадыңыз:", // "submission.sections.ccLicense.confirmation": "I grant the license above", - // TODO New key - Add a translation - "submission.sections.ccLicense.confirmation": "I grant the license above", + "submission.sections.ccLicense.confirmation": "Мен жоғарыда аталған лицензияны беремін", // "submission.sections.general.add-more": "Add more", - // TODO New key - Add a translation - "submission.sections.general.add-more": "Add more", + "submission.sections.general.add-more": "Тағы қосу", // "submission.sections.general.collection": "Collection", - // TODO New key - Add a translation - "submission.sections.general.collection": "Collection", + "submission.sections.general.collection": "Жинақ", // "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", - // TODO New key - Add a translation - "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", + "submission.sections.general.deposit_error_notice": "Тауарды жіберген кезде мәселе туындады, кейінірек қайталап көріңіз.", // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", - // TODO New key - Add a translation - "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", + "submission.sections.general.deposit_success_notice": "Өтініш сәтті сақталды"., // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", - // TODO New key - Add a translation - "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", + "submission.sections.general.discard_error_notice": "Тауарды тастау кезінде мәселе туындады, кейінірек қайталап көріңіз"., // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", - // TODO New key - Add a translation - "submission.sections.general.discard_success_notice": "Submission discarded successfully.", - + "submission.sections.general.discard_success_notice": "Ұсыныс сәтті қабылданбады"., + // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", - // TODO New key - Add a translation - "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", + "submission.sections.general.metadata-extracted": "Жаңа метадеректер алынып, {{SectionID}} бөліміне қосылды.", // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", - // TODO New key - Add a translation - "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", - + "submission.sections.general.metadata-extracted-new-section": "Жіберу үшін жаңа бөлім {{SectionID}}< / strong > қосылды.", + // "submission.sections.general.no-collection": "No collection found", - // TODO New key - Add a translation - "submission.sections.general.no-collection": "No collection found", + "submission.sections.general.no-collection": "Жинақ табылмады", // "submission.sections.general.no-sections": "No options available", - // TODO New key - Add a translation - "submission.sections.general.no-sections": "No options available", + "submission.sections.general.no-sections": "Қол жетімді опциялар жоқ", // "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", - // TODO New key - Add a translation - "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", + "submission.sections.general.save_error_notice": "Элементті сақтау кезінде мәселе туындады, кейінірек қайталап көріңіз.", // "submission.sections.general.save_success_notice": "Submission saved successfully.", - // TODO New key - Add a translation - "submission.sections.general.save_success_notice": "Submission saved successfully.", + "submission.sections.general.save_success_notice": "Жіберу сәтті сақталды.", // "submission.sections.general.search-collection": "Search for a collection", - // TODO New key - Add a translation - "submission.sections.general.search-collection": "Search for a collection", + "submission.sections.general.search-collection": "Коллекцияны іздеу", // "submission.sections.general.sections_not_valid": "There are incomplete sections.", - // TODO New key - Add a translation - "submission.sections.general.sections_not_valid": "There are incomplete sections.", - - - + "submission.sections.general.sections_not_valid":"Толық емес бөлімдер бар"., + // "submission.sections.submit.progressbar.CClicense": "Creative commons license", - // TODO New key - Add a translation "submission.sections.submit.progressbar.CClicense": "Creative commons license", // "submission.sections.submit.progressbar.describe.recycle": "Recycle", - // TODO New key - Add a translation - "submission.sections.submit.progressbar.describe.recycle": "Recycle", + "submission.sections.submit.progressbar.describe.recycle": "Өңдеуге", // "submission.sections.submit.progressbar.describe.stepcustom": "Describe", - // TODO New key - Add a translation - "submission.sections.submit.progressbar.describe.stepcustom": "Describe", + "submission.sections.submit.progressbar.describe.stepcustom": "Сипаттау", // "submission.sections.submit.progressbar.describe.stepone": "Describe", - // TODO New key - Add a translation - "submission.sections.submit.progressbar.describe.stepone": "Describe", + "submission.sections.submit.progressbar.describe.stepone": "Сипаттау", // "submission.sections.submit.progressbar.describe.steptwo": "Describe", - // TODO New key - Add a translation - "submission.sections.submit.progressbar.describe.steptwo": "Describe", + "submission.sections.submit.progressbar.describe.steptwo": "Сипаттау", // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", - // TODO New key - Add a translation - "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", + "submission.sections.submit.progressbar.detect-duplicate": "Ықтимал телнұсқалар", // "submission.sections.submit.progressbar.license": "Deposit license", - // TODO New key - Add a translation - "submission.sections.submit.progressbar.license": "Deposit license", + "submission.sections.submit.progressbar.license": "Депозиттік лицензия", // "submission.sections.submit.progressbar.upload": "Upload files", - // TODO New key - Add a translation - "submission.sections.submit.progressbar.upload": "Upload files", - - - - // "submission.sections.upload.delete.confirm.cancel": "Cancel", - // TODO New key - Add a translation - "submission.sections.upload.delete.confirm.cancel": "Cancel", + "submission.sections.submit.progressbar.upload": "Файлдарды жүктеу", + +// "submission.sections.upload.delete.confirm.cancel": "Cancel", + "submission.sections.upload.delete.confirm.cancel": "Болдырмау", // "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?", - // TODO New key - Add a translation - "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?", + "submission.sections.upload.delete.confirm.info": "Бұл операцияны болдырмау мүмкін емес. Сіз сенімдіміз?", // "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", - // TODO New key - Add a translation - "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", + "submission.sections.upload.delete.confirm.submit": "Ия, мен сенімдімін", // "submission.sections.upload.delete.confirm.title": "Delete bitstream", - // TODO New key - Add a translation - "submission.sections.upload.delete.confirm.title": "Delete bitstream", + "submission.sections.upload.delete.confirm.title": "Бит ағынын жою", // "submission.sections.upload.delete.submit": "Delete", - // TODO New key - Add a translation - "submission.sections.upload.delete.submit": "Delete", + "submission.sections.upload.delete.submit": "Жою", // "submission.sections.upload.drop-message": "Drop files to attach them to the item", - // TODO New key - Add a translation - "submission.sections.upload.drop-message": "Drop files to attach them to the item", +"submission.sections.upload.drop-message": "Оларды элементке бекіту үшін файлдарды жойыңыз", // "submission.sections.upload.form.access-condition-label": "Access condition type", - // TODO New key - Add a translation - "submission.sections.upload.form.access-condition-label": "Access condition type", + "submission.sections.upload.form.access-condition-label": "Кіру шартының түрі", // "submission.sections.upload.form.date-required": "Date is required.", - // TODO New key - Add a translation - "submission.sections.upload.form.date-required": "Date is required.", + "submission.sections.upload.form.date-required": "Күні міндетті.", // "submission.sections.upload.form.from-label": "Grant access from", - // TODO New key - Add a translation - "submission.sections.upload.form.from-label": "Grant access from", + "submission.sections.upload.form.from-label": "Қатынауды ұсыну бірі", // "submission.sections.upload.form.from-placeholder": "From", - // TODO New key - Add a translation - "submission.sections.upload.form.from-placeholder": "From", - + "submission.sections.upload.form.from-placeholder": "Кімнен", + // "submission.sections.upload.form.group-label": "Group", - // TODO New key - Add a translation - "submission.sections.upload.form.group-label": "Group", + "submission.sections.upload.form.group-label": "Топ", // "submission.sections.upload.form.group-required": "Group is required.", - // TODO New key - Add a translation - "submission.sections.upload.form.group-required": "Group is required.", - + "submission.sections.upload.form.group-required": "Топ қажет.", + // "submission.sections.upload.form.until-label": "Grant access until", - // TODO New key - Add a translation - "submission.sections.upload.form.until-label": "Grant access until", + "submission.sections.upload.form.until-label": "Рұқсат беруге болғанша", // "submission.sections.upload.form.until-placeholder": "Until", - // TODO New key - Add a translation - "submission.sections.upload.form.until-placeholder": "Until", + "submission.sections.upload.form.until-placeholder":"Әзірге", // "submission.sections.upload.header.policy.default.nolist": "Uploaded files in the {{collectionName}} collection will be accessible according to the following group(s):", - // TODO New key - Add a translation - "submission.sections.upload.header.policy.default.nolist": "Uploaded files in the {{collectionName}} collection will be accessible according to the following group(s):", + "submission.sections.upload.header.policy.default.nolist": "{{Коллекция атауы}} жинағына жүктелген файлдар келесі топқа (топтарға) сәйкес қол жетімді болады:", // "submission.sections.upload.header.policy.default.withlist": "Please note that uploaded files in the {{collectionName}} collection will be accessible, in addition to what is explicitly decided for the single file, with the following group(s):", - // TODO New key - Add a translation - "submission.sections.upload.header.policy.default.withlist": "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": "{{Коллекция атауы}} жинағына жүктелген файлдар жеке файл үшін нақты анықталғаннан басқа, келесі топпен (топтармен) қол жетімді болатындығын ескеріңіз:", // "submission.sections.upload.info": "Here you will find all the files currently in the item. You can update the file metadata and access conditions or upload additional files just dragging & dropping them everywhere in the page", - // TODO New key - Add a translation - "submission.sections.upload.info": "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": "Мұнда сіз осы элементтегі барлық файлдарды таба аласыз. Файл метадеректерін және кіру шарттарын жаңартуға немесе қосымша файлдарды олардыбетінде сүйреп апару арқылы жүктеуге болады.", // "submission.sections.upload.no-entry": "No", - // TODO New key - Add a translation - "submission.sections.upload.no-entry": "No", + "submission.sections.upload.no-entry":"Жоқ", // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", - // TODO New key - Add a translation - "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", + "submission.sections.upload.no-file-uploaded": "Файл әлі жүктелмеген"., // "submission.sections.upload.save-metadata": "Save metadata", - // TODO New key - Add a translation - "submission.sections.upload.save-metadata": "Save metadata", + "submission.sections.upload.save-metadata": "Метадеректерді сақтау", // "submission.sections.upload.undo": "Cancel", - // TODO New key - Add a translation - "submission.sections.upload.undo": "Cancel", + "submission.sections.upload.undo": "Болдырмау", // "submission.sections.upload.upload-failed": "Upload failed", - // TODO New key - Add a translation - "submission.sections.upload.upload-failed": "Upload failed", - + "submission.sections.upload.upload-failed": "Жүктеу сәтсіз аяқталды", + // "submission.sections.upload.upload-successful": "Upload successful", - // TODO New key - Add a translation - "submission.sections.upload.upload-successful": "Upload successful", - - - + "submission.sections.upload.upload-successful": "Жүктеу сәтті өтті", + // "submission.submit.title": "Submission", - // TODO New key - Add a translation - "submission.submit.title": "Submission", - - - + "submission.submit.title":"Бағыну", + // "submission.workflow.generic.delete": "Delete", "submission.workflow.generic.delete": "Өшіру", // "submission.workflow.generic.delete-help": "If you would to discard this item, select \"Delete\". You will then be asked to confirm it.", - // TODO New key - Add a translation - "submission.workflow.generic.delete-help": "If you would to discard this item, select \"Delete\". You will then be asked to confirm it.", + "submission.workflow.generic.delete-help": "Егер сіз осы элементтен бас тартқыңыз келсе, жою таңдаңыз. Содан кейін сізден оны растау сұралады.", // "submission.workflow.generic.edit": "Edit", - // TODO New key - Add a translation - "submission.workflow.generic.edit": "Edit", + "submission.workflow.generic.edit": "Редакциялау", // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", - // TODO New key - Add a translation - "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", + "submission.workflow.generic.edit-help": "Элементтің метадеректерін өзгерту үшін осы параметрді таңдаңыз"., // "submission.workflow.generic.view": "View", - // TODO New key - Add a translation - "submission.workflow.generic.view": "View", + "submission.workflow.generic.view": "Түрі", // "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", - // TODO New key - Add a translation - "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", - - + "submission.workflow.generic.view-help": "Элемент метадеректерін көру үшін осы параметрді таңдаңыз.", // "submission.workflow.tasks.claimed.approve": "Approve", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.approve": "Approve", + "submission.workflow.tasks.claimed.approve": "Мақұлдансын", // "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", + "submission.workflow.tasks.claimed.approve_help":"Егер сіз тауармен танысқан болсаңыз және ол коллекцияға қосуға жарамды болса, \"Мақұлдау\" таңдаңыз.", // "submission.workflow.tasks.claimed.edit": "Edit", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.edit": "Edit", + "submission.workflow.tasks.claimed.edit": "Редакциялау", // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", + "submission.workflow.tasks.claimed.edit_help": "Элементтің метадеректерін өзгерту үшін осы параметрді таңдаңыз"., // "submission.workflow.tasks.claimed.reject.reason.info": "Please enter your reason for rejecting the submission into the box below, indicating whether the submitter may fix a problem and resubmit.", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.reject.reason.info": "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": "Жіберушінің мәселені шешіп, қайта жібере алатындығын көрсете отырып, төмендегі жолаққа жіберуден бас тарту себебін енгізіңіз.", // "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", + "submission.workflow.tasks.claimed.reject.reason.placeholder": "Қабылдамау себебін сипаттаңыз", // "submission.workflow.tasks.claimed.reject.reason.submit": "Reject item", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.reject.reason.submit": "Reject item", + "submission.workflow.tasks.claimed.reject.reason.submit": "Тауарды қабылдамау", // "submission.workflow.tasks.claimed.reject.reason.title": "Reason", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.reject.reason.title": "Reason", + "submission.workflow.tasks.claimed.reject.reason.title": "Себеп", // "submission.workflow.tasks.claimed.reject.submit": "Reject", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.reject.submit": "Reject", + "submission.workflow.tasks.claimed.reject.submit": "Қабылдамау", // "submission.workflow.tasks.claimed.reject_help": "If you have reviewed the item and found it is not suitable for inclusion in the collection, select \"Reject\". You will then be asked to enter a message indicating why the item is unsuitable, and whether the submitter should change something and resubmit.", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.reject_help": "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": "Егер сіз затты қарап шығып, оның емес екенін байқасаңыз, \"Қабылдамау\" таңдаңыз. Содан кейін сізден тауардың неге сәйкес келмейтінін және жіберуші бірдеңені өзгертіп, қайта жіберуі керек екенін көрсететін хабарлама енгізу сұралады.", // "submission.workflow.tasks.claimed.return": "Return to pool", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.return": "Return to pool", + "submission.workflow.tasks.claimed.return": "Бассейнге оралу", // "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", - // TODO New key - Add a translation - "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", - - - + "submission.workflow.tasks.claimed.return_help": "Басқа пайдаланушы бұл тапсырманы орындай алатындай етіп тапсырманы бассейнге қайтарыңыз"., + // "submission.workflow.tasks.generic.error": "Error occurred during operation...", - // TODO New key - Add a translation - "submission.workflow.tasks.generic.error": "Error occurred during operation...", + "submission.workflow.tasks.generic.error": "Жұмыс кезінде қате пайда болды...", // "submission.workflow.tasks.generic.processing": "Processing...", - // TODO New key - Add a translation - "submission.workflow.tasks.generic.processing": "Processing...", + "submission.workflow.tasks.generic.processing": "Өңдеу...", // "submission.workflow.tasks.generic.submitter": "Submitter", - // TODO New key - Add a translation - "submission.workflow.tasks.generic.submitter": "Submitter", + "submission.workflow.tasks.generic.submitter": "Жіберуші", // "submission.workflow.tasks.generic.success": "Operation successful", - // TODO New key - Add a translation - "submission.workflow.tasks.generic.success": "Operation successful", - - - + "submission.workflow.tasks.generic.success": "Операция сәтті өтті", + // "submission.workflow.tasks.pool.claim": "Claim", - // TODO New key - Add a translation - "submission.workflow.tasks.pool.claim": "Claim", + "submission.workflow.tasks.pool.claim": "Талап", // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", - // TODO New key - Add a translation - "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", + "submission.workflow.tasks.pool.claim_help": "Бұл тапсырманы өзіңе жүкте"., // "submission.workflow.tasks.pool.hide-detail": "Hide detail", - // TODO New key - Add a translation - "submission.workflow.tasks.pool.hide-detail": "Hide detail", + "submission.workflow.tasks.pool.hide-detail": "Жасыру бөлшектері", // "submission.workflow.tasks.pool.show-detail": "Show detail", - // TODO New key - Add a translation - "submission.workflow.tasks.pool.show-detail": "Show detail", + "submission.workflow.tasks.pool.show-detail": "Толығырақ көрсету", // "title": "DSpace", - // TODO New key - Add a translation "title": "DSpace", - - + // "vocabulary-treeview.header": "Hierarchical tree view", - // TODO New key - Add a translation - "vocabulary-treeview.header": "Hierarchical tree view", + "vocabulary-treeview.header": "Иерархиялық ағаш көрінісі", // "vocabulary-treeview.load-more": "Load more", - // TODO New key - Add a translation - "vocabulary-treeview.load-more": "Load more", + "vocabulary-treeview.load-more": "Жүктеңіз көп", // "vocabulary-treeview.search.form.reset": "Reset", - // TODO New key - Add a translation - "vocabulary-treeview.search.form.reset": "Reset", + "vocabulary-treeview.search.form.reset": "Қайта қалыпқа келтіру", // "vocabulary-treeview.search.form.search": "Search", - // TODO New key - Add a translation - "vocabulary-treeview.search.form.search": "Search", + "vocabulary-treeview.search.form.search": "Іздеу", // "vocabulary-treeview.search.no-result": "There were no items to show", - // TODO New key - Add a translation - "vocabulary-treeview.search.no-result": "There were no items to show", + "vocabulary-treeview.search.no-result": "Көрсетуге болатын заттар болған жоқ", // "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", - // TODO New key - Add a translation - "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", + "vocabulary-treeview.tree.description.nsi": "Норвегиялық ғылыми индекс", // "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", - // TODO New key - Add a translation - "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", + "vocabulary-treeview.tree.description.srsc": "Зерттеудің пәндік санаттары", - - - // "uploader.browse": "browse", - // TODO New key - Add a translation - "uploader.browse": "browse", +// "uploader.browse": "browse", + "uploader.browse": "көру", // "uploader.drag-message": "Drag & Drop your files here", - // TODO New key - Add a translation - "uploader.drag-message": "Drag & Drop your files here", + "uploader.drag-message": "Файлдарды осында сүйреңіз", // "uploader.or": ", or ", - // TODO New key - Add a translation - "uploader.or": ", or ", + "uploader.or": ", немесе ", // "uploader.processing": "Processing", - // TODO New key - Add a translation - "uploader.processing": "Processing", + "uploader.processing": "Өңдеу", // "uploader.queue-length": "Queue length", - // TODO New key - Add a translation - "uploader.queue-length": "Queue length", + "uploader.queue-length": "Кезек ұзындығы", // "virtual-metadata.delete-item.info": "Select the types for which you want to save the virtual metadata as real metadata", - // TODO New key - Add a translation - "virtual-metadata.delete-item.info": "Select the types for which you want to save the virtual metadata as real metadata", + "virtual-metadata.delete-item.info": "Виртуалды метадеректерді нақты метадеректер ретінде сақтағыңыз келетін түрлерін таңдаңыз", // "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", - // TODO New key - Add a translation - "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", + "virtual-metadata.delete-item.modal-head": "Бұл қарым-қатынастың виртуалды метадеректері", // "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", - // TODO New key - Add a translation - "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", - - - + "virtual-metadata.delete-relationship.modal-head": "Виртуалды метадеректерді нақты метадеректер ретінде сақтағыңыз келетін элементтерді таңдаңыз", + // "workflowAdmin.search.results.head": "Administer Workflow", - // TODO New key - Add a translation - "workflowAdmin.search.results.head": "Administer Workflow", + "workflowAdmin.search.results.head": "Жұмыс процесін басқару", - - - // "workflow-item.delete.notification.success.title": "Deleted", - // TODO New key - Add a translation - "workflow-item.delete.notification.success.title": "Deleted", +// "workflow-item.delete.notification.success.title": "Deleted", + "workflow-item.delete.notification.success.title":"Жойылды", // "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", - // TODO New key - Add a translation - "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", + "workflow-item.delete.notification.success.content": "Жұмыс процесінің бұл элементі сәтті жойылды", // "workflow-item.delete.notification.error.title": "Something went wrong", - // TODO New key - Add a translation - "workflow-item.delete.notification.error.title": "Something went wrong", + "workflow-item.delete.notification.error.title": "Бір нәрсе дұрыс болмады", // "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", - // TODO New key - Add a translation - "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", + "workflow-item.delete.notification.error.content": "Жұмыс процесінің элементі жойылмады", // "workflow-item.delete.title": "Delete workflow item", - // TODO New key - Add a translation - "workflow-item.delete.title": "Delete workflow item", + "workflow-item.delete.title": "Жұмыс процесінің элементін жою", // "workflow-item.delete.header": "Delete workflow item", - // TODO New key - Add a translation - "workflow-item.delete.header": "Delete workflow item", + "workflow-item.delete.header": "Жұмыс процесінің элементін жою", // "workflow-item.delete.button.cancel": "Cancel", - // TODO New key - Add a translation - "workflow-item.delete.button.cancel": "Cancel", + "workflow-item.delete.button.cancel": "Алып тастау", // "workflow-item.delete.button.confirm": "Delete", - // TODO New key - Add a translation - "workflow-item.delete.button.confirm": "Delete", + "workflow-item.delete.button.confirm": "Жою", - - // "workflow-item.send-back.notification.success.title": "Sent back to submitter", - // TODO New key - Add a translation - "workflow-item.send-back.notification.success.title": "Sent back to submitter", +// "workflow-item.send-back.notification.success.title": "Sent back to submitter", + "workflow-item.send-back.notification.success.title": "Жіберушіге қайта жіберілді", // "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", - // TODO New key - Add a translation - "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", - + "workflow-item.send-back.notification.success.content": "Жұмыс процесінің бұл элементі жіберушіге сәтті жіберілді", + // "workflow-item.send-back.notification.error.title": "Something went wrong", - // TODO New key - Add a translation - "workflow-item.send-back.notification.error.title": "Something went wrong", + "workflow-item.send-back.notification.error.title": "Бір нәрсе дұрыс болмады", // "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", - // TODO New key - Add a translation - "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", + "workflow-item.send-back.notification.error.content": "Жұмыс процесінің элементі жіберушіге қайтарылмады", // "workflow-item.send-back.title": "Send workflow item back to submitter", - // TODO New key - Add a translation - "workflow-item.send-back.title": "Send workflow item back to submitter", + "workflow-item.send-back.title": "Жұмыс процесінің элементін жіберушіге қайта жіберіңіз", // "workflow-item.send-back.header": "Send workflow item back to submitter", - // TODO New key - Add a translation - "workflow-item.send-back.header": "Send workflow item back to submitter", - + "workflow-item.send-back.header": "Жұмыс процесінің элементін жіберушіге жіберу", + // "workflow-item.send-back.button.cancel": "Cancel", "workflow-item.send-back.button.cancel": "Алып тастау", // "workflow-item.send-back.button.confirm": "Send back" - // TODO New key - Add a translation - "workflow-item.send-back.button.confirm": "Send back" + "workflow-item.send-back.button.confirm": "Кері жіберу" } From 3757a414bce266ec8cee0e9ed32b9a21a7534d54 Mon Sep 17 00:00:00 2001 From: myrza1 Date: Sat, 23 Apr 2022 19:14:59 +0600 Subject: [PATCH 010/119] Update kz.json5 --- src/assets/i18n/kz.json5 | 3129 +++++++++++++++++++------------------- 1 file changed, 1564 insertions(+), 1565 deletions(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index 1da5fa5e0f..5adb17504c 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -1,2430 +1,2429 @@ { - + // "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": "Сіз бұл бетке өтуге тіркелемегенсіз. Басты бетке оралу үшін төмендегі батырманы пайдалануға болады", - + // "401.link.home-page": "Take me to the home page", "401.link.home-page": "Басты бетке өту", - + // "401.unauthorized": "unauthorized", "401.unauthorized": "Тіркелмеген", - - - + + + // "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": "Сізде бұл параққа кіруге рұқсат жоқ. Басты бетке оралу үшін төмендегі батырманы пайдалануға болады.", - + // "403.link.home-page": "Take me to the home page", "403.link.home-page": "Басты бетке өту", - + // "403.forbidden": "forbidden", "403.forbidden": "Тыйым салынған", - + // "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": "Сіз іздеген бет табылмады. Бұл бет алмастырылған немесе жойылған болуы мүмкін. Басты бетке оралу үшін төмендегі батырманы пайдалануға болады. ", - + // "404.link.home-page": "Take me to the home page", "404.link.home-page": "Басты бетке өту", - + // "404.page-not-found": "page not found", "404.page-not-found": "Бұл бет табылмады", - + // "admin.curation-tasks.breadcrumbs": "System curation tasks", // TODO New key - Add a translation "admin.curation-tasks.breadcrumbs": "System curation tasks", - + // "admin.curation-tasks.title": "System curation tasks", // TODO New key - Add a translation "admin.curation-tasks.title": "System curation tasks", - + // "admin.curation-tasks.header": "System curation tasks", // TODO New key - Add a translation "admin.curation-tasks.header": "System curation tasks", - + // "admin.registries.bitstream-formats.breadcrumbs": "Format registry", // TODO New key - Add a translation "admin.registries.bitstream-formats.breadcrumbs": "Format registry", - + // "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", // TODO New key - Add a translation "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", - + // "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", // TODO New key - Add a translation "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", - + // "admin.registries.bitstream-formats.create.failure.head": "Failure", // TODO New key - Add a translation "admin.registries.bitstream-formats.create.failure.head": "Failure", - + // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", // TODO New key - Add a translation "admin.registries.bitstream-formats.create.head": "Create Bitstream format", - + // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", // TODO New key - Add a translation "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", - + // "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", // TODO New key - Add a translation "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", - + // "admin.registries.bitstream-formats.create.success.head": "Success", // TODO New key - Add a translation "admin.registries.bitstream-formats.create.success.head": "Success", - + // "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", // TODO New key - Add a translation "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", - + // "admin.registries.bitstream-formats.delete.failure.head": "Failure", // TODO New key - Add a translation "admin.registries.bitstream-formats.delete.failure.head": "Failure", - + // "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", // TODO New key - Add a translation "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", - + // "admin.registries.bitstream-formats.delete.success.head": "Success", // TODO New key - Add a translation "admin.registries.bitstream-formats.delete.success.head": "Success", - + // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", // TODO New key - Add a translation "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", - + // "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", - + // "admin.registries.bitstream-formats.edit.description.hint": "", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.description.hint": "", - + // "admin.registries.bitstream-formats.edit.description.label": "Description", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.description.label": "Description", - + // "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.", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.extensions.hint": "Extensions are file extensions that are used to automatically identify the format of uploaded files. You can enter several extensions for each format.", - + // "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", - + // "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", - + // "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", - + // "admin.registries.bitstream-formats.edit.failure.head": "Failure", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.failure.head": "Failure", - + // "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", - + // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", - + // "admin.registries.bitstream-formats.edit.internal.label": "Internal", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.internal.label": "Internal", - + // "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", - + // "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", - + // "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", - + // "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", - + // "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", - + // "admin.registries.bitstream-formats.edit.success.head": "Success", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.success.head": "Success", - + // "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", - + // "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", - + // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", // TODO New key - Add a translation "admin.registries.bitstream-formats.head": "Bitstream Format Registry", - + // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", // TODO New key - Add a translation "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", - + // "admin.registries.bitstream-formats.table.delete": "Delete selected", // TODO New key - Add a translation "admin.registries.bitstream-formats.table.delete": "Delete selected", - + // "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", // TODO New key - Add a translation "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", - + // "admin.registries.bitstream-formats.table.internal": "internal", // TODO New key - Add a translation "admin.registries.bitstream-formats.table.internal": "internal", - + // "admin.registries.bitstream-formats.table.mimetype": "MIME Type", // TODO New key - Add a translation "admin.registries.bitstream-formats.table.mimetype": "MIME Type", - + // "admin.registries.bitstream-formats.table.name": "Name", // TODO New key - Add a translation "admin.registries.bitstream-formats.table.name": "Name", - + // "admin.registries.bitstream-formats.table.return": "Return", // TODO New key - Add a translation "admin.registries.bitstream-formats.table.return": "Return", - + // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", // TODO New key - Add a translation "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", - + // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", // TODO New key - Add a translation "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", - + // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", // TODO New key - Add a translation "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", - + // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", // TODO New key - Add a translation "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", - + // "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Format Registry", // TODO New key - Add a translation "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Format Registry", - - - + + + // "admin.registries.metadata.breadcrumbs": "Metadata registry", // TODO New key - Add a translation "admin.registries.metadata.breadcrumbs": "Metadata registry", - + // "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", // TODO New key - Add a translation "admin.registries.metadata.description": "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.form.create": "Create metadata schema", // TODO New key - Add a translation "admin.registries.metadata.form.create": "Create metadata schema", - + // "admin.registries.metadata.form.edit": "Edit metadata schema", // TODO New key - Add a translation "admin.registries.metadata.form.edit": "Edit metadata schema", - + // "admin.registries.metadata.form.name": "Name", // TODO New key - Add a translation "admin.registries.metadata.form.name": "Name", - + // "admin.registries.metadata.form.namespace": "Namespace", // TODO New key - Add a translation "admin.registries.metadata.form.namespace": "Namespace", - + // "admin.registries.metadata.head": "Metadata Registry", // TODO New key - Add a translation "admin.registries.metadata.head": "Metadata Registry", - + // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", // TODO New key - Add a translation "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", - + // "admin.registries.metadata.schemas.table.delete": "Delete selected", // TODO New key - Add a translation "admin.registries.metadata.schemas.table.delete": "Delete selected", - + // "admin.registries.metadata.schemas.table.id": "ID", // TODO New key - Add a translation "admin.registries.metadata.schemas.table.id": "ID", - + // "admin.registries.metadata.schemas.table.name": "Name", // TODO New key - Add a translation "admin.registries.metadata.schemas.table.name": "Name", - + // "admin.registries.metadata.schemas.table.namespace": "Namespace", // TODO New key - Add a translation "admin.registries.metadata.schemas.table.namespace": "Namespace", - + // "admin.registries.metadata.title": "DSpace Angular :: Metadata Registry", // TODO New key - Add a translation "admin.registries.metadata.title": "DSpace Angular :: Metadata Registry", - - - + + + // "admin.registries.schema.breadcrumbs": "Metadata schema", // TODO New key - Add a translation "admin.registries.schema.breadcrumbs": "Metadata schema", - + // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", // TODO New key - Add a translation "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", - + // "admin.registries.schema.fields.head": "Schema metadata fields", // TODO New key - Add a translation "admin.registries.schema.fields.head": "Schema metadata fields", - + // "admin.registries.schema.fields.no-items": "No metadata fields to show.", // TODO New key - Add a translation "admin.registries.schema.fields.no-items": "No metadata fields to show.", - + // "admin.registries.schema.fields.table.delete": "Delete selected", // TODO New key - Add a translation "admin.registries.schema.fields.table.delete": "Delete selected", - + // "admin.registries.schema.fields.table.field": "Field", // TODO New key - Add a translation "admin.registries.schema.fields.table.field": "Field", - + // "admin.registries.schema.fields.table.scopenote": "Scope Note", // TODO New key - Add a translation "admin.registries.schema.fields.table.scopenote": "Scope Note", - + // "admin.registries.schema.form.create": "Create metadata field", // TODO New key - Add a translation "admin.registries.schema.form.create": "Create metadata field", - + // "admin.registries.schema.form.edit": "Edit metadata field", // TODO New key - Add a translation "admin.registries.schema.form.edit": "Edit metadata field", - + // "admin.registries.schema.form.element": "Element", // TODO New key - Add a translation "admin.registries.schema.form.element": "Element", - + // "admin.registries.schema.form.qualifier": "Qualifier", // TODO New key - Add a translation "admin.registries.schema.form.qualifier": "Qualifier", - + // "admin.registries.schema.form.scopenote": "Scope Note", // TODO New key - Add a translation "admin.registries.schema.form.scopenote": "Scope Note", - + // "admin.registries.schema.head": "Metadata Schema", // TODO New key - Add a translation "admin.registries.schema.head": "Metadata Schema", - + // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", // TODO New key - Add a translation "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", - + // "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", // TODO New key - Add a translation "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", - + // "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", // TODO New key - Add a translation "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", - + // "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", // TODO New key - Add a translation "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", - + // "admin.registries.schema.notification.failure": "Error", // TODO New key - Add a translation "admin.registries.schema.notification.failure": "Error", - + // "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", // TODO New key - Add a translation "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", - + // "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", // TODO New key - Add a translation "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", - + // "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", // TODO New key - Add a translation "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", - + // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", // TODO New key - Add a translation "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", - + // "admin.registries.schema.notification.success": "Success", // TODO New key - Add a translation "admin.registries.schema.notification.success": "Success", - + // "admin.registries.schema.return": "Return", // TODO New key - Add a translation "admin.registries.schema.return": "Return", - + // "admin.registries.schema.title": "DSpace Angular :: Metadata Schema Registry", // TODO New key - Add a translation "admin.registries.schema.title": "DSpace Angular :: Metadata Schema Registry", - - - + + + // "admin.access-control.epeople.actions.delete": "Delete EPerson", // TODO New key - Add a translation "admin.access-control.epeople.actions.delete": "Delete EPerson", - + // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", // TODO New key - Add a translation "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", - + // "admin.access-control.epeople.actions.reset": "Reset password", // TODO New key - Add a translation "admin.access-control.epeople.actions.reset": "Reset password", - + // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", // TODO New key - Add a translation "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", - + // "admin.access-control.epeople.title": "DSpace Angular :: EPeople", // TODO New key - Add a translation "admin.access-control.epeople.title": "DSpace Angular :: EPeople", - + // "admin.access-control.epeople.head": "EPeople", // TODO New key - Add a translation "admin.access-control.epeople.head": "EPeople", - + // "admin.access-control.epeople.search.head": "Search", "admin.access-control.epeople.search.head": "Іздеу", - + // "admin.access-control.epeople.button.see-all": "Browse All", // TODO New key - Add a translation "admin.access-control.epeople.button.see-all": "Browse All", - + // "admin.access-control.epeople.search.scope.metadata": "Metadata", // TODO New key - Add a translation "admin.access-control.epeople.search.scope.metadata": "Metadata", - + // "admin.access-control.epeople.search.scope.email": "E-mail (exact)", // TODO New key - Add a translation "admin.access-control.epeople.search.scope.email": "E-mail (exact)", - + // "admin.access-control.epeople.search.button": "Search", // TODO New key - Add a translation "admin.access-control.epeople.search.button": "Search", - + // "admin.access-control.epeople.button.add": "Add EPerson", // TODO New key - Add a translation "admin.access-control.epeople.button.add": "Add EPerson", - + // "admin.access-control.epeople.table.id": "ID", // TODO New key - Add a translation "admin.access-control.epeople.table.id": "ID", - + // "admin.access-control.epeople.table.name": "Name", // TODO New key - Add a translation "admin.access-control.epeople.table.name": "Name", - + // "admin.access-control.epeople.table.email": "E-mail (exact)", // TODO New key - Add a translation "admin.access-control.epeople.table.email": "E-mail (exact)", - + // "admin.access-control.epeople.table.edit": "Edit", // TODO New key - Add a translation "admin.access-control.epeople.table.edit": "Edit", - + // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", - + // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", - + // "admin.access-control.epeople.no-items": "No EPeople to show.", // TODO New key - Add a translation "admin.access-control.epeople.no-items": "No EPeople to show.", - + // "admin.access-control.epeople.form.create": "Create EPerson", // TODO New key - Add a translation "admin.access-control.epeople.form.create": "Create EPerson", - + // "admin.access-control.epeople.form.edit": "Edit EPerson", // TODO New key - Add a translation "admin.access-control.epeople.form.edit": "Edit EPerson", - + // "admin.access-control.epeople.form.firstName": "First name", // TODO New key - Add a translation "admin.access-control.epeople.form.firstName": "First name", - + // "admin.access-control.epeople.form.lastName": "Last name", // TODO New key - Add a translation "admin.access-control.epeople.form.lastName": "Last name", - + // "admin.access-control.epeople.form.email": "E-mail", // TODO New key - Add a translation "admin.access-control.epeople.form.email": "E-mail", - + // "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", // TODO New key - Add a translation "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", - + // "admin.access-control.epeople.form.canLogIn": "Can log in", // TODO New key - Add a translation "admin.access-control.epeople.form.canLogIn": "Can log in", - + // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", // TODO New key - Add a translation "admin.access-control.epeople.form.requireCertificate": "Requires certificate", - + // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", // TODO New key - Add a translation "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", - + // "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", // TODO New key - Add a translation "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", - + // "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", - + // "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", - + // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", // TODO New key - Add a translation "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", - + // "admin.access-control.epeople.form.table.id": "ID", // TODO New key - Add a translation "admin.access-control.epeople.form.table.id": "ID", - + // "admin.access-control.epeople.form.table.name": "Name", // TODO New key - Add a translation "admin.access-control.epeople.form.table.name": "Name", - + // "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", // TODO New key - Add a translation "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", - + // "admin.access-control.epeople.form.goToGroups": "Add to groups", // TODO New key - Add a translation "admin.access-control.epeople.form.goToGroups": "Add to groups", - + // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", - + // "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", - - - + + + // "admin.access-control.groups.title": "DSpace Angular :: Groups", // TODO New key - Add a translation "admin.access-control.groups.title": "DSpace Angular :: Groups", - + // "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Edit Group", // TODO New key - Add a translation "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Edit Group", - + // "admin.access-control.groups.title.addGroup": "DSpace Angular :: New Group", // TODO New key - Add a translation "admin.access-control.groups.title.addGroup": "DSpace Angular :: New Group", - + // "admin.access-control.groups.head": "Groups", // TODO New key - Add a translation "admin.access-control.groups.head": "Groups", - + // "admin.access-control.groups.button.add": "Add group", // TODO New key - Add a translation "admin.access-control.groups.button.add": "Add group", - + // "admin.access-control.groups.search.head": "Search groups", // TODO New key - Add a translation "admin.access-control.groups.search.head": "Search groups", - + // "admin.access-control.groups.button.see-all": "Browse all", // TODO New key - Add a translation "admin.access-control.groups.button.see-all": "Browse all", - + // "admin.access-control.groups.search.button": "Search", // TODO New key - Add a translation "admin.access-control.groups.search.button": "Search", - + // "admin.access-control.groups.table.id": "ID", // TODO New key - Add a translation "admin.access-control.groups.table.id": "ID", - + // "admin.access-control.groups.table.name": "Name", // TODO New key - Add a translation "admin.access-control.groups.table.name": "Name", - + // "admin.access-control.groups.table.members": "Members", // TODO New key - Add a translation "admin.access-control.groups.table.members": "Members", - + // "admin.access-control.groups.table.edit": "Edit", // TODO New key - Add a translation "admin.access-control.groups.table.edit": "Edit", - + // "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", - + // "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", - + // "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", // TODO New key - Add a translation "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", - + // "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", - + // "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", - + // "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", // TODO New key - Add a translation "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", - - - + + + // "admin.access-control.groups.form.alert.permanent": "This group is permanent, so it can't be edited or deleted. You can still add and remove group members using this page.", // TODO New key - Add a translation "admin.access-control.groups.form.alert.permanent": "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.workflowGroup": "This group can’t be modified or deleted because it corresponds to a role in the submission and workflow process in the \"{{name}}\" {{comcol}}. You can delete it from the \"assign roles\" tab on the edit {{comcol}} page. You can still add and remove group members using this page.", // TODO New key - Add a translation "admin.access-control.groups.form.alert.workflowGroup": "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.head.create": "Create group", // TODO New key - Add a translation "admin.access-control.groups.form.head.create": "Create group", - + // "admin.access-control.groups.form.head.edit": "Edit group", // TODO New key - Add a translation "admin.access-control.groups.form.head.edit": "Edit group", - + // "admin.access-control.groups.form.groupName": "Group name", // TODO New key - Add a translation "admin.access-control.groups.form.groupName": "Group name", - + // "admin.access-control.groups.form.groupDescription": "Description", // TODO New key - Add a translation "admin.access-control.groups.form.groupDescription": "Description", - + // "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", - + // "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", - + // "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Failed to create Group with name: \"{{name}}\", make sure the name is not already in use.", // TODO New key - Add a translation "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Failed to create Group with name: \"{{name}}\", make sure the name is not already in use.", - + // "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", - + // "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", // TODO New key - Add a translation "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", - + // "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", - + // "admin.access-control.groups.form.actions.delete": "Delete Group", // TODO New key - Add a translation "admin.access-control.groups.form.actions.delete": "Delete Group", - + // "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", // TODO New key - Add a translation "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", - + // "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", // TODO New key - Add a translation "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", - + // "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", // TODO New key - Add a translation "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", - + // "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", // TODO New key - Add a translation "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", - + // "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", // TODO New key - Add a translation "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", - + // "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", // TODO New key - Add a translation "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", - + // "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", // TODO New key - Add a translation "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", - + // "admin.access-control.groups.form.members-list.head": "EPeople", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.head": "EPeople", - + // "admin.access-control.groups.form.members-list.search.head": "Add EPeople", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.search.head": "Add EPeople", - + // "admin.access-control.groups.form.members-list.button.see-all": "Browse All", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.button.see-all": "Browse All", - + // "admin.access-control.groups.form.members-list.headMembers": "Current Members", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.headMembers": "Current Members", - + // "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", - + // "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", - + // "admin.access-control.groups.form.members-list.search.button": "Search", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.search.button": "Search", - + // "admin.access-control.groups.form.members-list.table.id": "ID", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.id": "ID", - + // "admin.access-control.groups.form.members-list.table.name": "Name", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.name": "Name", - + // "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", - + // "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", - + // "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", - + // "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", - + // "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", - + // "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", - + // "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", - + // "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", - + // "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", - + // "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", // TODO New key - Add a translation "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", - + // "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", - + // "admin.access-control.groups.form.subgroups-list.head": "Groups", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.head": "Groups", - + // "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", - + // "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", - + // "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", - + // "admin.access-control.groups.form.subgroups-list.search.button": "Search", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.search.button": "Search", - + // "admin.access-control.groups.form.subgroups-list.table.id": "ID", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.id": "ID", - + // "admin.access-control.groups.form.subgroups-list.table.name": "Name", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.name": "Name", - + // "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", - + // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", - + // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", - + // "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", - + // "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", - + // "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", - + // "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", - + // "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", - + // "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", - + // "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", - + // "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", - + // "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", - + // "admin.access-control.groups.form.return": "Return to groups", // TODO New key - Add a translation "admin.access-control.groups.form.return": "Return to groups", - - - + + + // "admin.search.breadcrumbs": "Administrative Search", // TODO New key - Add a translation "admin.search.breadcrumbs": "Administrative Search", - + // "admin.search.collection.edit": "Edit", // TODO New key - Add a translation "admin.search.collection.edit": "Edit", - + // "admin.search.community.edit": "Edit", // TODO New key - Add a translation "admin.search.community.edit": "Edit", - + // "admin.search.item.delete": "Delete", // TODO New key - Add a translation "admin.search.item.delete": "Delete", - + // "admin.search.item.edit": "Edit", // TODO New key - Add a translation "admin.search.item.edit": "Edit", - + // "admin.search.item.make-private": "Make Private", // TODO New key - Add a translation "admin.search.item.make-private": "Make Private", - + // "admin.search.item.make-public": "Make Public", // TODO New key - Add a translation "admin.search.item.make-public": "Make Public", - + // "admin.search.item.move": "Move", // TODO New key - Add a translation "admin.search.item.move": "Move", - + // "admin.search.item.reinstate": "Reinstate", // TODO New key - Add a translation "admin.search.item.reinstate": "Reinstate", - + // "admin.search.item.withdraw": "Withdraw", // TODO New key - Add a translation "admin.search.item.withdraw": "Withdraw", - + // "admin.search.title": "Administrative Search", // TODO New key - Add a translation "admin.search.title": "Administrative Search", - + // "administrativeView.search.results.head": "Administrative Search", // TODO New key - Add a translation "administrativeView.search.results.head": "Administrative Search", - - - - + + + + // "admin.workflow.breadcrumbs": "Administer Workflow", // TODO New key - Add a translation "admin.workflow.breadcrumbs": "Administer Workflow", - + // "admin.workflow.title": "Administer Workflow", // TODO New key - Add a translation "admin.workflow.title": "Administer Workflow", - + // "admin.workflow.item.workflow": "Workflow", // TODO New key - Add a translation "admin.workflow.item.workflow": "Workflow", - + // "admin.workflow.item.delete": "Delete", // TODO New key - Add a translation "admin.workflow.item.delete": "Delete", - + // "admin.workflow.item.send-back": "Send back", // TODO New key - Add a translation "admin.workflow.item.send-back": "Send back", - - - + + + // "admin.metadata-import.breadcrumbs": "Import Metadata", // TODO New key - Add a translation "admin.metadata-import.breadcrumbs": "Import Metadata", - + // "admin.metadata-import.title": "Import Metadata", // TODO New key - Add a translation "admin.metadata-import.title": "Import Metadata", - + // "admin.metadata-import.page.header": "Import Metadata", // TODO New key - Add a translation "admin.metadata-import.page.header": "Import Metadata", - + // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", // TODO New key - Add a translation "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", - + // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", // TODO New key - Add a translation "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", - + // "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", // TODO New key - Add a translation "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", - + // "admin.metadata-import.page.button.return": "Return", // TODO New key - Add a translation "admin.metadata-import.page.button.return": "Return", - + // "admin.metadata-import.page.button.proceed": "Proceed", // TODO New key - Add a translation "admin.metadata-import.page.button.proceed": "Proceed", - + // "admin.metadata-import.page.error.addFile": "Select file first!", // TODO New key - Add a translation "admin.metadata-import.page.error.addFile": "Select file first!", - - - - + + + + // "auth.errors.invalid-user": "Invalid email address or password.", // TODO New key - Add a translation "auth.errors.invalid-user": "Invalid email address or password.", - + // "auth.messages.expired": "Your session has expired. Please log in again.", // TODO New key - Add a translation "auth.messages.expired": "Your session has expired. Please log in again.", - - - + + + // "bitstream.edit.bitstream": "Bitstream: ", "bitstream.edit.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": "Қажет болса, файлдың қысқаша сипаттамасын беріңіз, мысалы \"Негізгі мақала\" немесе \"Тәжірибелік деректер көрсеткіштері\".", - + // "bitstream.edit.form.description.label": "Description", "bitstream.edit.form.description.label": "Сипаттамасы", - + // "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": "Кіруге рұқсат етілген бірінші күн. Бұл күнді осы формада өзгерту мүмкін емес. Бит ағынына тыйым салу күнін белгілеу үшін, мына жерге өтіңіз элемент дәрежесі қойындысын басыңыз Тіркелу..., бит ағынын жасау немесе өңдеу ОҚУ ереже және орнату Басталу Күні қалауы бойынша.", - + // "bitstream.edit.form.embargo.label": "Embargo until specific date", "bitstream.edit.form.embargo.label": "Белгілі бір күнге дейін тыйым салу(шектеу)", - + // "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": "Бит ағыны үшін файл атауын өзгертіңіз. Бұл көрсетілген бит ағынының URL мекенжайын өзгертетініне назар аударыңыз, бірақ бірізділік идентификаторы өзгергенге дейін ескі сілтемелер әлі де жарамды болады.", - + // "bitstream.edit.form.fileName.label": "Filename", "bitstream.edit.form.fileName.label": "Файл атауы", - + // "bitstream.edit.form.newFormat.label": "Describe new format", "bitstream.edit.form.newFormat.label": "Жаңа форматты сипаттаңыз", - + // "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": "Файлды жасау үшін пайдаланған бағдарлама, және нұсқа нөмірі (мысалы, \"ACMESoft SuperApp version 1.5\").", - + // "bitstream.edit.form.primaryBitstream.label": "Primary bitstream", "bitstream.edit.form.primaryBitstream.label": "Негізгі бит ағыны", - + // "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": "Егер формат жоғарыда көрсетілген тізімде болмаса, таңдау \"формат тізімде жоқ\" жоғары және оны бөлімде сипаттаңыз \"Жаңа форматты сипаттаңыз\".", - + // "bitstream.edit.form.selectedFormat.label": "Selected Format", "bitstream.edit.form.selectedFormat.label": "Таңдалған Формат", - + // "bitstream.edit.form.selectedFormat.unknown": "Format not in list", "bitstream.edit.form.selectedFormat.unknown": "Формат тізімде жоқ", - + // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", "bitstream.edit.notifications.error.format.title": "Бит ағынының форматын сақтау кезінде қате пайда болды", - + // "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", "bitstream.edit.notifications.saved.content": "Осы бит ағынында сіз енгізген өзгерістер сақталды.", - + // "bitstream.edit.notifications.saved.title": "Bitstream saved", "bitstream.edit.notifications.saved.title": "Бит ағыны сақталды", - + // "bitstream.edit.title": "Edit bitstream", "bitstream.edit.title": "Бит ағынын өзгерту", - - - + + + // "browse.comcol.by.author": "By Author", "browse.comcol.by.author": "Авторы", - + // "browse.comcol.by.dateissued": "By Issue Date", "browse.comcol.by.dateissued": "Шығарылған Күні Бойынша", - + // "browse.comcol.by.subject": "By Subject", "browse.comcol.by.subject": "Пәні Бойынша", - + // "browse.comcol.by.title": "By Title", "browse.comcol.by.title": "Тақырыбы Бойынша", - + // "browse.comcol.head": "Browse", "browse.comcol.head": "Көру", - + // "browse.empty": "No items to show.", "browse.empty": "Көрсету үшін элементтер жоқ.", - + // "browse.metadata.author": "Author", "browse.metadata.author": "Автор", - + // "browse.metadata.dateissued": "Issue Date", "browse.metadata.dateissued": "Шығарылған күні", - + // "browse.metadata.subject": "Subject", "browse.metadata.subject": "Пән", - + // "browse.metadata.title": "Title", "browse.metadata.title": "Тақырып", - + // "browse.metadata.author.breadcrumbs": "Browse by Author", "browse.metadata.author.breadcrumbs": "Автор бойынша қарау", - + // "browse.metadata.dateissued.breadcrumbs": "Browse by Date", "browse.metadata.dateissued.breadcrumbs": "Күні бойынша қарау", - + // "browse.metadata.subject.breadcrumbs": "Browse by Subject", "browse.metadata.subject.breadcrumbs": "Пәні бойынша қарау", - + // "browse.metadata.title.breadcrumbs": "Browse by Title", "browse.metadata.title.breadcrumbs": "Тақырыбы бойынша қарау", - + // "browse.startsWith.choose_start": "(Choose start)", "browse.startsWith.choose_start": "(басталуын таңдаңыз)", - + // "browse.startsWith.choose_year": "(Choose year)", "browse.startsWith.choose_year": "(Жылды таңдаңыз)", - + // "browse.startsWith.jump": "Jump to a point in the index:", "browse.startsWith.jump": "Индекстегі нүктеге өту:", - + // "browse.startsWith.months.april": "April", "browse.startsWith.months.april": "Сәуір", - + // "browse.startsWith.months.august": "August", "browse.startsWith.months.august": "Тамыз", - + // "browse.startsWith.months.december": "December", "browse.startsWith.months.december": "Желтоқсан", - + // "browse.startsWith.months.february": "February", "browse.startsWith.months.february": "Ақпан", - + // "browse.startsWith.months.january": "January", "browse.startsWith.months.january": "Қаңтар", - + // "browse.startsWith.months.july": "July", "browse.startsWith.months.july": "Шілде", - + // "browse.startsWith.months.june": "June", "browse.startsWith.months.june": "Маусым", - + // "browse.startsWith.months.march": "March", "browse.startsWith.months.march": "Наурыз", - + // "browse.startsWith.months.may": "May", "browse.startsWith.months.may": "Мамыр", - + // "browse.startsWith.months.none": "(Choose month)", "browse.startsWith.months.none": "(Айды таңдаңыз)", - + // "browse.startsWith.months.november": "November", "browse.startsWith.months.november": "Қараша", - + // "browse.startsWith.months.october": "October", "browse.startsWith.months.october": "Қазан", - + // "browse.startsWith.months.september": "September", "browse.startsWith.months.september": "Қыркүйек", - + // "browse.startsWith.submit": "Go", "browse.startsWith.submit": "Go", - + // "browse.startsWith.type_date": "Or type in a date (year-month):", "browse.startsWith.type_date": "Немесе күнді енгізіңіз (жыл-ай):", - + // "browse.startsWith.type_text": "Or enter first few letters:", "browse.startsWith.type_text": "Немесе алғашқы бірнеше әріптерді енгізіңіз:", - + // "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", "browse.title": "{{collection}} {{field}} {{value}} бойынша қараңыз", - - + + // "chips.remove": "Remove chip", "chips.remove": "Чипті жою", // "collection.create.head": "Create a Collection", "collection.create.head": "Топтама Жасау", - + // "collection.create.notifications.success": "Successfully created the Collection", "collection.create.notifications.success": "Топтама сәтті жасалды", - + // "collection.create.sub-head": "Create a Collection for Community {{ parent }}", "collection.create.sub-head": "Қауымдастық үшін Топтама жасау {{ parent }}", - + // "collection.curate.header": "Curate Collection: {{collection}}", "collection.curate.header": "Кураторлық Топтама: {{collection}}", - + // "collection.delete.cancel": "Cancel", "collection.delete.cancel": "Бас тарту", - + // "collection.delete.confirm": "Confirm", "collection.delete.confirm": "Растау", - + // "collection.delete.head": "Delete Collection", "collection.delete.head": "Топтаманы жою", - + // "collection.delete.notification.fail": "Collection could not be deleted", "collection.delete.notification.fail": "Топтаманы жою мүмкін емес", - + // "collection.delete.notification.success": "Successfully deleted collection", "collection.delete.notification.success": "Топтама сәтті жойылды", - + // "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", "collection.delete.text": "Сіз шынымен топтаманы жойғыңыз келеді ме\"{{ dso }}\"", - + // "collection.edit.delete": "Delete this collection", "collection.edit.delete": "Осы топтаманы жою", - + // "collection.edit.head": "Edit Collection", "collection.edit.head": "Топтаманы Өңдеу", - + // "collection.edit.breadcrumbs": "Edit Collection", "collection.edit.breadcrumbs": "Топтаманы Өңдеу", - + // "collection.edit.tabs.mapper.head": "Item Mapper", "collection.edit.tabs.mapper.head": "Элементті Түрлендіру", - + // "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", "collection.edit.tabs.item-mapper.title": "Топтаманы Өңдеу - Элементті Түрлендіру", - + // "collection.edit.item-mapper.cancel": "Cancel", "collection.edit.item-mapper.cancel": "Бас тарту", - + // "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", "collection.edit.item-mapper.collection": "Топтама: \"{{name}}\"", - + // "collection.edit.item-mapper.confirm": "Map selected items", "collection.edit.item-mapper.confirm": "Таңдалған элементтерді көрсету", - + // "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": "Бұл топтама әкімшілеріне басқа топтамалардан осы топтамаға элементтерді көрсетуге мүмкіндік беретін элементтерді көрсету құралы. Сіз басқа топтамалардандан заттарды іздей аласыз және оларды картаға түсіре аласыз немесе ағымдағы көрсетілген элементтердің тізімін көре аласыз.", - + // "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", "collection.edit.item-mapper.head": "Элементті Түрлендіру - Басқа топтамалардан элементтерді көрсету", - + // "collection.edit.item-mapper.no-search": "Please enter a query to search", "collection.edit.item-mapper.no-search": "Іздеу үшін ақпаратты енгізіңіз", - + // "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", "collection.edit.item-mapper.notifications.map.error.content": "Элементтерді салыстыру кезінде қателер орын алды {{amount}}.", - + // "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", "collection.edit.item-mapper.notifications.map.error.head": "Түрлендіру қателері", - + // "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", "collection.edit.item-mapper.notifications.map.success.content": "Элементтер сәтті салыстырылды {{amount}} .", - + // "collection.edit.item-mapper.notifications.map.success.head": "Mapping completed", "collection.edit.item-mapper.notifications.map.success.head": "Салыстыру аяқталды", - + // "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}} .", - + // "collection.edit.item-mapper.notifications.unmap.error.head": "Remove mapping errors", "collection.edit.item-mapper.notifications.unmap.error.head": "Салыстыру қателерін жою", - + // "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", "collection.edit.item-mapper.notifications.unmap.success.content": "Элементтердің салыстырулары сәтті жойылды {{amount}} .", - + // "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", "collection.edit.item-mapper.notifications.unmap.success.head": "Салыстыруды жою аяқталды", - + // "collection.edit.item-mapper.remove": "Remove selected item mappings", "collection.edit.item-mapper.remove": "Таңдалған элементтердің салыстыруларын жою", - + // "collection.edit.item-mapper.tabs.browse": "Browse mapped items", "collection.edit.item-mapper.tabs.browse": "Салыстырылған элементтерді қарау", - + // "collection.edit.item-mapper.tabs.map": "Map new items", "collection.edit.item-mapper.tabs.map": "Жаңа элементтерді көрсету", - + // "collection.edit.logo.label": "Collection logo", "collection.edit.logo.label": "Топтама логотипі", - + // "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", "collection.edit.logo.notifications.add.error": "Топтама логотипін жүктеу мүмкін емес. Қайта қолданар алдында мазмұның тексеріңіз.", - + // "collection.edit.logo.notifications.add.success": "Upload Collection logo successful.", "collection.edit.logo.notifications.add.success": "Топтама логотипін жүктеу сәтті өтті.", - + // "collection.edit.logo.notifications.delete.success.title": "Logo deleted", "collection.edit.logo.notifications.delete.success.title": "Логотип жойылды", - + // "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", "collection.edit.logo.notifications.delete.success.content": "Топтама логотипі сәтті жойылды", - + // "collection.edit.logo.notifications.delete.error.title": "Error deleting logo", "collection.edit.logo.notifications.delete.error.title": "Логотипті өшіру кезінде қате орын алды", - + // "collection.edit.logo.upload": "Drop a Collection Logo to upload", "collection.edit.logo.upload": "Жүктеу үшін топтама логотипін жойыңыз", - + // "collection.edit.notifications.success": "Successfully edited the Collection", "collection.edit.notifications.success": "Сәтті өзгертілген топтама", - + // "collection.edit.return": "Return", "collection.edit.return": "Қайтару", - + // "collection.edit.tabs.curate.head": "Curate", "collection.edit.tabs.curate.head": "Куратор", - + // "collection.edit.tabs.curate.title": "Collection Edit - Curate", "collection.edit.tabs.curate.title": "Топтаманы өзгерту-Куратор", - + // "collection.edit.tabs.authorizations.head": "Authorizations", "collection.edit.tabs.authorizations.head": "Авторизациялар", - + // "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", "collection.edit.tabs.authorizations.title": "Топтаманы өзгерту - Авторизациялар", - + // "collection.edit.tabs.metadata.head": "Edit Metadata", "collection.edit.tabs.metadata.head": "Метадеректерді өңдеу", - - // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", + + // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", "collection.edit.tabs.metadata.title": "Топтаманы өзгерту - Метадеректер", - + // "collection.edit.tabs.roles.head": "Assign Roles", "collection.edit.tabs.roles.head": "Рөлдерді тағайындау", - + // "collection.edit.tabs.roles.title": "Collection Edit - Roles", "collection.edit.tabs.roles.title": "Топтаманы өзгерту - Рөлдер", - + // "collection.edit.tabs.source.external": "This collection harvests its content from an external source", "collection.edit.tabs.source.external": "Топтама өзінің мазмұнын сыртқы дереккөзден жинайды", - + // "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": "Негізгі топтама жиынтығының идентификаторын көрсету керек.", - + // "collection.edit.tabs.source.form.harvestType": "Content being harvested", "collection.edit.tabs.source.form.harvestType": "Мазмұн жиналуда", - + // "collection.edit.tabs.source.form.head": "Configure an external source", "collection.edit.tabs.source.form.head": "Сыртқы дереккөзді баптау", - + // "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", "collection.edit.tabs.source.form.metadataConfigId": "Метадеректер форматы", - + // "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", "collection.edit.tabs.source.form.oaiSetId": "OAI арнайы жиын идентификаторы", - + // "collection.edit.tabs.source.form.oaiSource": "OAI Provider", "collection.edit.tabs.source.form.oaiSource": "OAI Провайдер (Жеткізуші)", - + // "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": "Метадеректер мен бит ағындарын жинау (requires ORE support)(ORE қолдауын қажет етеді)", - + // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest metadata and references to bitstreams (requires ORE support)", "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Метадеректер мен биттік ағындарға сілтемелерді жинау (requires ORE support)(ORE қолдауын қажет етеді)", - + // "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvest metadata only", "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Тек метадеректерді жинау", - + // "collection.edit.tabs.source.head": "Content Source", "collection.edit.tabs.source.head": "Дереккөз мазмұны", - + // "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": "Өзгерістеріңіз алынып тасталынды (жойылды). Өзгерістерді қалпына келтіру үшін «Болдырмау» түймесін басыңыз", - + // "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", "collection.edit.tabs.source.notifications.discarded.title": "Өзгерістер алынып тасталынды (жойылды)", - + // "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": "Сіз енгізген өзгерістер сақталмады. Сақтау алдында барлық өзгерістердің жарамды екеніне көз жеткізіңіз.", - + // "collection.edit.tabs.source.notifications.invalid.title": "Metadata invalid", "collection.edit.tabs.source.notifications.invalid.title": "Метадеректер жарамсыз", - + // "collection.edit.tabs.source.notifications.saved.content": "Your changes to this collection's content source were saved.", "collection.edit.tabs.source.notifications.saved.content": "Топтаманың мазмұн дереккөзіне енгізілген өзгертулеріңіз сақталды.", - + // "collection.edit.tabs.source.notifications.saved.title": "Content Source saved", "collection.edit.tabs.source.notifications.saved.title": "Мазмұн Дереккөзі сақталды", - + // "collection.edit.tabs.source.title": "Collection Edit - Content Source", "collection.edit.tabs.source.title": "Топтаманы Өзгерту - Мазмұн Дереккөзі", - + // "collection.edit.template.add-button": "Add", "collection.edit.template.add-button": "Қосу", - + // "collection.edit.template.breadcrumbs": "Item template", "collection.edit.template.breadcrumbs": "Элемент үлгісі", - + // "collection.edit.template.cancel": "Cancel", "collection.edit.template.cancel": "Бас тарту", - + // "collection.edit.template.delete-button": "Delete", "collection.edit.template.delete-button": "Жою", - + // "collection.edit.template.edit-button": "Edit", "collection.edit.template.edit-button": "Өзгерту", - + // "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", "collection.edit.template.head": "Топтамаға арналған үлгі элементін өзгерту \"{{ collection }}\"", - + // "collection.edit.template.label": "Template item", "collection.edit.template.label": "Үлгі элементі", - + // "collection.edit.template.notifications.delete.error": "Failed to delete the item template", "collection.edit.template.notifications.delete.error": "Элемент үлгісін жою мүмкін емес", - + // "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", "collection.edit.template.notifications.delete.success": "Элемент үлгісі сәтті жойылды", - + // "collection.edit.template.title": "Edit Template Item", "collection.edit.template.title": "Үлгі элементін өзгерту", - + // "collection.form.abstract": "Short Description", "collection.form.abstract": "Қысқаша сипаттамасы", - + // "collection.form.description": "Introductory text (HTML)", "collection.form.description": "Кіріспе мәтін (HTML)", - + // "collection.form.errors.title.required": "Please enter a collection name", "collection.form.errors.title.required": "Топтаманың атауын енгізіңіз", - + // "collection.form.license": "License", "collection.form.license": "Лицензия", - + // "collection.form.provenance": "Provenance", "collection.form.provenance": "Шығу тегі", - + // "collection.form.rights": "Copyright text (HTML)", "collection.form.rights": "Авторлық мәтін (HTML)", - + // "collection.form.tableofcontents": "News (HTML)", "collection.form.tableofcontents": "Жаңалықтар (HTML)", - + // "collection.form.title": "Name", "collection.form.title": "Атауы", - + // "collection.listelement.badge": "Collection", "collection.listelement.badge": "Топтама", - + // "collection.page.browse.recent.head": "Recent Submissions", "collection.page.browse.recent.head": "Соңғы Материалдар", - + // "collection.page.browse.recent.empty": "No items to show", "collection.page.browse.recent.empty": "Көрсету үшін элементтер жоқ", - + // "collection.page.edit": "Edit this collection", "collection.page.edit": "Жинақты өңдеңіз", - + // "collection.page.handle": "Permanent URI for this collection", // TODO New key - Add a translation "collection.page.handle": "Тұрақты URI коллекция үшін", - + // "collection.page.license": "License", "collection.page.license": "Лицензия", - + // "collection.page.news": "News", "collection.page.news": "Жаңалықтар", - + // "collection.select.confirm": "Confirm selected", "collection.select.confirm": "Таңдалғанды растау", - + // "collection.select.empty": "No collections to show", "collection.select.empty": "Көрсету үшін топтамалар жоқ", - + // "collection.select.table.title": "Title", "collection.select.table.title": "Тақырыбы", - + // "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", "collection.source.update.notifications.error.content": "Берілген параметрлер тексерілді және жұмыс істемеді.", - + // "collection.source.update.notifications.error.title": "Server Error", "collection.source.update.notifications.error.title": "Сервер қатесі", - - - + + + // "communityList.tabTitle": "DSpace - Community List", "communityList.tabTitle": "DSpace - Қауымдастық Тізімі", - + // "communityList.title": "List of Communities", "communityList.title": "Қауымдастықтар Тізімі", - + // "communityList.showMore": "Show More", "communityList.showMore": "Көбірек Көрсету", - - - + + + // "community.create.head": "Create a Community", "community.create.head": "Қауымдастық Құру", - + // "community.create.notifications.success": "Successfully created the Community", "community.create.notifications.success": "Қауымдастық Сәтті құрылды", - + // "community.create.sub-head": "Create a Sub-Community for Community {{ parent }}", "community.create.sub-head": "Қауымдастық үшін Қосалқы Қауымдастық Жасаңыз {{ parent }}", - + // "community.curate.header": "Curate Community: {{community}}", "community.curate.header": "Кураторлық Қауымдастық: {{community}}", - + // "community.delete.cancel": "Cancel", "community.delete.cancel": "Бас тарту", - + // "community.delete.confirm": "Confirm", "community.delete.confirm": "Растау", - + // "community.delete.head": "Delete Community", "community.delete.head": "Қауымдастықты Жою", - + // "community.delete.notification.fail": "Community could not be deleted", "community.delete.notification.fail": "Қауымдастықты жою мүмкін емес", - + // "community.delete.notification.success": "Successfully deleted community", "community.delete.notification.success": "Қауымдастық сәтті жойылды", - + // "community.delete.text": "Are you sure you want to delete community \"{{ dso }}\"", "community.delete.text": "Қауымдастықты жойғыңыз келетініне сенімдісіз бе \"{{ dso }}\"", - + // "community.edit.delete": "Delete this community", "community.edit.delete": "Бұл қауымдастықты жойыңыз", - + // "community.edit.head": "Edit Community", "community.edit.head": "Қауымдастықты Өзгерту", - + // "community.edit.breadcrumbs": "Edit Community", "community.edit.breadcrumbs": "Edit Community", - - + + // "community.edit.logo.label": "Community logo", "community.edit.logo.label": "Қауымдастық логотипі", - + // "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", "community.edit.logo.notifications.add.error": "Қауымдастық логотипін жүктеу мүмкін емес. Қайта қолданар алдында мазмұның тексеріңіз.", - + // "community.edit.logo.notifications.add.success": "Upload Community logo successful.", "community.edit.logo.notifications.add.success": "Қауымдастық логотипін жүктеу сәтті өтті.", - + // "community.edit.logo.notifications.delete.success.title": "Logo deleted", "community.edit.logo.notifications.delete.success.title": "Логотип жойылды", - + // "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", "community.edit.logo.notifications.delete.success.content": "Қауымдастық логотипі сәтті жойылды", - + // "community.edit.logo.notifications.delete.error.title": "Error deleting logo", "community.edit.logo.notifications.delete.error.title": "Логотипті жою қатесі", - + // "community.edit.logo.upload": "Drop a Community Logo to upload", "community.edit.logo.upload": "Жүктеу үшін Қауымдастық Логотипін жойыңыз", - - - + + + // "community.edit.notifications.success": "Successfully edited the Community", "community.edit.notifications.success": "Сәтті өзгертілген Қауымдастық", - + // "community.edit.notifications.unauthorized": "You do not have privileges to make this change", "community.edit.notifications.unauthorized": "Бұл өзгерісті жасауға Сіздің құқығыңыз жоқ", - + // "community.edit.notifications.error": "An error occured while editing the Community", "community.edit.notifications.error": "Қауымдастықты өзгерту кезінде қате орын алды", - + // "community.edit.return": "Return", "community.edit.return": "Қайтару", - - - + + + // "community.edit.tabs.curate.head": "Curate", "community.edit.tabs.curate.head": "Куратор", - + // "community.edit.tabs.curate.title": "Community Edit - Curate", "community.edit.tabs.curate.title": "Қауымдастық Өзгерту - Куратор", - + // "community.edit.tabs.metadata.head": "Edit Metadata", "community.edit.tabs.metadata.head": "Метадеректерді Өзгерту", - + // "community.edit.tabs.metadata.title": "Community Edit - Metadata", "community.edit.tabs.metadata.title": "Қауымдастықты Өзгерту-Метадеректер", - + // "community.edit.tabs.roles.head": "Assign Roles", "community.edit.tabs.roles.head": "Рөлдерді Бөлу", - + // "community.edit.tabs.roles.title": "Community Edit - Roles", "community.edit.tabs.roles.title": "Қауымдастықты Өзгерту - Рөлдер", - + // "community.edit.tabs.authorizations.head": "Authorizations", "community.edit.tabs.authorizations.head": "Рұқсаттар", - + // "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", "community.edit.tabs.authorizations.title": "Қауымдастықты Өзгерту - Рұқсаттар", - - - + + + // "community.listelement.badge": "Community", "community.listelement.badge": "Қауымдастық", - - - + + + // "comcol-role.edit.no-group": "None", // TODO New key - Add a translation "comcol-role.edit.no-group": "None", - + // "comcol-role.edit.create": "Create", // TODO New key - Add a translation "comcol-role.edit.create": "Create", - + // "comcol-role.edit.restrict": "Restrict", // TODO New key - Add a translation "comcol-role.edit.restrict": "Restrict", - + // "comcol-role.edit.delete": "Delete", // TODO New key - Add a translation "comcol-role.edit.delete": "Delete", - - + + // "comcol-role.edit.community-admin.name": "Administrators", // TODO New key - Add a translation "comcol-role.edit.community-admin.name": "Administrators", - + // "comcol-role.edit.collection-admin.name": "Administrators", // TODO New key - Add a translation "comcol-role.edit.collection-admin.name": "Administrators", - - + + // "comcol-role.edit.community-admin.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", // TODO New key - Add a translation "comcol-role.edit.community-admin.description": "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.collection-admin.description": "Collection administrators decide who can submit items to the collection, edit item metadata (after submission), and add (map) existing items from other collections to this collection (subject to authorization for that collection).", // TODO New key - Add a translation "comcol-role.edit.collection-admin.description": "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.submitters.name": "Submitters", // TODO New key - Add a translation "comcol-role.edit.submitters.name": "Submitters", - + // "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", // TODO New key - Add a translation "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", - - + + // "comcol-role.edit.item_read.name": "Default item read access", // TODO New key - Add a translation "comcol-role.edit.item_read.name": "Default item read access", - + // "comcol-role.edit.item_read.description": "E-People and Groups that can read new items submitted to this collection. Changes to this role are not retroactive. Existing items in the system will still be viewable by those who had read access at the time of their addition.", // TODO New key - Add a translation "comcol-role.edit.item_read.description": "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.anonymous-group": "Default read for incoming items is currently set to Anonymous.", // TODO New key - Add a translation "comcol-role.edit.item_read.anonymous-group": "Default read for incoming items is currently set to Anonymous.", - - + + // "comcol-role.edit.bitstream_read.name": "Default bitstream read access", // TODO New key - Add a translation "comcol-role.edit.bitstream_read.name": "Default bitstream read access", - + // "comcol-role.edit.bitstream_read.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", // TODO New key - Add a translation "comcol-role.edit.bitstream_read.description": "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.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", // TODO New key - Add a translation "comcol-role.edit.bitstream_read.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", - - + + // "comcol-role.edit.editor.name": "Editors", // TODO New key - Add a translation "comcol-role.edit.editor.name": "Editors", - + // "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", // TODO New key - Add a translation "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", - - + + // "comcol-role.edit.finaleditor.name": "Final editors", // TODO New key - Add a translation "comcol-role.edit.finaleditor.name": "Final editors", - + // "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", // TODO New key - Add a translation "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", - - + + // "comcol-role.edit.reviewer.name": "Reviewers", // TODO New key - Add a translation "comcol-role.edit.reviewer.name": "Reviewers", - + // "comcol-role.edit.reviewer.description": "Reviewers are able to accept or reject incoming submissions. However, they are not able to edit the submission's metadata.", // TODO New key - Add a translation "comcol-role.edit.reviewer.description": "Reviewers are able to accept or reject incoming submissions. However, they are not able to edit the submission's metadata.", - - - + + + // "community.form.abstract": "Short Description", "community.form.abstract": "Қысқаша Сипаттамасы", - + // "community.form.description": "Introductory text (HTML)", "community.form.description": "Кіріспе мәтін (HTML)", - + // "community.form.errors.title.required": "Please enter a community name", "community.form.errors.title.required": "Қауымдастық атын енгізіңіз", - + // "community.form.rights": "Copyright text (HTML)", "community.form.rights": "Авторлық мәтін (HTML)", - + // "community.form.tableofcontents": "News (HTML)", "community.form.tableofcontents": "Жаңалықтар (HTML)", - + // "community.form.title": "Name", "community.form.title": "Атауы", - + // "community.page.edit": "Edit this community", "community.page.edit": "Қауымдастықты өзгерту", - + // "community.page.handle": "Permanent URI for this community", "community.page.handle": "Осы қауымдастық үшін Тұрақты URI", - + // "community.page.license": "License", "community.page.license": "Лицензия", - + // "community.page.news": "News", "community.page.news": "Жаңалықтыр", - + // "community.all-lists.head": "Subcommunities and Collections", "community.all-lists.head": "Қосалқы қауымдамтықтар мен топтамалар", - + // "community.sub-collection-list.head": "Collections of this Community", "community.sub-collection-list.head": "Қауымдастық Топтамалары", - + // "community.sub-community-list.head": "Communities of this Community", "community.sub-community-list.head": "Осы қоғамдастық шеңберіндегі қауымдастықтар", - - - + + + // "cookies.consent.app.opt-out.title": "(opt-out)", "cookies.consent.app.opt-out.title": "(opt-out)", - + // "cookies.consent.app.purpose": "purpose", "cookies.consent.app.purpose": "Мақсаты", - + // "cookies.consent.app.required.description": "This application is always required", "cookies.consent.app.required.description": "Бұл бағдарлама әрқашан қажет", - + // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(әрқашан қажет)", - + // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Сіздің соңғы рет болғаңыздан бері өзгерістер болды, келісіміңізді жаңартыңыз.", - + // "cookies.consent.close": "Close", "cookies.consent.close": "Жабу", - + // "cookies.consent.decline": "Decline", "cookies.consent.decline": "Қабылдамау", - + // "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": "Біз сіздің жеке ақпаратыңызды келесі мақсаттарда жинаймыз және өңдейміз: Аутентификация, Параметрлері, Растау және Статистикалар.
Көбірек білу үшін, біздің {privacyPolicy} оқуыңызды өтінеміз.", - + // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Баптау", - + // "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", "cookies.consent.content-modal.description": "Мұнда сіз туралы жиналған ақпаратты көре және баптай аласыз", - + // "cookies.consent.content-modal.privacy-policy.name": "privacy policy", "cookies.consent.content-modal.privacy-policy.name": "Конфиденциальді ақпарат ережелері", - + // "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", "cookies.consent.content-modal.privacy-policy.text": "Көбірек білу үшін, біздің {privacyPolicy} оқуыңызды өтінеміз..", - + // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Біз жинайтын ақпарат", - + // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Аутентификация", - + // "cookies.consent.app.description.authentication": "Required for signing you in", "cookies.consent.app.description.authentication": "Жүйеге кіру үшін қажет", - + // "cookies.consent.app.title.preferences": "Preferences", "cookies.consent.app.title.preferences": "Параметрлері", - + // "cookies.consent.app.description.preferences": "Required for saving your preferences", "cookies.consent.app.description.preferences": "Параметрлерді сақтау үшін қажет", - + // "cookies.consent.app.title.acknowledgement": "Acknowledgement", "cookies.consent.app.title.acknowledgement": "Растау", - + // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", "cookies.consent.app.description.acknowledgement": "Сіздің растауыңызбен келісімдеріңізді сақтау үшін қажет", - + // "cookies.consent.app.title.google-analytics": "Google Analytics", "cookies.consent.app.title.google-analytics": "Google Аналитикасы", - + // "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", "cookies.consent.app.description.google-analytics": "Бізге статистикалық мәліметтерді бақылауға мүмкіндік береді", - + // "cookies.consent.purpose.functional": "Functional", "cookies.consent.purpose.functional": "Функционалды", - + // "cookies.consent.purpose.statistical": "Statistical", "cookies.consent.purpose.statistical": "Статистикалық", - - + + // "curation-task.task.checklinks.label": "Check Links in Metadata", "curation-task.task.checklinks.label": "Метадеректердегі Сілтемелерді Тексеріңіз", - + // "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": "Бит ағыны Профильдерінің Форматы", - + // "curation-task.task.requiredmetadata.label": "Check for Required Metadata", "curation-task.task.requiredmetadata.label": "Қажетті Деректерді Тексеріңіз", - + // "curation-task.task.translate.label": "Microsoft Translator", "curation-task.task.translate.label": "Microsoft Аудармашысы", - + // "curation-task.task.vscan.label": "Virus Scan", "curation-task.task.vscan.label": "Вирустарды тексеру", - - - + + + // "curation.form.task-select.label": "Task:", "curation.form.task-select.label": "Міндет(Тапсырма):", - + // "curation.form.submit": "Start", "curation.form.submit": "Бастау", - + // "curation.form.submit.success.head": "The curation task has been started successfully", "curation.form.submit.success.head": "Кураторлық(Жетекшілік) міндет сәтті басталды", - + // "curation.form.submit.success.content": "You will be redirected to the corresponding process page.", "curation.form.submit.success.content": "Сіз процестің тиісті бетіне қайта бағытталасыз.", - + // "curation.form.submit.error.head": "Running the curation task failed", "curation.form.submit.error.head": "Кураторлық(Жетекшілік) тапсырманы орындау мүмкін емес", - + // "curation.form.submit.error.content": "An error occured when trying to start the curation task.", "curation.form.submit.error.content": "Тапсырманы іске қосу кезіндегі қателік.", - + // "curation.form.handle.label": "Handle:", "curation.form.handle.label": "Қалам:", - + // "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": "Кеңес: Енгізіңіз [your-handle-prefix]/0 бүкіл сайт бойынша тапсырманы орындау үшін(барлық тапсырмалар бұл мүмкіндікті қолдамауы мүмкін)", - - - + + + // "dso-selector.create.collection.head": "New collection", "dso-selector.create.collection.head": "Жаңа топтама", - + // "dso-selector.create.collection.sub-level": "Create a new collection in", "dso-selector.create.collection.sub-level": "Жаңа топтама жасаңыз", - + // "dso-selector.create.community.head": "New community", "dso-selector.create.community.head": "Жаңа қауымдастық", - + // "dso-selector.create.community.sub-level": "Create a new community in", "dso-selector.create.community.sub-level": "Жаңңа қауымдастық жасаңыз", - + // "dso-selector.create.community.top-level": "Create a new top-level community", "dso-selector.create.community.top-level": "Жаңа жоғары деңгейлі қауымдастық құрыңыз", - + // "dso-selector.create.item.head": "New item", "dso-selector.create.item.head": "Жаңа элемент", - + // "dso-selector.create.item.sub-level": "Create a new item in", "dso-selector.create.item.sub-level": "Жаңа элемент жасаңыз", - + // "dso-selector.create.submission.head": "New submission", "dso-selector.create.submission.head": "Жаңа өтініш", - + // "dso-selector.edit.collection.head": "Edit collection", "dso-selector.edit.collection.head": "Топтаманы өзгерту", - + // "dso-selector.edit.community.head": "Edit community", "dso-selector.edit.community.head": "Қауымдастықты өзгерту", - + // "dso-selector.edit.item.head": "Edit item", "dso-selector.edit.item.head": "Элементті өзгерту", - + // "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", "dso-selector.export-metadata.dspaceobject.head": "Метадеректерді экспорттау", - + // "dso-selector.no-results": "No {{ type }} found", "dso-selector.no-results": "Табылған жоқ {{ type }}", - + // "dso-selector.placeholder": "Search for a {{ type }}", "dso-selector.placeholder": "{{ type }} іздеу", - - - + + + // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", "confirmation-modal.export-metadata.header": "{{ dsoName }} метадеректерін экспорттау", - + // "confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}", "confirmation-modal.export-metadata.info": "{{ dsoName }} метадеректерін экспорттағыңыз келетініне сенімдісіз бе", // "confirmation-modal.export-metadata.cancel": "Cancel", "confirmation-modal.export-metadata.cancel":"Болдырмау", - + // "confirmation-modal.export-metadata.confirm": "Export", "confirmation-modal.export-metadata.confirm":"Экспорт", - - // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", - "confirmation-modal.delete-eperson.header": "EPerson \"{{ dsoName }}\" жою, - - // "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", + // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", + "confirmation-modal.delete-eperson.header": "EPerson \"{{ dsoName }}\" жою", + + // "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", "confirmation-modal.delete-eperson.info": "EPerson \"{{ dsoName }}\ қолданбасын жойғыңыз келетініне сенімдісіз бе"", - + // "confirmation-modal.delete-eperson.cancel": "Cancel", - + "confirmation-modal.delete-eperson.cancel": "Болдырмау", - + // "confirmation-modal.delete-eperson.confirm": "Delete", "confirmation-modal.delete-eperson.confirm": "Жою", - - + + // "error.bitstream": "Error fetching bitstream", "error.bitstream": "Бақыттық ағынды алу қатесі", - + // "error.browse-by": "Error fetching items", "error.browse-by": "Элементтерді алу қатесі", - + // "error.collection": "Error fetching collection", "error.collection": "Жинауды алу қатесі", - + // "error.collections": "Error fetching collections", "error.collections": "Жинақтарды алу қатесі", - + // "error.community": "Error fetching community", "error.community": "Қауымдастықты алу қатесі", - + // "error.identifier": "No item found for the identifier", "error.identifier": "Идентификатор үшін ешбір элемент табылмады", - + // "error.default": "Error", "error.default": "Қате", - + // "error.item": "Error fetching item", "error.item": "Элементті алу қатесі", - + // "error.items": "Error fetching items", "error.items": "Элементтерді алу қатесі", - + // "error.objects": "Error fetching objects", "error.objects":"Нысандарды алу қатесі", - + // "error.recent-submissions": "Error fetching recent submissions", "error.recent-submissions":"Соңғы жіберілімдерді алу қатесі", - + // "error.search-results": "Error fetching search results", "error.search-results": "Іздеу нәтижелерін алу қатесі", - + // "error.sub-collections": "Error fetching sub-collections", "error.sub-collections":"Ішкі жинақтарды алу қатесі", - + // "error.sub-communities": "Error fetching sub-communities", "error.sub-communities": "Қосымша қауымдастықтарды алу қатесі", - + // "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":"Бөлімді инициализациялау кезінде қате орын алды, енгізу пішінінің конфигурациясын тексеріңіз. Мәліметтер төменде берілген:

", - - // "error.top-level-communities": "Error fetching top-level communities", + + // "error.top-level-communities": "Error fetching top-level communities", "error.top-level-communities": "Жоғары деңгейлі қауымдастықтарды алу қатесі", - // "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": "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": "Жіберуді аяқтау үшін осы лицензияны беруіңіз керек. Бұл лицензияны қазір бере алмасаңыз, жұмысыңызды сақтап, кейінірек оралуыңызға немесе жіберуді жоюға болады.", - - // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", + + // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", "error.validation.pattern": "Бұл енгізу ағымдағы үлгімен шектелген: {{ үлгі }}.", - + // "error.validation.filerequired": "The file upload is mandatory", "error.validation.filerequired": "Файлды жүктеп салу міндетті", - - - + + + // "file-section.error.header": "Error obtaining files for this item", "file-section.error.header": "Осы элемент үшін файлдарды алу қатесі", - - - + + + // "footer.copyright": "copyright © 2002-{{ year }}", "footer.copyright": "Авторлық құқық © 2002-{{ year }}", - + // "footer.link.dspace": "DSpace software", "footer.link.dspace": "DSpace бағдарламалық құралы", - + // "footer.link.lyrasis": "LYRASIS", "footer.link.lyrasis": "LYRASIS", - + // "footer.link.cookies": "Cookie settings", "footer.link.cookies": "Cookie параметрлері", - + // "footer.link.privacy-policy": "Privacy policy", "footer.link.privacy-policy": "Құпиялылық саясаты", - + // "footer.link.end-user-agreement":"End User Agreement", "footer.link.end-user-agreement":"Соңғы пайдаланушы келісімі", - - - + + + // "forgot-email.form.header": "Forgot Password", "forgot-email.form.header": "Парольді Ұмыттыңыз Ба", - + // "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": "Электрондық пошта жаңартуларына арналған жинақтарға жазылу және DSpace қызметіне жаңа элементтерді жіберу үшін тіркелгіні тіркеңіз.", - + // "forgot-email.form.email": "Email Address *", "forgot-email.form.email": "Электрондық пошта *", - + // "forgot-email.form.email.error.required": "Please fill in an email address", "forgot-email.form.email.error.required": "Электрондық пошта мекенжайын толтырыңыз", - + // "forgot-email.form.email.error.pattern": "Please fill in a valid email address", "forgot-email.form.email.error.pattern": "Жарамды электрондық пошта мекенжайын толтырыңыз", - + // "forgot-email.form.email.hint": "This address will be verified and used as your login name.", "forgot-email.form.email.hint": "Бұл мекенжай тексеріледі және сіздің логин атыңыз ретінде пайдаланылады.", - + // "forgot-email.form.submit": "Submit", "forgot-email.form.submit": "Жіберу", - + // "forgot-email.form.success.head": "Verification email sent", "forgot-email.form.success.head": "Растау электрондық поштасы жіберілді", - + // "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", "forgot-email.form.success.content": "Арнайы URL мекенжайы және қосымша нұсқаулары бар электрондық пошта {{ email }} мекенжайына жіберілді.", - + // "forgot-email.form.error.head": "Error when trying to register email", "forgot-email.form.error.head": "Электрондық поштаны тіркеу кезіндегі қате", - + // "forgot-email.form.error.content": "An error occured when registering the following email address: {{ email }}", "forgot-email.form.error.content": "Келесі электрондық пошта мекенжайын тіркеу кезінде қате орын алды: {{ email }}", - - - + + + // "forgot-password.title": "Forgot Password", "forgot-password.title": "Құпия сөзді ұмыттыңыз ба", - + // "forgot-password.form.head": "Forgot Password", "forgot-password.form.head": "Құпия сөзді ұмыттыңыз ба", - + // "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": "Төмендегі жолаққа жаңа құпия сөзді енгізіп, оны екінші жолаққа қайта теру арқылы растаңыз. Оның ұзындығы кемінде алты таңба болуы керек.", - + // "forgot-password.form.card.security": "Security", "forgot-password.form.card.security": "Қауіпсіздік", - + // "forgot-password.form.identification.header": "Identify", "forgot-password.form.identification.header": "Анықтау", - + // "forgot-password.form.identification.email": "Email address: ", "forgot-password.form.identification.email": "Электрондық пошта: ", - + // "forgot-password.form.label.password": "Password", "forgot-password.form.label.password": "Құпия сөз", - + // "forgot-password.form.label.passwordrepeat": "Retype to confirm", "forgot-password.form.label.passwordrepeat": "Растау үшін қайта теріңіз", - + // "forgot-password.form.error.empty-password": "Please enter a password in the box below.", "forgot-password.form.error.empty-password": "Төмендегі ұяшыққа құпия сөзді енгізіңіз.", - + // "forgot-password.form.error.matching-passwords": "The passwords do not match.", "forgot-password.form.error.matching-passwords": "Құпия сөздер сәйкес келмейді.", // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", "forgot-password.form.error.password-length":"Құпия сөз кемінде 6 таңбадан тұруы керек.", - + // "forgot-password.form.notification.error.title": "Error when trying to submit new password", "forgot-password.form.notification.error.title": "Жаңа құпия сөзді жіберу әрекеті кезіндегі қате", - + // "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": "Құпия сөзді қалпына келтіру сәтті аяқталды. Сіз құрылған пайдаланушы ретінде жүйеге кірдіңіз.", // "forgot-password.form.notification.success.title": "Password reset completed", "forgot-password.form.notification.success.title": "Құпия сөзді қалпына келтіру аяқталды", - + // "forgot-password.form.submit": "Submit password", "forgot-password.form.submit": "Құпия сөзді жіберу", - - - + + + // "form.add": "Add", "form.add": "Қосу", - + // "form.add-help": "Click here to add the current entry and to add another one", "form.add-help": "Ағымдағы жазбаны қосу және басқасын қосу үшін осы жерді басыңыз", - + // "form.cancel": "Cancel", "form.cancel": "Бас тарту", - + // "form.clear": "Clear", "form.clear": "Түсінікті", - + // "form.clear-help": "Click here to remove the selected value", "form.clear-help": "Таңдалған мәнді жою үшін осы жерді басыңыз", - + // "form.edit": "Edit", "form.edit": "Өзгерту", - + // "form.edit-help": "Click here to edit the selected value", "form.edit-help": "Таңдалған мәнді өзгерту үшін осы жерді басыңыз", - + // "form.first-name": "First name", "form.first-name": "Есімі", - + // "form.group-collapse": "Collapse", "form.group-collapse": "Ықшамдау", - + // "form.group-collapse-help": "Click here to collapse", "form.group-collapse-help": "Ықшамдау үшін осы жерді басыңыз", - + // "form.group-expand": "Expand", "form.group-expand": "Ретке келтіру", - + // "form.group-expand-help": "Click here to expand and add more elements", "form.group-expand-help": "Қосымша элементтерді кеңейту және қосу үшін мына жерді басыңыз", - + // "form.last-name": "Last name", "form.last-name": "Тегі(Фамилия)", - + // "form.loading": "Loading...", "form.loading": "Жүктелуде...", - + // "form.lookup": "Lookup", "form.lookup": "Іздеу", - + // "form.lookup-help": "Click here to look up an existing relation", "form.lookup-help": "Қазіргі қатынасты іздеу/көру үшін осы жерді басыңыз", - + // "form.no-results": "No results found", "form.no-results": "Нәтижесіз", - + // "form.no-value": "No value entered", "form.no-value": "Мәні енгізілмеді", - + // "form.other-information": {}, "form.other-information": {}, - + // "form.remove": "Remove", "form.remove": "Өшіру", - + // "form.save": "Save", "form.save": "Сақтау", - + // "form.save-help": "Save changes", "form.save-help": "Өзгерістерді сақтау", - + // "form.search": "Search", "form.search": "Іздеу", - + // "form.search-help": "Click here to look for an existing correspondence", "form.search-help": "Хат алмасуды табу үшін мына жерді басыңыз", - + // "form.submit": "Submit", "form.submit": "Жіберу", - - - + + + // "home.description": "", "home.description": "", - + // "home.breadcrumbs": "Home", "home.breadcrumbs": "Басты", - + // "home.title": "DSpace Angular :: Home", "home.title": "DSpace Angular :: Басты», - + // "home.top-level-communities.head": "Communities in DSpace", "home.top-level-communities.head": "DSpace-тегі қауымдастықтар", - + // "home.top-level-communities.help": "Select a community to browse its collections.", "home.top-level-communities.help": "Оның жинақтарын шолу үшін қауымдастықты таңдаңыз.", - - - + + + // "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", "info.end-user-agreement.accept": "Мен Түпкі пайдаланушы келісімін оқыдым және келісемін", - + // "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", "info.end-user-agreement.accept.error": "Түпкілікті пайдаланушы келісімін қабылдау кезінде қате орын алды", - + // "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", "info.end-user-agreement.accept.success": "Соңғы пайдаланушы келісімі сәтті жаңартылды", - + // "info.end-user-agreement.breadcrumbs": "End User Agreement", "info.end-user-agreement.breadcrumbs":"Соңғы пайдаланушы келісімі", - + // "info.end-user-agreement.buttons.cancel": "Cancel", "info.end-user-agreement.buttons.cancel": "Болдырмау", - + // "info.end-user-agreement.buttons.save": "Save", "info.end-user-agreement.buttons.save": "Сақтау", - + // "info.end-user-agreement.head": "End User Agreement", "info.end-user-agreement.head": "Соңғы пайдаланушы келісімі", - + // "info.end-user-agreement.title": "End User Agreement", "info.end-user-agreement.title": "Түпкі пайдаланушы келісімі", - + // "info.privacy.breadcrumbs": "Privacy Statement", "info.privacy.breadcrumbs": "Құпиялылық туралы мәлімдеме", - + // "info.privacy.head": "Privacy Statement", "info.privacy.head": "Құпиялылық туралы мәлімдеме", // "info.privacy.title": "Privacy Statement", "info.privacy.title": "Құпиялылық туралы мәлімдеме", - + // "item.alerts.private": "This item is private", "item.alerts.private": "Бұл элемент жеке", - + // "item.alerts.withdrawn": "This item has been withdrawn", - "item.alerts.withdrawn": "Бұл тармақ алынып тасталды", - + "item.alerts.withdrawn": "Бұл тармақ алынып тасталды", + // "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": "Осы өңдегіштің көмегімен элементтің саясаттарын көруге және өзгертуге, сонымен қатар жеке элемент құрамдастарының саясаттарын өзгертуге болады: байламдар және бит ағындары. Қысқаша айтқанда, элемент - бумалардың контейнері, ал бумалар - биттік ағындардың контейнерлері. Контейнерлерде әдетте ҚОСУ/ЖОЮ мүмкіндігі болады. /READ/WRITE саясаттары, ал биттік ағындарда тек ОҚУ/ЖАЗУ саясаттары бар.", - + // "item.edit.authorizations.title": "Edit item's Policies", "item.edit.authorizations.title": "Элемент саясаттарын өңдеу", // "item.badge.private": "Private", "item.badge.private": "Жеке", - + // "item.badge.withdrawn": "Withdrawn", "item.badge.withdrawn": "Шығарылды", - + // "item.bitstreams.upload.bundle": "Bundle", "item.bitstreams.upload.bundle": "Бума", - + // "item.bitstreams.upload.bundle.placeholder": "Select a bundle", "item.bitstreams.upload.bundle.placeholder": "Буманы таңдау", - + // "item.bitstreams.upload.bundle.new": "Create bundle", "item.bitstreams.upload.bundle.new": "Буманы жасау", - + // "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.", "item.bitstreams.upload.bundles.empty": "Бұл элементте биттік ағынды жүктеп салуға арналған бумалар жоқ.", - + // "item.bitstreams.upload.cancel": "Cancel", "item.bitstreams.upload.cancel": "Болдырмау", - + // "item.bitstreams.upload.drop-message": "Drop a file to upload", "item.bitstreams.upload.drop-message": "Жүктеп салу үшін файлды тастаңыз", - + // "item.bitstreams.upload.item": "Item: ", "item.bitstreams.upload.item":"Элемент:", - + // "item.bitstreams.upload.notifications.bundle.created.content": "Successfully created new bundle.", "item.bitstreams.upload.notifications.bundle.created.content": "Жаңа топтама сәтті жасалды.", - + // "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", "item.bitstreams.upload.notifications.bundle.created.title": "Жасалған топтама", - + // "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", "item.bitstreams.upload.notifications.upload.failed": "Жүктеп салу сәтсіз аяқталды. Әрекетті қайталаудан бұрын мазмұнды тексеріңіз.", - + // "item.bitstreams.upload.title": "Upload bitstream", "item.bitstreams.upload.title": "Бақыттық ағынды жүктеп салу", - + // "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", "item.edit.bitstreams.bundle.edit.buttons.upload": "Жүктеп салу", - + // "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", "item.edit.bitstreams.bundle.displaying": "Қазір {{ amount }} {{ total }} бит ағыны көрсетілуде.", // "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", "item.edit.bitstreams.bundle.load.all": "Барлығын жүктеу ({{ total }})", - + // "item.edit.bitstreams.bundle.load.more": "Load more", "item.edit.bitstreams.bundle.load.more":"Көбірек жүктеңіз", - + // "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", "item.edit.bitstreams.bundle.name": "БАНДЛ: {{ name }}", - + // "item.edit.bitstreams.discard-button": "Discard", "item.edit.bitstreams.discard-button": "Тастау", - + // "item.edit.bitstreams.edit.buttons.download": "Download", "item.edit.bitstreams.edit.buttons.download": "Жүктеп алу", - + // "item.edit.bitstreams.edit.buttons.drag": "Drag", "item.edit.bitstreams.edit.buttons.drag": "Сүйреу", - + // "item.edit.bitstreams.edit.buttons.edit": "Edit", "item.edit.bitstreams.edit.buttons.edit": "Өңдеу", - + // "item.edit.bitstreams.edit.buttons.remove": "Remove", "item.edit.bitstreams.edit.buttons.remove": "Жою", - + // "item.edit.bitstreams.edit.buttons.undo": "Undo changes", "item.edit.bitstreams.edit.buttons.undo": "Өзгерістерді болдырмау", - + // "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", "item.edit.bitstreams.empty":"Бұл элементте биттік ағындар жоқ. Біреуін жасау үшін жүктеп салу түймесін басыңыз.", - + // "item.edit.bitstreams.headers.actions": "Actions", "item.edit.bitstreams.headers.actions":"Әрекеттер", - + // "item.edit.bitstreams.headers.bundle": "Bundle", "item.edit.bitstreams.headers.bundle": "Бума", - + // "item.edit.bitstreams.headers.description": "Description", "item.edit.bitstreams.headers.description": "Сипаттамасы", - + // "item.edit.bitstreams.headers.format": "Format", "item.edit.bitstreams.headers.format": "Формат", - + // "item.edit.bitstreams.headers.name": "Name", "item.edit.bitstreams.headers.name":"Аты", // "item.edit.bitstreams.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", "item.edit.bitstreams.notifications.discarded.content": "Өзгертулеріңіз жойылды. Өзгерістерді қалпына келтіру үшін 'Болдырмау' түймесін басыңыз", - + // "item.edit.bitstreams.notifications.discarded.title": "Changes discarded", "item.edit.bitstreams.notifications.discarded.title": "Өзгерістер жойылды", - + // "item.edit.bitstreams.notifications.move.failed.title": "Error moving bitstreams", "item.edit.bitstreams.notifications.move.failed.title": "Бақыттық ағындарды жылжыту қатесі", - + // "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": "Сіздің жылжытуыңыз осы элементтің бит ағындары мен бумаларына жасалған өзгерістер сақталды.", - + // "item.edit.bitstreams.notifications.move.saved.title": "Move changes saved", "item.edit.bitstreams.notifications.move.saved.title": "Өзгерістерді жылжыту сақталды", - + // "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": "Сіз қазір жұмыс істеп жатқан элементті басқа пайдаланушы өзгертті. Қайшылықтарды болдырмау үшін ағымдағы өзгертулеріңіз жойылды", - + // "item.edit.bitstreams.notifications.outdated.title": "Changes outdated", "item.edit.bitstreams.notifications.outdated.title": "Өзгерістер ескірген", - + // "item.edit.bitstreams.notifications.remove.failed.title": "Error deleting bitstream", "item.edit.bitstreams.notifications.remove.failed.title": "Бақыттық ағынды жою қатесі", - + // "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": "Осы элементтің бит ағындарына жасалған жою өзгерістеріңіз сақталды.", - + // "item.edit.bitstreams.notifications.remove.saved.title": "Removal changes saved", "item.edit.bitstreams.notifications.remove.saved.title": "Жою өзгерістері сақталды", - + // "item.edit.bitstreams.reinstate-button": "Undo", "item.edit.bitstreams.reinstate-button": "Болдырмау", - + // "item.edit.bitstreams.save-button": "Save", "item.edit.bitstreams.save-button": "Сақтау", - + // "item.edit.bitstreams.upload-button": "Upload", "item.edit.bitstreams.upload-button": "Жүктеп салу", // "item.edit.delete.cancel": "Cancel", "item.edit.delete.cancel": "Болдырмау", - + // "item.edit.delete.confirm": "Delete", "item.edit.delete.confirm": "Жою", - + // "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": "Бұл элемент толығымен жойылуы керек екеніне сенімдісіз бе? Абайлаңыз: Қазіргі уақытта құлпытас қалмас еді"., - + // "item.edit.delete.error": "An error occurred while deleting the item", "item.edit.delete.error": "Элементті жою кезінде қате орын алды", - + // "item.edit.delete.header": "Delete item: {{ id }}", "item.edit.delete.header": "Элементті жою: {{ id }}", - + // "item.edit.delete.success": "The item has been deleted", "item.edit.delete.success": "Элемент жойылды", // "item.edit.head": "Edit Item", "item.edit.head": "Элементті өңдеу", - + // "item.edit.breadcrumbs": "Edit Item", "item.edit.breadcrumbs": "Элементті өңдеу", - + // "item.edit.tabs.mapper.head": "Collection Mapper", "item.edit.tabs.mapper.head": "Коллекция картасы", - + // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", "item.edit.tabs.item-mapper.title": "Item Edit - Коллекция картасы", - + // "item.edit.item-mapper.buttons.add": "Map item to selected collections", "item.edit.item-mapper.buttons.add": "Таңдалған жинақтарға элементті картаға салу", - + // "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", "item.edit.item-mapper.buttons.remove": "Таңдалған жинақтар үшін элементтің салыстыруын жою", - + // "item.edit.item-mapper.cancel": "Cancel", "item.edit.item-mapper.cancel":"Болдырмау", - + // "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": "Бұл әкімшілерге осы элементті басқа жинақтармен салыстыруға мүмкіндік беретін элементті салыстыру құралы. Жинақтарды іздеуге және оларды салыстыруға немесе элемент қазіргі уақытта салыстырылған жинақтар тізімін шолуға болады.", - + // "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", "item.edit.item-mapper.head":"Элемент салыстырушы - Элементті коллекциялармен салыстыру", - + // "item.edit.item-mapper.item": "Item: \"{{name}}\"", "item.edit.item-mapper.item": "Элемент: \"{{name}}\"", - + // "item.edit.item-mapper.no-search": "Please enter a query to search", "item.edit.item-mapper.no-search": "Іздеу үшін сұрауды енгізіңіз", - + // "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": "Элементті {{amount}} жинаққа салыстыру кезінде қателер орын алды.", // "item.edit.item-mapper.notifications.add.error.head": "Mapping errors", "item.edit.item-mapper.notifications.add.error.head": "Карталау қателері", - + // "item.edit.item-mapper.notifications.add.success.content": "Successfully mapped item to {{amount}} collections.", "item.edit.item-mapper.notifications.add.success.content": "Элемент {{amount}} жинаққа сәтті салыстырылды.", - + // "item.edit.item-mapper.notifications.add.success.head": "Mapping completed", "item.edit.item-mapper.notifications.add.success.head":"Карталау аяқталды", - + // "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": "{{amount}} жинаққа салыстыруды жою кезінде қателер орын алды.", - + // "item.edit.item-mapper.notifications.remove.error.head": "Removal of mapping errors", "item.edit.item-mapper.notifications.remove.error.head": "Карталау қателерін жою", - + // "item.edit.item-mapper.notifications.remove.success.content": "Successfully removed mapping of item to {{amount}} collections.", "item.edit.item-mapper.notifications.remove.success.content": "Элементтің {{amount}} жинаққа салыстыруы сәтті жойылды.", - + // "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", "item.edit.item-mapper.notifications.remove.success.head": "Карталауды жою аяқталды", - + // "item.edit.item-mapper.tabs.browse": "Browse mapped collections", "item.edit.item-mapper.tabs.browse": "Карталанған жинақтарды шолу", - + // "item.edit.item-mapper.tabs.map": "Map new collections", "item.edit.item-mapper.tabs.map": "Жаңа жинақтарды картаға түсіру", // "item.edit.metadata.add-button": "Add", "item.edit.metadata.add-button": "Қосу", - + // "item.edit.metadata.discard-button": "Discard", "item.edit.metadata.discard-button": "Тастау", - + // "item.edit.metadata.edit.buttons.edit": "Edit", "item.edit.metadata.edit.buttons.edit": "Өңдеу", - + // "item.edit.metadata.edit.buttons.remove": "Remove", "item.edit.metadata.edit.buttons.remove": "Жою", - + // "item.edit.metadata.edit.buttons.undo": "Undo changes", "item.edit.metadata.edit.buttons.undo": "Өзгерістерді болдырмау", - + // "item.edit.metadata.edit.buttons.unedit": "Stop editing", "item.edit.metadata.edit.buttons.unedit": "Өңдеуді тоқтату", - + // "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", "item.edit.metadata.empty": "Элементте қазір ешбір метадеректер жоқ. Метадеректер мәнін қосуды бастау үшін Қосу түймесін басыңыз.", - + // "item.edit.metadata.headers.edit": "Edit", "item.edit.metadata.headers.edit": "Өңдеу", - + // "item.edit.metadata.headers.field": "Field", "item.edit.metadata.headers.field": "Жолақ", @@ -2433,418 +2432,418 @@ // "item.edit.metadata.headers.value": "Value", "item.edit.metadata.headers.value": "құн", - + // "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", "item.edit.metadata.metadatafield.invalid": "Жарамды метадеректер өрісін таңдаңыз", - + // "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", "item.edit.metadata.notifications.discarded.content": "Өзгерістеріңіз жойылды. Өзгерістерді қалпына келтіру үшін 'Болдырмау' түймесін басыңыз", - + // "item.edit.metadata.notifications.discarded.title": "Changed discarded", "item.edit.metadata.notifications.discarded.title": "Өзгертілген жойылды", - + // "item.edit.metadata.notifications.error.title": "An error occurred", "item.edit.metadata.notifications.error.title": "Қате орын алды", // "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": "Өзгертулеріңіз сақталмады. Сақтамас бұрын барлық өрістердің жарамды екеніне көз жеткізіңіз.", - + // "item.edit.metadata.notifications.invalid.title": "Metadata invalid", "item.edit.metadata.notifications.invalid.title": "Метадеректер жарамсыз", - + // "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": "Сіз қазір жұмыс істеп жатқан элементті басқа пайдаланушы өзгертті. Қақтығыстардың алдын алу үшін сіздің қазіргі өзгерістеріңіз жойылады", - + // "item.edit.metadata.notifications.outdated.title": "Changed outdated", "item.edit.metadata.notifications.outdated.title": "Өзгертілген ескірген", - + // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", "item.edit.metadata.notifications.saved.content": "Осы элементтің метадеректеріндегі өзгерістер сақталды"., - + // "item.edit.metadata.notifications.saved.title": "Metadata saved", "item.edit.metadata.notifications.saved.title": "Сақталған метадеректер", // "item.edit.metadata.reinstate-button": "Undo", "item.edit.metadata.reinstate-button": "Болдырмау", - + // "item.edit.metadata.save-button": "Save", "item.edit.metadata.save-button":"Сақтау", // "item.edit.modify.overview.field": "Field", "item.edit.modify.overview.field": "Өріс", - + // "item.edit.modify.overview.language": "Language", "item.edit.modify.overview.language": "Тіл", - + // "item.edit.modify.overview.value": "Value", "item.edit.modify.overview.value": "Құндылық", // "item.edit.move.cancel": "Cancel", "item.edit.move.cancel": "Cancel", - + // "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": "Осы элементті жылжытқыңыз келетін коллекцияны таңдаңыз. Көрсетілген жинақтардың тізімін тарылту үшін өріске іздеу сұрауын енгізуге болады.", - + // "item.edit.move.error": "An error occurred when attempting to move the item", "item.edit.move.error": "Элементті жылжыту кезінде қате пайда болды", - + // "item.edit.move.head": "Move item: {{id}}", "item.edit.move.head": "Элементті жылжыту: {{id}}", - + // "item.edit.move.inheritpolicies.checkbox": "Inherit policies", "item.edit.move.inheritpolicies.checkbox": "Мұрагерлік саясат", - + // "item.edit.move.inheritpolicies.description": "Inherit the default policies of the destination collection", "item.edit.move.inheritpolicies.description": "Мақсатты жинақтың әдепкі саясатын мұра ету", - + // "item.edit.move.move": "Move", "item.edit.move.move": "Жылжыту", - + // "item.edit.move.processing": "Moving...", "item.edit.move.processing": "Ысырулыда...", - + // "item.edit.move.search.placeholder": "Enter a search query to look for collections", "item.edit.move.search.placeholder": "Жинақтарды іздеу үшін іздеу сұрауын енгізіңіз", - + // "item.edit.move.success": "The item has been moved successfully", "item.edit.move.success": "Элемент сәтті көшірілді", - + // "item.edit.move.title": "Move item", "item.edit.move.title": "Элементті жылжыту", // "item.edit.private.cancel": "Cancel", "item.edit.private.cancel":"Болдырмау", - + // "item.edit.private.confirm": "Make it Private", "item.edit.private.confirm": "Мұны жеке жаса", - + // "item.edit.private.description": "Are you sure this item should be made private in the archive?", "item.edit.private.description": "Сіз бұл затты мұрағатта жабу керек екеніне сенімдісіз бе?", - + // "item.edit.private.error": "An error occurred while making the item private", "item.edit.private.error": "Элементті жабу кезінде қате пайда болды", - + // "item.edit.private.header": "Make item private: {{ id }}", "item.edit.private.header": "Элементті жеке ету: {{ id }}", - + // "item.edit.private.success": "The item is now private", "item.edit.private.success": "Тауар қазір жеке", // "item.edit.public.cancel": "Cancel", "item.edit.public.cancel": "Болдырмау", - + // "item.edit.public.confirm": "Make it Public", "item.edit.public.confirm": "Мұны көпшілікке жария ету", - + // "item.edit.public.description": "Are you sure this item should be made public in the archive?", "item.edit.public.description": "Сіз бұл материалды мұрағатта жариялау керек екеніне сенімдісіз бе?", // "item.edit.public.error": "An error occurred while making the item public", "item.edit.public.error": "Элементті жариялау кезінде қате пайда болды", - + // "item.edit.public.header": "Make item public: {{ id }}", "item.edit.public.header": "Элементті жалпыға қол жетімді ету: {{ id }}", - + // "item.edit.public.success": "The item is now public", "item.edit.public.success": "Тауар қазір көпшілікке қол жетімді", // "item.edit.reinstate.cancel": "Cancel", "item.edit.reinstate.cancel": "Болдырмау", - + // "item.edit.reinstate.confirm": "Reinstate", "item.edit.reinstate.confirm": "Қалпына келтіру", // "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?" "item.edit.reinstate.description": "Сіз бұл элементті мұрағатта қалпына келтіру керек екеніне сенімдісіз бе?", - + // "item.edit.reinstate.error": "An error occurred while reinstating the item", "item.edit.reinstate.error": "Элементті қалпына келтіру кезінде қате пайда болды", - + // "item.edit.reinstate.header": "Reinstate item: {{ id }}", "item.edit.reinstate.header": "Элементті қалпына келтіру: {{ id }}", - + // "item.edit.reinstate.success": "The item was reinstated successfully", "item.edit.reinstate.success": "Элемент сәтті қалпына келтірілді", // "item.edit.relationships.discard-button": "Discard", "item.edit.relationships.discard-button": "Тастау", - + // "item.edit.relationships.edit.buttons.add": "Add", "item.edit.relationships.edit.buttons.add":"Қосу", - + // "item.edit.relationships.edit.buttons.remove": "Remove", "item.edit.relationships.edit.buttons.remove": "Жою", - + // "item.edit.relationships.edit.buttons.undo": "Undo changes", "item.edit.relationships.edit.buttons.undo": "Өзгерістерді болдырмау", - + // "item.edit.relationships.no-relationships": "No relationships", "item.edit.relationships.no-relationships": "Қарым-қатынас жоқ", - + // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", "item.edit.relationships.notifications.discarded.content": "Сіздің өзгертулеріңіз жойылды. Енгізілген өзгертулерді қалпына келтіру үшін 'Болдырмау' түймесін басыңыз, - + // "item.edit.relationships.notifications.discarded.title": "Changes discarded", "item.edit.relationships.notifications.discarded.title": "Өзгерістер жойылды", - + // "item.edit.relationships.notifications.failed.title": "Error editing relationships", "item.edit.relationships.notifications.failed.title": "Қарым-қатынасты өңдеу қатесі", - + // "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": "Сіз қазір жұмыс істеп жатқан элементті басқа пайдаланушы өзгертті. Қақтығыстардың алдын алу үшін сіздің қазіргі өзгерістеріңіз жойылады", - + // "item.edit.relationships.notifications.outdated.title": "Changes outdated", "item.edit.relationships.notifications.outdated.title": "Өзгерістер ескірген", - + // "item.edit.relationships.notifications.saved.content": "Your changes to this item's relationships were saved.", "item.edit.relationships.notifications.saved.content": "Осы элементтің қарым-қатынасындағы өзгерістер сақталды.", // "item.edit.relationships.notifications.saved.title": "Relationships saved", "item.edit.relationships.notifications.saved.title": "Сақталған қатынастар", - + // "item.edit.relationships.reinstate-button": "Undo", "item.edit.relationships.reinstate-button":"Болдырмау", - + // "item.edit.relationships.save-button": "Save", "item.edit.relationships.save-button": "Сақтау", - + // "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", "item.edit.relationships.no-entity-type": "Метадеректерін элемент үшін байланыстарды қосу үшін 'dspace.entity.type' басыныз", - + // "item.edit.tabs.bitstreams.head": "Bitstreams", "item.edit.tabs.bitstreams.head": "Бит ағындары", - + // "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", "item.edit.tabs.bitstreams.title": "Item Edit - Бит ағындары", - + // "item.edit.tabs.curate.head": "Curate", "item.edit.tabs.curate.head": "Викар", - + // "item.edit.tabs.curate.title": "Item Edit - Curate", "item.edit.tabs.curate.title": "Өңдеу элементі-Куратор", - + // "item.edit.tabs.metadata.head": "Metadata", "item.edit.tabs.metadata.head": "Метадеректер", - + // "item.edit.tabs.metadata.title": "Item Edit - Metadata", "item.edit.tabs.metadata.title": "Item Edit - Метадеректер", - + // "item.edit.tabs.relationships.head": "Relationships", "item.edit.tabs.relationships.head": "Қатынастар", - + // "item.edit.tabs.relationships.title": "Item Edit - Relationships", "item.edit.tabs.relationships.title": "Элементті өңдеу - қарым-қатынас", - + // "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", "item.edit.tabs.status.buttons.authorizations.button": "Рұқсат...", - + // "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", "item.edit.tabs.status.buttons.authorizations.label":"Элементті авторизациялау саясатын өзгерту", - + // "item.edit.tabs.status.buttons.delete.button": "Permanently delete", "item.edit.tabs.status.buttons.delete.button":"Біржола жою", - + // "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", "item.edit.tabs.status.buttons.delete.label": "Элементті толығымен алып тастаңыз", // "item.edit.tabs.status.buttons.mappedCollections.button": "Mapped collections", "item.edit.tabs.status.buttons.mappedCollections.button": "Салыстырмалы коллекциялар", - + // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", "item.edit.tabs.status.buttons.mappedCollections.label": "Салыстырмалы коллекцияларды басқару", - + // "item.edit.tabs.status.buttons.move.button": "Move...", "item.edit.tabs.status.buttons.move.button": "Ысыру...", - + // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", "item.edit.tabs.status.buttons.move.label": "Элементті басқа жинаққа жылжытыңыз", - + // "item.edit.tabs.status.buttons.private.button": "Make it private...", "item.edit.tabs.status.buttons.private.button": "Мұны жеке етіңіз...", - + // "item.edit.tabs.status.buttons.private.label": "Make item private", "item.edit.tabs.status.buttons.private.label": "Затты жеке ету", - + // "item.edit.tabs.status.buttons.public.button": "Make it public...", "item.edit.tabs.status.buttons.public.button": "Мұны көпшілікке жария етіңіз...", - + // "item.edit.tabs.status.buttons.public.label": "Make item public", "item.edit.tabs.status.buttons.public.label": "Өнімді жалпыға қол жетімді ету", - + // "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", "item.edit.tabs.status.buttons.reinstate.button": "Қалпына келтіру...", - + // "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", "item.edit.tabs.status.buttons.reinstate.label": "Сақтау ішіндегі элементті қалпына келтіру", - + // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", "item.edit.tabs.status.buttons.withdraw.button": "Шегінуге...", - + // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", "item.edit.tabs.status.buttons.withdraw.label": "Қоймадан тауарды алып қою", - + // "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": "Тауарларды басқару бетіне қош келдіңіз. Осы жерден элементті алып тастауға, қалпына келтіруге, жылжытуға немесе жоюға болады. Басқа қойындыларда жаңа метадеректерді / бит ағындарын жаңартуға немесе қосуға болады.", - + // "item.edit.tabs.status.head": "Status", "item.edit.tabs.status.head":"Мәртебе", - + // "item.edit.tabs.status.labels.handle": "Handle", "item.edit.tabs.status.labels.handle": "Қалам", - + // "item.edit.tabs.status.labels.id": "Item Internal ID", "item.edit.tabs.status.labels.id": "Ішкі элемент идентификаторы", - + // "item.edit.tabs.status.labels.itemPage": "Item Page", "item.edit.tabs.status.labels.itemPage": "Өнім беті", - + // "item.edit.tabs.status.labels.lastModified": "Last Modified", "item.edit.tabs.status.labels.lastModified": "Соңғы өзгеріс", - + // "item.edit.tabs.status.title": "Item Edit - Status", "item.edit.tabs.status.title": "Item Edit - Мәртебесі", - + // "item.edit.tabs.versionhistory.head": "Version History", "item.edit.tabs.versionhistory.head": "Нұсқа тарихы", - + // "item.edit.tabs.versionhistory.title": "Item Edit - Version History", "item.edit.tabs.versionhistory.title": "Элементті өңдеу-нұсқа тарихы", - + // "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": "Бұл пайдаланушы интерфейсінде жаңа нұсқаларды өңдеу немесе қосу әлі мүмкін емес"., - + // "item.edit.tabs.view.head": "View Item", "item.edit.tabs.view.head": "Элементті қарау", - + // "item.edit.tabs.view.title": "Item Edit - View", "item.edit.tabs.view.title": "Элементті өңдеу-қарау", // "item.edit.withdraw.cancel": "Cancel", "item.edit.withdraw.cancel": "Болдырмау", - + // "item.edit.withdraw.confirm": "Withdraw", "item.edit.withdraw.confirm": "Шақыру", - + // "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?", "item.edit.withdraw.description": "Сіз бұл затты мұрағаттан алып тастау керек деп ойлайсыз ба?", // "item.edit.withdraw.error": "An error occurred while withdrawing the item", "item.edit.withdraw.error": "Тауарды алып қою кезінде қате кетті", - + // "item.edit.withdraw.header": "Withdraw item: {{ id }}", "item.edit.withdraw.header": "Өнім шығару: {{ id }}", - + // "item.edit.withdraw.success": "The item was withdrawn successfully", "item.edit.withdraw.success": "Тауар сәтті алынды", // "item.listelement.badge": "Item", "item.listelement.badge": "Пән", - + // "item.page.description": "Description", "item.page.description": "Сипаттама", - + // "item.page.edit": "Edit this item", "item.page.edit": "Бұл элементті өңдеу", - + // "item.page.journal-issn": "Journal ISSN", "item.page.journal-issn": "ISSN журналы", - + // "item.page.journal-title": "Journal Title", "item.page.journal-title": "Журналдың атауы", - + // "item.page.publisher": "Publisher", "item.page.publisher": "Баспагер", - + // "item.page.titleprefix": "Item: ", "item.page.titleprefix": "Пән:", - + // "item.page.volume-title": "Volume Title", "item.page.volume-title": "Томның атауы", // "item.search.results.head": "Item Search Results", "item.search.results.head": "Өнімді іздеу нәтижелері", - + // "item.search.title": "DSpace Angular :: Item Search", "item.search.title": "DSpace Angular :: элементтерді іздеу", // "item.page.abstract": "Abstract", "item.page.abstract": "Дерексіз", - + // "item.page.author": "Authors", "item.page.author": "Авторлар", - + // "item.page.citation": "Citation", "item.page.citation":"Дәйексөз", - + // "item.page.collections": "Collections", "item.page.collections": "Жинақтар", - + // "item.page.date": "Date", "item.page.date": "Кездесуге", - + // "item.page.edit": "Edit this item", "item.page.edit": "Бұл элементті өңдеңіз", - + // "item.page.files": "Files", "item.page.files": "Файлдар", - + // "item.page.filesection.description": "Description:", "item.page.filesection.description": "Сипаттама:" - + // "item.page.filesection.download": "Download", "item.page.filesection.download": "Жүктеу", - + // "item.page.filesection.format": "Format:", "item.page.filesection.format": "Формат:", - + // "item.page.filesection.name": "Name:", "item.page.filesection.name": "Аты:", - + // "item.page.filesection.size": "Size:", "item.page.filesection.size": "Көлемі:", // "item.page.journal.search.title": "Articles in this journal", "item.page.journal.search.title": "Осы журналдағы мақалалар", - + // "item.page.link.full": "Full item page", "item.page.link.full": "Өнімнің толық беті", - + // "item.page.link.simple": "Simple item page", "item.page.link.simple": "Тауардың қарапайым беті", - + // "item.page.person.search.title": "Articles by this author", "item.page.person.search.title": "Осы автордың мақалалары", - + // "item.page.related-items.view-more": "Show {{ amount }} more", "item.page.related-items.view-more": "{{ amount }} көбірек көрсету", - + // "item.page.related-items.view-less": "Hide last {{ amount }}", "item.page.related-items.view-less": "Соңғы {{ amount }} жасыру", - + // "item.page.relationships.isAuthorOfPublication": "Publications", "item.page.relationships.isAuthorOfPublication": "Жарияланымдар", - + // "item.page.relationships.isJournalOfPublication": "Publications", "item.page.relationships.isJournalOfPublication": "Жарияланымдар", - + // "item.page.relationships.isOrgUnitOfPerson": "Authors", "item.page.relationships.isOrgUnitOfPerson": "Авторлары", - + // "item.page.relationships.isOrgUnitOfProject": "Research Projects", "item.page.relationships.isOrgUnitOfProject": "Зерттеу жобалары", - + // "item.page.subject": "Keywords", "item.page.subject": "Кілт сөздер", - + // "item.page.uri": "URI", "item.page.uri": "URI", - + // "item.page.bitstreams.view-more": "Show more", "item.page.bitstreams.view-more": "Көбірек көрсету", - + // "item.page.bitstreams.collapse": "Collapse", "item.page.bitstreams.collapse": "Коллапс", - + // "item.page.filesection.original.bundle" : "Original bundle", "item.page.filesection.original.bundle" : "Түпнұсқа жинақ", @@ -2859,258 +2858,258 @@ // "item.preview.dc.date.issued": "Published date:", "item.preview.dc.date.issued": "Жарияланған күні:", - + // "item.preview.dc.description.abstract": "Abstract:", "item.preview.dc.description.abstract": "Аннотация:, - + // "item.preview.dc.identifier.other": "Other identifier:", "item.preview.dc.identifier.other": "Басқа идентификатор:", - + // "item.preview.dc.language.iso": "Language:", "item.preview.dc.language.iso": "Тіл:", - + // "item.preview.dc.subject": "Subjects:", "item.preview.dc.subject": "Тақырыбы:", - + // "item.preview.dc.title": "Title:", "item.preview.dc.title": "Атауы:", // "item.preview.person.familyName": "Surname:", "item.preview.person.familyName": "Тегі:", - + // "item.preview.person.givenName": "Name:", "item.preview.person.givenName": "Аты:", - + // "item.preview.person.identifier.orcid": "ORCID:", "item.preview.person.identifier.orcid": "ORCID:", - + // "item.select.confirm": "Confirm selected", "item.select.confirm": "Таңдауды растау", - + // "item.select.empty": "No items to show", "item.select.empty":"Көрсету үшін элементтер жоқ", - + // "item.select.table.author": "Author", "item.select.table.author": "Автор", - + // "item.select.table.collection": "Collection", "item.select.table.collection": "Жинақ", - + // "item.select.table.title": "Title", "item.select.table.title": "Атауы", - + // "item.version.history.empty": "There are no other versions for this item yet.", "item.version.history.empty": "Бұл тақырыпқа арналған басқа нұсқалар әлі жоқ"., - + // "item.version.history.head": "Version History", "item.version.history.head": "Нұсқа тарихы", - + // "item.version.history.return": "Return", "item.version.history.return": "Возвращение", - + // "item.version.history.selected": "Selected version", "item.version.history.selected": "Таңдалған нұсқа", - + // "item.version.history.table.version": "Version", "item.version.history.table.version": "Нұсқа", - + // "item.version.history.table.item": "Item", "item.version.history.table.item": "Пән", - + // "item.version.history.table.editor": "Editor", "item.version.history.table.editor": "Редакторы", - + // "item.version.history.table.date": "Date", "item.version.history.table.date":"Кездесуге", - + // "item.version.history.table.summary": "Summary", "item.version.history.table.summary": "Қысқаша мазмұны", - + // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", "item.version.notice": "Бұл өнімнің соңғы нұсқасы емес. Соңғы нұсқаны мына жердентабуға болады.", - - - + + + // "journal.listelement.badge": "Journal", "journal.listelement.badge": "Журнал", - + // "journal.page.description": "Description", "journal.page.description": "Сипаттама", - + // "journal.page.edit": "Edit this item", "journal.page.edit": "Бұл элементті өңдеңіз", - + // "journal.page.editor": "Editor-in-Chief", "journal.page.editor": "Бас редактор", - + // "journal.page.issn": "ISSN", "journal.page.issn": "ISSN", - + // "journal.page.publisher": "Publisher", "journal.page.publisher": "Баспагер", - + // "journal.page.titleprefix": "Journal: ", "journal.page.titleprefix": "Күнделік:", - + // "journal.search.results.head": "Journal Search Results", "journal.search.results.head":"Журналдағы іздеу нәтижелері", - + // "journal.search.title": "DSpace Angular :: Journal Search", "journal.search.title": "DSpace Angular :: Журналдағы іздеу", // "journalissue.listelement.badge": "Journal Issue", "journalissue.listelement.badge": "Журнал шығару", - + // "journalissue.page.description": "Description", "journalissue.page.description": "Сипаттамасы", - + // "journalissue.page.edit": "Edit this item", "journalissue.page.edit": "Бұл элементті өңдеу", - + // "journalissue.page.issuedate": "Issue Date", "journalissue.page.issuedate": "Шығарылған күні", - + // "journalissue.page.journal-issn": "Journal ISSN", "journalissue.page.journal-issn":"ISSN журналы", - + // "journalissue.page.journal-title": "Journal Title", "journalissue.page.journal-title": "Журнал атауы", - + // "journalissue.page.keyword": "Keywords", "journalissue.page.keyword":"Түйінді сөздер", - + // "journalissue.page.number": "Number", "journalissue.page.number": "Саны", - + // "journalissue.page.titleprefix": "Journal Issue: ", "journalissue.page.titleprefix": "Журнал нөмірі:", - + // "journalvolume.listelement.badge": "Journal Volume", "journalvolume.listelement.badge":"Журнал көлемі", - + // "journalvolume.page.description": "Description", "journalvolume.page.description": "Сипаттама", - + // "journalvolume.page.edit": "Edit this item", "journalvolume.page.edit": "Бұл элементті өңдеу", - + // "journalvolume.page.issuedate": "Issue Date", "journalvolume.page.issuedate": "Шығарылған күні", - + // "journalvolume.page.titleprefix": "Journal Volume: ", "journalvolume.page.titleprefix":"Журнал көлемі:", - + // "journalvolume.page.volume": "Volume", "journalvolume.page.volume": "Көлемі", - + // "loading.bitstream": "Loading bitstream...", "loading.bitstream": "Бит ағынын жүктеу...", - + // "loading.bitstreams": "Loading bitstreams...", "loading.bitstreams": "Бит ағындарын жүктеу...", // "loading.browse-by": "Loading items...", "loading.browse-by": "Заттарды жүктеу...", - + // "loading.browse-by-page": "Loading page...", "loading.browse-by-page": "Жүктеу беті...", - + // "loading.collection": "Loading collection...", "loading.collection": "Жинақты жүктеу...", - + // "loading.collections": "Loading collections...", "loading.collections":"Топтамаларды жүктеу...", - + // "loading.content-source": "Loading content source...", "loading.content-source": "Мазмұн көзін жүктеу...", - + // "loading.community": "Loading community...", "loading.community": "Жүктеу қауымдастығы...", - + // "loading.default": "Loading...", "loading.default": "Жүктеу...", - + // "loading.item": "Loading item...", "loading.item": "Тауарды жүктеу...", - + // "loading.items": "Loading items...", "loading.items": "Заттарды жүктеу...", - + // "loading.mydspace-results": "Loading items...", "loading.mydspace-results": "Заттарды жүктеу...", - + // "loading.objects": "Loading...", "loading.objects":"Жүктеу...", - + // "loading.recent-submissions": "Loading recent submissions...", "loading.recent-submissions": "Соңғы жіберілімдер жүктелуде...", - + // "loading.search-results": "Loading search results...", "loading.search-results": "Іздеу нәтижелері жүктелуде...", - + // "loading.sub-collections": "Loading sub-collections...", "loading.sub-collections": "Ішкі жинақтар жүктелуде...", - + // "loading.sub-communities": "Loading sub-communities...", "loading.sub-communities":"Қосымша қауымдастықтар жүктелуде...", - + // "loading.top-level-communities": "Loading top-level communities...", "loading.top-level-communities": "Жоғарғы деңгейдегі қауымдастықтар жүктелуде...", // "login.form.email": "Email address", "login.form.email": "Электрондық пошта", - + // "login.form.forgot-password": "Have you forgotten your password?", "login.form.forgot-password":"Сіз парольді ұмыттыңыз ба?", - + // "login.form.header": "Please log in to DSpace", "login.form.header":"DSpace жүйесіне кіріңіз", - + // "login.form.new-user": "New user? Click here to register.", "login.form.new-user":"Жаңа пайдаланушы? Тіркелу үшін осы жерді басыңыз.", - + // "login.form.or-divider": "or", "login.form.or-divider": "немесе", - + // "login.form.password": "Password", "login.form.password":"Пароль", - + // "login.form.shibboleth": "Log in with Shibboleth", "login.form.shibboleth": "Шибболетпен кіру", - + // "login.form.submit": "Log in", "login.form.submit": "Кіру", - + // "login.title": "Login", "login.title": "Кіру", - + // "login.breadcrumbs": "Login", "login.breadcrumbs": "Кіру", // "logout.form.header": "Log out from DSpace", "logout.form.header": "DSpace жүйесінен шығу", - + // "logout.form.submit": "Log out", "logout.form.submit": "Шығу", - + // "logout.title": "Logout", "logout.title":"Шығу", // "menu.header.admin": "Admin", "menu.header.admin": "Әкімші", - + // "menu.header.image.logo": "Repository logo", "menu.header.image.logo": "Репозиторий логотипі", // "menu.section.access_control": "Access Control", "menu.section.access_control": "Қатынасты басқару", - + // "menu.section.access_control_authorizations": "Authorizations", "menu.section.access_control_authorizations":"Рұқсаттар", - + // "menu.section.access_control_groups": "Groups", "menu.section.access_control_groups": "Топтар", - + // "menu.section.access_control_people": "People", "menu.section.access_control_people": "Адамдар", @@ -3119,139 +3118,139 @@ // "menu.section.browse_community": "This Community", "menu.section.browse_community": "Бұл қауымдастық", - + // "menu.section.browse_community_by_author": "By Author", "menu.section.browse_community_by_author": "Автор бойынша", - + // "menu.section.browse_community_by_issue_date": "By Issue Date", "menu.section.browse_community_by_issue_date": "Шығарылған күні бойынша", - + // "menu.section.browse_community_by_title": "By Title", "menu.section.browse_community_by_title": "Тақырып бойынша", - + // "menu.section.browse_global": "All of DSpace", "menu.section.browse_global": "Барлық DSpace", - + // "menu.section.browse_global_by_author": "By Author", "menu.section.browse_global_by_author": "Авторымен", - + // "menu.section.browse_global_by_dateissued": "By Issue Date", "menu.section.browse_global_by_dateissued": "Шығарылған күні бойынша", - + // "menu.section.browse_global_by_subject": "By Subject", "menu.section.browse_global_by_subject": "Тақырыбымен", - + // "menu.section.browse_global_by_title": "By Title", "menu.section.browse_global_by_title": "Атауымен", - + // "menu.section.browse_global_communities_and_collections": "Communities & Collections", "menu.section.browse_global_communities_and_collections": "Қауымдастықтар мен коллекциялар", // "menu.section.control_panel": "Control Panel", "menu.section.control_panel":"Басқару панелі", - + // "menu.section.curation_task": "Curation Task", "menu.section.curation_task": "Тапсырма" - + // "menu.section.edit": "Edit", "menu.section.edit":"Өңдеу", - + // "menu.section.edit_collection": "Collection", "menu.section.edit_collection": "Жинақ", - + // "menu.section.edit_community": "Community", "menu.section.edit_community": "Қауымдастық", - + // "menu.section.edit_item": "Item", "menu.section.edit_item": "Жол", // "menu.section.export": "Export", "menu.section.export": "Экспорт", - + // "menu.section.export_collection": "Collection", "menu.section.export_collection": "Жинақ", // "menu.section.export_community": "Community", "menu.section.export_community": "Қауымдастық", - + // "menu.section.export_item": "Item", - "menu.section.export_item": "Жол" - + "menu.section.export_item": "Жол" + // "menu.section.export_metadata": "Metadata", "menu.section.export_metadata": "Метадеректер", // "menu.section.icon.access_control": "Access Control menu section", "menu.section.icon.access_control": "Қатынасты басқару мәзірі бөлімі", - + // "menu.section.icon.admin_search": "Admin search menu section", "menu.section.icon.admin_search": "Әкімші іздеу мәзірі бөлімі", - + // "menu.section.icon.control_panel": "Control Panel menu section", "menu.section.icon.control_panel": "Басқару тақтасының мәзір бөлімі", - + // "menu.section.icon.curation_task": "Curation Task menu section", "menu.section.icon.curation_task": "Кураторлық тапсырма мәзірі бөлімі", - + // "menu.section.icon.edit": "Edit menu section", "menu.section.icon.edit": "Өңдеу мәзір бөлімі", // "menu.section.icon.export": "Export menu section", "menu.section.icon.export": "Экспорт мәзірі бөлімі", - + // "menu.section.icon.find": "Find menu section", "menu.section.icon.find": "Мәзір бөлімін табу", - + // "menu.section.icon.import": "Import menu section", "menu.section.icon.import": "Импорттау мәзірі бөлімі", - + // "menu.section.icon.new": "New menu section", "menu.section.icon.new": "Жаңа мәзір бөлімі", - + // "menu.section.icon.pin": "Pin sidebar", "menu.section.icon.pin": "Бүйірлік тақтаны бекіту", - + // "menu.section.icon.processes": "Processes menu section", "menu.section.icon.processes": "Процесстер мәзірі бөлімі", - + // "menu.section.icon.registries": "Registries menu section", "menu.section.icon.registries": "Тіркеулер мәзірі бөлімі", - + // "menu.section.icon.statistics_task": "Statistics Task menu section", "menu.section.icon.statistics_task": "Статистика тапсырмалары мәзірі бөлімі", - + // "menu.section.icon.unpin": "Unpin sidebar", "menu.section.icon.unpin": "Бүйірлік тақтаны босату", - + // "menu.section.import": "Import", "menu.section.import": "Импорттау", - + // "menu.section.import_batch": "Batch Import (ZIP)", "menu.section.import_batch": "Пакеттік импорт (ZIP)", - + // "menu.section.import_metadata": "Metadata", "menu.section.import_metadata": "Метадеректер", // "menu.section.new": "New", "menu.section.new": "Жаңа", - + // "menu.section.new_collection": "Collection", "menu.section.new_collection": "Жинақ", - + // "menu.section.new_community": "Community", "menu.section.new_community": "Қауымдастық", - + // "menu.section.new_item": "Item", "menu.section.new_item": "Жол", - + // "menu.section.new_item_version": "Item Version", "menu.section.new_item_version": "Элемент нұсқасы", - + // "menu.section.new_process": "Process", "menu.section.new_process": "Процесс", // "menu.section.pin": "Pin sidebar", "menu.section.pin": "Бүйірлік тақтаны бекіту", - + // "menu.section.unpin": "Unpin sidebar", "menu.section.unpin": "Бүйірлік тақтаны босату", @@ -3260,161 +3259,161 @@ // "menu.section.registries": "Registries", "menu.section.registries": "Тіркеулер", - + // "menu.section.registries_format": "Format", "menu.section.registries_format": "Формат", - + // "menu.section.registries_metadata": "Metadata", "menu.section.registries_metadata": "Метадеректер", // "menu.section.statistics": "Statistics", "menu.section.statistics": "Статистика", - + // "menu.section.statistics_task": "Statistics Task", "menu.section.statistics_task": "Статистика тапсырмасы", // "menu.section.toggle.access_control": "Toggle Access Control section", "menu.section.toggle.access_control": "Қатынасты басқару бөлімін ауыстырып-қосқыш", - + // "menu.section.toggle.control_panel": "Toggle Control Panel section", "menu.section.toggle.control_panel": "Басқару тақтасы бөлімін ауыстыру", - + // "menu.section.toggle.curation_task": "Toggle Curation Task section", "menu.section.toggle.curation_task": "Тапсырма бөлімін өзгерту", - + // "menu.section.toggle.edit": "Toggle Edit section", "menu.section.toggle.edit": "Өңдеу бөлімін ауыстырып қосу", - + // "menu.section.toggle.export": "Toggle Export section", "menu.section.toggle.export": "Экспорттау бөлімін ауыстыру", - + // "menu.section.toggle.find": "Toggle Find section", "menu.section.toggle.find": "Табу бөлімін қосу/өшіру", - + // "menu.section.toggle.import": "Toggle Import section", "menu.section.toggle.import": "Импорттау бөлімін ауыстырып қосу", // "menu.section.toggle.new": "Toggle New section", "menu.section.toggle.new": "Жаңа бөлімді ауыстыру", - + // "menu.section.toggle.registries": "Toggle Registries section", "menu.section.toggle.registries": "Тізілімдер бөлімін ауыстырып қосу", - + // "menu.section.toggle.statistics_task": "Toggle Statistics Task section", "menu.section.toggle.statistics_task": "Статистика тапсырмасы бөлімін ауыстыру", - + // "menu.section.workflow": "Administer Workflow", "menu.section.workflow": "Жұмыс процесін басқару", - - + + // "mydspace.description": "", "mydspace.description": "", - + // "mydspace.general.text-here": "here", "mydspace.general.text-here":"Мұнда", - + // "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", "mydspace.messages.controller-help": "Элемент жіберушіге хабарлама жіберу үшін осы опцияны таңдаңыз.", - + // "mydspace.messages.description-placeholder": "Insert your message here...", "mydspace.messages.description-placeholder": "Хабарыңызды осында енгізіңіз...", - + // "mydspace.messages.hide-msg": "Hide message", "mydspace.messages.hide-msg": "Хабарламаны жасыру", - + // "mydspace.messages.mark-as-read": "Mark as read", "mydspace.messages.mark-as-read": "Оқылған деп белгілеу", - + // "mydspace.messages.mark-as-unread": "Mark as unread", "mydspace.messages.mark-as-unread": "Оқылмаған деп белгілеу", - + // "mydspace.messages.no-content": "No content.", "mydspace.messages.no-content":"Мазмұн жоқ.", - + // "mydspace.messages.no-messages": "No messages yet.", "mydspace.messages.no-messages": "Әлі хабарлар жоқ.", - + // "mydspace.messages.send-btn": "Send", "mydspace.messages.send-btn": "Жіберу", - + // "mydspace.messages.show-msg": "Show message", "mydspace.messages.show-msg": "Хабарды көрсету", - + // "mydspace.messages.subject-placeholder": "Subject...", "mydspace.messages.subject-placeholder": "Тақырып...", - + // "mydspace.messages.submitter-help": "Select this option to send a message to controller.", "mydspace.messages.submitter-help": "Контроллерге хабарлама жіберу үшін осы опцияны таңдаңыз.", - + // "mydspace.messages.title": "Messages", "mydspace.messages.title":"Хабарлар", - + // "mydspace.messages.to": "To", "mydspace.messages.to": "Кімге", - + // "mydspace.new-submission": "New submission", "mydspace.new-submission": "Жаңа жіберу", - + // "mydspace.new-submission-external": "Import metadata from external source", "mydspace.new-submission-external": "Сыртқы көзден метадеректерді импорттау", - + // "mydspace.new-submission-external-short": "Import metadata", "mydspace.new-submission-external-short": "Метадеректерді импорттау", - + // "mydspace.results.head": "Your submissions", "mydspace.results.head": "Сіздің өтініштеріңіз", - + // "mydspace.results.no-abstract": "No Abstract", "mydspace.results.no-abstract": "Реферат жоқ", - + // "mydspace.results.no-authors": "No Authors", "mydspace.results.no-authors": "Авторлар жоқ", - + // "mydspace.results.no-collections": "No Collections", "mydspace.results.no-collections": "Жинақтар жоқ", // "mydspace.results.no-date": "No Date", "mydspace.results.no-date": "Күні жоқ", - + // "mydspace.results.no-files": "No Files", "mydspace.results.no-files": "Файлдар жоқ", - + // "mydspace.results.no-results": "There were no items to show", "mydspace.results.no-results": "Көрсетілетін заттар жоқ", - + // "mydspace.results.no-title": "No title", "mydspace.results.no-title": "Атауы жоқ", - + // "mydspace.results.no-uri": "No Uri", "mydspace.results.no-uri": "Uri жоқ", - + // "mydspace.show.workflow": "All tasks", "mydspace.show.workflow": "Барлық тапсырмалар", - + // "mydspace.show.workspace": "Your Submissions", "mydspace.show.workspace":"Сіздің өтініштеріңіз", - + // "mydspace.status.archived": "Archived", "mydspace.status.archived": "Мұрағатталған", - + // "mydspace.status.validation": "Validation", "mydspace.status.validation": "Валидация", - + // "mydspace.status.waiting-for-controller": "Waiting for controller", "mydspace.status.waiting-for-controller": "Контроллерді күтуде", - + // "mydspace.status.workflow": "Workflow", "mydspace.status.workflow":"Жұмыс барысы", - + // "mydspace.status.workspace": "Workspace", "mydspace.status.workspace": "Жұмыс кеңістігі", - + // "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": "Жаңа жұмыс кеңістігін жасау қатесі. Қайталаудан бұрын жүктеп салынған мазмұнды тексеріңіз.", - + // "mydspace.upload.upload-failed-manyentries": "Unprocessable file. Detected too many entries but allowed only one for file.", "mydspace.upload.upload-failed-manyentries": "Өңделмейтін файл. Тым көп жазбалар анықталды, бірақ файл үшін тек біреуіне рұқсат етілді.", @@ -3426,37 +3425,37 @@ // "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", "mydspace.upload.upload-successful": "Жаңа жұмыс кеңістігі элементі жасалды. Оны өңдеу үшін {{осында}} басыңыз.", - + // "mydspace.view-btn": "View", "mydspace.view-btn": "Көру", - + // "nav.browse.header": "All of DSpace", "nav.browse.header": "Барлық DSpace", - + // "nav.community-browse.header": "By Community", "nav.community-browse.header": "Қауымдастық бойынша", - + // "nav.language": "Language switch", "nav.language": "Тілді ауыстыру", - + // "nav.login": "Log In", "nav.login": "Кіру", - + // "nav.logout": "Log Out", "nav.logout": "Шығу" - + // "nav.mydspace": "MyDSpace", "nav.mydspace": "MyDSpace", - + // "nav.profile": "Profile", "nav.profile": "Профиль", - + // "nav.search": "Search", "nav.search": "Іздеу", - + // "nav.statistics.header": "Statistics", "nav.statistics.header": "Статистика", - + // "nav.stop-impersonating": "Stop impersonating EPerson", "nav.stop-impersonating": "Eperson атын шығаруды тоқтатыңыз", @@ -3465,31 +3464,31 @@ // "orgunit.page.city": "City", "orgunit.page.city": "Қала", - + // "orgunit.page.country": "Country", "orgunit.page.country": "Ел", - + // "orgunit.page.dateestablished": "Date established", "orgunit.page.dateestablished": "Орнатылған күні", - + // "orgunit.page.description": "Description", "orgunit.page.description":"Сипаттамасы", - + // "orgunit.page.edit": "Edit this item", "orgunit.page.edit": "Осы элементті өңдеу", // "orgunit.page.id": "ID", "orgunit.page.id": "ID", - + // "orgunit.page.titleprefix": "Organizational Unit: ", "orgunit.page.titleprefix": "Ұйымдық бөлімше:", // "pagination.results-per-page": "Results Per Page", "pagination.results-per-page": "Әр беттегі нәтижелер", - + // "pagination.showing.detail": "{{ range }} of {{ total }}", "pagination.showing.detail": "{{ жалпы }} ішінен {{ диапазон }}", - + // "pagination.showing.label": "Now showing ", "pagination.showing.label": "Қазір көрсету", @@ -3498,353 +3497,353 @@ // "person.listelement.badge": "Person", "person.listelement.badge": "Адам", - + // "person.listelement.no-title": "No name found", "person.listelement.no-title":"Ешқандай атау табылмады", - + // "person.page.birthdate": "Birth Date", "person.page.birthdate": "Туылған күні", - + // "person.page.edit": "Edit this item", "person.page.edit": "Бұл элементті өңдеу", - + // "person.page.email": "Email Address", "person.page.email": "Электрондық мекенжайы", - + // "person.page.firstname": "First Name", "person.page.firstname":"Имя", - + // "person.page.jobtitle": "Job Title", "person.page.jobtitle": "Жұмыс атауы", // "person.page.lastname": "Last Name", "person.page.lastname": "Фамилия", - + // "person.page.link.full": "Show all metadata", "person.page.link.full": "Барлық метамәліметті көрсету", - + // "person.page.orcid": "ORCID", "person.page.orcid": "ORCID", - + // "person.page.staffid": "Staff ID", "person.page.staffid": "Қызметкерлердің жеке куәлігі", - + // "person.page.titleprefix": "Person: ", "person.page.titleprefix":"Адам:", - + // "person.search.results.head": "Person Search Results", "person.search.results.head": "Тұлға іздеу нәтижелері", - + // "person.search.title": "DSpace Angular :: Person Search", "person.search.title": "DSpace Angular :: Адамды іздеу", // "process.new.select-parameters": "Parameters", "process.new.select-parameters":"Параметрлер", - + // "process.new.cancel": "Cancel", "process.new.cancel": "Болдырмау", - + // "process.new.submit": "Submit", "process.new.submit": "Жіберу", - + // "process.new.select-script": "Script", "process.new.select-script": "Сценарий", - + // "process.new.select-script.placeholder": "Choose a script...", "process.new.select-script.placeholder": "Сценарий таңдаңыз...", - + // "process.new.select-script.required": "Script is required", "process.new.select-script.required": "Сценарий қажет", - + // "process.new.parameter.file.upload-button": "Select file...", "process.new.parameter.file.upload-button":"Файлды таңдау...", // "process.new.parameter.file.required": "Please select a file", "process.new.parameter.file.required":"Файлды таңдаңыз", - + // "process.new.parameter.string.required": "Parameter value is required", "process.new.parameter.string.required": "Параметр мәні қажет", // "process.new.parameter.type.value": "value", "process.new.parameter.type.value": "құны", - + // "process.new.parameter.type.file": "file", "process.new.parameter.type.file": "файл", - + // "process.new.parameter.required.missing": "The following parameters are required but still missing:", "process.new.parameter.required.missing": "Келесі параметрлер қажет, бірақ әлі жоқ:", - + // "process.new.notification.success.title": "Success", "process.new.notification.success.title": "Жетістік", - + // "process.new.notification.success.content": "The process was successfully created", "process.new.notification.success.content": "Процесс сәтті құрылды", - + // "process.new.notification.error.title": "Error", "process.new.notification.error.title": "Қате", - + // "process.new.notification.error.content": "An error occurred while creating this process", "process.new.notification.error.content": "Бұл процесті жасау кезінде қате орын алды", - + // "process.new.header": "Create a new process", "process.new.header": "Жаңа процесс жасау", - + // "process.new.title": "Create a new process", "process.new.title": "Жаңа процесс жасау", - + // "process.new.breadcrumbs": "Create a new process", "process.new.breadcrumbs": "Жаңа процесс жасау", // "process.detail.arguments" : "Arguments", "process.detail.arguments" :"Аргументтер", - + // "process.detail.arguments.empty" : "This process doesn't contain any arguments", "process.detail.arguments.empty" : "Бұл процесс ешқандай аргументтерді қамтымайды", - + // "process.detail.back" : "Back", "process.detail.back" : "Артқа", - + // "process.detail.output" : "Process Output", "process.detail.output" : "Процесс шығысы", - + // "process.detail.logs.button": "Retrieve process output", "process.detail.logs.button": "Процесс шығысын шығарып алу", // "process.detail.logs.loading": "Retrieving", "process.detail.logs.loading": "Алу", - + // "process.detail.logs.none": "This process has no output", "process.detail.logs.none": "Бұл процесте нәтиже жоқ", - + // "process.detail.output-files" : "Output Files", "process.detail.output-files" : "Шығару файлдары", - + // "process.detail.output-files.empty" : "This process doesn't contain any output files", "process.detail.output-files.empty" : "Бұл процесте ешқандай шығыс файлдары жоқ", - + // "process.detail.script" : "Script", "process.detail.script" : "Сценарий", - + // "process.detail.title" : "Process: {{ id }} - {{ name }}", "process.detail.title" :"Процесс: {{ id }} - {{ аты }}", - + // "process.detail.start-time" : "Start time", "process.detail.start-time" : "Бастау уақыты", - + // "process.detail.end-time" : "Finish time", "process.detail.end-time" : "Аяқтау уақыты", - + // "process.detail.status" : "Status", "process.detail.status" : "Мәртебе", - + // "process.detail.create" : "Create similar process", "process.detail.create" : "Ұқсас процесті жасау", // "process.overview.table.finish" : "Finish time", "process.overview.table.finish" :"Аяқтау уақыты", - + // "process.overview.table.id" : "Process ID", "process.overview.table.id" :"Процесс идентификаторы", - + // "process.overview.table.name" : "Name", "process.overview.table.name" :"Аты", - + // "process.overview.table.start" : "Start time", "process.overview.table.start" : "Бастау уақыты", - + "process.overview.table.status" : "Мәртебе", - + // "process.overview.table.user" : "User", "process.overview.table.user" : "Пайдаланушы", - + // "process.overview.title": "Processes Overview", "process.overview.title": "Процестерге шолу", - + // "process.overview.breadcrumbs": "Processes Overview", "process.overview.breadcrumbs":"Процестерге шолу", - + // "process.overview.new": "New", "process.overview.new": "Жаңа", - - + + // "profile.breadcrumbs": "Update Profile", "profile.breadcrumbs": "Профильді жаңарту", - + // "profile.card.identify": "Identify", "profile.card.identify":"Анықтау", - + // "profile.card.security": "Security", "profile.card.security": "Қауіпсіздік", - + // "profile.form.submit": "Update Profile", "profile.form.submit": "Профильді жаңарту", - + // "profile.groups.head": "Authorization groups you belong to", "profile.groups.head": "Сіз тиесілі авторизация топтары", - + // "profile.head": "Update Profile", "profile.head": "Профильді жаңарту", - + // "profile.metadata.form.error.firstname.required": "First Name is required", "profile.metadata.form.error.firstname.required": "Аты қажет", // "profile.metadata.form.error.lastname.required": "Last Name is required", "profile.metadata.form.error.lastname.required": "Тегі қажет", - + // "profile.metadata.form.label.email": "Email Address", "profile.metadata.form.label.email": "Электрондық пошта", - + // "profile.metadata.form.label.firstname": "First Name", "profile.metadata.form.label.firstname": "Аты", - + // "profile.metadata.form.label.language": "Language", "profile.metadata.form.label.language": "Тіл", - + // "profile.metadata.form.label.lastname": "Last Name", "profile.metadata.form.label.lastname": "Тек", - + // "profile.metadata.form.label.phone": "Contact Telephone", "profile.metadata.form.label.phone": "Байланыс телефоны", - + // "profile.metadata.form.notifications.success.content": "Your changes to the profile were saved.", "profile.metadata.form.notifications.success.content": "Сіздің профильдегі өзгертулеріңіз сақталды.", - + // "profile.metadata.form.notifications.success.title": "Profile saved", "profile.metadata.form.notifications.success.title": "Профиль сақталды", - + // "profile.notifications.warning.no-changes.content": "No changes were made to the Profile.", "profile.notifications.warning.no-changes.content": "Профильге ешқандай өзгерістер енгізілген жоқ.", - + // "profile.notifications.warning.no-changes.title": "No changes", "profile.notifications.warning.no-changes.title": "Өзгеріс жоқ", - + // "profile.security.form.error.matching-passwords": "The passwords do not match.", "profile.security.form.error.matching-passwords": "Құпия сөздер сәйкес келмейді.", // "profile.security.form.error.password-length": "The password should be at least 6 characters long.", "profile.security.form.error.password-length": "Құпия сөздің ұзындығы кемінде 6 таңба болуы керек.", - + // "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": "Қосымша, төмендегі жолаққа жаңа құпия сөзді енгізіп, оны екінші жолаққа қайта теру арқылы растай аласыз. Оның ұзындығы кемінде алты таңба болуы керек.", // "profile.security.form.label.password": "Password", "profile.security.form.label.password": "Құпия сөз", - + // "profile.security.form.label.passwordrepeat": "Retype to confirm", "profile.security.form.label.passwordrepeat":"Растау үшін қайта теріңіз", - + // "profile.security.form.notifications.success.content": "Your changes to the password were saved.", "profile.security.form.notifications.success.content": "Құпия сөзге енгізілген өзгертулеріңіз сақталды.", // "profile.security.form.notifications.success.title": "Password saved", "profile.security.form.notifications.success.title": "Құпия сөз сақталды", - + // "profile.security.form.notifications.error.title": "Error changing passwords", "profile.security.form.notifications.error.title": "Құпия сөздерді өзгерту қатесі", - + // "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": "Құпия сөз кемінде 6 таңбадан тұруы керек.", - + // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", "profile.security.form.notifications.error.not-same": "Берілген құпия сөздер бірдей емес"., - + // "profile.title": "Update Profile", "profile.title":"Профильді жаңарту", // "project.listelement.badge": "Research Project", "project.listelement.badge":"Зерттеу жобасы", - + // "project.page.contributor": "Contributors", "project.page.contributor": "Қалымдар", - + // "project.page.description": "Description", "project.page.description": "Сипаттама", - + // "project.page.edit": "Edit this item", "project.page.edit": "Осы элементті өңдеу", // "project.page.expectedcompletion": "Expected Completion", "project.page.expectedcompletion": "Күтілетін аяқталу", - + // "project.page.funder": "Funders", "project.page.funder": "Қаржыландырушылар", - + // "project.page.id": "ID", "project.page.id": "ID", - + // "project.page.keyword": "Keywords", "project.page.keyword": "Негізгі сөздер", - + // "project.page.status": "Status", "project.page.status": "Мәртебе", - + // "project.page.titleprefix": "Research Project: ", "project.page.titleprefix": "Зерттеу жобасы:", - + // "project.search.results.head": "Project Search Results", "project.search.results.head": "Жобаны іздеу нәтижелері", // "publication.listelement.badge": "Publication", "publication.listelement.badge": "Басылым", - + // "publication.page.description": "Description", "publication.page.description": "Сипаттамасы", - + // "publication.page.edit": "Edit this item", "publication.page.edit": "Осы элементті өңдеу", - + // "publication.page.journal-issn": "Journal ISSN", "publication.page.journal-issn": "ISSN журналы", - + // "publication.page.journal-title": "Journal Title", "publication.page.journal-title": "Журнал атауы", - + // "publication.page.publisher": "Publisher", "publication.page.publisher": "Баспагер", - + // "publication.page.titleprefix": "Publication: ", "publication.page.titleprefix": "Басылым: ", - + // "publication.page.volume-title": "Volume Title", "publication.page.volume-title": "Том атауы",, // "publication.search.results.head": "Publication Search Results", "publication.search.results.head": "Жарияланымдарды іздеу нәтижелері", - + // "publication.search.title": "DSpace Angular :: Publication Search", "publication.search.title": "DSpace Angular :: Жарияланымдарды іздеу", - + // "register-email.title": "New user registration", "register-email.title": "Жаңа пайдаланушыны тіркеу", // "register-page.create-profile.header": "Create Profile", "register-page.create-profile.header":"Профиль жасау", - + // "register-page.create-profile.identification.header": "Identify", "register-page.create-profile.identification.header": "Анықтау", - + // "register-page.create-profile.identification.email": "Email Address", "register-page.create-profile.identification.email": "Электрондық пошта", - + // "register-page.create-profile.identification.first-name": "First Name *", "register-page.create-profile.identification.first-name": "Аты *", - + // "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", "register-page.create-profile.identification.first-name.error": "Аты-жөніңізді толтырыңыз", - + // "register-page.create-profile.identification.last-name": "Last Name *", "register-page.create-profile.identification.last-name":"Тек *", - + // "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", "register-page.create-profile.identification.last-name.error":"Тегін енгізіңіз", - + // "register-page.create-profile.identification.contact": "Contact Telephone", "register-page.create-profile.identification.contact": "Байланыс телефоны", // "register-page.create-profile.identification.language": "Language", "register-page.create-profile.identification.language": "Тіл", - + // "register-page.create-profile.security.header": "Security", "register-page.create-profile.security.header": "Қауіпсіздік", @@ -3853,160 +3852,160 @@ // "register-page.create-profile.security.label.password": "Password *", "register-page.create-profile.security.label.password": "Пароль *", - + // "register-page.create-profile.security.label.passwordrepeat": "Retype to confirm *", "register-page.create-profile.security.label.passwordrepeat":"Растау үшін қайта енгізіңіз*", - + // "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", "register-page.create-profile.security.error.empty-password": "Төмендегі өріске құпия сөзді енгізіңіз"., - + // "register-page.create-profile.security.error.matching-passwords": "The passwords do not match.", "register-page.create-profile.security.error.matching-passwords": "Парольдер бірдей емес"., // "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": "Пароль кем дегенде 6 таңбадан тұруы керек"., - + // "register-page.create-profile.submit": "Complete Registration", "register-page.create-profile.submit": "Тіркеуді аяқтау", - + // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", "register-page.create-profile.submit.error.content": "Жаңа пайдаланушыны тіркеу кезінде бір нәрсе дұрыс болмады"., - + // "register-page.create-profile.submit.error.head": "Registration failed", "register-page.create-profile.submit.error.head": "Тіркеу сәтсіз аяқталды", // "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":"Тіркеу сәтті өтті. Сіз құрылған пайдаланушы ретінде кірдіңіз.", - + // "register-page.create-profile.submit.success.head": "Registration completed", "register-page.create-profile.submit.success.head":"Тіркеу аяқталды", - + // "register-page.registration.header": "New user registration", "register-page.registration.header": "Жаңа пайдаланушыны тіркеу", - + // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", "register-page.registration.info":"Электрондық пошта арқылы жаңартулар алу және DSpace-ке жаңа өнімдер жіберу үшін жинақтарға жазылу үшін есептік жазбаны тіркеңіз"., - + // "register-page.registration.email": "Email Address *", "register-page.registration.email": "Электрондық пошта мекенжайы *", - + // "register-page.registration.email.error.required": "Please fill in an email address", "register-page.registration.email.error.required": "Электрондық пошта мекенжайын толтырыңыз", - + // "register-page.registration.email.error.pattern": "Please fill in a valid email address", "register-page.registration.email.error.pattern": "Жарамды электрондық пошта мекенжайын енгізіңіз", - + // "register-page.registration.email.hint": "This address will be verified and used as your login name.", "register-page.registration.email.hint":"Бұл мекен-жай тексеріліп, сіздің логиніңіз ретінде пайдаланылады"., - + // "register-page.registration.submit": "Register", "register-page.registration.submit": "Тіркелу", - + // "register-page.registration.success.head": "Verification email sent", "register-page.registration.success.head": "Растау электрондық поштасы жіберілді", - + // "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}} мекен-жайына арнайы URL мекен-жайы мен қосымша нұсқаулары бар электрондық пошта жіберіледі"., - + // "register-page.registration.error.head": "Error when trying to register email", "register-page.registration.error.head": "Электрондық поштаны тіркеу кезінде қате", - + // "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", "register-page.registration.error.content":"Келесі электрондық пошта мекенжайын тіркеу кезінде қате пайда болды: {{ 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":"Екі элемент арасындағы байланыс түрі {{ type }} үшін сәйкес сәйкестікті табу мүмкін емес", - + // "relationships.add.error.server.content": "The server returned an error", "relationships.add.error.server.content": "Сервер қате туралы хабарламаны қайтарды", - + // "relationships.add.error.title": "Unable to add relationship", "relationships.add.error.title": "Байланыс қосу мүмкін емес", - + // "relationships.isAuthorOf": "Authors", "relationships.isAuthorOf":"Авторлар", - + // "relationships.isAuthorOf.Person": "Authors (persons)", "relationships.isAuthorOf.Person": "Авторлар (тұлғалар)", - + // "relationships.isAuthorOf.OrgUnit": "Authors (organizational units)", "relationships.isAuthorOf.OrgUnit": "Авторлар (ұйымдастыру бөлімшелері)", - + // "relationships.isIssueOf": "Journal Issues", "relationships.isIssueOf": "Журналдың шығарылымдары", - + // "relationships.isJournalIssueOf": "Journal Issue", "relationships.isJournalIssueOf":"Журнал шығару", - + // "relationships.isJournalOf": "Journals", "relationships.isJournalOf": "Күнделіктер", - + // "relationships.isOrgUnitOf": "Organizational Units", "relationships.isOrgUnitOf": "Ұйымдастыру бөлімшелері", - + // "relationships.isPersonOf": "Authors", "relationships.isPersonOf": "Авторлары", - + // "relationships.isProjectOf": "Research Projects", "relationships.isProjectOf": "Зерттеу жобалары", // "relationships.isPublicationOf": "Publications", "relationships.isPublicationOf": "Жарияланымдар", - + // "relationships.isPublicationOfJournalIssue": "Articles", "relationships.isPublicationOfJournalIssue": "Мақалалар", - + // "relationships.isSingleJournalOf": "Journal", "relationships.isSingleJournalOf":"Күнделік", // "relationships.isSingleVolumeOf": "Journal Volume", "relationships.isSingleVolumeOf": "Журнал көлемі", - + // "relationships.isVolumeOf": "Journal Volumes", "relationships.isVolumeOf": "Журнал томдары", - + // "relationships.isContributorOf": "Contributors", "relationships.isContributorOf": "Қатысушылар", // "resource-policies.add.button": "Add", "resource-policies.add.button": "Қосу", - + // "resource-policies.add.for.": "Add a new policy", "resource-policies.add.for.": "Жаңа саясат қосу", - + // "resource-policies.add.for.bitstream": "Add a new Bitstream policy", "resource-policies.add.for.bitstream": "Жаңа бит ағынының саясатын қосыңыз", - + // "resource-policies.add.for.bundle": "Add a new Bundle policy", "resource-policies.add.for.bundle": "Жаңа пакет саясатын қосу", - + // "resource-policies.add.for.item": "Add a new Item policy", "resource-policies.add.for.item":"Жаңа элемент саясатын қосу", - + // "resource-policies.add.for.community": "Add a new Community policy", "resource-policies.add.for.community": "Жаңа қауымдастық саясатын қосу", - + // "resource-policies.add.for.collection": "Add a new Collection policy", "resource-policies.add.for.collection":"Жаңа деректерді жинау саясатын қосу", - + // "resource-policies.create.page.heading": "Create new resource policy for ", "resource-policies.create.page.heading": "Ресурстарға қатысты жаңа саясат құру ", // "resource-policies.create.page.failure.content": "An error occurred while creating the resource policy.", "resource-policies.create.page.failure.content": "Ресурстық саясатты құру кезінде қате пайда болды.", - + // "resource-policies.create.page.success.content": "Operation successful", "resource-policies.create.page.success.content":"Операция сәтті өтті", - + // "resource-policies.create.page.title": "Create new resource policy", "resource-policies.create.page.title": "Ресурстар саласында жаңа саясат құру", - + // "resource-policies.delete.btn": "Delete selected", "resource-policies.delete.btn": "Жою таңдалған", - + // "resource-policies.delete.btn.title": "Delete selected resource policies", "resource-policies.delete.btn.title": "Таңдалған ресурстар саясатын жою", - + // "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", "resource-policies.delete.failure.content": "Таңдалған ресурстық саясатты жою кезінде қате пайда болды"., @@ -4015,579 +4014,579 @@ // "resource-policies.edit.page.heading": "Edit resource policy ", "resource-policies.edit.page.heading": "Ресурстар саясатын өзгерту", - + // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", "resource-policies.edit.page.failure.content":"Ресурстар саясатын өңдеуде қате пайда болды"., // "resource-policies.edit.page.success.content": "Operation successful", "resource-policies.edit.page.success.content": "Операция сәтті өтті", - + // "resource-policies.edit.page.title": "Edit resource policy", "resource-policies.edit.page.title": "Ресурстар саясатын түзету", - + // "resource-policies.form.action-type.label": "Select the action type", "resource-policies.form.action-type.label": "Әрекет түрін таңдаңыз", - + // "resource-policies.form.action-type.required": "You must select the resource policy action.", "resource-policies.form.action-type.required":"Сіз ресурстар саясатының әрекетін таңдауыңыз керек"., // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", "resource-policies.form.eperson-group-list.label": "Рұқсат берілетін тұлға немесе топ", - + // "resource-policies.form.eperson-group-list.select.btn": "Select", "resource-policies.form.eperson-group-list.select.btn": "Таңдау", // "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", "resource-policies.form.eperson-group-list.tab.eperson": "Адамды іздеу", - + // "resource-policies.form.eperson-group-list.tab.group": "Search for a group", "resource-policies.form.eperson-group-list.tab.group":"Топты іздеу", - + // "resource-policies.form.eperson-group-list.table.headers.action": "Action", "resource-policies.form.eperson-group-list.table.headers.action": "Әрекет", - + // "resource-policies.form.eperson-group-list.table.headers.id": "ID", "resource-policies.form.eperson-group-list.table.headers.id": "ID", - + // "resource-policies.form.eperson-group-list.table.headers.name": "Name", "resource-policies.form.eperson-group-list.table.headers.name": "Аты", - + // "resource-policies.form.date.end.label": "End Date", "resource-policies.form.date.end.label": "Аяқталу күні", - + // "resource-policies.form.date.start.label": "Start Date", "resource-policies.form.date.start.label":"Басталу күні", - + // "resource-policies.form.description.label": "Description", "resource-policies.form.description.label": "Сипаттама", - + // "resource-policies.form.name.label": "Name", "resource-policies.form.name.label": "Аты", - + // "resource-policies.form.policy-type.label": "Select the policy type", "resource-policies.form.policy-type.label": "Саясат түрін таңдаңыз", - + // "resource-policies.form.policy-type.required": "You must select the resource policy type.", "resource-policies.form.policy-type.required": "Сіз ресурстар саясатының түрін таңдауыңыз керек"., - + // "resource-policies.table.headers.action": "Action", "resource-policies.table.headers.action": "Әрекет", - + // "resource-policies.table.headers.date.end": "End Date", "resource-policies.table.headers.date.end": "Аяқталу күні", - + // "resource-policies.table.headers.date.start": "Start Date", "resource-policies.table.headers.date.start": "Басталу күні", - + // "resource-policies.table.headers.edit": "Edit", "resource-policies.table.headers.edit": "Редакциялау", - + // "resource-policies.table.headers.edit.group": "Edit group", "resource-policies.table.headers.edit.group": "Топты өңдеу", - + // "resource-policies.table.headers.edit.policy": "Edit policy", "resource-policies.table.headers.edit.policy": "Саясатты өзгерту", - + // "resource-policies.table.headers.eperson": "EPerson", "resource-policies.table.headers.eperson": "Адам", - + // "resource-policies.table.headers.group": "Group", "resource-policies.table.headers.group": "Топ", - + // "resource-policies.table.headers.id": "ID", "resource-policies.table.headers.id": "ID", - + // "resource-policies.table.headers.name": "Name", "resource-policies.table.headers.name": "Аты", - + // "resource-policies.table.headers.policyType": "type", "resource-policies.table.headers.policyType": "түрі", - + // "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", "resource-policies.table.headers.title.for.bitstream": "Бит ағынына арналған саясат", - + // "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", "resource-policies.table.headers.title.for.bundle": "Пакетке арналған саясат", - + // "resource-policies.table.headers.title.for.item": "Policies for Item", "resource-policies.table.headers.title.for.item": "Өнімге арналған саясат", - + // "resource-policies.table.headers.title.for.community": "Policies for Community", "resource-policies.table.headers.title.for.community": "Қоғамға арналған саясат", - + // "resource-policies.table.headers.title.for.collection": "Policies for Collection", "resource-policies.table.headers.title.for.collection": "Деректерді жинау саясаты", // "search.description": "", "search.description": "", - + // "search.switch-configuration.title": "Show", "search.switch-configuration.title": "Шоу", - + // "search.title": "DSpace Angular :: Search", "search.title": "DSpace Angular :: Іздеу", - + // "search.breadcrumbs": "Search", "search.breadcrumbs": "Іздеу", - + // "search.filters.applied.f.author": "Author", "search.filters.applied.f.author": "Автор", - + // "search.filters.applied.f.dateIssued.max": "End date", "search.filters.applied.f.dateIssued.max": "Аяқталу күні", - + // "search.filters.applied.f.dateIssued.min": "Start date", "search.filters.applied.f.dateIssued.min": "Басталу күні", - + // "search.filters.applied.f.dateSubmitted": "Date submitted", "search.filters.applied.f.dateSubmitted": "Ұсыну күні", - + // "search.filters.applied.f.discoverable": "Private", "search.filters.applied.f.discoverable": "Жеке", - + // "search.filters.applied.f.entityType": "Item Type", "search.filters.applied.f.entityType": "Өнім түрі", - + // "search.filters.applied.f.has_content_in_original_bundle": "Has files", "search.filters.applied.f.has_content_in_original_bundle":"Файлдар бар", - + // "search.filters.applied.f.itemtype": "Type", "search.filters.applied.f.itemtype": "Түрі", - + // "search.filters.applied.f.namedresourcetype": "Status", "search.filters.applied.f.namedresourcetype":"Мәртебе", - + // "search.filters.applied.f.subject": "Subject", "search.filters.applied.f.subject": "Тақырып", - + // "search.filters.applied.f.submitter": "Submitter", "search.filters.applied.f.submitter": "Жіберуші", - + // "search.filters.applied.f.jobTitle": "Job Title", "search.filters.applied.f.jobTitle": "Лауазым", - + // "search.filters.applied.f.birthDate.max": "End birth date", "search.filters.applied.f.birthDate.max": "Соңғы туған күні", - + // "search.filters.applied.f.birthDate.min": "Start birth date", "search.filters.applied.f.birthDate.min":"Бастауыш туған күні", - + // "search.filters.applied.f.withdrawn": "Withdrawn", "search.filters.applied.f.withdrawn": "Отозванный", // "search.filters.filter.author.head": "Author", "search.filters.filter.author.head": "Автор", - + // "search.filters.filter.author.placeholder": "Author name", "search.filters.filter.author.placeholder": "Автордың аты", - + // "search.filters.filter.birthDate.head": "Birth Date", "search.filters.filter.birthDate.head": "Туған күні", - + // "search.filters.filter.birthDate.placeholder": "Birth Date", "search.filters.filter.birthDate.placeholder":"Туған күні", - + // "search.filters.filter.creativeDatePublished.head": "Date Published", "search.filters.filter.creativeDatePublished.head": "Жарияланған күні", - + // "search.filters.filter.creativeDatePublished.placeholder": "Date Published", "search.filters.filter.creativeDatePublished.placeholder": "Жарияланған күні", - + // "search.filters.filter.creativeWorkEditor.head": "Editor", "search.filters.filter.creativeWorkEditor.head": "Редактор", - + // "search.filters.filter.creativeWorkEditor.placeholder": "Editor", "search.filters.filter.creativeWorkEditor.placeholder": "Редактор", - + // "search.filters.filter.creativeWorkKeywords.head": "Subject", "search.filters.filter.creativeWorkKeywords.head": "Тақырып", - + // "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", "search.filters.filter.creativeWorkKeywords.placeholder": "Тақырыбы", - + // "search.filters.filter.creativeWorkPublisher.head": "Publisher", "search.filters.filter.creativeWorkPublisher.head": "Баспагер", - + // "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", "search.filters.filter.creativeWorkPublisher.placeholder":"Баспагер", - + // "search.filters.filter.dateIssued.head": "Date", "search.filters.filter.dateIssued.head": "Кездесуге", - + // "search.filters.filter.dateIssued.max.placeholder": "Minimum Date", "search.filters.filter.dateIssued.max.placeholder": "Ең төменгі күн", - + // "search.filters.filter.dateIssued.min.placeholder": "Maximum Date", "search.filters.filter.dateIssued.min.placeholder":"Максималды күн", - + // "search.filters.filter.dateSubmitted.head": "Date submitted", "search.filters.filter.dateSubmitted.head": "Жіберілген күні", - + // "search.filters.filter.dateSubmitted.placeholder": "Date submitted", "search.filters.filter.dateSubmitted.placeholder": "Ұсыну күні", - + // "search.filters.filter.discoverable.head": "Private", "search.filters.filter.discoverable.head": "Жеке", - + // "search.filters.filter.withdrawn.head": "Withdrawn", "search.filters.filter.withdrawn.head": "Отозванный", - + // "search.filters.filter.entityType.head": "Item Type", "search.filters.filter.entityType.head": "Өнім түрі", - + // "search.filters.filter.entityType.placeholder": "Item Type", "search.filters.filter.entityType.placeholder": "Өнім түрі", - + // "search.filters.filter.has_content_in_original_bundle.head": "Has files", "search.filters.filter.has_content_in_original_bundle.head": "Файлдар бар", - + // "search.filters.filter.itemtype.head": "Type", "search.filters.filter.itemtype.head": "Түрі", - + // "search.filters.filter.itemtype.placeholder": "Type", "search.filters.filter.itemtype.placeholder":"Түрі", - + // "search.filters.filter.jobTitle.head": "Job Title", "search.filters.filter.jobTitle.head": "Лауазымы", - + // "search.filters.filter.jobTitle.placeholder": "Job Title", "search.filters.filter.jobTitle.placeholder":"Лауазымы", - + // "search.filters.filter.knowsLanguage.head": "Known language", "search.filters.filter.knowsLanguage.head": "Белгілі тіл", - + // "search.filters.filter.knowsLanguage.placeholder": "Known language", "search.filters.filter.knowsLanguage.placeholder": "Белгілі тіл", - + // "search.filters.filter.namedresourcetype.head": "Status", "search.filters.filter.namedresourcetype.head": "Мәртебе", - + // "search.filters.filter.namedresourcetype.placeholder": "Status", "search.filters.filter.namedresourcetype.placeholder": "Мәртебе", - + // "search.filters.filter.objectpeople.head": "People", "search.filters.filter.objectpeople.head": "Адамдар", - + // "search.filters.filter.objectpeople.placeholder": "People", "search.filters.filter.objectpeople.placeholder": "Адамдар", - + // "search.filters.filter.organizationAddressCountry.head": "Country", "search.filters.filter.organizationAddressCountry.head": "Ел", - + // "search.filters.filter.organizationAddressCountry.placeholder": "Country", "search.filters.filter.organizationAddressCountry.placeholder": "Ел", - + // "search.filters.filter.organizationAddressLocality.head": "City", "search.filters.filter.organizationAddressLocality.head": "Қала", - + // "search.filters.filter.organizationAddressLocality.placeholder": "City", "search.filters.filter.organizationAddressLocality.placeholder": "Қаласы", - + // "search.filters.filter.organizationFoundingDate.head": "Date Founded", "search.filters.filter.organizationFoundingDate.head": "Құрылған күні", - + // "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", "search.filters.filter.organizationFoundingDate.placeholder": "Құрылған күні", - + // "search.filters.filter.scope.head": "Scope", "search.filters.filter.scope.head": "Қолдану саласы", - + // "search.filters.filter.scope.placeholder": "Scope filter", "search.filters.filter.scope.placeholder": "Ауқым сүзгісі", - + // "search.filters.filter.show-less": "Collapse", "search.filters.filter.show-less": "Коллапс", - + // "search.filters.filter.show-more": "Show more", "search.filters.filter.show-more":"Көбірек көрсету", - + // "search.filters.filter.subject.head": "Subject", "search.filters.filter.subject.head":"Тақырып", - + // "search.filters.filter.subject.placeholder": "Subject", "search.filters.filter.subject.placeholder": "Тақырып", - + // "search.filters.filter.submitter.head": "Submitter", "search.filters.filter.submitter.head": "Жіберуші", - + // "search.filters.filter.submitter.placeholder": "Submitter", "search.filters.filter.submitter.placeholder":"Жіберуші", // "search.filters.entityType.JournalIssue": "Journal Issue", "search.filters.entityType.JournalIssue": "Журналдың нөмірі", - + // "search.filters.entityType.JournalVolume": "Journal Volume", "search.filters.entityType.JournalVolume":"Журнал көлемі", - + // "search.filters.entityType.OrgUnit": "Organizational Unit", "search.filters.entityType.OrgUnit":"Ұйымдастыру бөлімшесі", - + // "search.filters.has_content_in_original_bundle.true": "Yes", "search.filters.has_content_in_original_bundle.true": "Иә", - + // "search.filters.has_content_in_original_bundle.false": "No", "search.filters.has_content_in_original_bundle.false": "Жоқ", - + // "search.filters.discoverable.true": "No", "search.filters.discoverable.true": "Жоқ", - + // "search.filters.discoverable.false": "Yes", "search.filters.discoverable.false": "Иә", - + // "search.filters.withdrawn.true": "Yes", "search.filters.withdrawn.true": "Иә", - + // "search.filters.withdrawn.false": "No", "search.filters.withdrawn.false": "Жоқ", - + // "search.filters.head": "Filters", "search.filters.head":"Сүзгілер", - + // "search.filters.reset": "Reset filters", "search.filters.reset": "Сүзгілерді қалпына келтіру", - + // "search.form.search": "Search", "search.form.search":"Іздеу", - + // "search.form.search_dspace": "Search DSpace", "search.form.search_dspace": "Іздеу кеңістігі", - + // "search.form.search_mydspace": "Search MyDSpace", "search.form.search_mydspace":"Myspace іздеу", // "search.results.head": "Search Results", "search.results.head": "Іздеу нәтижелері", - + // "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", "search.results.no-results": "Сіздің іздеуіңіз нәтиже бермеді. Қиындықтар іздеумен қатар, сіз іздеген? Қоюға тырысыңыз", - + // "search.results.no-results-link": "quotes around it", "search.results.no-results-link": "оның айналасындағы тырнақшалар", - + // "search.results.empty": "Your search returned no results.", "search.results.empty": "Сіздің іздеуіңіз нәтиже бермеді"., // "search.sidebar.close": "Back to results", "search.sidebar.close": "Нәтижелерге оралайық", - + // "search.sidebar.filters.title": "Filters", "search.sidebar.filters.title": "Сүзгілер", - + // "search.sidebar.open": "Search Tools", "search.sidebar.open": "Іздеу құралдары", - + // "search.sidebar.results": "results", "search.sidebar.results":"нәтижелер", - + // "search.sidebar.settings.rpp": "Results per page", "search.sidebar.settings.rpp": "Беттегі нәтижелер", - + // "search.sidebar.settings.sort-by": "Sort By", "search.sidebar.settings.sort-by": "Сұрыптау", - + // "search.sidebar.settings.title": "Settings", "search.sidebar.settings.title": "Параметрлер", // "search.view-switch.show-detail": "Show detail", "search.view-switch.show-detail": "Толығырақ көрсету", - + // "search.view-switch.show-grid": "Show as grid", "search.view-switch.show-grid": "Тор түрінде көрсету", - + // "search.view-switch.show-list": "Show as list", "search.view-switch.show-list": "Тізім ретінде көрсету", - - - + + + // "sorting.ASC": "Ascending", "sorting.ASC": "Жоғарылайтын", - + // "sorting.DESC": "Descending", "sorting.DESC": "Төмен", - + // "sorting.dc.title.ASC": "Title Ascending", "sorting.dc.title.ASC": "Өсу бойынша тақырып", - + // "sorting.dc.title.DESC": "Title Descending", "sorting.dc.title.DESC": "Кему тақырыбы", - + // "sorting.score.DESC": "Relevance", "sorting.score.DESC": "Өзектілігі", // "statistics.title": "Statistics", "statistics.title":"Статистика", - + // "statistics.header": "Statistics for {{ scope }}", "statistics.header": "{{ scope }} үшін Статистика", - + // "statistics.breadcrumbs": "Statistics", "statistics.breadcrumbs": "Статистика", - + // "statistics.page.no-data": "No data available", "statistics.page.no-data": "Деректер жоқ", - + // "statistics.table.no-data": "No data available", "statistics.table.no-data": "Деректер жоқ", - + // "statistics.table.title.TotalVisits": "Total visits", "statistics.table.title.TotalVisits": "Келушілердің жалпы саны", - + // "statistics.table.title.TotalVisitsPerMonth": "Total visits per month", "statistics.table.title.TotalVisitsPerMonth": "Айына келушілердің жалпы саны", - + // "statistics.table.title.TotalDownloads": "File Visits", "statistics.table.title.TotalDownloads": "Қаралған файлдарды", - + // "statistics.table.title.TopCountries": "Top country views", "statistics.table.title.TopCountries": "Елге ең жақсы көріністер", - + // "statistics.table.title.TopCities": "Top city views", "statistics.table.title.TopCities": "Қаланың үздік көріністері", - + // "statistics.table.header.views": "Views", "statistics.table.header.views": "Түрлері", // "submission.edit.title": "Edit Submission", "submission.edit.title": "Жіберуді өңдеу", - + // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", "submission.general.cannot_submit": "Сізде жаңа қойылым жасау артықшылығы жоқ"., - + // "submission.general.deposit": "Deposit", "submission.general.deposit": "Депозит", - + // "submission.general.discard.confirm.cancel": "Cancel", "submission.general.discard.confirm.cancel": "Болдырмау", - + // "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?", "submission.general.discard.confirm.info":"Бұл операцияны болдырмау мүмкін емес. Сен сенімді?", - + // "submission.general.discard.confirm.submit": "Yes, I'm sure", "submission.general.discard.confirm.submit": "Ия, мен сенімдімін", - + // "submission.general.discard.confirm.title": "Discard submission", "submission.general.discard.confirm.title": "Қабылдамау жіберуді", - + // "submission.general.discard.submit": "Discard", "submission.general.discard.submit": "Тастау", - + // "submission.general.save": "Save", "submission.general.save": "Сақтау", - + // "submission.general.save-later": "Save for later", "submission.general.save-later": "Кейінірек сақтаңыз", - + // "submission.import-external.page.title": "Import metadata from an external source", "submission.import-external.page.title":"Метадеректерді сыртқы көзден импорттау", - + // "submission.import-external.title": "Import metadata from an external source", "submission.import-external.title":"Метадеректерді сыртқы көзден импорттау", - + // "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": "Ғарышқа импорттау үшін интернеттен элементтерді табу үшін жоғарыдағы сұрауды енгізіңіз"., - + // "submission.import-external.back-to-my-dspace": "Back to MyDSpace", "submission.import-external.back-to-my-dspace": "Myspace-ке оралу", - + // "submission.import-external.search.placeholder": "Search the external source", "submission.import-external.search.placeholder": "Сыртқы көзден іздеу", - + // "submission.import-external.search.button": "Search", "submission.import-external.search.button": "Іздеу", - + // "submission.import-external.search.button.hint": "Write some words to search", "submission.import-external.search.button.hint": "Іздеу үшін бірнеше сөз жазыңыз", - + // "submission.import-external.search.source.hint": "Pick an external source", "submission.import-external.search.source.hint": "Сыртқы көзді таңдаңыз", - + // "submission.import-external.source.arxiv": "arXiv", "submission.import-external.source.arxiv": "arXiv", - + // "submission.import-external.source.loading": "Loading ...", "submission.import-external.source.loading": "Жүктеу...", - + // "submission.import-external.source.sherpaJournal": "SHERPA Journals", "submission.import-external.source.sherpaJournal": "ШЕРПА күнделіктері", - + // "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", "submission.import-external.source.sherpaPublisher": "ШЕРПА баспасы", - + // "submission.import-external.source.orcid": "ORCID", "submission.import-external.source.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": "Конгресс Кітапханасының Атаулары", - + // "submission.import-external.preview.title": "Item Preview", "submission.import-external.preview.title": "Элементті алдын-ала қарау", - + // "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": "Төмендегі метадеректер сыртқы көзден импортталды. Сіз жіберуді бастаған кезде ол алдын-ала толтырылады.", - + // "submission.import-external.preview.button.import": "Start submission", "submission.import-external.preview.button.import": "Жіберуді бастау", - + // "submission.import-external.preview.error.import.title": "Submission error", "submission.import-external.preview.error.import.title": "Жіберу қатесі", - + // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", "submission.import-external.preview.error.import.body": "Қате жазбаны сыртқы көзден импорттау кезінде пайда болады"., - + // "submission.sections.describe.relationship-lookup.close": "Close", "submission.sections.describe.relationship-lookup.close": "Жабу", - + // "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", "submission.sections.describe.relationship-lookup.external-source.added":"Үлгіге жергілікті жазба сәтті қосылды", - + // "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": "Қашықтағы авторды импорттау", - + // "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": "Қашықтағы журналды импорттау", - + // "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": "Журналдың қашықтан шығарылымын импорттау", - + // "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": "Журналдың қашықтағы томын импорттау", - + // "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": "Қашықтағы авторды импорттау", - + // "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": "Үлгіге жергілікті автор сәтті қосылды", - + // "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": "Үлгіге сыртқы автор сәтті импортталды және қосылды", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Authority", "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Беделі", - + // "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": "Импорт жергілікті биліктің жаңа жазбасы ретінде", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel":"Болдырмау", - + // "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": "Жаңа жазбаларды импорттау үшін коллекцияны таңдаңыз", - + // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Нысандар", - + // "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": "Импорт Жаңа жергілікті нысан ретінде", - + // "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.lcname":"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-тен Импорт", - + // "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": "Шерпа журналынан импорттау", @@ -4595,7 +4594,7 @@ "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Sherpa Publisher-ден импорттау", // "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-тен импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", @@ -4607,13 +4606,13 @@ "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Қашықтағы журналды импорттау", // "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": "Үлгіге жергілікті журнал сәтті қосылды", // "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": "Үлгіге сыртқы журнал сәтті импортталды және қосылды", // "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": "Журналдың қашықтан шығарылымын импорттау", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", @@ -4625,7 +4624,7 @@ "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Журналдың қашықтағы томын импорттау", // "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": "Үлгіге журналдың жергілікті көлемі сәтті қосылды", // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", @@ -4633,187 +4632,187 @@ // "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Жергілікті сәйкестікті таңдаңыз:", - + // "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Жойылсын таңдау барлық", - + // "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Бетті таңдаудан бас тарту", - + // "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", "submission.sections.describe.relationship-lookup.search-tab.loading":"Жүктеу...", - + // "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Іздеу сұранысы", - + // "submission.sections.describe.relationship-lookup.search-tab.search": "Go", "submission.sections.describe.relationship-lookup.search-tab.search": "Бару", - + // "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", "submission.sections.describe.relationship-lookup.search-tab.select-all": "Барлығын таңдау", - + // "submission.sections.describe.relationship-lookup.search-tab.select-page": "Select page", "submission.sections.describe.relationship-lookup.search-tab.select-page": "Бетті таңдау", - + // "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", "submission.sections.describe.relationship-lookup.selected": "Таңдалған элементтер {{ өлшемі }}", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Жергілікті авторлар ({{саны}})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Жергілікті журналдар ({{саны}})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Жергілікті жобалар ({{ саны }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Жергілікті басылымдар ({{ саны }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Жергілікті авторлар ({{ саны }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Жергілікті ұйымдастыру бөлімшелері ({{саны }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Жергілікті деректер пакеттері ({{ саны }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Жергілікті деректер файлдары ({{ count }})", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Жергілікті журналдар ({{ 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": "Жергілікті журнал мәселелері ({{ 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": "Жергілікті журнал мәселелері ({{ 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": "Жергілікті журнал томдары ({{ 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": "Жергілікті журнал томдары ({{ 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 журналдары ({{ 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 атаулары ({{ 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": "Қаржыландыру агенттіктерін іздеу", - + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication":"Қаржыландыруды іздеу", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Ұйымдастырушылық бірліктерді іздеу", - + // "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", "submission.sections.describe.relationship-lookup.selection-tab.tab-title":"Ағымдағы таңдау ({{ count }})", - + // "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Журналдың шығарылымдары", // "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", "submission.sections.describe.relationship-lookup.title.JournalIssue":"Журналдың шығарылымдары", - + // "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication":"Журнал томдары", // "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", "submission.sections.describe.relationship-lookup.title.JournalVolume": "Журнал томдары", - + // "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Журналдар", // "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Authors", "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Авторлар", - + // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Қаржыландыру агенттігі", // "submission.sections.describe.relationship-lookup.title.Project": "Projects", "submission.sections.describe.relationship-lookup.title.Project": "Жобалар", - + // "submission.sections.describe.relationship-lookup.title.Publication": "Publications", "submission.sections.describe.relationship-lookup.title.Publication": "Жарияланымдар", - + // "submission.sections.describe.relationship-lookup.title.Person": "Authors", "submission.sections.describe.relationship-lookup.title.Person": "Авторлар", - + // "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", "submission.sections.describe.relationship-lookup.title.OrgUnit": "Ұйымдастыру бөлімшелері", - + // "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", "submission.sections.describe.relationship-lookup.title.DataPackage": "Деректер пакеттері", - + // "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", "submission.sections.describe.relationship-lookup.title.DataFile": "Деректер файлдары", - + // "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", "submission.sections.describe.relationship-lookup.title.Funding Agency":"Қаржыландыру агенттігі", - + // "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Қаржыландыру", - + // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Бас ұйымдастыру бөлімшесі", - + // "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Ашылмалы тізімді ауыстыру", - + // "submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings", "submission.sections.describe.relationship-lookup.selection-tab.settings": "Баптаулар", - + // "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Сіздің таңдауыңыз қазір бос"., - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Authors", "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Таңдалған авторлар", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Таңдаулы журналдар", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Журналдың таңдалған көлемі", // "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Таңдаулы жобалар", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", "submission.sections.describe.relationship-lookup.selection-tab.title.Publication":"Таңдамалы Жарияланымдар", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Authors", "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Таңдалған авторлар", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Жеке ұйымдастыру бөлімшелері", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Таңдалған деректер пакеттері", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Selected Data Files", "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Таңдалған деректер файлдары", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Таңдаулы журналдар", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Таңдалған сұрақ", @@ -4822,196 +4821,196 @@ // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Таңдалған қаржыландыру агенттігі", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Таңдалған қаржыландыру", // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Таңдалған шығарылым", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Таңдалған ұйымдастыру бөлімі", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal":"Іздеу нәтижелері", // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Іздеу нәтижелері", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Іздеу нәтижелері", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Іздеу нәтижелері", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Іздеу нәтижесі", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Іздеу нәтижелері", - + // "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Іздеу нәтижесі", - + // "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": "Сіз \"{{ value }}\" сол адамға арналған атау опциясы ретінде сақтағыңыз келе ме, сондықтан сіз және басқалар оны болашақ жіберу үшін қайта пайдалана аласыз ба? Егер жоқ болса, сіз оны осы жіберу үшін пайдалана аласыз "., - + // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Атаудың жаңа нұсқасын сақтау", // "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Тек осы жіберу үшін пайдаланыңыз", - + // "submission.sections.ccLicense.type": "License Type", "submission.sections.ccLicense.type": "Лицензияның типі", - + // "submission.sections.ccLicense.select": "Select a license type…", "submission.sections.ccLicense.select": "Лицензия түрін таңдаңыз...", // "submission.sections.ccLicense.change": "Change your license type…", "submission.sections.ccLicense.change": "Лицензия түрін өзгертіңіз...", - + // "submission.sections.ccLicense.none": "No licenses available", "submission.sections.ccLicense.none": "Лицензиялар жоқ", // "submission.sections.ccLicense.option.select": "Select an option…", "submission.sections.ccLicense.option.select": "Опцияны таңдаңыз...", - + // "submission.sections.ccLicense.link": "You’ve selected the following license:", "submission.sections.ccLicense.link": "Сіз келесі лицензияны таңдадыңыз:", - + // "submission.sections.ccLicense.confirmation": "I grant the license above", "submission.sections.ccLicense.confirmation": "Мен жоғарыда аталған лицензияны беремін", - + // "submission.sections.general.add-more": "Add more", "submission.sections.general.add-more": "Тағы қосу", - + // "submission.sections.general.collection": "Collection", "submission.sections.general.collection": "Жинақ", - + // "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", "submission.sections.general.deposit_error_notice": "Тауарды жіберген кезде мәселе туындады, кейінірек қайталап көріңіз.", - + // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", "submission.sections.general.deposit_success_notice": "Өтініш сәтті сақталды"., - + // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", "submission.sections.general.discard_error_notice": "Тауарды тастау кезінде мәселе туындады, кейінірек қайталап көріңіз"., - + // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", "submission.sections.general.discard_success_notice": "Ұсыныс сәтті қабылданбады"., // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", "submission.sections.general.metadata-extracted": "Жаңа метадеректер алынып, {{SectionID}} бөліміне қосылды.", - + // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", "submission.sections.general.metadata-extracted-new-section": "Жіберу үшін жаңа бөлім {{SectionID}}< / strong > қосылды.", // "submission.sections.general.no-collection": "No collection found", "submission.sections.general.no-collection": "Жинақ табылмады", - + // "submission.sections.general.no-sections": "No options available", "submission.sections.general.no-sections": "Қол жетімді опциялар жоқ", - + // "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", "submission.sections.general.save_error_notice": "Элементті сақтау кезінде мәселе туындады, кейінірек қайталап көріңіз.", - + // "submission.sections.general.save_success_notice": "Submission saved successfully.", "submission.sections.general.save_success_notice": "Жіберу сәтті сақталды.", - + // "submission.sections.general.search-collection": "Search for a collection", "submission.sections.general.search-collection": "Коллекцияны іздеу", - + // "submission.sections.general.sections_not_valid": "There are incomplete sections.", "submission.sections.general.sections_not_valid":"Толық емес бөлімдер бар"., // "submission.sections.submit.progressbar.CClicense": "Creative commons license", "submission.sections.submit.progressbar.CClicense": "Creative commons license", - + // "submission.sections.submit.progressbar.describe.recycle": "Recycle", "submission.sections.submit.progressbar.describe.recycle": "Өңдеуге", - + // "submission.sections.submit.progressbar.describe.stepcustom": "Describe", "submission.sections.submit.progressbar.describe.stepcustom": "Сипаттау", - + // "submission.sections.submit.progressbar.describe.stepone": "Describe", "submission.sections.submit.progressbar.describe.stepone": "Сипаттау", - + // "submission.sections.submit.progressbar.describe.steptwo": "Describe", "submission.sections.submit.progressbar.describe.steptwo": "Сипаттау", - + // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", "submission.sections.submit.progressbar.detect-duplicate": "Ықтимал телнұсқалар", - + // "submission.sections.submit.progressbar.license": "Deposit license", "submission.sections.submit.progressbar.license": "Депозиттік лицензия", - + // "submission.sections.submit.progressbar.upload": "Upload files", "submission.sections.submit.progressbar.upload": "Файлдарды жүктеу", - + // "submission.sections.upload.delete.confirm.cancel": "Cancel", "submission.sections.upload.delete.confirm.cancel": "Болдырмау", - + // "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?", "submission.sections.upload.delete.confirm.info": "Бұл операцияны болдырмау мүмкін емес. Сіз сенімдіміз?", - + // "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", "submission.sections.upload.delete.confirm.submit": "Ия, мен сенімдімін", - + // "submission.sections.upload.delete.confirm.title": "Delete bitstream", "submission.sections.upload.delete.confirm.title": "Бит ағынын жою", - + // "submission.sections.upload.delete.submit": "Delete", "submission.sections.upload.delete.submit": "Жою", - + // "submission.sections.upload.drop-message": "Drop files to attach them to the item", "submission.sections.upload.drop-message": "Оларды элементке бекіту үшін файлдарды жойыңыз", - + // "submission.sections.upload.form.access-condition-label": "Access condition type", "submission.sections.upload.form.access-condition-label": "Кіру шартының түрі", - + // "submission.sections.upload.form.date-required": "Date is required.", "submission.sections.upload.form.date-required": "Күні міндетті.", - + // "submission.sections.upload.form.from-label": "Grant access from", "submission.sections.upload.form.from-label": "Қатынауды ұсыну бірі", - + // "submission.sections.upload.form.from-placeholder": "From", "submission.sections.upload.form.from-placeholder": "Кімнен", // "submission.sections.upload.form.group-label": "Group", "submission.sections.upload.form.group-label": "Топ", - + // "submission.sections.upload.form.group-required": "Group is required.", "submission.sections.upload.form.group-required": "Топ қажет.", // "submission.sections.upload.form.until-label": "Grant access until", "submission.sections.upload.form.until-label": "Рұқсат беруге болғанша", - + // "submission.sections.upload.form.until-placeholder": "Until", "submission.sections.upload.form.until-placeholder":"Әзірге", - + // "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": "{{Коллекция атауы}} жинағына жүктелген файлдар келесі топқа (топтарға) сәйкес қол жетімді болады:", - + // "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": "{{Коллекция атауы}} жинағына жүктелген файлдар жеке файл үшін нақты анықталғаннан басқа, келесі топпен (топтармен) қол жетімді болатындығын ескеріңіз:", - + // "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": "Мұнда сіз осы элементтегі барлық файлдарды таба аласыз. Файл метадеректерін және кіру шарттарын жаңартуға немесе қосымша файлдарды олардыбетінде сүйреп апару арқылы жүктеуге болады.", - + // "submission.sections.upload.no-entry": "No", "submission.sections.upload.no-entry":"Жоқ", - + // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", "submission.sections.upload.no-file-uploaded": "Файл әлі жүктелмеген"., - + // "submission.sections.upload.save-metadata": "Save metadata", "submission.sections.upload.save-metadata": "Метадеректерді сақтау", - + // "submission.sections.upload.undo": "Cancel", "submission.sections.upload.undo": "Болдырмау", - + // "submission.sections.upload.upload-failed": "Upload failed", "submission.sections.upload.upload-failed": "Жүктеу сәтсіз аяқталды", @@ -5023,183 +5022,183 @@ // "submission.workflow.generic.delete": "Delete", "submission.workflow.generic.delete": "Өшіру", - + // "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": "Егер сіз осы элементтен бас тартқыңыз келсе, жою таңдаңыз. Содан кейін сізден оны растау сұралады.", - + // "submission.workflow.generic.edit": "Edit", "submission.workflow.generic.edit": "Редакциялау", - + // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", "submission.workflow.generic.edit-help": "Элементтің метадеректерін өзгерту үшін осы параметрді таңдаңыз"., - + // "submission.workflow.generic.view": "View", "submission.workflow.generic.view": "Түрі", - + // "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", "submission.workflow.generic.view-help": "Элемент метадеректерін көру үшін осы параметрді таңдаңыз.", - + // "submission.workflow.tasks.claimed.approve": "Approve", "submission.workflow.tasks.claimed.approve": "Мақұлдансын", - + // "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":"Егер сіз тауармен танысқан болсаңыз және ол коллекцияға қосуға жарамды болса, \"Мақұлдау\" таңдаңыз.", - + // "submission.workflow.tasks.claimed.edit": "Edit", "submission.workflow.tasks.claimed.edit": "Редакциялау", - + // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", "submission.workflow.tasks.claimed.edit_help": "Элементтің метадеректерін өзгерту үшін осы параметрді таңдаңыз"., - + // "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": "Жіберушінің мәселені шешіп, қайта жібере алатындығын көрсете отырып, төмендегі жолаққа жіберуден бас тарту себебін енгізіңіз.", - + // "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", "submission.workflow.tasks.claimed.reject.reason.placeholder": "Қабылдамау себебін сипаттаңыз", - + // "submission.workflow.tasks.claimed.reject.reason.submit": "Reject item", "submission.workflow.tasks.claimed.reject.reason.submit": "Тауарды қабылдамау", - + // "submission.workflow.tasks.claimed.reject.reason.title": "Reason", "submission.workflow.tasks.claimed.reject.reason.title": "Себеп", - + // "submission.workflow.tasks.claimed.reject.submit": "Reject", "submission.workflow.tasks.claimed.reject.submit": "Қабылдамау", - + // "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": "Егер сіз затты қарап шығып, оның емес екенін байқасаңыз, \"Қабылдамау\" таңдаңыз. Содан кейін сізден тауардың неге сәйкес келмейтінін және жіберуші бірдеңені өзгертіп, қайта жіберуі керек екенін көрсететін хабарлама енгізу сұралады.", - + // "submission.workflow.tasks.claimed.return": "Return to pool", "submission.workflow.tasks.claimed.return": "Бассейнге оралу", - + // "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": "Басқа пайдаланушы бұл тапсырманы орындай алатындай етіп тапсырманы бассейнге қайтарыңыз"., // "submission.workflow.tasks.generic.error": "Error occurred during operation...", "submission.workflow.tasks.generic.error": "Жұмыс кезінде қате пайда болды...", - + // "submission.workflow.tasks.generic.processing": "Processing...", "submission.workflow.tasks.generic.processing": "Өңдеу...", - + // "submission.workflow.tasks.generic.submitter": "Submitter", "submission.workflow.tasks.generic.submitter": "Жіберуші", - + // "submission.workflow.tasks.generic.success": "Operation successful", "submission.workflow.tasks.generic.success": "Операция сәтті өтті", // "submission.workflow.tasks.pool.claim": "Claim", "submission.workflow.tasks.pool.claim": "Талап", - + // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", "submission.workflow.tasks.pool.claim_help": "Бұл тапсырманы өзіңе жүкте"., - + // "submission.workflow.tasks.pool.hide-detail": "Hide detail", "submission.workflow.tasks.pool.hide-detail": "Жасыру бөлшектері", - + // "submission.workflow.tasks.pool.show-detail": "Show detail", "submission.workflow.tasks.pool.show-detail": "Толығырақ көрсету", - - - + + + // "title": "DSpace", "title": "DSpace", - + // "vocabulary-treeview.header": "Hierarchical tree view", "vocabulary-treeview.header": "Иерархиялық ағаш көрінісі", - + // "vocabulary-treeview.load-more": "Load more", "vocabulary-treeview.load-more": "Жүктеңіз көп", - + // "vocabulary-treeview.search.form.reset": "Reset", "vocabulary-treeview.search.form.reset": "Қайта қалыпқа келтіру", - + // "vocabulary-treeview.search.form.search": "Search", "vocabulary-treeview.search.form.search": "Іздеу", - + // "vocabulary-treeview.search.no-result": "There were no items to show", "vocabulary-treeview.search.no-result": "Көрсетуге болатын заттар болған жоқ", - + // "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", "vocabulary-treeview.tree.description.nsi": "Норвегиялық ғылыми индекс", - + // "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", "vocabulary-treeview.tree.description.srsc": "Зерттеудің пәндік санаттары", - + // "uploader.browse": "browse", "uploader.browse": "көру", - + // "uploader.drag-message": "Drag & Drop your files here", "uploader.drag-message": "Файлдарды осында сүйреңіз", - + // "uploader.or": ", or ", "uploader.or": ", немесе ", - + // "uploader.processing": "Processing", "uploader.processing": "Өңдеу", - + // "uploader.queue-length": "Queue length", "uploader.queue-length": "Кезек ұзындығы", - + // "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": "Виртуалды метадеректерді нақты метадеректер ретінде сақтағыңыз келетін түрлерін таңдаңыз", - + // "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", "virtual-metadata.delete-item.modal-head": "Бұл қарым-қатынастың виртуалды метадеректері", - + // "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": "Виртуалды метадеректерді нақты метадеректер ретінде сақтағыңыз келетін элементтерді таңдаңыз", // "workflowAdmin.search.results.head": "Administer Workflow", "workflowAdmin.search.results.head": "Жұмыс процесін басқару", - + // "workflow-item.delete.notification.success.title": "Deleted", "workflow-item.delete.notification.success.title":"Жойылды", - + // "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", "workflow-item.delete.notification.success.content": "Жұмыс процесінің бұл элементі сәтті жойылды", - + // "workflow-item.delete.notification.error.title": "Something went wrong", "workflow-item.delete.notification.error.title": "Бір нәрсе дұрыс болмады", - + // "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", "workflow-item.delete.notification.error.content": "Жұмыс процесінің элементі жойылмады", - + // "workflow-item.delete.title": "Delete workflow item", "workflow-item.delete.title": "Жұмыс процесінің элементін жою", - + // "workflow-item.delete.header": "Delete workflow item", "workflow-item.delete.header": "Жұмыс процесінің элементін жою", - + // "workflow-item.delete.button.cancel": "Cancel", "workflow-item.delete.button.cancel": "Алып тастау", - + // "workflow-item.delete.button.confirm": "Delete", "workflow-item.delete.button.confirm": "Жою", - + // "workflow-item.send-back.notification.success.title": "Sent back to submitter", "workflow-item.send-back.notification.success.title": "Жіберушіге қайта жіберілді", - + // "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", "workflow-item.send-back.notification.success.content": "Жұмыс процесінің бұл элементі жіберушіге сәтті жіберілді", // "workflow-item.send-back.notification.error.title": "Something went wrong", "workflow-item.send-back.notification.error.title": "Бір нәрсе дұрыс болмады", - + // "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": "Жұмыс процесінің элементі жіберушіге қайтарылмады", - + // "workflow-item.send-back.title": "Send workflow item back to submitter", "workflow-item.send-back.title": "Жұмыс процесінің элементін жіберушіге қайта жіберіңіз", - + // "workflow-item.send-back.header": "Send workflow item back to submitter", "workflow-item.send-back.header": "Жұмыс процесінің элементін жіберушіге жіберу", // "workflow-item.send-back.button.cancel": "Cancel", "workflow-item.send-back.button.cancel": "Алып тастау", - + // "workflow-item.send-back.button.confirm": "Send back" "workflow-item.send-back.button.confirm": "Кері жіберу" - + } From 0146a11953dfea0db37380a6dd25bcff57f42a7e Mon Sep 17 00:00:00 2001 From: myrza1 Date: Sat, 23 Apr 2022 19:33:25 +0600 Subject: [PATCH 011/119] Update kz.json5 update ed commas --- src/assets/i18n/kz.json5 | 84 ++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index 5adb17504c..fd611712e6 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -1873,10 +1873,9 @@ "confirmation-modal.delete-eperson.header": "EPerson \"{{ dsoName }}\" жою", // "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", - "confirmation-modal.delete-eperson.info": "EPerson \"{{ dsoName }}\ қолданбасын жойғыңыз келетініне сенімдісіз бе"", + "confirmation-modal.delete-eperson.info": "EPerson \"{{ dsoName }}\" қолданбасын жойғыңыз келетініне сенімдісіз бе", // "confirmation-modal.delete-eperson.cancel": "Cancel", - "confirmation-modal.delete-eperson.cancel": "Болдырмау", // "confirmation-modal.delete-eperson.confirm": "Delete", @@ -1935,13 +1934,12 @@ "error.validation.license.notgranted": "Жіберуді аяқтау үшін осы лицензияны беруіңіз керек. Бұл лицензияны қазір бере алмасаңыз, жұмысыңызды сақтап, кейінірек оралуыңызға немесе жіберуді жоюға болады.", // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", - "error.validation.pattern": "Бұл енгізу ағымдағы үлгімен шектелген: {{ үлгі }}.", + "error.validation.pattern": "Бұл енгізу ағымдағы үлгімен шектелген: {{ pattern }}.", // "error.validation.filerequired": "The file upload is mandatory", "error.validation.filerequired": "Файлды жүктеп салу міндетті", - // "file-section.error.header": "Error obtaining files for this item", "file-section.error.header": "Осы элемент үшін файлдарды алу қатесі", @@ -2133,7 +2131,7 @@ "home.breadcrumbs": "Басты", // "home.title": "DSpace Angular :: Home", - "home.title": "DSpace Angular :: Басты», + "home.title": "DSpace Angular :: Басты", // "home.top-level-communities.head": "Communities in DSpace", "home.top-level-communities.head": "DSpace-тегі қауымдастықтар", @@ -2326,7 +2324,7 @@ "item.edit.delete.confirm": "Жою", // "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": "Бұл элемент толығымен жойылуы керек екеніне сенімдісіз бе? Абайлаңыз: Қазіргі уақытта құлпытас қалмас еді"., + "item.edit.delete.description": "Бұл элемент толығымен жойылуы керек екеніне сенімдісіз бе? Абайлаңыз: Қазіргі уақытта құлпытас қалмас еді.", // "item.edit.delete.error": "An error occurred while deleting the item", "item.edit.delete.error": "Элементті жою кезінде қате орын алды", @@ -2458,7 +2456,7 @@ "item.edit.metadata.notifications.outdated.title": "Өзгертілген ескірген", // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", - "item.edit.metadata.notifications.saved.content": "Осы элементтің метадеректеріндегі өзгерістер сақталды"., + "item.edit.metadata.notifications.saved.content": "Осы элементтің метадеректеріндегі өзгерістер сақталды.", // "item.edit.metadata.notifications.saved.title": "Metadata saved", "item.edit.metadata.notifications.saved.title": "Сақталған метадеректер", @@ -2581,7 +2579,7 @@ "item.edit.relationships.no-relationships": "Қарым-қатынас жоқ", // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", - "item.edit.relationships.notifications.discarded.content": "Сіздің өзгертулеріңіз жойылды. Енгізілген өзгертулерді қалпына келтіру үшін 'Болдырмау' түймесін басыңыз, + "item.edit.relationships.notifications.discarded.content": "Сіздің өзгертулеріңіз жойылды. Енгізілген өзгертулерді қалпына келтіру үшін 'Болдырмау' түймесін басыңыз", // "item.edit.relationships.notifications.discarded.title": "Changes discarded", "item.edit.relationships.notifications.discarded.title": "Өзгерістер жойылды", @@ -2710,7 +2708,7 @@ "item.edit.tabs.versionhistory.title": "Элементті өңдеу-нұсқа тарихы", // "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": "Бұл пайдаланушы интерфейсінде жаңа нұсқаларды өңдеу немесе қосу әлі мүмкін емес"., + "item.edit.tabs.versionhistory.under-construction": "Бұл пайдаланушы интерфейсінде жаңа нұсқаларды өңдеу немесе қосу әлі мүмкін емес.", // "item.edit.tabs.view.head": "View Item", "item.edit.tabs.view.head": "Элементті қарау", @@ -2788,7 +2786,7 @@ "item.page.files": "Файлдар", // "item.page.filesection.description": "Description:", - "item.page.filesection.description": "Сипаттама:" + "item.page.filesection.description": "Сипаттама:", // "item.page.filesection.download": "Download", "item.page.filesection.download": "Жүктеу", @@ -2860,7 +2858,7 @@ "item.preview.dc.date.issued": "Жарияланған күні:", // "item.preview.dc.description.abstract": "Abstract:", - "item.preview.dc.description.abstract": "Аннотация:, + "item.preview.dc.description.abstract": "Аннотация:", // "item.preview.dc.identifier.other": "Other identifier:", "item.preview.dc.identifier.other": "Басқа идентификатор:", @@ -2899,7 +2897,7 @@ "item.select.table.title": "Атауы", // "item.version.history.empty": "There are no other versions for this item yet.", - "item.version.history.empty": "Бұл тақырыпқа арналған басқа нұсқалар әлі жоқ"., + "item.version.history.empty": "Бұл тақырыпқа арналған басқа нұсқалар әлі жоқ.", // "item.version.history.head": "Version History", "item.version.history.head": "Нұсқа тарихы", @@ -3150,7 +3148,7 @@ "menu.section.control_panel":"Басқару панелі", // "menu.section.curation_task": "Curation Task", - "menu.section.curation_task": "Тапсырма" + "menu.section.curation_task": "Тапсырма", // "menu.section.edit": "Edit", "menu.section.edit":"Өңдеу", @@ -3174,7 +3172,7 @@ "menu.section.export_community": "Қауымдастық", // "menu.section.export_item": "Item", - "menu.section.export_item": "Жол" + "menu.section.export_item": "Жол", // "menu.section.export_metadata": "Metadata", "menu.section.export_metadata": "Метадеректер", @@ -3442,7 +3440,7 @@ "nav.login": "Кіру", // "nav.logout": "Log Out", - "nav.logout": "Шығу" + "nav.logout": "Шығу", // "nav.mydspace": "MyDSpace", "nav.mydspace": "MyDSpace", @@ -3746,7 +3744,7 @@ "profile.security.form.notifications.error.not-long-enough": "Құпия сөз кемінде 6 таңбадан тұруы керек.", // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", - "profile.security.form.notifications.error.not-same": "Берілген құпия сөздер бірдей емес"., + "profile.security.form.notifications.error.not-same": "Берілген құпия сөздер бірдей емес.", // "profile.title": "Update Profile", "profile.title":"Профильді жаңарту", @@ -3806,7 +3804,7 @@ "publication.page.titleprefix": "Басылым: ", // "publication.page.volume-title": "Volume Title", - "publication.page.volume-title": "Том атауы",, + "publication.page.volume-title": "Том атауы", // "publication.search.results.head": "Publication Search Results", "publication.search.results.head": "Жарияланымдарды іздеу нәтижелері", @@ -3857,19 +3855,19 @@ "register-page.create-profile.security.label.passwordrepeat":"Растау үшін қайта енгізіңіз*", // "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", - "register-page.create-profile.security.error.empty-password": "Төмендегі өріске құпия сөзді енгізіңіз"., + "register-page.create-profile.security.error.empty-password": "Төмендегі өріске құпия сөзді енгізіңіз.", // "register-page.create-profile.security.error.matching-passwords": "The passwords do not match.", - "register-page.create-profile.security.error.matching-passwords": "Парольдер бірдей емес"., + "register-page.create-profile.security.error.matching-passwords": "Парольдер бірдей емес.", // "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": "Пароль кем дегенде 6 таңбадан тұруы керек"., + "register-page.create-profile.security.error.password-length": "Пароль кем дегенде 6 таңбадан тұруы керек.", // "register-page.create-profile.submit": "Complete Registration", "register-page.create-profile.submit": "Тіркеуді аяқтау", // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", - "register-page.create-profile.submit.error.content": "Жаңа пайдаланушыны тіркеу кезінде бір нәрсе дұрыс болмады"., + "register-page.create-profile.submit.error.content": "Жаңа пайдаланушыны тіркеу кезінде бір нәрсе дұрыс болмады.", // "register-page.create-profile.submit.error.head": "Registration failed", "register-page.create-profile.submit.error.head": "Тіркеу сәтсіз аяқталды", @@ -3884,7 +3882,7 @@ "register-page.registration.header": "Жаңа пайдаланушыны тіркеу", // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", - "register-page.registration.info":"Электрондық пошта арқылы жаңартулар алу және DSpace-ке жаңа өнімдер жіберу үшін жинақтарға жазылу үшін есептік жазбаны тіркеңіз"., + "register-page.registration.info":"Электрондық пошта арқылы жаңартулар алу және DSpace-ке жаңа өнімдер жіберу үшін жинақтарға жазылу үшін есептік жазбаны тіркеңіз.", // "register-page.registration.email": "Email Address *", "register-page.registration.email": "Электрондық пошта мекенжайы *", @@ -3896,7 +3894,7 @@ "register-page.registration.email.error.pattern": "Жарамды электрондық пошта мекенжайын енгізіңіз", // "register-page.registration.email.hint": "This address will be verified and used as your login name.", - "register-page.registration.email.hint":"Бұл мекен-жай тексеріліп, сіздің логиніңіз ретінде пайдаланылады"., + "register-page.registration.email.hint":"Бұл мекен-жай тексеріліп, сіздің логиніңіз ретінде пайдаланылады.", // "register-page.registration.submit": "Register", "register-page.registration.submit": "Тіркелу", @@ -3905,7 +3903,7 @@ "register-page.registration.success.head": "Растау электрондық поштасы жіберілді", // "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}} мекен-жайына арнайы URL мекен-жайы мен қосымша нұсқаулары бар электрондық пошта жіберіледі"., + "register-page.registration.success.content": "{{Email}} мекен-жайына арнайы URL мекен-жайы мен қосымша нұсқаулары бар электрондық пошта жіберіледі.", // "register-page.registration.error.head": "Error when trying to register email", "register-page.registration.error.head": "Электрондық поштаны тіркеу кезінде қате", @@ -4007,7 +4005,7 @@ "resource-policies.delete.btn.title": "Таңдалған ресурстар саясатын жою", // "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", - "resource-policies.delete.failure.content": "Таңдалған ресурстық саясатты жою кезінде қате пайда болды"., + "resource-policies.delete.failure.content": "Таңдалған ресурстық саясатты жою кезінде қате пайда болды.", // "resource-policies.delete.success.content": "Operation successful", "resource-policies.delete.success.content": "Операция сәтті өтті", @@ -4016,7 +4014,7 @@ "resource-policies.edit.page.heading": "Ресурстар саясатын өзгерту", // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", - "resource-policies.edit.page.failure.content":"Ресурстар саясатын өңдеуде қате пайда болды"., + "resource-policies.edit.page.failure.content":"Ресурстар саясатын өңдеуде қате пайда болды.", // "resource-policies.edit.page.success.content": "Operation successful", "resource-policies.edit.page.success.content": "Операция сәтті өтті", @@ -4028,7 +4026,7 @@ "resource-policies.form.action-type.label": "Әрекет түрін таңдаңыз", // "resource-policies.form.action-type.required": "You must select the resource policy action.", - "resource-policies.form.action-type.required":"Сіз ресурстар саясатының әрекетін таңдауыңыз керек"., + "resource-policies.form.action-type.required":"Сіз ресурстар саясатының әрекетін таңдауыңыз керек.", // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", "resource-policies.form.eperson-group-list.label": "Рұқсат берілетін тұлға немесе топ", @@ -4067,7 +4065,7 @@ "resource-policies.form.policy-type.label": "Саясат түрін таңдаңыз", // "resource-policies.form.policy-type.required": "You must select the resource policy type.", - "resource-policies.form.policy-type.required": "Сіз ресурстар саясатының түрін таңдауыңыз керек"., + "resource-policies.form.policy-type.required": "Сіз ресурстар саясатының түрін таңдауыңыз керек.", // "resource-policies.table.headers.action": "Action", "resource-policies.table.headers.action": "Әрекет", @@ -4364,7 +4362,7 @@ "search.results.no-results-link": "оның айналасындағы тырнақшалар", // "search.results.empty": "Your search returned no results.", - "search.results.empty": "Сіздің іздеуіңіз нәтиже бермеді"., + "search.results.empty": "Сіздің іздеуіңіз нәтиже бермеді.", // "search.sidebar.close": "Back to results", "search.sidebar.close": "Нәтижелерге оралайық", @@ -4450,7 +4448,7 @@ "submission.edit.title": "Жіберуді өңдеу", // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", - "submission.general.cannot_submit": "Сізде жаңа қойылым жасау артықшылығы жоқ"., + "submission.general.cannot_submit": "Сізде жаңа қойылым жасау артықшылығы жоқ.", // "submission.general.deposit": "Deposit", "submission.general.deposit": "Депозит", @@ -4483,7 +4481,7 @@ "submission.import-external.title":"Метадеректерді сыртқы көзден импорттау", // "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": "Ғарышқа импорттау үшін интернеттен элементтерді табу үшін жоғарыдағы сұрауды енгізіңіз"., + "submission.import-external.page.hint": "Ғарышқа импорттау үшін интернеттен элементтерді табу үшін жоғарыдағы сұрауды енгізіңіз.", // "submission.import-external.back-to-my-dspace": "Back to MyDSpace", "submission.import-external.back-to-my-dspace": "Myspace-ке оралу", @@ -4534,7 +4532,7 @@ "submission.import-external.preview.error.import.title": "Жіберу қатесі", // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", - "submission.import-external.preview.error.import.body": "Қате жазбаны сыртқы көзден импорттау кезінде пайда болады"., + "submission.import-external.preview.error.import.body": "Қате жазбаны сыртқы көзден импорттау кезінде пайда болады.", // "submission.sections.describe.relationship-lookup.close": "Close", "submission.sections.describe.relationship-lookup.close": "Жабу", @@ -4781,7 +4779,7 @@ "submission.sections.describe.relationship-lookup.selection-tab.settings": "Баптаулар", // "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", - "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Сіздің таңдауыңыз қазір бос"., + "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Сіздің таңдауыңыз қазір бос.", // "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Authors", "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Таңдалған авторлар", @@ -4853,7 +4851,7 @@ "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Іздеу нәтижесі", // "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": "Сіз \"{{ value }}\" сол адамға арналған атау опциясы ретінде сақтағыңыз келе ме, сондықтан сіз және басқалар оны болашақ жіберу үшін қайта пайдалана аласыз ба? Егер жоқ болса, сіз оны осы жіберу үшін пайдалана аласыз "., + "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Сіз \"{{ value }}\" сол адамға арналған атау опциясы ретінде сақтағыңыз келе ме, сондықтан сіз және басқалар оны болашақ жіберу үшін қайта пайдалана аласыз ба? Егер жоқ болса, сіз оны осы жіберу үшін пайдалана аласыз.", // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Атаудың жаңа нұсқасын сақтау", @@ -4892,13 +4890,13 @@ "submission.sections.general.deposit_error_notice": "Тауарды жіберген кезде мәселе туындады, кейінірек қайталап көріңіз.", // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", - "submission.sections.general.deposit_success_notice": "Өтініш сәтті сақталды"., + "submission.sections.general.deposit_success_notice": "Өтініш сәтті сақталды.", // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", - "submission.sections.general.discard_error_notice": "Тауарды тастау кезінде мәселе туындады, кейінірек қайталап көріңіз"., + "submission.sections.general.discard_error_notice": "Тауарды тастау кезінде мәселе туындады, кейінірек қайталап көріңіз.", // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", - "submission.sections.general.discard_success_notice": "Ұсыныс сәтті қабылданбады"., + "submission.sections.general.discard_success_notice": "Ұсыныс сәтті қабылданбады.", // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", "submission.sections.general.metadata-extracted": "Жаңа метадеректер алынып, {{SectionID}} бөліміне қосылды.", @@ -4922,7 +4920,7 @@ "submission.sections.general.search-collection": "Коллекцияны іздеу", // "submission.sections.general.sections_not_valid": "There are incomplete sections.", - "submission.sections.general.sections_not_valid":"Толық емес бөлімдер бар"., + "submission.sections.general.sections_not_valid":"Толық емес бөлімдер бар.", // "submission.sections.submit.progressbar.CClicense": "Creative commons license", "submission.sections.submit.progressbar.CClicense": "Creative commons license", @@ -5003,7 +5001,7 @@ "submission.sections.upload.no-entry":"Жоқ", // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", - "submission.sections.upload.no-file-uploaded": "Файл әлі жүктелмеген"., + "submission.sections.upload.no-file-uploaded": "Файл әлі жүктелмеген.", // "submission.sections.upload.save-metadata": "Save metadata", "submission.sections.upload.save-metadata": "Метадеректерді сақтау", @@ -5030,7 +5028,7 @@ "submission.workflow.generic.edit": "Редакциялау", // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", - "submission.workflow.generic.edit-help": "Элементтің метадеректерін өзгерту үшін осы параметрді таңдаңыз"., + "submission.workflow.generic.edit-help": "Элементтің метадеректерін өзгерту үшін осы параметрді таңдаңыз.", // "submission.workflow.generic.view": "View", "submission.workflow.generic.view": "Түрі", @@ -5048,7 +5046,7 @@ "submission.workflow.tasks.claimed.edit": "Редакциялау", // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", - "submission.workflow.tasks.claimed.edit_help": "Элементтің метадеректерін өзгерту үшін осы параметрді таңдаңыз"., + "submission.workflow.tasks.claimed.edit_help": "Элементтің метадеректерін өзгерту үшін осы параметрді таңдаңыз.", // "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": "Жіберушінің мәселені шешіп, қайта жібере алатындығын көрсете отырып, төмендегі жолаққа жіберуден бас тарту себебін енгізіңіз.", @@ -5072,7 +5070,7 @@ "submission.workflow.tasks.claimed.return": "Бассейнге оралу", // "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": "Басқа пайдаланушы бұл тапсырманы орындай алатындай етіп тапсырманы бассейнге қайтарыңыз"., + "submission.workflow.tasks.claimed.return_help": "Басқа пайдаланушы бұл тапсырманы орындай алатындай етіп тапсырманы бассейнге қайтарыңыз.", // "submission.workflow.tasks.generic.error": "Error occurred during operation...", "submission.workflow.tasks.generic.error": "Жұмыс кезінде қате пайда болды...", @@ -5090,7 +5088,7 @@ "submission.workflow.tasks.pool.claim": "Талап", // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", - "submission.workflow.tasks.pool.claim_help": "Бұл тапсырманы өзіңе жүкте"., + "submission.workflow.tasks.pool.claim_help": "Бұл тапсырманы өзіңе жүкте.", // "submission.workflow.tasks.pool.hide-detail": "Hide detail", "submission.workflow.tasks.pool.hide-detail": "Жасыру бөлшектері", From 5fd692ce1bb46f918fc2e567bbc606c5719fe64b Mon Sep 17 00:00:00 2001 From: myrza1 Date: Sun, 1 May 2022 02:07:01 +0600 Subject: [PATCH 012/119] Update kz.json5 translated all --- src/assets/i18n/kz.json5 | 710 +++++++++++++-------------------------- 1 file changed, 231 insertions(+), 479 deletions(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index fd611712e6..a35a88de0b 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -30,959 +30,711 @@ "404.page-not-found": "Бұл бет табылмады", // "admin.curation-tasks.breadcrumbs": "System curation tasks", - // TODO New key - Add a translation - "admin.curation-tasks.breadcrumbs": "System curation tasks", + "admin.curation-tasks.breadcrumbs": "Тапсырмаларға жетекшілік ету жүйесі", // "admin.curation-tasks.title": "System curation tasks", - // TODO New key - Add a translation - "admin.curation-tasks.title": "System curation tasks", + "admin.curation-tasks.title": "Тапсырмаларға жетекшілік ету жүйесі", // "admin.curation-tasks.header": "System curation tasks", - // TODO New key - Add a translation - "admin.curation-tasks.header": "System curation tasks", + "admin.curation-tasks.header": "Тапсырмаларға жетекшілік ету жүйесі", // "admin.registries.bitstream-formats.breadcrumbs": "Format registry", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.breadcrumbs": "Format registry", + "admin.registries.bitstream-formats.breadcrumbs": "Тізілім форматы", // "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", + "admin.registries.bitstream-formats.create.breadcrumbs": "Бит ағынының форматы", // "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", + "admin.registries.bitstream-formats.create.failure.content": "Бит ағынының жаңа форматын құру қатесі.", // "admin.registries.bitstream-formats.create.failure.head": "Failure", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.create.failure.head": "Failure", + "admin.registries.bitstream-formats.create.failure.head": "Ақау", // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.create.head": "Create Bitstream format", + "admin.registries.bitstream-formats.create.head": "Бит ағынының форматын жасау", // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", + "admin.registries.bitstream-formats.create.new": "Бит ағынының жаңа форматын қосыңыз", // "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", + "admin.registries.bitstream-formats.create.success.content": "Жаңа бит ағынының форматы сәтті жасалды.", // "admin.registries.bitstream-formats.create.success.head": "Success", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.create.success.head": "Success", + "admin.registries.bitstream-formats.create.success.head": "Сәтті", // "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", + "admin.registries.bitstream-formats.delete.failure.amount": "{{ amount }} пішімін (лерін) жою мүмкін емес", // "admin.registries.bitstream-formats.delete.failure.head": "Failure", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.delete.failure.head": "Failure", + "admin.registries.bitstream-formats.delete.failure.head": "Сәтсіздік", // "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", + "admin.registries.bitstream-formats.delete.success.amount":"{{ amount }} пішімі (лері) сәтті жойылды", // "admin.registries.bitstream-formats.delete.success.head": "Success", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.delete.success.head": "Success", + "admin.registries.bitstream-formats.delete.success.head": "Сәтті", // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", + "admin.registries.bitstream-formats.description": "Бит ағынының форматтарының бұл тізімінде белгілі форматтар және оларды қолдау деңгейі туралы ақпарат бар.", // "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", + "admin.registries.bitstream-formats.edit.breadcrumbs": "Бит ағынының форматы", // "admin.registries.bitstream-formats.edit.description.hint": "", - // TODO New key - Add a translation "admin.registries.bitstream-formats.edit.description.hint": "", // "admin.registries.bitstream-formats.edit.description.label": "Description", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.description.label": "Description", + "admin.registries.bitstream-formats.edit.description.label": "Сипаттама", // "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.", - // TODO New key - Add a translation - "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": "Кеңейтімдер-бұл жүктелетін файл пішімін автоматты түрде анықтау үшін қолданылатын файл кеңейтімдері. Әр формат үшін бірнеше кеңейтімдерді енгізуге болады.", // "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", + "admin.registries.bitstream-formats.edit.extensions.label": "Файл кеңейтімдері", // "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", + "admin.registries.bitstream-formats.edit.extensions.placeholder": "Файл кеңейтімін нүктесіз енгізіңіз", // "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", + "admin.registries.bitstream-formats.edit.failure.content": "Бит ағынының форматын өңдеу кезінде қате пайда болды.", // "admin.registries.bitstream-formats.edit.failure.head": "Failure", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.failure.head": "Failure", + "admin.registries.bitstream-formats.edit.failure.head": "Сәтсіздік", // "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", + "admin.registries.bitstream-formats.edit.head": "Бит ағынының пішімі: {{ format }}", // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", + "admin.registries.bitstream-formats.edit.internal.hint": "Ішкі деп белгіленген форматтар қолданушыдан жасырылған және әкімшілік мақсатта қолданылады", // "admin.registries.bitstream-formats.edit.internal.label": "Internal", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.internal.label": "Internal", + "admin.registries.bitstream-formats.edit.internal.label": "Ішкі", // "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", + "admin.registries.bitstream-formats.edit.mimetype.hint": "Осы форматпен байланысты MIME түрі ерекше болуы міндетті емес.", // "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", + "admin.registries.bitstream-formats.edit.mimetype.label": "Пантомима түрі", // "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", + "admin.registries.bitstream-formats.edit.shortDescription.hint":"Бұл форматтың ерекше атауы,(e.g. Microsoft Word XP or Microsoft Word 2000)", // "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", + "admin.registries.bitstream-formats.edit.shortDescription.label": "Аты", // "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", + "admin.registries.bitstream-formats.edit.success.content": "Бит ағынының форматы сәтті өңделді", // "admin.registries.bitstream-formats.edit.success.head": "Success", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.success.head": "Success", + "admin.registries.bitstream-formats.edit.success.head": "Cәтті", // "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", + "admin.registries.bitstream-formats.edit.supportLevel.hint": "Сіздің мекеме осы форматқа уәде беретін қолдау деңгейі", // "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", + "admin.registries.bitstream-formats.edit.supportLevel.label": "Қолдау деңгейі", // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.head": "Bitstream Format Registry", + "admin.registries.bitstream-formats.head": "Бит ағыны форматтарының тізілімі", // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", + "admin.registries.bitstream-formats.no-items": "Көрсету үшін бит ағынының форматтары жоқ", // "admin.registries.bitstream-formats.table.delete": "Delete selected", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.delete": "Delete selected", + "admin.registries.bitstream-formats.table.delete": "Жою таңдалған", // "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", + "admin.registries.bitstream-formats.table.deselect-all": "Барлығын таңдаудан бас тарту", // "admin.registries.bitstream-formats.table.internal": "internal", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.internal": "internal", + "admin.registries.bitstream-formats.table.internal": "ішкі", // "admin.registries.bitstream-formats.table.mimetype": "MIME Type", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.mimetype": "MIME Type", + "admin.registries.bitstream-formats.table.mimetype": "Пантомима түрі", // "admin.registries.bitstream-formats.table.name": "Name", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.name": "Name", + "admin.registries.bitstream-formats.table.name":"Аты", // "admin.registries.bitstream-formats.table.return": "Return", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.return": "Return", + "admin.registries.bitstream-formats.table.return": "Қайтару", // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", + "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Белгілі", // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", + "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED":"Қолдау", // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", + "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Белгісіз", // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", + "admin.registries.bitstream-formats.table.supportLevel.head": "Қолдау деңгейі", // "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Format Registry", - // TODO New key - Add a translation - "admin.registries.bitstream-formats.title": "DSpace Angular :: Bitstream Format Registry", - - + "admin.registries.bitstream-formats.title": "DSpace Angular ::Бит ағыны форматтарының тізілімі", // "admin.registries.metadata.breadcrumbs": "Metadata registry", - // TODO New key - Add a translation - "admin.registries.metadata.breadcrumbs": "Metadata registry", + "admin.registries.metadata.breadcrumbs": "Метадеректер тізілімі", // "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", - // TODO New key - Add a translation - "admin.registries.metadata.description": "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": "Метадеректер тізілімі репозиторийде қол жетімді барлық метадеректер өрістерінің тізімін жүргізеді. Бұл өрістерді бірнеше тізбектер арасында бөлуге болады. Алайда, DSpace білікті Dublin Core схемасын қажет етеді.", // "admin.registries.metadata.form.create": "Create metadata schema", - // TODO New key - Add a translation - "admin.registries.metadata.form.create": "Create metadata schema", + "admin.registries.metadata.form.create": "Метадеректер схемасын құру", // "admin.registries.metadata.form.edit": "Edit metadata schema", - // TODO New key - Add a translation - "admin.registries.metadata.form.edit": "Edit metadata schema", + "admin.registries.metadata.form.edit":"Метадеректер схемасын өңдеу", // "admin.registries.metadata.form.name": "Name", - // TODO New key - Add a translation - "admin.registries.metadata.form.name": "Name", + "admin.registries.metadata.form.name": "Аты", // "admin.registries.metadata.form.namespace": "Namespace", - // TODO New key - Add a translation - "admin.registries.metadata.form.namespace": "Namespace", + "admin.registries.metadata.form.namespace": "Аттар кеңістігі", // "admin.registries.metadata.head": "Metadata Registry", - // TODO New key - Add a translation - "admin.registries.metadata.head": "Metadata Registry", + "admin.registries.metadata.head": "Метадеректер тізілімі", // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", - // TODO New key - Add a translation - "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", + "admin.registries.metadata.schemas.no-items":"Көрсету үшін метадеректер схемасы жоқ", // "admin.registries.metadata.schemas.table.delete": "Delete selected", - // TODO New key - Add a translation - "admin.registries.metadata.schemas.table.delete": "Delete selected", + "admin.registries.metadata.schemas.table.delete": "Жою таңдалған", // "admin.registries.metadata.schemas.table.id": "ID", - // TODO New key - Add a translation - "admin.registries.metadata.schemas.table.id": "ID", + "admin.registries.metadata.schemas.table.id": "Жеке куәлік", // "admin.registries.metadata.schemas.table.name": "Name", - // TODO New key - Add a translation - "admin.registries.metadata.schemas.table.name": "Name", + "admin.registries.metadata.schemas.table.name": "Аты", // "admin.registries.metadata.schemas.table.namespace": "Namespace", - // TODO New key - Add a translation - "admin.registries.metadata.schemas.table.namespace": "Namespace", + "admin.registries.metadata.schemas.table.namespace": "Аттар кеңістігі", // "admin.registries.metadata.title": "DSpace Angular :: Metadata Registry", - // TODO New key - Add a translation - "admin.registries.metadata.title": "DSpace Angular :: Metadata Registry", - - + "admin.registries.metadata.title": "DSpace Angular :: Метадеректер тізілімі", // "admin.registries.schema.breadcrumbs": "Metadata schema", - // TODO New key - Add a translation - "admin.registries.schema.breadcrumbs": "Metadata schema", + "admin.registries.schema.breadcrumbs":"Метадеректер схемасы", // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", - // TODO New key - Add a translation - "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", + "admin.registries.schema.description": "Бұл \" {{аттар кеңістігі}} \" үшін метадеректер схемасы.", // "admin.registries.schema.fields.head": "Schema metadata fields", - // TODO New key - Add a translation - "admin.registries.schema.fields.head": "Schema metadata fields", + "admin.registries.schema.fields.head": "Схема метадеректерінің өрістері", // "admin.registries.schema.fields.no-items": "No metadata fields to show.", - // TODO New key - Add a translation - "admin.registries.schema.fields.no-items": "No metadata fields to show.", + "admin.registries.schema.fields.no-items": "Көрсету үшін метадеректер өрісі жоқ", // "admin.registries.schema.fields.table.delete": "Delete selected", - // TODO New key - Add a translation - "admin.registries.schema.fields.table.delete": "Delete selected", + "admin.registries.schema.fields.table.delete": "Жою таңдалған", // "admin.registries.schema.fields.table.field": "Field", - // TODO New key - Add a translation - "admin.registries.schema.fields.table.field": "Field", + "admin.registries.schema.fields.table.field": "Өріс", // "admin.registries.schema.fields.table.scopenote": "Scope Note", - // TODO New key - Add a translation - "admin.registries.schema.fields.table.scopenote": "Scope Note", + "admin.registries.schema.fields.table.scopenote": "Қолдану саласы бойынша ескертпе", // "admin.registries.schema.form.create": "Create metadata field", - // TODO New key - Add a translation - "admin.registries.schema.form.create": "Create metadata field", + "admin.registries.schema.form.create": "Метадеректер өрісін құру", // "admin.registries.schema.form.edit": "Edit metadata field", - // TODO New key - Add a translation - "admin.registries.schema.form.edit": "Edit metadata field", + "admin.registries.schema.form.edit": "Метадеректер өрісін өңдеу", // "admin.registries.schema.form.element": "Element", - // TODO New key - Add a translation - "admin.registries.schema.form.element": "Element", + "admin.registries.schema.form.element": "Элемент", // "admin.registries.schema.form.qualifier": "Qualifier", - // TODO New key - Add a translation - "admin.registries.schema.form.qualifier": "Qualifier", + "admin.registries.schema.form.qualifier": "Квалификатор", // "admin.registries.schema.form.scopenote": "Scope Note", - // TODO New key - Add a translation - "admin.registries.schema.form.scopenote": "Scope Note", + "admin.registries.schema.form.scopenote": "Қолдану саласы бойынша ескертпе", // "admin.registries.schema.head": "Metadata Schema", - // TODO New key - Add a translation - "admin.registries.schema.head": "Metadata Schema", + "admin.registries.schema.head": "Метадеректер схемасы", // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", - // TODO New key - Add a translation - "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", + "admin.registries.schema.notification.created": "Сәтті құрылған метадеректер схемасы \"{{prefix}}\"", // "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", - // TODO New key - Add a translation - "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", + "admin.registries.schema.notification.deleted.failure": "Жою мүмкін емес{{amount}} метадеректер схемалары", // "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", - // TODO New key - Add a translation - "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", + "admin.registries.schema.notification.deleted.success": "Сәтті жойылды{{amount}} метадеректер схемалары", // "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", - // TODO New key - Add a translation - "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", + "admin.registries.schema.notification.edited": "Сәтті өңделген метадеректер схемасы \"{{prefix}}\"", // "admin.registries.schema.notification.failure": "Error", - // TODO New key - Add a translation - "admin.registries.schema.notification.failure": "Error", + "admin.registries.schema.notification.failure": "Қате", // "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", - // TODO New key - Add a translation - "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", + "admin.registries.schema.notification.field.created": "Сәтті құрылған метадеректер өрісі\"{{field}}\"", // "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", - // TODO New key - Add a translation - "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", + "admin.registries.schema.notification.field.deleted.failure": "Жою мүмкін емес {{amount}}метадеректер өрісі", // "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", - // TODO New key - Add a translation - "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", + "admin.registries.schema.notification.field.deleted.success":"Сәтті жойылды {{amount}} метадеректер өрісі", // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", - // TODO New key - Add a translation - "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", + "admin.registries.schema.notification.field.edited": "Сәтті өңделген метадеректер өрісі\"{{field}}\"", // "admin.registries.schema.notification.success": "Success", - // TODO New key - Add a translation - "admin.registries.schema.notification.success": "Success", + "admin.registries.schema.notification.success": "Успех", // "admin.registries.schema.return": "Return", - // TODO New key - Add a translation - "admin.registries.schema.return": "Return", + "admin.registries.schema.return": "Қайтару", // "admin.registries.schema.title": "DSpace Angular :: Metadata Schema Registry", - // TODO New key - Add a translation - "admin.registries.schema.title": "DSpace Angular :: Metadata Schema Registry", - - + "admin.registries.schema.title": "DSpace Angular:: метадеректер тізбегінің тізілімі", // "admin.access-control.epeople.actions.delete": "Delete EPerson", - // TODO New key - Add a translation - "admin.access-control.epeople.actions.delete": "Delete EPerson", + "admin.access-control.epeople.actions.delete": "Адамды жою", // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", - // TODO New key - Add a translation - "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", + "admin.access-control.epeople.actions.impersonate": "Өзіңді басқа адам ретінде көрсету", // "admin.access-control.epeople.actions.reset": "Reset password", - // TODO New key - Add a translation - "admin.access-control.epeople.actions.reset": "Reset password", + "admin.access-control.epeople.actions.reset": "Құпия сөзді қалпына келтіру", // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", - // TODO New key - Add a translation - "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", + "admin.access-control.epeople.actions.stop-impersonating": "Адам туралы ойлауды доғарыңыз", // "admin.access-control.epeople.title": "DSpace Angular :: EPeople", - // TODO New key - Add a translation - "admin.access-control.epeople.title": "DSpace Angular :: EPeople", + "admin.access-control.epeople.title": "DSpace Angular :: Адамдар", // "admin.access-control.epeople.head": "EPeople", - // TODO New key - Add a translation - "admin.access-control.epeople.head": "EPeople", + "admin.access-control.epeople.head": "Адамдар", // "admin.access-control.epeople.search.head": "Search", "admin.access-control.epeople.search.head": "Іздеу", // "admin.access-control.epeople.button.see-all": "Browse All", - // TODO New key - Add a translation - "admin.access-control.epeople.button.see-all": "Browse All", + "admin.access-control.epeople.button.see-all": "Барлығын қарау", // "admin.access-control.epeople.search.scope.metadata": "Metadata", - // TODO New key - Add a translation - "admin.access-control.epeople.search.scope.metadata": "Metadata", + "admin.access-control.epeople.search.scope.metadata": "Метадеректер", // "admin.access-control.epeople.search.scope.email": "E-mail (exact)", - // TODO New key - Add a translation - "admin.access-control.epeople.search.scope.email": "E-mail (exact)", + "admin.access-control.epeople.search.scope.email": "Электрондық пошта (exact)", // "admin.access-control.epeople.search.button": "Search", - // TODO New key - Add a translation - "admin.access-control.epeople.search.button": "Search", + "admin.access-control.epeople.search.button": "Іздеу", // "admin.access-control.epeople.button.add": "Add EPerson", - // TODO New key - Add a translation - "admin.access-control.epeople.button.add": "Add EPerson", + "admin.access-control.epeople.button.add": "Адамды қосу", // "admin.access-control.epeople.table.id": "ID", - // TODO New key - Add a translation "admin.access-control.epeople.table.id": "ID", // "admin.access-control.epeople.table.name": "Name", - // TODO New key - Add a translation - "admin.access-control.epeople.table.name": "Name", + "admin.access-control.epeople.table.name": "Аты", // "admin.access-control.epeople.table.email": "E-mail (exact)", - // TODO New key - Add a translation - "admin.access-control.epeople.table.email": "E-mail (exact)", + "admin.access-control.epeople.table.email": "Электрондық пошта (exact)", // "admin.access-control.epeople.table.edit": "Edit", - // TODO New key - Add a translation - "admin.access-control.epeople.table.edit": "Edit", + "admin.access-control.epeople.table.edit": "Өңдеу", // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", + "admin.access-control.epeople.table.edit.buttons.edit": "Өңдеу \"{{name}}\"", // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", + "admin.access-control.epeople.table.edit.buttons.remove": "Жою\"{{name}}\"", // "admin.access-control.epeople.no-items": "No EPeople to show.", - // TODO New key - Add a translation - "admin.access-control.epeople.no-items": "No EPeople to show.", + "admin.access-control.epeople.no-items": "Көрсетуге болатын адамдар жоқ", // "admin.access-control.epeople.form.create": "Create EPerson", - // TODO New key - Add a translation - "admin.access-control.epeople.form.create": "Create EPerson", + "admin.access-control.epeople.form.create": "Адамды құру", // "admin.access-control.epeople.form.edit": "Edit EPerson", - // TODO New key - Add a translation - "admin.access-control.epeople.form.edit": "Edit EPerson", + "admin.access-control.epeople.form.edit": "Адамды редакциялау", // "admin.access-control.epeople.form.firstName": "First name", - // TODO New key - Add a translation - "admin.access-control.epeople.form.firstName": "First name", + "admin.access-control.epeople.form.firstName": "Аты", // "admin.access-control.epeople.form.lastName": "Last name", - // TODO New key - Add a translation - "admin.access-control.epeople.form.lastName": "Last name", + "admin.access-control.epeople.form.lastName": "Тегі", // "admin.access-control.epeople.form.email": "E-mail", - // TODO New key - Add a translation - "admin.access-control.epeople.form.email": "E-mail", + "admin.access-control.epeople.form.email": "Электрондық пошта", // "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", - // TODO New key - Add a translation - "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", + "admin.access-control.epeople.form.emailHint": "Жарамды электрондық пошта мекенжайы болуы керек", // "admin.access-control.epeople.form.canLogIn": "Can log in", - // TODO New key - Add a translation - "admin.access-control.epeople.form.canLogIn": "Can log in", + "admin.access-control.epeople.form.canLogIn": "Мен кіре аламын", // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", - // TODO New key - Add a translation - "admin.access-control.epeople.form.requireCertificate": "Requires certificate", + "admin.access-control.epeople.form.requireCertificate": "Сертификат қажет", // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.created.success": "Сәтті құрылған Эпперсон \"{{name}}\"", // "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.created.failure": "Адамды құру мүмкін емес \"{{name}}\"", // "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", - // TODO New key - Add a translation - "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", + "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Адамды құру мүмкін емес\"{{name}}\", email \"{{email}}\" қазірдің өзінде қолданылады.", // "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", - // TODO New key - Add a translation - "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", + "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Адамды өңдеу мүмкін емес\"{{name}}\", email \"{{email}}\" қазірдің өзінде қолданылады.", // "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.edited.success": "Сәтті өңделген адам \"{{name}}\"", // "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.edited.failure":"Адамды өңдеу мүмкін емес\"{{name}}\"", // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.success": "Сәтті жойылған тұлға \"{{name}}\"", // "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", + "admin.access-control.epeople.form.notification.deleted.failure": "Пайдаланушыны жою мүмкін емес\"{{name}}\"", // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", - // TODO New key - Add a translation - "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", + "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Осы топтардың мүшесі:", // "admin.access-control.epeople.form.table.id": "ID", - // TODO New key - Add a translation - "admin.access-control.epeople.form.table.id": "ID", + "admin.access-control.epeople.form.table.id": "Жеке куәлік", // "admin.access-control.epeople.form.table.name": "Name", - // TODO New key - Add a translation - "admin.access-control.epeople.form.table.name": "Name", + "admin.access-control.epeople.form.table.name": "Аты", // "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", - // TODO New key - Add a translation - "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", + "admin.access-control.epeople.form.memberOfNoGroups": "Бұл адам ешқандай топтың мүшесі емес", // "admin.access-control.epeople.form.goToGroups": "Add to groups", - // TODO New key - Add a translation - "admin.access-control.epeople.form.goToGroups": "Add to groups", + "admin.access-control.epeople.form.goToGroups": "Топтарға қосу", // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", + "admin.access-control.epeople.notification.deleted.failure": "Пайдаланушыны өшіру мүмкін емес: \"{{name}}\"", // "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", - - + "admin.access-control.epeople.notification.deleted.success": "Сәтті жойылған тұлға: \"{{name}}\"", // "admin.access-control.groups.title": "DSpace Angular :: Groups", - // TODO New key - Add a translation - "admin.access-control.groups.title": "DSpace Angular :: Groups", + "admin.access-control.groups.title": "DSpace Angular :: Топтар", // "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Edit Group", - // TODO New key - Add a translation - "admin.access-control.groups.title.singleGroup": "DSpace Angular :: Edit Group", + "admin.access-control.groups.title.singleGroup": "DSpace Angular:: редакциялау тобы", // "admin.access-control.groups.title.addGroup": "DSpace Angular :: New Group", - // TODO New key - Add a translation - "admin.access-control.groups.title.addGroup": "DSpace Angular :: New Group", + "admin.access-control.groups.title.addGroup": "DSpace Angular :: Жаңа топ", // "admin.access-control.groups.head": "Groups", - // TODO New key - Add a translation - "admin.access-control.groups.head": "Groups", + "admin.access-control.groups.head": "Топтар", // "admin.access-control.groups.button.add": "Add group", - // TODO New key - Add a translation - "admin.access-control.groups.button.add": "Add group", + "admin.access-control.groups.button.add": "Топты қосу", // "admin.access-control.groups.search.head": "Search groups", - // TODO New key - Add a translation - "admin.access-control.groups.search.head": "Search groups", + "admin.access-control.groups.search.head": "Іздеу топтары", // "admin.access-control.groups.button.see-all": "Browse all", - // TODO New key - Add a translation - "admin.access-control.groups.button.see-all": "Browse all", + "admin.access-control.groups.button.see-all": "Барлығын қарау", // "admin.access-control.groups.search.button": "Search", - // TODO New key - Add a translation - "admin.access-control.groups.search.button": "Search", + "admin.access-control.groups.search.button": "Іздеу", // "admin.access-control.groups.table.id": "ID", - // TODO New key - Add a translation - "admin.access-control.groups.table.id": "ID", + "admin.access-control.groups.table.id": "Жеке куәлік", // "admin.access-control.groups.table.name": "Name", - // TODO New key - Add a translation - "admin.access-control.groups.table.name": "Name", + "admin.access-control.groups.table.name": "Аты", // "admin.access-control.groups.table.members": "Members", - // TODO New key - Add a translation - "admin.access-control.groups.table.members": "Members", + "admin.access-control.groups.table.members": "Қатысушылар", // "admin.access-control.groups.table.edit": "Edit", - // TODO New key - Add a translation - "admin.access-control.groups.table.edit": "Edit", + "admin.access-control.groups.table.edit": "Өңдеу", // "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", + "admin.access-control.groups.table.edit.buttons.edit": "Редакциялау \"{{name}}\"", // "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", + "admin.access-control.groups.table.edit.buttons.remove": "Өшіру \"{{name}}\"", // "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", - // TODO New key - Add a translation - "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", + "admin.access-control.groups.no-items": "Бұл атаумен немесе UUID сияқты топтар табылған жоқ", // "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", + "admin.access-control.groups.notification.deleted.success": "Сәтті қашықтағы топ \"{{name}}\"", // "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", + "admin.access-control.groups.notification.deleted.failure.title": "Топты жою мүмкін емес \"{{name}}\"", // "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", - - + "admin.access-control.groups.notification.deleted.failure.content": "Себебі: \"{{cause}}\"", // "admin.access-control.groups.form.alert.permanent": "This group is permanent, so it can't be edited or deleted. You can still add and remove group members using this page.", - // TODO New key - Add a translation - "admin.access-control.groups.form.alert.permanent": "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": "Бұл топ тұрақты, сондықтан оны өңдеуге немесе жоюға болмайды. Осы бетті қолдана отырып, топ мүшелерін қосуға және жоюға болады.", // "admin.access-control.groups.form.alert.workflowGroup": "This group can’t be modified or deleted because it corresponds to a role in the submission and workflow process in the \"{{name}}\" {{comcol}}. You can delete it from the \"assign roles\" tab on the edit {{comcol}} page. You can still add and remove group members using this page.", - // TODO New key - Add a translation - "admin.access-control.groups.form.alert.workflowGroup": "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": "Бұл топты өзгерту немесе жою мүмкін емес, өйткені ол жіберу және жұмыс процесінің рөліне сәйкес келеді \"{{name}}\" {{comcol}}. Сіз оны \"рөлдерді тағайындау\" өңдеу қойындысы {{comcol}} page. You can still add and remove group members using this page.", // "admin.access-control.groups.form.head.create": "Create group", - // TODO New key - Add a translation - "admin.access-control.groups.form.head.create": "Create group", + "admin.access-control.groups.form.head.create": "Топ құру", // "admin.access-control.groups.form.head.edit": "Edit group", - // TODO New key - Add a translation - "admin.access-control.groups.form.head.edit": "Edit group", + "admin.access-control.groups.form.head.edit": "Топты өңдеу", // "admin.access-control.groups.form.groupName": "Group name", - // TODO New key - Add a translation - "admin.access-control.groups.form.groupName": "Group name", + "admin.access-control.groups.form.groupName": "Топтың атауы", // "admin.access-control.groups.form.groupDescription": "Description", - // TODO New key - Add a translation - "admin.access-control.groups.form.groupDescription": "Description", + "admin.access-control.groups.form.groupDescription":"Сипаттама", // "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", + "admin.access-control.groups.form.notification.created.success": "Сәтті құрылған топ \"{{name}}\"", // "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", + "admin.access-control.groups.form.notification.created.failure": "Топ құру мүмкін емес \"{{name}}\"", // "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Failed to create Group with name: \"{{name}}\", make sure the name is not already in use.", - // TODO New key - Add a translation - "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "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": "Аты бар топ құру мүмкін емес: \"{{name}}\", бұл атау әлі қолданылмағанына көз жеткізіңіз.", // "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", + "admin.access-control.groups.form.notification.edited.failure": "Топты өңдеу мүмкін емес\"{{name}}\"", // "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", - // TODO New key - Add a translation - "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", + "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Аты \"{{name}}\" қазірдің өзінде қолданылады", // "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", + "admin.access-control.groups.form.notification.edited.success": "Сәтті өңделген топ \"{{name}}\"", // "admin.access-control.groups.form.actions.delete": "Delete Group", - // TODO New key - Add a translation - "admin.access-control.groups.form.actions.delete": "Delete Group", + "admin.access-control.groups.form.actions.delete": "Топты өшіру", // "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", + "admin.access-control.groups.form.delete-group.modal.header": "Топты жою \"{{ dsoName }}\"", // "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", + "admin.access-control.groups.form.delete-group.modal.info": "Сіз топты жойғыңыз келетініне сенімдісіз \"{{ dsoName }}\"", // "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", - // TODO New key - Add a translation - "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", + "admin.access-control.groups.form.delete-group.modal.cancel": "Болдырмау", // "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", - // TODO New key - Add a translation - "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", + "admin.access-control.groups.form.delete-group.modal.confirm": "Жою", // "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", + "admin.access-control.groups.form.notification.deleted.success": "Сәтті қашықтағы топ \"{{ name }}\"", // "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", + "admin.access-control.groups.form.notification.deleted.failure.title": "Топты жою мүмкін емес\"{{ name }}\"", // "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", + "admin.access-control.groups.form.notification.deleted.failure.content": "Өйткені: \"{{ cause }}\"", // "admin.access-control.groups.form.members-list.head": "EPeople", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.head": "EPeople", + "admin.access-control.groups.form.members-list.head": "Адамдар", // "admin.access-control.groups.form.members-list.search.head": "Add EPeople", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.search.head": "Add EPeople", + "admin.access-control.groups.form.members-list.search.head": "Адамдарды қосу", // "admin.access-control.groups.form.members-list.button.see-all": "Browse All", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.button.see-all": "Browse All", + "admin.access-control.groups.form.members-list.button.see-all": "Барлығын қарау", // "admin.access-control.groups.form.members-list.headMembers": "Current Members", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.headMembers": "Current Members", + "admin.access-control.groups.form.members-list.headMembers": "Қазіргі мүшелер", // "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", + "admin.access-control.groups.form.members-list.search.scope.metadata": "Метадеректер", // "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", + "admin.access-control.groups.form.members-list.search.scope.email": "Электрондық пошта (exact)", // "admin.access-control.groups.form.members-list.search.button": "Search", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.search.button": "Search", + "admin.access-control.groups.form.members-list.search.button": "Іздеу", // "admin.access-control.groups.form.members-list.table.id": "ID", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.table.id": "ID", + "admin.access-control.groups.form.members-list.table.id": "Жеке куәлік", // "admin.access-control.groups.form.members-list.table.name": "Name", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.table.name": "Name", + "admin.access-control.groups.form.members-list.table.name": "Аты", // "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", + "admin.access-control.groups.form.members-list.table.edit": "Жою/ Add", // "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", + "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Қатысушыны аты-жөнімен жою \"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.success.addMember":"Сәтті қосылған мүше: \"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.addMember":"Қатысушыны қосу мүмкін емес: \"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Сәтті қашықтағы мүше: \"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", + "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Қатысушыны жою мүмкін емес: \"{{name}}\"", // "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", + "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Аты бар мүшені қосу\"{{name}}\"", // "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "Ағымдағы белсенді топ жоқ, алдымен атын енгізіңіз.", // "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", + "admin.access-control.groups.form.members-list.no-members-yet": "Топта әлі мүшелер жоқ, табыңыз және қосыңыз", // "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", - // TODO New key - Add a translation - "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", + "admin.access-control.groups.form.members-list.no-items": "Бұл іздеу барысында бірде-бір адам табылған жоқ", // "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure": "Бір нәрсе дұрыс болмады: \"{{cause}}\"", // "admin.access-control.groups.form.subgroups-list.head": "Groups", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.head": "Groups", + "admin.access-control.groups.form.subgroups-list.head": "Топтар", // "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", + "admin.access-control.groups.form.subgroups-list.search.head":"Кіші топты қосу", // "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", + "admin.access-control.groups.form.subgroups-list.button.see-all": "Барлығын Қарау", // "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", + "admin.access-control.groups.form.subgroups-list.headSubgroups": "Ағымдағы кіші топтар", // "admin.access-control.groups.form.subgroups-list.search.button": "Search", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.search.button": "Search", + "admin.access-control.groups.form.subgroups-list.search.button": "Іздеу", // "admin.access-control.groups.form.subgroups-list.table.id": "ID", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.table.id": "ID", + "admin.access-control.groups.form.subgroups-list.table.id": "Жеке куәлік", // "admin.access-control.groups.form.subgroups-list.table.name": "Name", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.table.name": "Name", + "admin.access-control.groups.form.subgroups-list.table.name": "Аты", // "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", + "admin.access-control.groups.form.subgroups-list.table.edit": "Жою / Қосу", // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Аты бар кіші топты жою \"{{name}}\"", - // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", + // "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}}\"", // "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", + "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Ағымдағы топ", // "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", - // TODO New key - Add a translation "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Кіші топ қосу мүмкін емес: \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Сәтті жойылған кіші топ: \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", + "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Кіші топты жою мүмкін емес: \"{{name}}\"", // "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Ағымдағы белсенді топ жоқ, алдымен атын енгізіңіз.", // "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", + "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "Бұл қазіргі топ, оны қосу мүмкін емес.", // "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", + "admin.access-control.groups.form.subgroups-list.no-items": "Бұл атаумен немесе UUID сияқты топтар табылған жоқ", // "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", - // TODO New key - Add a translation - "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", + "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Топта әлі кіші топтар жоқ.", // "admin.access-control.groups.form.return": "Return to groups", - // TODO New key - Add a translation - "admin.access-control.groups.form.return": "Return to groups", - - + "admin.access-control.groups.form.return": "Топтарға оралу", // "admin.search.breadcrumbs": "Administrative Search", - // TODO New key - Add a translation - "admin.search.breadcrumbs": "Administrative Search", + "admin.search.breadcrumbs": "Әкімшілік іздеу", // "admin.search.collection.edit": "Edit", - // TODO New key - Add a translation - "admin.search.collection.edit": "Edit", + "admin.search.collection.edit": "Өңдеу", // "admin.search.community.edit": "Edit", - // TODO New key - Add a translation - "admin.search.community.edit": "Edit", + "admin.search.community.edit":"Өңдеу", // "admin.search.item.delete": "Delete", - // TODO New key - Add a translation - "admin.search.item.delete": "Delete", + "admin.search.item.delete": "Жою", // "admin.search.item.edit": "Edit", - // TODO New key - Add a translation - "admin.search.item.edit": "Edit", + "admin.search.item.edit": "Өңдеу", // "admin.search.item.make-private": "Make Private", - // TODO New key - Add a translation - "admin.search.item.make-private": "Make Private", + "admin.search.item.make-private": "Жеке ету", // "admin.search.item.make-public": "Make Public", - // TODO New key - Add a translation - "admin.search.item.make-public": "Make Public", + "admin.search.item.make-public": "Жариялау", // "admin.search.item.move": "Move", - // TODO New key - Add a translation - "admin.search.item.move": "Move", + "admin.search.item.move": "Жылжыту", // "admin.search.item.reinstate": "Reinstate", - // TODO New key - Add a translation - "admin.search.item.reinstate": "Reinstate", + "admin.search.item.reinstate":"Қалпына келтіру", // "admin.search.item.withdraw": "Withdraw", - // TODO New key - Add a translation - "admin.search.item.withdraw": "Withdraw", + "admin.search.item.withdraw": "Шақыру", // "admin.search.title": "Administrative Search", - // TODO New key - Add a translation - "admin.search.title": "Administrative Search", + "admin.search.title": "Әкімшілік іздеу", // "administrativeView.search.results.head": "Administrative Search", - // TODO New key - Add a translation - "administrativeView.search.results.head": "Administrative Search", - - - + "administrativeView.search.results.head": "Әкімшілік іздеу", // "admin.workflow.breadcrumbs": "Administer Workflow", - // TODO New key - Add a translation - "admin.workflow.breadcrumbs": "Administer Workflow", + "admin.workflow.breadcrumbs": "Жұмыс процесін басқару", // "admin.workflow.title": "Administer Workflow", - // TODO New key - Add a translation - "admin.workflow.title": "Administer Workflow", + "admin.workflow.title": "Жұмыс процесін басқару", // "admin.workflow.item.workflow": "Workflow", - // TODO New key - Add a translation - "admin.workflow.item.workflow": "Workflow", + "admin.workflow.item.workflow": "Жұмыс процесі", // "admin.workflow.item.delete": "Delete", - // TODO New key - Add a translation - "admin.workflow.item.delete": "Delete", + "admin.workflow.item.delete": "Жою", // "admin.workflow.item.send-back": "Send back", - // TODO New key - Add a translation - "admin.workflow.item.send-back": "Send back", - - + "admin.workflow.item.send-back": "Кері жіберу", // "admin.metadata-import.breadcrumbs": "Import Metadata", - // TODO New key - Add a translation - "admin.metadata-import.breadcrumbs": "Import Metadata", + "admin.metadata-import.breadcrumbs": "Метадеректерді импорттау", // "admin.metadata-import.title": "Import Metadata", - // TODO New key - Add a translation - "admin.metadata-import.title": "Import Metadata", + "admin.metadata-import.title": "Метадеректерді импорттау", // "admin.metadata-import.page.header": "Import Metadata", - // TODO New key - Add a translation - "admin.metadata-import.page.header": "Import Metadata", + "admin.metadata-import.page.header": "Метадеректерді импорттау", // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", - // TODO New key - Add a translation - "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", + "admin.metadata-import.page.help": "Мұнда файлдарда метадеректермен пакеттік операциялары бар CSV файлдарын жоюға немесе көруге болады", // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", - // TODO New key - Add a translation - "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", + "admin.metadata-import.page.dropMsg": "Импорттау үшін метадеректердің CSV файлын сүйреңіз", // "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", - // TODO New key - Add a translation - "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", + "admin.metadata-import.page.dropMsgReplace": "Импорттау үшін CSV метадеректерін ауыстыру үшін тастаңыз", // "admin.metadata-import.page.button.return": "Return", - // TODO New key - Add a translation - "admin.metadata-import.page.button.return": "Return", + "admin.metadata-import.page.button.return": "Қайтару", // "admin.metadata-import.page.button.proceed": "Proceed", - // TODO New key - Add a translation - "admin.metadata-import.page.button.proceed": "Proceed", + "admin.metadata-import.page.button.proceed": "Жалғастыра беріңіз", // "admin.metadata-import.page.error.addFile": "Select file first!", - // TODO New key - Add a translation - "admin.metadata-import.page.error.addFile": "Select file first!", + "admin.metadata-import.page.error.addFile": "Алдымен файлды таңдаңыз!", // "auth.errors.invalid-user": "Invalid email address or password.", // TODO New key - Add a translation - "auth.errors.invalid-user": "Invalid email address or password.", + "auth.errors.invalid-user": "Жарамсыз электрондық пошта мекенжайы немесе құпия сөз.", // "auth.messages.expired": "Your session has expired. Please log in again.", // TODO New key - Add a translation - "auth.messages.expired": "Your session has expired. Please log in again.", + "auth.messages.expired": "Сессияңыздың мерзімі аяқталды. Жүйеге қайта кіріңіз.", From 4de5ab0f563a2090d28f03852b0322b6043b6305 Mon Sep 17 00:00:00 2001 From: Jens Vannerum Date: Mon, 27 Jun 2022 13:47:19 +0200 Subject: [PATCH 013/119] 92701: Disable user agreement feature --- ...-user-agreement-current-user.guard.spec.ts | 20 +++++++++ .../end-user-agreement-current-user.guard.ts | 7 ++- src/app/info/info-routing.module.ts | 44 ++++++++++++------- src/config/global-config.interface.ts | 2 + src/config/info-config.interface.ts | 6 +++ src/environments/environment.common.ts | 4 ++ src/environments/mock-environment.ts | 4 ++ 7 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 src/config/info-config.interface.ts diff --git a/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts b/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts index 75b8f6089e..b280ef798c 100644 --- a/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts +++ b/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts @@ -2,6 +2,7 @@ import { EndUserAgreementCurrentUserGuard } from './end-user-agreement-current-u import { EndUserAgreementService } from './end-user-agreement.service'; import { Router, UrlTree } from '@angular/router'; import { of as observableOf } from 'rxjs'; +import { environment } from '../../../environments/mock-environment'; describe('EndUserAgreementGuard', () => { let guard: EndUserAgreementCurrentUserGuard; @@ -44,5 +45,24 @@ describe('EndUserAgreementGuard', () => { }); }); }); + + describe('when the end user agreement is disabled', () => { + it('should return true', (done) => { + environment.info.enableEndUserAgreement = false; + guard.canActivate(undefined, Object.assign({ url: 'redirect' })).subscribe((result) => { + console.log(result); + expect(result).toEqual(true); + done(); + }); + }); + + it('should not resolve to the end user agreement page', (done) => { + environment.info.enableEndUserAgreement = false; + guard.canActivate(undefined, Object.assign({ url: 'redirect' })).subscribe((result) => { + expect(router.navigateByUrl).not.toHaveBeenCalled(); + done(); + }); + }); + }); }); }); diff --git a/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.ts b/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.ts index 2c04186f34..a79e12cc32 100644 --- a/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.ts +++ b/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.ts @@ -1,8 +1,9 @@ import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; +import { Observable, of as observableOf } from 'rxjs'; import { AbstractEndUserAgreementGuard } from './abstract-end-user-agreement.guard'; import { EndUserAgreementService } from './end-user-agreement.service'; import { Router } from '@angular/router'; +import { environment } from '../../../environments/environment'; /** * A guard redirecting logged in users to the end agreement page when they haven't accepted the latest user agreement @@ -19,6 +20,10 @@ export class EndUserAgreementCurrentUserGuard extends AbstractEndUserAgreementGu * True when the currently logged in user has accepted the agreements or when the user is not currently authenticated */ hasAccepted(): Observable { + if (!environment.info.enableEndUserAgreement) { + return observableOf(true); + } + return this.endUserAgreementService.hasCurrentUserAcceptedAgreement(true); } diff --git a/src/app/info/info-routing.module.ts b/src/app/info/info-routing.module.ts index f76fb47ff0..e15ae521b2 100644 --- a/src/app/info/info-routing.module.ts +++ b/src/app/info/info-routing.module.ts @@ -4,25 +4,37 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso import { PRIVACY_PATH, END_USER_AGREEMENT_PATH } from './info-routing-paths'; import { ThemedEndUserAgreementComponent } from './end-user-agreement/themed-end-user-agreement.component'; import { ThemedPrivacyComponent } from './privacy/themed-privacy.component'; +import { environment } from '../../environments/environment'; + + +const imports = []; + + if (environment.info.enableEndUserAgreement) { + imports.push( + RouterModule.forChild([ + { + path: END_USER_AGREEMENT_PATH, + component: ThemedEndUserAgreementComponent, + resolve: { breadcrumb: I18nBreadcrumbResolver }, + data: { title: 'info.end-user-agreement.title', breadcrumbKey: 'info.end-user-agreement' } + } + ])); + } + if (environment.info.enablePrivacyStatement) { + imports.push( + RouterModule.forChild([ + { + path: PRIVACY_PATH, + component: ThemedPrivacyComponent, + resolve: { breadcrumb: I18nBreadcrumbResolver }, + data: { title: 'info.privacy.title', breadcrumbKey: 'info.privacy' } + } + ])); + } @NgModule({ imports: [ - RouterModule.forChild([ - { - path: END_USER_AGREEMENT_PATH, - component: ThemedEndUserAgreementComponent, - resolve: { breadcrumb: I18nBreadcrumbResolver }, - data: { title: 'info.end-user-agreement.title', breadcrumbKey: 'info.end-user-agreement' } - } - ]), - RouterModule.forChild([ - { - path: PRIVACY_PATH, - component: ThemedPrivacyComponent, - resolve: { breadcrumb: I18nBreadcrumbResolver }, - data: { title: 'info.privacy.title', breadcrumbKey: 'info.privacy' } - } - ]) + ...imports ] }) /** diff --git a/src/config/global-config.interface.ts b/src/config/global-config.interface.ts index d46822eb61..8218682d8a 100644 --- a/src/config/global-config.interface.ts +++ b/src/config/global-config.interface.ts @@ -13,6 +13,7 @@ import { ThemeConfig } from './theme.model'; import { AuthConfig } from './auth-config.interfaces'; import { UIServerConfig } from './ui-server-config.interface'; import { MediaViewerConfig } from './media-viewer-config.interface'; +import { InfoConfig } from './info-config.interface'; export interface GlobalConfig extends Config { ui: UIServerConfig; @@ -32,4 +33,5 @@ export interface GlobalConfig extends Config { collection: CollectionPageConfig; themes: ThemeConfig[]; mediaViewer: MediaViewerConfig; + info: InfoConfig; } diff --git a/src/config/info-config.interface.ts b/src/config/info-config.interface.ts new file mode 100644 index 0000000000..b1831962b5 --- /dev/null +++ b/src/config/info-config.interface.ts @@ -0,0 +1,6 @@ +import { Config } from './config.interface'; + +export interface InfoConfig extends Config { + enableEndUserAgreement: boolean; + enablePrivacyStatement: boolean; +} diff --git a/src/environments/environment.common.ts b/src/environments/environment.common.ts index 9091773041..2570759151 100644 --- a/src/environments/environment.common.ts +++ b/src/environments/environment.common.ts @@ -285,4 +285,8 @@ export const environment: GlobalConfig = { image: false, video: false, }, + info: { + enableEndUserAgreement: false, + enablePrivacyStatement: false + }, }; diff --git a/src/environments/mock-environment.ts b/src/environments/mock-environment.ts index 824c8c8a83..a5fa44b115 100644 --- a/src/environments/mock-environment.ts +++ b/src/environments/mock-environment.ts @@ -235,4 +235,8 @@ export const environment: Partial = { image: true, video: true }, + info: { + enableEndUserAgreement: true, + enablePrivacyStatement: true, + } }; From 1b5c801d0665f0c9fa39c3b63e45dfa01d4e59d2 Mon Sep 17 00:00:00 2001 From: Jens Vannerum Date: Mon, 27 Jun 2022 16:24:16 +0200 Subject: [PATCH 014/119] 92701: Disable user agreement feature --- config/config.example.yml | 7 +++++++ config/config.yml | 4 ++++ .../end-user-agreement-current-user.guard.spec.ts | 2 +- src/config/default-app-config.ts | 7 ++++--- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/config/config.example.yml b/config/config.example.yml index 898b47784f..723568c020 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -246,3 +246,10 @@ bundle: mediaViewer: image: false video: false + +# Whether the end user agreement is required before users use the repository. +# If enabled, the user will be required to accept the agreement before they can use the repository. +# And whether the privacy statement should exist or not. +info: + enableEndUserAgreement: true + enablePrivacyStatement: true diff --git a/config/config.yml b/config/config.yml index b5eecd112f..2b5ac3b52e 100644 --- a/config/config.yml +++ b/config/config.yml @@ -3,3 +3,7 @@ rest: host: api7.dspace.org port: 443 nameSpace: /server + +info: + enableEndUserAgreement: true + enablePrivacyStatement: true diff --git a/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts b/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts index b280ef798c..40728ab601 100644 --- a/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts +++ b/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts @@ -2,7 +2,7 @@ import { EndUserAgreementCurrentUserGuard } from './end-user-agreement-current-u import { EndUserAgreementService } from './end-user-agreement.service'; import { Router, UrlTree } from '@angular/router'; import { of as observableOf } from 'rxjs'; -import { environment } from '../../../environments/mock-environment'; +import { environment } from '../../../environments/environment.test'; describe('EndUserAgreementGuard', () => { let guard: EndUserAgreementCurrentUserGuard; diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index 886f1598fd..4108444443 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -16,6 +16,7 @@ import { ThemeConfig } from './theme.model'; import { UIServerConfig } from './ui-server-config.interface'; import { BundleConfig } from './bundle-config.interface'; import { ActuatorsConfig } from './actuators.config'; +import { InfoConfig } from './info-config.interface'; export class DefaultAppConfig implements AppConfig { production = false; @@ -324,8 +325,8 @@ export class DefaultAppConfig implements AppConfig { image: false, video: false }; - info: { - enableEndUserAgreement: false, - enablePrivacyStatement: false + info: InfoConfig = { + enableEndUserAgreement: true, + enablePrivacyStatement: true }; } From 612f8f25da2c39869c44d0b76c3caa24861fde01 Mon Sep 17 00:00:00 2001 From: myrza1 Date: Fri, 8 Jul 2022 01:46:52 +0600 Subject: [PATCH 015/119] Update kz.json5 changed paginations --- src/assets/i18n/kz.json5 | 42 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index a35a88de0b..0d3b3e8394 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -3237,10 +3237,10 @@ "pagination.results-per-page": "Әр беттегі нәтижелер", // "pagination.showing.detail": "{{ range }} of {{ total }}", - "pagination.showing.detail": "{{ жалпы }} ішінен {{ диапазон }}", + "pagination.showing.detail": "{{ range }} ішінен {{ total }}", // "pagination.showing.label": "Now showing ", - "pagination.showing.label": "Қазір көрсету", + "pagination.showing.label": "Қазір көрсету ", // "pagination.sort-direction": "Sort Options", "pagination.sort-direction": "Сұрыптау опциялары", @@ -3279,7 +3279,7 @@ "person.page.staffid": "Қызметкерлердің жеке куәлігі", // "person.page.titleprefix": "Person: ", - "person.page.titleprefix":"Адам:", + "person.page.titleprefix":"Адам: ", // "person.search.results.head": "Person Search Results", "person.search.results.head": "Тұлға іздеу нәтижелері", @@ -3375,7 +3375,7 @@ "process.detail.script" : "Сценарий", // "process.detail.title" : "Process: {{ id }} - {{ name }}", - "process.detail.title" :"Процесс: {{ id }} - {{ аты }}", + "process.detail.title" :"Процесс: {{ id }} - {{ name }}", // "process.detail.start-time" : "Start time", "process.detail.start-time" : "Бастау уақыты", @@ -3655,7 +3655,7 @@ "register-page.registration.success.head": "Растау электрондық поштасы жіберілді", // "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}} мекен-жайына арнайы URL мекен-жайы мен қосымша нұсқаулары бар электрондық пошта жіберіледі.", + "register-page.registration.success.content": "{{ email }} мекен-жайына арнайы URL мекен-жайы мен қосымша нұсқаулары бар электрондық пошта жіберіледі.", // "register-page.registration.error.head": "Error when trying to register email", "register-page.registration.error.head": "Электрондық поштаны тіркеу кезінде қате", @@ -3871,7 +3871,7 @@ "search.description": "", // "search.switch-configuration.title": "Show", - "search.switch-configuration.title": "Шоу", + "search.switch-configuration.title": "Көрсету", // "search.title": "DSpace Angular :: Search", "search.title": "DSpace Angular :: Іздеу", @@ -3922,7 +3922,7 @@ "search.filters.applied.f.birthDate.min":"Бастауыш туған күні", // "search.filters.applied.f.withdrawn": "Withdrawn", - "search.filters.applied.f.withdrawn": "Отозванный", + "search.filters.applied.f.withdrawn": "Алып тасталынды", // "search.filters.filter.author.head": "Author", "search.filters.filter.author.head": "Автор", @@ -4167,7 +4167,7 @@ "statistics.title":"Статистика", // "statistics.header": "Statistics for {{ scope }}", - "statistics.header": "{{ scope }} үшін Статистика", + "statistics.header": "{{ scope }} үшін статистика", // "statistics.breadcrumbs": "Statistics", "statistics.breadcrumbs": "Статистика", @@ -4405,28 +4405,28 @@ "submission.sections.describe.relationship-lookup.search-tab.select-page": "Бетті таңдау", // "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", - "submission.sections.describe.relationship-lookup.selected": "Таңдалған элементтер {{ өлшемі }}", + "submission.sections.describe.relationship-lookup.selected": "Таңдалған элементтер {{ size }}", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Authors ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Жергілікті авторлар ({{саны}})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Жергілікті авторлар ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Жергілікті журналдар ({{саны}})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Жергілікті журналдар ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Жергілікті жобалар ({{ саны }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Жергілікті жобалар ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Жергілікті басылымдар ({{ саны }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Жергілікті басылымдар ({{ count }})", // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Authors ({{ count }})", - "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Жергілікті авторлар ({{ саны }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Жергілікті авторлар ({{ 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": "Жергілікті ұйымдастыру бөлімшелері ({{саны }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Жергілікті ұйымдастыру бөлімшелері ({{ 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": "Жергілікті деректер пакеттері ({{ саны }})", + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Жергілікті деректер пакеттері ({{ 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": "Жергілікті деректер файлдары ({{ count }})", @@ -4651,10 +4651,10 @@ "submission.sections.general.discard_success_notice": "Ұсыныс сәтті қабылданбады.", // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", - "submission.sections.general.metadata-extracted": "Жаңа метадеректер алынып, {{SectionID}} бөліміне қосылды.", + "submission.sections.general.metadata-extracted": "Жаңа метадеректер алынып, {{sectionId}} бөліміне қосылды.", // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", - "submission.sections.general.metadata-extracted-new-section": "Жіберу үшін жаңа бөлім {{SectionID}}< / strong > қосылды.", + "submission.sections.general.metadata-extracted-new-section": "Жіберу үшін жаңа бөлім {{sectionId}} қосылды.", // "submission.sections.general.no-collection": "No collection found", "submission.sections.general.no-collection": "Жинақ табылмады", @@ -4741,13 +4741,13 @@ "submission.sections.upload.form.until-placeholder":"Әзірге", // "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": "{{Коллекция атауы}} жинағына жүктелген файлдар келесі топқа (топтарға) сәйкес қол жетімді болады:", + "submission.sections.upload.header.policy.default.nolist": "{{collectionName}} жинағына жүктелген файлдар келесі топқа (топтарға) сәйкес қол жетімді болады:", // "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": "{{Коллекция атауы}} жинағына жүктелген файлдар жеке файл үшін нақты анықталғаннан басқа, келесі топпен (топтармен) қол жетімді болатындығын ескеріңіз:", + "submission.sections.upload.header.policy.default.withlist": "{{collectionName}} жинағына жүктелген файлдар жеке файл үшін нақты анықталғаннан басқа, келесі топпен (топтармен) қол жетімді болатындығын ескеріңіз:", // "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": "Мұнда сіз осы элементтегі барлық файлдарды таба аласыз. Файл метадеректерін және кіру шарттарын жаңартуға немесе қосымша файлдарды олардыбетінде сүйреп апару арқылы жүктеуге болады.", + "submission.sections.upload.info": "Мұнда сіз осы элементтегі барлық файлдарды таба аласыз. Файл метадеректерін және кіру шарттарын жаңартуға немесе қосымша файлдарды олардыбетінде сүйреп апару арқылы жүктеуге болады.", // "submission.sections.upload.no-entry": "No", "submission.sections.upload.no-entry":"Жоқ", From 2d9e5b43ac3db325e44ca72caa0f352086bc6c0c Mon Sep 17 00:00:00 2001 From: myrza1 Date: Mon, 11 Jul 2022 15:07:43 +0600 Subject: [PATCH 016/119] Update kz.json5 added title prefix --- src/assets/i18n/kz.json5 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/assets/i18n/kz.json5 b/src/assets/i18n/kz.json5 index 0d3b3e8394..a778d08e69 100644 --- a/src/assets/i18n/kz.json5 +++ b/src/assets/i18n/kz.json5 @@ -1883,7 +1883,7 @@ "home.breadcrumbs": "Басты", // "home.title": "DSpace Angular :: Home", - "home.title": "DSpace Angular :: Басты", + "home.title": "Басты", // "home.top-level-communities.head": "Communities in DSpace", "home.top-level-communities.head": "DSpace-тегі қауымдастықтар", @@ -3717,6 +3717,19 @@ // "relationships.isContributorOf": "Contributors", "relationships.isContributorOf": "Қатысушылар", + "relationships.isContributorOf.OrgUnit": "Қатысушылар (Мекемелер)", + + "relationships.isContributorOf.Person": "Қатысушы", + + "relationships.isFundingAgencyOf.OrgUnit": "Жасаушы", + + + "repository.image.logo": "Repository logo", + + "repository.title.prefix": "Институционалдық Репозиторий :: ", + + "repository.title.prefixDSpace": "Институционалдық Репозиторий ::", + // "resource-policies.add.button": "Add", "resource-policies.add.button": "Қосу", From 39c2aa85eca5c94060bb4618c371a896f8b9e1de Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Mon, 18 Jul 2022 15:55:30 +0200 Subject: [PATCH 017/119] 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 577a92bc6b93e51362e14e33719e5db163cf3183 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Jul 2022 02:25:52 +0000 Subject: [PATCH 018/119] Bump terser from 4.8.0 to 4.8.1 Bumps [terser](https://github.com/terser/terser) from 4.8.0 to 4.8.1. - [Release notes](https://github.com/terser/terser/releases) - [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) - [Commits](https://github.com/terser/terser/commits) --- updated-dependencies: - dependency-name: terser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index f9352e8f05..f870fd85e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12239,9 +12239,9 @@ terser@5.11.0: source-map-support "~0.5.20" terser@^4.6.12, terser@^4.6.3: - version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + version "4.8.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" + integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== dependencies: commander "^2.20.0" source-map "~0.6.1" From 372cddfd5e65387fe6714108e9711a6a6467d90e Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Tue, 19 Jul 2022 17:58:19 +0200 Subject: [PATCH 019/119] 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 020/119] 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 021/119] 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 022/119] 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 023/119] 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 024/119] 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 025/119] 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 3d5f7bb0614c2c4cbb605a3feb447a6b3b905b47 Mon Sep 17 00:00:00 2001 From: Ying Jin Date: Sun, 31 Jul 2022 17:25:53 -0500 Subject: [PATCH 026/119] fix missing space between author names MyDspace our submissions #1730 --- .../item-list-preview/item-list-preview.component.html | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html index 6d4c704b60..78181dc65a 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html @@ -19,6 +19,7 @@ {{'mydspace.results.no-authors' | translate}} + ; From f2e977c402a299735d3c646db3d8e7264a163973 Mon Sep 17 00:00:00 2001 From: Jens Vannerum Date: Wed, 3 Aug 2022 15:15:45 +0200 Subject: [PATCH 027/119] 92701: Redirect / dead link fixes --- config/config.yml | 4 ++-- .../end-user-agreement/abstract-end-user-agreement.guard.ts | 6 +++++- src/app/footer/footer.component.html | 4 ++-- src/app/footer/footer.component.ts | 3 +++ src/app/shared/cookies/browser-klaro.service.ts | 4 ++++ 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/config/config.yml b/config/config.yml index 2b5ac3b52e..8b1966b100 100644 --- a/config/config.yml +++ b/config/config.yml @@ -5,5 +5,5 @@ rest: nameSpace: /server info: - enableEndUserAgreement: true - enablePrivacyStatement: true + enableEndUserAgreement: false + enablePrivacyStatement: false diff --git a/src/app/core/end-user-agreement/abstract-end-user-agreement.guard.ts b/src/app/core/end-user-agreement/abstract-end-user-agreement.guard.ts index b9f134f946..076df8ebc9 100644 --- a/src/app/core/end-user-agreement/abstract-end-user-agreement.guard.ts +++ b/src/app/core/end-user-agreement/abstract-end-user-agreement.guard.ts @@ -1,6 +1,7 @@ import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; -import { Observable } from 'rxjs'; +import { Observable, of as observableOf } from 'rxjs'; import { returnEndUserAgreementUrlTreeOnFalse } from '../shared/authorized.operators'; +import { environment } from '../../../environments/environment'; /** * An abstract guard for redirecting users to the user agreement page if a certain condition is met @@ -18,6 +19,9 @@ export abstract class AbstractEndUserAgreementGuard implements CanActivate { * when they're finished accepting the agreement */ canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + if (!environment.info.enableEndUserAgreement) { + return observableOf(true); + } return this.hasAccepted().pipe( returnEndUserAgreementUrlTreeOnFalse(this.router, state.url) ); diff --git a/src/app/footer/footer.component.html b/src/app/footer/footer.component.html index 2c1a34ccae..88236d381e 100644 --- a/src/app/footer/footer.component.html +++ b/src/app/footer/footer.component.html @@ -67,11 +67,11 @@ {{ 'footer.link.cookies' | translate}} -
  • +
  • {{ 'footer.link.privacy-policy' | translate}}
  • -
  • +
  • {{ 'footer.link.end-user-agreement' | translate}}
  • diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts index c43a0ae85d..c4195c8eb3 100644 --- a/src/app/footer/footer.component.ts +++ b/src/app/footer/footer.component.ts @@ -1,6 +1,7 @@ import { Component, Optional } from '@angular/core'; import { hasValue } from '../shared/empty.util'; import { KlaroService } from '../shared/cookies/klaro.service'; +import { environment } from '../../environments/environment'; @Component({ selector: 'ds-footer', @@ -14,6 +15,8 @@ export class FooterComponent { * A boolean representing if to show or not the top footer container */ showTopFooter = false; + showPrivacyPolicy = environment.info.enablePrivacyStatement; + showEndUserAgreement = environment.info.enableEndUserAgreement; constructor(@Optional() private cookies: KlaroService) { } diff --git a/src/app/shared/cookies/browser-klaro.service.ts b/src/app/shared/cookies/browser-klaro.service.ts index 4e6370f179..e65b7c8b86 100644 --- a/src/app/shared/cookies/browser-klaro.service.ts +++ b/src/app/shared/cookies/browser-klaro.service.ts @@ -91,6 +91,10 @@ export class BrowserKlaroService extends KlaroService { Klaro.setup(this.klaroConfig); }); + if (!environment.info.enablePrivacyStatement) { + delete this.klaroConfig.privacyPolicy; + } + } /** From 4dcf6a345a0ddb749234c301978f7a9beb754480 Mon Sep 17 00:00:00 2001 From: Jens Vannerum Date: Fri, 5 Aug 2022 13:12:52 +0200 Subject: [PATCH 028/119] 92701: Fix privacy string for klaro and add documentation --- config/config.yml | 4 ---- src/app/shared/cookies/browser-klaro.service.ts | 10 +++++----- src/assets/i18n/en.json5 | 2 ++ src/config/default-app-config.ts | 8 ++++++++ 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/config/config.yml b/config/config.yml index 8b1966b100..b5eecd112f 100644 --- a/config/config.yml +++ b/config/config.yml @@ -3,7 +3,3 @@ rest: host: api7.dspace.org port: 443 nameSpace: /server - -info: - enableEndUserAgreement: false - enablePrivacyStatement: false diff --git a/src/app/shared/cookies/browser-klaro.service.ts b/src/app/shared/cookies/browser-klaro.service.ts index e65b7c8b86..638d465864 100644 --- a/src/app/shared/cookies/browser-klaro.service.ts +++ b/src/app/shared/cookies/browser-klaro.service.ts @@ -63,6 +63,11 @@ export class BrowserKlaroService extends KlaroService { * - Add and translate klaro configuration messages */ initialize() { + if (!environment.info.enablePrivacyStatement) { + delete this.klaroConfig.privacyPolicy; + this.klaroConfig.translations.en.consentNotice.description = 'cookies.consent.content-notice.description.no-privacy'; + } + this.translateService.setDefaultLang(environment.defaultLanguage); const user$: Observable = this.getUser$(); @@ -90,11 +95,6 @@ export class BrowserKlaroService extends KlaroService { this.translateConfiguration(); Klaro.setup(this.klaroConfig); }); - - if (!environment.info.enablePrivacyStatement) { - delete this.klaroConfig.privacyPolicy; - } - } /** diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 5d7be2a681..bf2d37fbf9 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1225,6 +1225,8 @@ "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.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", + "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index 4108444443..11761af49a 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -325,6 +325,14 @@ export class DefaultAppConfig implements AppConfig { image: false, video: false }; + // Whether the end-user-agreement and privacy policy feature should be enabled or not. + // Disabling the end user agreement feature will result in: + // - Users no longer being forced to accept the end-user-agreement before they can access the repository + // - A 404 page if you manually try to navigate to the end-user-agreement page at info/end-user-agreement + // - All end-user-agreement related links and pages will be removed from the UI (e.g. in the footer) + // Disabling the privacy policy feature will result in: + // - A 404 page if you manually try to navigate to the privacy policy page at info/privacy + // - All mentions of the privacy policy being removed from the UI (e.g. in the footer) info: InfoConfig = { enableEndUserAgreement: true, enablePrivacyStatement: true From ed0204ab9caaadc3c82cb8c204f67277bb38840b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Aug 2022 15:56:19 +0000 Subject: [PATCH 029/119] Bump moment from 2.29.2 to 2.29.4 Bumps [moment](https://github.com/moment/moment) from 2.29.2 to 2.29.4. - [Release notes](https://github.com/moment/moment/releases) - [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.2...2.29.4) --- updated-dependencies: - dependency-name: moment dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index dbb4cca8a5..32832460a2 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "mirador": "^3.3.0", "mirador-dl-plugin": "^0.13.0", "mirador-share-plugin": "^0.11.0", - "moment": "^2.29.2", + "moment": "^2.29.4", "morgan": "^1.10.0", "ng-mocks": "^13.1.1", "ng2-file-upload": "1.4.0", diff --git a/yarn.lock b/yarn.lock index f870fd85e0..1996ace1b1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8741,10 +8741,10 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -moment@^2.29.2: - version "2.29.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4" - integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg== +moment@^2.29.4: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== morgan@^1.10.0: version "1.10.0" From 9e67b7f7a570c782264cd24b57237053ba49d73b Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Tue, 9 Aug 2022 11:21:22 +0200 Subject: [PATCH 030/119] 93657: Add admin option to export all fields in the metadata export --- ...export-metadata-selector.component.spec.ts | 64 +++++++++++++++++-- .../export-metadata-selector.component.ts | 45 +++++++------ 2 files changed, 87 insertions(+), 22 deletions(-) diff --git a/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.spec.ts b/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.spec.ts index f6b3581df5..df3e4f095c 100644 --- a/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.spec.ts +++ b/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.spec.ts @@ -20,6 +20,7 @@ import { createSuccessfulRemoteDataObject$ } from '../../../remote-data.utils'; import { ExportMetadataSelectorComponent } from './export-metadata-selector.component'; +import { AuthorizationDataService } from '../../../../core/data/feature-authorization/authorization-data.service'; // No way to add entryComponents yet to testbed; alternative implemented; source: https://stackoverflow.com/questions/41689468/how-to-shallow-test-a-component-with-an-entrycomponents @NgModule({ @@ -47,6 +48,7 @@ describe('ExportMetadataSelectorComponent', () => { let router; let notificationService: NotificationsServiceStub; let scriptService; + let authorizationDataService; const mockItem = Object.assign(new Item(), { id: 'fake-id', @@ -95,6 +97,9 @@ describe('ExportMetadataSelectorComponent', () => { invoke: createSuccessfulRemoteDataObject$({ processId: '45' }) } ); + authorizationDataService = jasmine.createSpyObj('authorizationDataService', { + isAuthorized: observableOf(true) + }); TestBed.configureTestingModule({ imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([]), ModelTestModule], declarations: [ExportMetadataSelectorComponent], @@ -102,6 +107,7 @@ describe('ExportMetadataSelectorComponent', () => { { provide: NgbActiveModal, useValue: modalStub }, { provide: NotificationsService, useValue: notificationService }, { provide: ScriptDataService, useValue: scriptService }, + { provide: AuthorizationDataService, useValue: authorizationDataService }, { provide: ActivatedRoute, useValue: { @@ -150,7 +156,7 @@ describe('ExportMetadataSelectorComponent', () => { }); }); - describe('if collection is selected', () => { + describe('if collection is selected and is admin', () => { let scriptRequestSucceeded; beforeEach((done) => { spyOn((component as any).modalService, 'open').and.returnValue(modalRef); @@ -159,7 +165,32 @@ describe('ExportMetadataSelectorComponent', () => { done(); }); }); - it('should invoke the metadata-export script with option -i uuid', () => { + it('should invoke the metadata-export script with option -i uuid and -a option', () => { + const parameterValues: ProcessParameter[] = [ + Object.assign(new ProcessParameter(), { name: '-i', value: mockCollection.uuid }), + Object.assign(new ProcessParameter(), { name: '-a' }), + ]; + expect(scriptService.invoke).toHaveBeenCalledWith(METADATA_EXPORT_SCRIPT_NAME, parameterValues, []); + }); + it('success notification is shown', () => { + expect(scriptRequestSucceeded).toBeTrue(); + expect(notificationService.success).toHaveBeenCalled(); + }); + it('redirected to process page', () => { + expect(router.navigateByUrl).toHaveBeenCalledWith('/processes/45'); + }); + }); + describe('if collection is selected and is not admin', () => { + let scriptRequestSucceeded; + beforeEach((done) => { + (authorizationDataService.isAuthorized as jasmine.Spy).and.returnValue(observableOf(false)); + spyOn((component as any).modalService, 'open').and.returnValue(modalRef); + component.navigate(mockCollection).subscribe((succeeded: boolean) => { + scriptRequestSucceeded = succeeded; + done(); + }); + }); + it('should invoke the metadata-export script with option -i uuid without the -a option', () => { const parameterValues: ProcessParameter[] = [ Object.assign(new ProcessParameter(), { name: '-i', value: mockCollection.uuid }), ]; @@ -174,7 +205,7 @@ describe('ExportMetadataSelectorComponent', () => { }); }); - describe('if community is selected', () => { + describe('if community is selected and is an admin', () => { let scriptRequestSucceeded; beforeEach((done) => { spyOn((component as any).modalService, 'open').and.returnValue(modalRef); @@ -183,7 +214,32 @@ describe('ExportMetadataSelectorComponent', () => { done(); }); }); - it('should invoke the metadata-export script with option -i uuid', () => { + it('should invoke the metadata-export script with option -i uuid and -a option if the user is an admin', () => { + const parameterValues: ProcessParameter[] = [ + Object.assign(new ProcessParameter(), { name: '-i', value: mockCommunity.uuid }), + Object.assign(new ProcessParameter(), { name: '-a' }), + ]; + expect(scriptService.invoke).toHaveBeenCalledWith(METADATA_EXPORT_SCRIPT_NAME, parameterValues, []); + }); + it('success notification is shown', () => { + expect(scriptRequestSucceeded).toBeTrue(); + expect(notificationService.success).toHaveBeenCalled(); + }); + it('redirected to process page', () => { + expect(router.navigateByUrl).toHaveBeenCalledWith('/processes/45'); + }); + }); + describe('if community is selected and is not an admin', () => { + let scriptRequestSucceeded; + beforeEach((done) => { + (authorizationDataService.isAuthorized as jasmine.Spy).and.returnValue(observableOf(false)); + spyOn((component as any).modalService, 'open').and.returnValue(modalRef); + component.navigate(mockCommunity).subscribe((succeeded: boolean) => { + scriptRequestSucceeded = succeeded; + done(); + }); + }); + it('should invoke the metadata-export script with option -i uuid without the -a option', () => { const parameterValues: ProcessParameter[] = [ Object.assign(new ProcessParameter(), { name: '-i', value: mockCommunity.uuid }), ]; diff --git a/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts index a04fc0a1cd..6b8169a263 100644 --- a/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts @@ -19,6 +19,8 @@ import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; import { Process } from '../../../../process-page/processes/process.model'; import { RemoteData } from '../../../../core/data/remote-data'; import { getProcessDetailRoute } from '../../../../process-page/process-page-routing.paths'; +import { AuthorizationDataService } from '../../../../core/data/feature-authorization/authorization-data.service'; +import { FeatureID } from '../../../../core/data/feature-authorization/feature-id'; /** * Component to wrap a list of existing dso's inside a modal @@ -36,6 +38,7 @@ export class ExportMetadataSelectorComponent extends DSOSelectorModalWrapperComp constructor(protected activeModal: NgbActiveModal, protected route: ActivatedRoute, private router: Router, protected notificationsService: NotificationsService, protected translationService: TranslateService, protected scriptDataService: ScriptDataService, + protected authorizationDataService: AuthorizationDataService, private modalService: NgbModal) { super(activeModal, route); } @@ -82,24 +85,30 @@ export class ExportMetadataSelectorComponent extends DSOSelectorModalWrapperComp const parameterValues: ProcessParameter[] = [ Object.assign(new ProcessParameter(), { name: '-i', value: dso.uuid }), ]; - return this.scriptDataService.invoke(METADATA_EXPORT_SCRIPT_NAME, parameterValues, []) - .pipe( - getFirstCompletedRemoteData(), - map((rd: RemoteData) => { - if (rd.hasSucceeded) { - const title = this.translationService.get('process.new.notification.success.title'); - const content = this.translationService.get('process.new.notification.success.content'); - this.notificationsService.success(title, content); - if (isNotEmpty(rd.payload)) { - this.router.navigateByUrl(getProcessDetailRoute(rd.payload.processId)); - } - return true; - } else { - const title = this.translationService.get('process.new.notification.error.title'); - const content = this.translationService.get('process.new.notification.error.content'); - this.notificationsService.error(title, content); - return false; + return this.authorizationDataService.isAuthorized(FeatureID.AdministratorOf).pipe( + switchMap((isAdmin) => { + if (isAdmin) { + parameterValues.push(Object.assign(new ProcessParameter(), {name: '-a'})); + } + console.log(isAdmin, parameterValues); + return this.scriptDataService.invoke(METADATA_EXPORT_SCRIPT_NAME, parameterValues, []); + }), + getFirstCompletedRemoteData(), + map((rd: RemoteData) => { + if (rd.hasSucceeded) { + const title = this.translationService.get('process.new.notification.success.title'); + const content = this.translationService.get('process.new.notification.success.content'); + this.notificationsService.success(title, content); + if (isNotEmpty(rd.payload)) { + this.router.navigateByUrl(getProcessDetailRoute(rd.payload.processId)); } - })); + return true; + } else { + const title = this.translationService.get('process.new.notification.error.title'); + const content = this.translationService.get('process.new.notification.error.content'); + this.notificationsService.error(title, content); + return false; + } + })); } } From bf489710473453b818a1754ce0bf86aa5bf1f30a Mon Sep 17 00:00:00 2001 From: Sufiyan Shaikh Date: Tue, 9 Aug 2022 15:10:59 +0530 Subject: [PATCH 031/119] [CST-6565] LYRASIS7: Cookie consent shows analytics usage also when GA is disabled --- .../cookies/browser-klaro.service.spec.ts | 18 +++++++++++++++ .../shared/cookies/browser-klaro.service.ts | 22 ++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/app/shared/cookies/browser-klaro.service.spec.ts b/src/app/shared/cookies/browser-klaro.service.spec.ts index 2155fb1bad..fef6c40692 100644 --- a/src/app/shared/cookies/browser-klaro.service.spec.ts +++ b/src/app/shared/cookies/browser-klaro.service.spec.ts @@ -11,8 +11,13 @@ import { CookieService } from '../../core/services/cookie.service'; import { getTestScheduler } from 'jasmine-marbles'; import { MetadataValue } from '../../core/shared/metadata.models'; import { cloneDeep } from 'lodash'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; +import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; +import { ConfigurationProperty } from '../../core/shared/configuration-property.model'; describe('BrowserKlaroService', () => { + const trackingIdProp = 'google.analytics.key'; + const trackingIdTestValue = 'mock-tracking-id'; let translateService; let ePersonService; let authService; @@ -20,6 +25,14 @@ describe('BrowserKlaroService', () => { let user; let service: BrowserKlaroService; + let configurationDataService: ConfigurationDataService; + const createConfigSuccessSpy = (...values: string[]) => jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$({ + ... new ConfigurationProperty(), + name: trackingIdProp, + values: values, + }), + }); let mockConfig; let appName; @@ -38,6 +51,7 @@ describe('BrowserKlaroService', () => { isAuthenticated: observableOf(true), getAuthenticatedUserFromStore: observableOf(user) }); + configurationDataService = createConfigSuccessSpy(trackingIdTestValue); cookieService = jasmine.createSpyObj('cookieService', { get: '{%22token_item%22:true%2C%22impersonation%22:true%2C%22redirect%22:true%2C%22language%22:true%2C%22klaro%22:true%2C%22has_agreed_end_user%22:true%2C%22google-analytics%22:true}', set: () => { @@ -63,6 +77,10 @@ describe('BrowserKlaroService', () => { { provide: CookieService, useValue: cookieService + }, + { + provide: ConfigurationDataService, + useValue: configurationDataService } ] }); diff --git a/src/app/shared/cookies/browser-klaro.service.ts b/src/app/shared/cookies/browser-klaro.service.ts index 4e6370f179..2dabf2abb3 100644 --- a/src/app/shared/cookies/browser-klaro.service.ts +++ b/src/app/shared/cookies/browser-klaro.service.ts @@ -4,7 +4,7 @@ import { combineLatest as observableCombineLatest, Observable, of as observableO import { AuthService } from '../../core/auth/auth.service'; import { TranslateService } from '@ngx-translate/core'; import { environment } from '../../../environments/environment'; -import { switchMap, take } from 'rxjs/operators'; +import { catchError, switchMap, take } from 'rxjs/operators'; import { EPerson } from '../../core/eperson/models/eperson.model'; import { KlaroService } from './klaro.service'; import { hasValue, isNotEmpty } from '../empty.util'; @@ -13,6 +13,8 @@ import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { cloneDeep, debounce } from 'lodash'; import { ANONYMOUS_STORAGE_NAME_KLARO, klaroConfiguration } from './klaro-configuration'; import { Operation } from 'fast-json-patch'; +import { getFirstCompletedRemoteData } from 'src/app/core/shared/operators'; +import { ConfigurationDataService } from 'src/app/core/data/configuration-data.service'; /** * Metadata field to store a user's cookie consent preferences in @@ -52,6 +54,7 @@ export class BrowserKlaroService extends KlaroService { private translateService: TranslateService, private authService: AuthService, private ePersonService: EPersonDataService, + private configService: ConfigurationDataService, private cookieService: CookieService) { super(); } @@ -63,6 +66,15 @@ export class BrowserKlaroService extends KlaroService { * - Add and translate klaro configuration messages */ initialize() { + this.configService.findByPropertyName('google.analytics.key').pipe( + getFirstCompletedRemoteData(), + catchError(this.removeGoogleAnalytics()) + ).subscribe((remoteData) => { + // make sure we got a success response from the backend + if (!remoteData.hasSucceeded) { + this.removeGoogleAnalytics(); + } + }); this.translateService.setDefaultLang(environment.defaultLanguage); const user$: Observable = this.getUser$(); @@ -253,4 +265,12 @@ export class BrowserKlaroService extends KlaroService { getStorageName(identifier: string) { return 'klaro-' + identifier; } + + /** + * remove the google analytics from the services + */ + removeGoogleAnalytics() { + this.klaroConfig.services = klaroConfiguration.services.filter(config => config.name !== 'google-analytics'); + return this.klaroConfig.services; + } } From 4870d818f685b83aae5fcd9484f6366f4639bdf4 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Tue, 9 Aug 2022 15:47:19 +0200 Subject: [PATCH 032/119] 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 033/119] 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 034/119] 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 035/119] 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 17ab269e255ca3a7bd25880ae9b9125c91abbf93 Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Thu, 11 Aug 2022 09:43:19 +0200 Subject: [PATCH 036/119] Remove console log --- .../export-metadata-selector.component.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts b/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts index 6b8169a263..d4b4314a99 100644 --- a/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts +++ b/src/app/shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component.ts @@ -90,7 +90,6 @@ export class ExportMetadataSelectorComponent extends DSOSelectorModalWrapperComp if (isAdmin) { parameterValues.push(Object.assign(new ProcessParameter(), {name: '-a'})); } - console.log(isAdmin, parameterValues); return this.scriptDataService.invoke(METADATA_EXPORT_SCRIPT_NAME, parameterValues, []); }), getFirstCompletedRemoteData(), From 092b3d862a7547f39ea78750cbdd9780b00bf296 Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 12 Aug 2022 11:35:30 +0200 Subject: [PATCH 037/119] 93665: fixed pagination in metadata browse links --- .../browse-by-metadata-page.component.ts | 4 +++- .../browse-entry-list-element.component.html | 2 +- .../browse-entry-list-element.component.ts | 20 ++++++++++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.ts b/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.ts index f789389697..f116077c05 100644 --- a/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.ts +++ b/src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.ts @@ -18,6 +18,8 @@ import { BrowseByDataType, rendersBrowseBy } from '../browse-by-switcher/browse- import { PaginationService } from '../../core/pagination/pagination.service'; import { map } from 'rxjs/operators'; +export const BBM_PAGINATION_ID = 'bbm'; + @Component({ selector: 'ds-browse-by-metadata-page', styleUrls: ['./browse-by-metadata-page.component.scss'], @@ -50,7 +52,7 @@ export class BrowseByMetadataPageComponent implements OnInit { * The pagination config used to display the values */ paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { - id: 'bbm', + id: BBM_PAGINATION_ID, currentPage: 1, pageSize: 20 }); diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html index 8577ee654c..a87e862345 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html @@ -1,5 +1,5 @@
    - + {{object.value}} diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts index cfdf561f99..235ac0665a 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts @@ -1,9 +1,12 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; import { BrowseEntry } from '../../../core/shared/browse-entry.model'; import { ViewMode } from '../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { Params } from '@angular/router'; +import { BBM_PAGINATION_ID } from '../../../browse-by/browse-by-metadata-page/browse-by-metadata-page.component'; @Component({ selector: 'ds-browse-entry-list-element', @@ -15,16 +18,27 @@ import { listableObjectComponent } from '../../object-collection/shared/listable * This component is automatically used to create a list view for BrowseEntry objects when used in ObjectCollectionComponent */ @listableObjectComponent(BrowseEntry, ViewMode.ListElement) -export class BrowseEntryListElementComponent extends AbstractListableElementComponent { +export class BrowseEntryListElementComponent extends AbstractListableElementComponent implements OnInit { + queryParams: Params; + + constructor(private paginationService: PaginationService) { + super(); + } + + ngOnInit() { + this.queryParams = this.getQueryParams(); + } /** * Get the query params to access the item page of this browse entry. */ - public getQueryParams(): {[param: string]: any} { + private getQueryParams(): Params { + const pageParamName = this.paginationService.getPageParam(BBM_PAGINATION_ID); return { value: this.object.value, authority: !!this.object.authority ? this.object.authority : undefined, startsWith: undefined, + [pageParamName]: null, }; } } From c602a22f6ca0754ff7ab3e442e517c70f656eeb9 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Tue, 16 Aug 2022 10:42:57 +0200 Subject: [PATCH 038/119] 93882: Move 3rd party css imports to separate file --- src/styles/_vendor.scss | 5 +++++ src/styles/base-theme.scss | 4 +--- src/themes/custom/styles/theme.scss | 4 +--- src/themes/dspace/styles/theme.scss | 4 +--- 4 files changed, 8 insertions(+), 9 deletions(-) create mode 100644 src/styles/_vendor.scss diff --git a/src/styles/_vendor.scss b/src/styles/_vendor.scss new file mode 100644 index 0000000000..9d9842b9b3 --- /dev/null +++ b/src/styles/_vendor.scss @@ -0,0 +1,5 @@ +// node_modules imports meant for all the themes + +@import '~node_modules/bootstrap/scss/bootstrap.scss'; +@import '~node_modules/nouislider/distribute/nouislider.min'; +@import '~node_modules/ngx-ui-switch/ui-switch.component.scss'; diff --git a/src/styles/base-theme.scss b/src/styles/base-theme.scss index a88057fec1..539f9fe185 100644 --- a/src/styles/base-theme.scss +++ b/src/styles/base-theme.scss @@ -1,8 +1,6 @@ @import './helpers/font_awesome_imports.scss'; -@import '../../node_modules/bootstrap/scss/bootstrap.scss'; -@import '../../node_modules/nouislider/distribute/nouislider.min'; +@import './_vendor.scss'; @import './_custom_variables.scss'; @import './bootstrap_variables_mapping.scss'; @import './_truncatable-part.component.scss'; @import './_global-styles.scss'; -@import '../../node_modules/ngx-ui-switch/ui-switch.component.scss'; diff --git a/src/themes/custom/styles/theme.scss b/src/themes/custom/styles/theme.scss index ad2c0de24e..05c96f3372 100644 --- a/src/themes/custom/styles/theme.scss +++ b/src/themes/custom/styles/theme.scss @@ -4,11 +4,9 @@ @import '../../../styles/_variables.scss'; @import '../../../styles/_mixins.scss'; @import '../../../styles/helpers/font_awesome_imports.scss'; -@import '../../../../node_modules/bootstrap/scss/bootstrap.scss'; -@import '../../../../node_modules/nouislider/distribute/nouislider.min'; +@import '../../../styles/_vendor.scss'; @import '../../../styles/_custom_variables.scss'; @import './_theme_css_variable_overrides.scss'; @import '../../../styles/bootstrap_variables_mapping.scss'; @import '../../../styles/_truncatable-part.component.scss'; @import './_global-styles.scss'; -@import '../../../../node_modules/ngx-ui-switch/ui-switch.component.scss'; diff --git a/src/themes/dspace/styles/theme.scss b/src/themes/dspace/styles/theme.scss index ad2c0de24e..05c96f3372 100644 --- a/src/themes/dspace/styles/theme.scss +++ b/src/themes/dspace/styles/theme.scss @@ -4,11 +4,9 @@ @import '../../../styles/_variables.scss'; @import '../../../styles/_mixins.scss'; @import '../../../styles/helpers/font_awesome_imports.scss'; -@import '../../../../node_modules/bootstrap/scss/bootstrap.scss'; -@import '../../../../node_modules/nouislider/distribute/nouislider.min'; +@import '../../../styles/_vendor.scss'; @import '../../../styles/_custom_variables.scss'; @import './_theme_css_variable_overrides.scss'; @import '../../../styles/bootstrap_variables_mapping.scss'; @import '../../../styles/_truncatable-part.component.scss'; @import './_global-styles.scss'; -@import '../../../../node_modules/ngx-ui-switch/ui-switch.component.scss'; From 35614d147397d25b01b3174026a71f4ce6490a91 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Wed, 17 Aug 2022 14:12:33 -0500 Subject: [PATCH 039/119] Replace gendered language with generic equivalent --- README.md | 2 +- .../some-feature-authorization.guard.ts | 2 +- src/app/core/data/processes/process-data.service.ts | 2 +- src/app/core/end-user-agreement/end-user-agreement.service.ts | 2 +- src/app/core/shared/metadata.models.ts | 4 ++-- .../health-panel/health-status/health-status.component.ts | 2 +- .../info/end-user-agreement/end-user-agreement.component.ts | 2 +- .../profile-page-researcher-form.component.ts | 2 +- src/app/shared/cookies/klaro-configuration.ts | 2 +- .../item/item-metadata-list-element.component.ts | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index cef95a45fa..837cb48004 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,7 @@ If needing to update default configurations values for production, update local - Update `environment.production.ts` file in `src/environment/` for a `production` environment; -The environment object is provided for use as import in code and is extended with he runtime configuration on bootstrap of the application. +The environment object is provided for use as import in code and is extended with the runtime configuration on bootstrap of the application. > Take caution moving runtime configs into the buildtime configuration. They will be overwritten by what is defined in the runtime config on bootstrap. diff --git a/src/app/core/data/feature-authorization/feature-authorization-guard/some-feature-authorization.guard.ts b/src/app/core/data/feature-authorization/feature-authorization-guard/some-feature-authorization.guard.ts index 18c7f8fb43..b909640ea6 100644 --- a/src/app/core/data/feature-authorization/feature-authorization-guard/some-feature-authorization.guard.ts +++ b/src/app/core/data/feature-authorization/feature-authorization-guard/some-feature-authorization.guard.ts @@ -19,7 +19,7 @@ export abstract class SomeFeatureAuthorizationGuard implements CanActivate { /** * True when user has authorization rights for the feature and object provided - * Redirect the user to the unauthorized page when he/she's not authorized for the given feature + * Redirect the user to the unauthorized page when they are not authorized for the given feature */ canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { return observableCombineLatest(this.getFeatureIDs(route, state), this.getObjectUrl(route, state), this.getEPersonUuid(route, state)).pipe( diff --git a/src/app/core/data/processes/process-data.service.ts b/src/app/core/data/processes/process-data.service.ts index 81b4cbd503..cb00ac529e 100644 --- a/src/app/core/data/processes/process-data.service.ts +++ b/src/app/core/data/processes/process-data.service.ts @@ -38,7 +38,7 @@ export class ProcessDataService extends DataService { } /** - * Get the endpoint for a process his files + * Get the endpoint for the files of the process * @param processId The ID of the process */ getFilesEndpoint(processId: string): Observable { diff --git a/src/app/core/end-user-agreement/end-user-agreement.service.ts b/src/app/core/end-user-agreement/end-user-agreement.service.ts index 8a18488660..3841abb5d4 100644 --- a/src/app/core/end-user-agreement/end-user-agreement.service.ts +++ b/src/app/core/end-user-agreement/end-user-agreement.service.ts @@ -55,7 +55,7 @@ export class EndUserAgreementService { /** * Set the current user's accepted agreement status - * When a user is authenticated, set his/her metadata to the provided value + * When a user is authenticated, set their metadata to the provided value * When no user is authenticated, set the cookie to the provided value * @param accepted */ diff --git a/src/app/core/shared/metadata.models.ts b/src/app/core/shared/metadata.models.ts index 52f1805e8c..e74e1f9927 100644 --- a/src/app/core/shared/metadata.models.ts +++ b/src/app/core/shared/metadata.models.ts @@ -39,7 +39,7 @@ export class MetadataValue implements MetadataValueInterface { value: string; /** - * The place of this MetadataValue within his list of metadata + * The place of this MetadataValue within its list of metadata * This is used to render metadata in a specific custom order */ @autoserialize @@ -105,7 +105,7 @@ export class MetadatumViewModel { value: string; /** - * The place of this MetadataValue within his list of metadata + * The place of this MetadataValue within its list of metadata * This is used to render metadata in a specific custom order */ place: number; diff --git a/src/app/health-page/health-panel/health-status/health-status.component.ts b/src/app/health-page/health-panel/health-status/health-status.component.ts index 19f83713fc..172baeee71 100644 --- a/src/app/health-page/health-panel/health-status/health-status.component.ts +++ b/src/app/health-page/health-panel/health-status/health-status.component.ts @@ -16,7 +16,7 @@ export class HealthStatusComponent { @Input() status: HealthStatus; /** - * He + * Health Status */ HealthStatus = HealthStatus; diff --git a/src/app/info/end-user-agreement/end-user-agreement.component.ts b/src/app/info/end-user-agreement/end-user-agreement.component.ts index a3350319ba..bcb5e0ce9d 100644 --- a/src/app/info/end-user-agreement/end-user-agreement.component.ts +++ b/src/app/info/end-user-agreement/end-user-agreement.component.ts @@ -76,7 +76,7 @@ export class EndUserAgreementComponent implements OnInit { /** * Cancel the agreement - * If the user is logged in, this will log him/her out + * If the user is logged in, this will log them out * If the user is not logged in, they will be redirected to the homepage */ cancel() { diff --git a/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts b/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts index f7662e0522..2d61660a17 100644 --- a/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts +++ b/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts @@ -24,7 +24,7 @@ import { ConfirmationModalComponent } from '../../shared/confirmation-modal/conf templateUrl: './profile-page-researcher-form.component.html', }) /** - * Component for a user to create/delete or change his researcher profile. + * Component for a user to create/delete or change their researcher profile. */ export class ProfilePageResearcherFormComponent implements OnInit { diff --git a/src/app/shared/cookies/klaro-configuration.ts b/src/app/shared/cookies/klaro-configuration.ts index 1c87e46309..659583ad87 100644 --- a/src/app/shared/cookies/klaro-configuration.ts +++ b/src/app/shared/cookies/klaro-configuration.ts @@ -24,7 +24,7 @@ export const klaroConfiguration: any = { /* Setting 'hideLearnMore' to 'true' will hide the "learn more / customize" link in the consent notice. We strongly advise against using this under most - circumstances, as it keeps the user from customizing his/her consent choices. + circumstances, as it keeps the user from customizing their consent choices. */ hideLearnMore: false, diff --git a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts index 3be16bcb5e..d0bbdf1ded 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts @@ -12,7 +12,7 @@ import { metadataRepresentationComponent } from '../../../metadata-representatio /** * A component for displaying MetadataRepresentation objects in the form of items * It will send the MetadataRepresentation object along with ElementViewMode.SetElement to the ItemTypeSwitcherComponent, - * which will in his turn decide how to render the item as metadata. + * which will in its turn decide how to render the item as metadata. */ export class ItemMetadataListElementComponent extends MetadataRepresentationListElementComponent { /** From f8e1db49874762455041974391be3ccc51c1a5d3 Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Thu, 18 Aug 2022 14:04:59 +0200 Subject: [PATCH 040/119] 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 606995881fa0a5e1040f74cb4a7053bdf838f826 Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 19 Aug 2022 11:05:08 +0200 Subject: [PATCH 041/119] 93665: fixes for post 7.2 and updated back button for browse by pages --- .../browse-by/browse-by.component.spec.ts | 6 ++-- .../shared/browse-by/browse-by.component.ts | 30 +++++++++++++++--- .../browse-entry-list-element.component.html | 2 +- ...rowse-entry-list-element.component.spec.ts | 24 ++++++++++++-- .../browse-entry-list-element.component.ts | 31 +++++++++++++------ 5 files changed, 73 insertions(+), 20 deletions(-) diff --git a/src/app/shared/browse-by/browse-by.component.spec.ts b/src/app/shared/browse-by/browse-by.component.spec.ts index 8bda44b11c..1f0d5cfae7 100644 --- a/src/app/shared/browse-by/browse-by.component.spec.ts +++ b/src/app/shared/browse-by/browse-by.component.spec.ts @@ -247,10 +247,12 @@ describe('BrowseByComponent', () => { }); describe('back', () => { it('should navigate back to the main browse page', () => { + const id = 'test-pagination'; comp.back(); - expect(paginationService.updateRoute).toHaveBeenCalledWith('test-pagination', {page: 1}, { + expect(paginationService.updateRoute).toHaveBeenCalledWith(id, {page: 1}, { value: null, - startsWith: null + startsWith: null, + [id + '.return']: null }); }); }); diff --git a/src/app/shared/browse-by/browse-by.component.ts b/src/app/shared/browse-by/browse-by.component.ts index 1132b41124..2c1844a310 100644 --- a/src/app/shared/browse-by/browse-by.component.ts +++ b/src/app/shared/browse-by/browse-by.component.ts @@ -1,10 +1,10 @@ -import { Component, EventEmitter, Injector, Input, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Injector, Input, OnDestroy, OnInit, Output } from '@angular/core'; import { RemoteData } from '../../core/data/remote-data'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { fadeIn, fadeInOut } from '../animations/fade'; -import { combineLatest as observableCombineLatest, Observable } from 'rxjs'; +import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs'; import { ListableObject } from '../object-collection/shared/listable-object.model'; import { getStartsWithComponent, StartsWithType } from '../starts-with/starts-with-decorator'; import { PaginationService } from '../../core/pagination/pagination.service'; @@ -12,6 +12,7 @@ import { ViewMode } from '../../core/shared/view-mode.model'; import { RouteService } from '../../core/services/route.service'; import { map } from 'rxjs/operators'; import { hasValue } from '../empty.util'; +import { BBM_PAGINATION_ID } from '../../browse-by/browse-by-metadata-page/browse-by-metadata-page.component'; @Component({ selector: 'ds-browse-by', @@ -25,7 +26,7 @@ import { hasValue } from '../empty.util'; /** * Component to display a browse-by page for any ListableObject */ -export class BrowseByComponent implements OnInit { +export class BrowseByComponent implements OnInit, OnDestroy { /** * ViewMode that should be passed to {@link ListableObjectComponentLoaderComponent}. @@ -112,6 +113,16 @@ export class BrowseByComponent implements OnInit { */ shouldDisplayResetButton$: Observable; + /** + * Page number of the previous page + */ + previousPage$ = new BehaviorSubject('1'); + + /** + * Subscription that has to be unsubscribed from on destroy + */ + sub: Subscription; + public constructor(private injector: Injector, protected paginationService: PaginationService, private routeService: RouteService, @@ -171,9 +182,20 @@ export class BrowseByComponent implements OnInit { this.shouldDisplayResetButton$ = observableCombineLatest([startsWith$, value$]).pipe( map(([startsWith, value]) => hasValue(startsWith) || hasValue(value)) ); + this.sub = this.routeService.getQueryParameterValue(this.paginationConfig.id + '.return').subscribe(this.previousPage$); } + /** + * Navigate back to the previous browse by page + */ back() { - this.paginationService.updateRoute(this.paginationConfig.id, {page: 1}, {value: null, startsWith: null}); + const page = +this.previousPage$.value > 1 ? +this.previousPage$.value : 1; + this.paginationService.updateRoute(this.paginationConfig.id, {page: page}, {[this.paginationConfig.id + '.return']: null, value: null, startsWith: null}); + } + + ngOnDestroy(): void { + if (this.sub) { + this.sub.unsubscribe(); + } } } diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html index 94cc590988..dcbdd77bff 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html @@ -1,5 +1,5 @@
    - + {{object.value}} diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts index d37f82234d..7d3d9e1eae 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts @@ -4,7 +4,9 @@ import { By } from '@angular/platform-browser'; import { TruncatePipe } from '../../utils/truncate.pipe'; import { BrowseEntryListElementComponent } from './browse-entry-list-element.component'; import { BrowseEntry } from '../../../core/shared/browse-entry.model'; - +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { RouteService } from '../../../core/services/route.service'; +import { of as observableOf } from 'rxjs'; let browseEntryListElementComponent: BrowseEntryListElementComponent; let fixture: ComponentFixture; @@ -13,12 +15,28 @@ const mockValue: BrowseEntry = Object.assign(new BrowseEntry(), { value: 'De Langhe Kristof' }); -describe('MetadataListElementComponent', () => { +let paginationService; +let routeService; +const pageParam = 'bbm.page'; + +function init() { + paginationService = jasmine.createSpyObj('paginationService', { + getPageParam: pageParam + }); + + routeService = jasmine.createSpyObj('routeService', { + getQueryParameterValue: observableOf('1') + }) +} +describe('BrowseEntryListElementComponent', () => { beforeEach(waitForAsync(() => { + init(); TestBed.configureTestingModule({ declarations: [BrowseEntryListElementComponent, TruncatePipe], providers: [ - { provide: 'objectElementProvider', useValue: { mockValue } } + { provide: 'objectElementProvider', useValue: { mockValue } }, + {provide: PaginationService, useValue: paginationService}, + {provide: RouteService, useValue: routeService}, ], schemas: [NO_ERRORS_SCHEMA] diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts index 235ac0665a..667da726ed 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts @@ -7,6 +7,9 @@ import { listableObjectComponent } from '../../object-collection/shared/listable import { PaginationService } from '../../../core/pagination/pagination.service'; import { Params } from '@angular/router'; import { BBM_PAGINATION_ID } from '../../../browse-by/browse-by-metadata-page/browse-by-metadata-page.component'; +import { RouteService } from 'src/app/core/services/route.service'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; @Component({ selector: 'ds-browse-entry-list-element', @@ -19,26 +22,34 @@ import { BBM_PAGINATION_ID } from '../../../browse-by/browse-by-metadata-page/br */ @listableObjectComponent(BrowseEntry, ViewMode.ListElement) export class BrowseEntryListElementComponent extends AbstractListableElementComponent implements OnInit { - queryParams: Params; + /** + * Emits the query parameters for the link of this browse entry list element + */ + queryParams$: Observable; - constructor(private paginationService: PaginationService) { + constructor(private paginationService: PaginationService, private routeService: RouteService) { super(); } ngOnInit() { - this.queryParams = this.getQueryParams(); + this.queryParams$ = this.getQueryParams(); } /** * Get the query params to access the item page of this browse entry. */ - private getQueryParams(): Params { + private getQueryParams(): Observable { const pageParamName = this.paginationService.getPageParam(BBM_PAGINATION_ID); - return { - value: this.object.value, - authority: !!this.object.authority ? this.object.authority : undefined, - startsWith: undefined, - [pageParamName]: null, - }; + return this.routeService.getQueryParameterValue(pageParamName).pipe( + map((currentPage) => { + return { + value: this.object.value, + authority: !!this.object.authority ? this.object.authority : undefined, + startsWith: undefined, + [pageParamName]: null, + [BBM_PAGINATION_ID + '.return']: currentPage + }; + }) + ); } } From 78598dc1b5030f68fed1ff0ce9e3810e5eab97a6 Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 19 Aug 2022 11:15:37 +0200 Subject: [PATCH 042/119] 93665: Fixed lint issue --- .../browse-entry-list-element.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts index 7d3d9e1eae..a4490bd951 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.spec.ts @@ -26,7 +26,7 @@ function init() { routeService = jasmine.createSpyObj('routeService', { getQueryParameterValue: observableOf('1') - }) + }); } describe('BrowseEntryListElementComponent', () => { beforeEach(waitForAsync(() => { From 5ed369d097e07aab0fd5a128005a57bde6d1b280 Mon Sep 17 00:00:00 2001 From: "Mark H. Wood" Date: Fri, 19 Aug 2022 16:23:20 -0400 Subject: [PATCH 043/119] 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 044/119] 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 53dcd48e98a11dcf0c4f82b02ccf656a0acb6cd7 Mon Sep 17 00:00:00 2001 From: Sufiyan Shaikh Date: Mon, 22 Aug 2022 15:28:55 +0530 Subject: [PATCH 045/119] [CST-6565] path and check fixes --- src/app/shared/cookies/browser-klaro.service.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/shared/cookies/browser-klaro.service.ts b/src/app/shared/cookies/browser-klaro.service.ts index 2dabf2abb3..9bc4d4736b 100644 --- a/src/app/shared/cookies/browser-klaro.service.ts +++ b/src/app/shared/cookies/browser-klaro.service.ts @@ -7,14 +7,14 @@ import { environment } from '../../../environments/environment'; import { catchError, switchMap, take } from 'rxjs/operators'; import { EPerson } from '../../core/eperson/models/eperson.model'; import { KlaroService } from './klaro.service'; -import { hasValue, isNotEmpty } from '../empty.util'; +import { hasValue, isEmpty, isNotEmpty } from '../empty.util'; import { CookieService } from '../../core/services/cookie.service'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { cloneDeep, debounce } from 'lodash'; import { ANONYMOUS_STORAGE_NAME_KLARO, klaroConfiguration } from './klaro-configuration'; import { Operation } from 'fast-json-patch'; -import { getFirstCompletedRemoteData } from 'src/app/core/shared/operators'; -import { ConfigurationDataService } from 'src/app/core/data/configuration-data.service'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; /** * Metadata field to store a user's cookie consent preferences in @@ -71,7 +71,7 @@ export class BrowserKlaroService extends KlaroService { catchError(this.removeGoogleAnalytics()) ).subscribe((remoteData) => { // make sure we got a success response from the backend - if (!remoteData.hasSucceeded) { + if (!remoteData.hasSucceeded || !remoteData.payload || isEmpty(remoteData.payload.values) ) { this.removeGoogleAnalytics(); } }); From cacce82b0a20047abd51fc89224142c826292509 Mon Sep 17 00:00:00 2001 From: Sufiyan Shaikh Date: Mon, 22 Aug 2022 17:03:55 +0530 Subject: [PATCH 046/119] [CST-6565] check fixed --- src/app/shared/cookies/browser-klaro.service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/shared/cookies/browser-klaro.service.ts b/src/app/shared/cookies/browser-klaro.service.ts index 9bc4d4736b..ec6aa1ac60 100644 --- a/src/app/shared/cookies/browser-klaro.service.ts +++ b/src/app/shared/cookies/browser-klaro.service.ts @@ -68,7 +68,6 @@ export class BrowserKlaroService extends KlaroService { initialize() { this.configService.findByPropertyName('google.analytics.key').pipe( getFirstCompletedRemoteData(), - catchError(this.removeGoogleAnalytics()) ).subscribe((remoteData) => { // make sure we got a success response from the backend if (!remoteData.hasSucceeded || !remoteData.payload || isEmpty(remoteData.payload.values) ) { From 4b20b0cb8116a234c22fb48a79200eb0783b57a1 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Tue, 23 Aug 2022 17:50:46 +0200 Subject: [PATCH 047/119] force initservices to wait until authentication is no longer blocking --- src/app/core/auth/auth-request.service.ts | 37 ++++++++++++++--------- src/app/core/auth/auth.reducer.ts | 6 ++++ src/modules/app/browser-init.service.ts | 7 +++++ src/modules/app/server-init.service.ts | 12 ++++++-- 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/src/app/core/auth/auth-request.service.ts b/src/app/core/auth/auth-request.service.ts index 00a94822d3..bcaa5972ac 100644 --- a/src/app/core/auth/auth-request.service.ts +++ b/src/app/core/auth/auth-request.service.ts @@ -1,5 +1,5 @@ import { Observable } from 'rxjs'; -import { distinctUntilChanged, filter, map, mergeMap, switchMap, tap } from 'rxjs/operators'; +import { distinctUntilChanged, filter, map, mergeMap, switchMap, tap, take } from 'rxjs/operators'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { RequestService } from '../data/request.service'; import { isNotEmpty } from '../../shared/empty.util'; @@ -26,8 +26,8 @@ export abstract class AuthRequestService { ) { } - protected fetchRequest(request: RestRequest): Observable> { - return this.rdbService.buildFromRequestUUID(request.uuid).pipe( + protected fetchRequest(requestId: string): Observable> { + return this.rdbService.buildFromRequestUUID(requestId).pipe( getFirstCompletedRemoteData(), ); } @@ -37,27 +37,36 @@ export abstract class AuthRequestService { } public postToEndpoint(method: string, body?: any, options?: HttpOptions): Observable> { - return this.halService.getEndpoint(this.linkName).pipe( + const requestId = this.requestService.generateRequestId(); + + this.halService.getEndpoint(this.linkName).pipe( filter((href: string) => isNotEmpty(href)), map((endpointURL) => this.getEndpointByMethod(endpointURL, method)), distinctUntilChanged(), - map((endpointURL: string) => new PostRequest(this.requestService.generateRequestId(), endpointURL, body, options)), - tap((request: PostRequest) => this.requestService.send(request)), - mergeMap((request: PostRequest) => this.fetchRequest(request)), - distinctUntilChanged()); + map((endpointURL: string) => new PostRequest(requestId, endpointURL, body, options)), + take(1) + ).subscribe((request: PostRequest) => { + this.requestService.send(request); + }); + + return this.fetchRequest(requestId); } public getRequest(method: string, options?: HttpOptions): Observable> { - return this.halService.getEndpoint(this.linkName).pipe( + const requestId = this.requestService.generateRequestId(); + + this.halService.getEndpoint(this.linkName).pipe( filter((href: string) => isNotEmpty(href)), map((endpointURL) => this.getEndpointByMethod(endpointURL, method)), distinctUntilChanged(), - map((endpointURL: string) => new GetRequest(this.requestService.generateRequestId(), endpointURL, undefined, options)), - tap((request: GetRequest) => this.requestService.send(request)), - mergeMap((request: GetRequest) => this.fetchRequest(request)), - distinctUntilChanged()); - } + map((endpointURL: string) => new GetRequest(requestId, endpointURL, undefined, options)), + take(1) + ).subscribe((request: GetRequest) => { + this.requestService.send(request); + }); + return this.fetchRequest(requestId); + } /** * Factory function to create the request object to send. This needs to be a POST client side and * a GET server side. Due to CSRF validation, the server isn't allowed to send a POST, so we allow diff --git a/src/app/core/auth/auth.reducer.ts b/src/app/core/auth/auth.reducer.ts index 6f47a3c20c..acdb8ef812 100644 --- a/src/app/core/auth/auth.reducer.ts +++ b/src/app/core/auth/auth.reducer.ts @@ -17,6 +17,7 @@ import { import { AuthTokenInfo } from './models/auth-token-info.model'; import { AuthMethod } from './models/auth.method'; import { AuthMethodType } from './models/auth.method-type'; +import { StoreActionTypes } from '../../store.actions'; /** * The auth state. @@ -251,6 +252,11 @@ export function authReducer(state: any = initialState, action: AuthActions): Aut idle: false, }); + case StoreActionTypes.REHYDRATE: + return Object.assign({}, state, { + blocking: true, + }); + default: return state; } diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index 3980b8bc28..2d49870d58 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -91,6 +91,13 @@ export class BrowserInitService extends InitService { this.initKlaro(); + // wait for auth to be ready + await this.store.pipe( + select(isAuthenticationBlocking), + distinctUntilChanged(), + find((b: boolean) => b === false) + ).toPromise(); + return true; }; } diff --git a/src/modules/app/server-init.service.ts b/src/modules/app/server-init.service.ts index 803dc7a75a..fb3539ecfa 100644 --- a/src/modules/app/server-init.service.ts +++ b/src/modules/app/server-init.service.ts @@ -6,7 +6,7 @@ * http://www.dspace.org/license/ */ import { InitService } from '../../app/init.service'; -import { Store } from '@ngrx/store'; +import { Store, select } from '@ngrx/store'; import { AppState } from '../../app/app.reducer'; import { TransferState } from '@angular/platform-browser'; import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; @@ -20,7 +20,8 @@ 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 { ThemeService } from '../../app/shared/theme-support/theme.service'; -import { take } from 'rxjs/operators'; +import { take, distinctUntilChanged, find } from 'rxjs/operators'; +import { isAuthenticationBlocking } from '../../app/core/auth/selectors'; /** * Performs server-side initialization. @@ -66,6 +67,13 @@ export class ServerInitService extends InitService { this.initRouteListeners(); this.themeService.listenForThemeChanges(false); + // wait for auth to be ready + await this.store.pipe( + select(isAuthenticationBlocking), + distinctUntilChanged(), + find((b: boolean) => b === false) + ).toPromise(); + return true; }; } From 50828e9c064965f6487270aa230e6ea277079bab Mon Sep 17 00:00:00 2001 From: Hardy Pottinger Date: Tue, 23 Aug 2022 15:17:40 -0500 Subject: [PATCH 048/119] Enable responsive font sizes - adds enable-responsive-font-sizes toggle to the main bootstrap variables scss file - [docs available](https://getbootstrap.com/docs/4.4/content/typography/#responsive-font-sizes) --- src/styles/_bootstrap_variables.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/styles/_bootstrap_variables.scss b/src/styles/_bootstrap_variables.scss index 20c0b3a679..3b06efb9d5 100644 --- a/src/styles/_bootstrap_variables.scss +++ b/src/styles/_bootstrap_variables.scss @@ -12,6 +12,9 @@ $fa-font-path: "^assets/fonts" !default; /* Images */ $image-path: "../assets/images" !default; +// enable-responsive-font-sizes allows text to scale more naturally across device and viewport sizes +$enable-responsive-font-sizes: true; + /** Bootstrap Variables **/ /* Colors */ $gray-700: #495057 !default; // Bootstrap $gray-700 From bd4190d4fcd51dac2affe5e96dab0820f82e6b73 Mon Sep 17 00:00:00 2001 From: Urban Andersson Date: Wed, 24 Aug 2022 17:39:06 +0200 Subject: [PATCH 049/119] Swedish language file for DSpace 7 (#1673) * Added Swedish language file * Small fix * Added translations * Added translations * More translations * Translations * Translations * Translations * Translations * Translations * Translations * More Swedish translations * Corrections to Swedish translations * Corrections to Swedish translations * Minor language fixes * Minor changes to Swedish translation * Restored tr.json5 --- src/assets/i18n/sv.json5 | 8078 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 8078 insertions(+) create mode 100644 src/assets/i18n/sv.json5 diff --git a/src/assets/i18n/sv.json5 b/src/assets/i18n/sv.json5 new file mode 100644 index 0000000000..0339969b31 --- /dev/null +++ b/src/assets/i18n/sv.json5 @@ -0,0 +1,8078 @@ +{ + + // "401.help": "You're not authorized to access this page. You can use the button below to get back to the home page.", + // TODO New key - Add a translation + "401.help": "Du saknar behörighet att se denna sida. Använd knappen nedan för att återvända till startsidan.", + + // "401.link.home-page": "Take me to the home page", + // TODO New key - Add a translation + "401.link.home-page": "Ta mig till startsidan", + + // "401.unauthorized": "unauthorized", + // TODO New key - Add a translation + "401.unauthorized": "obehörig", + + + // "403.help": "You don't have permission to access this page. You can use the button below to get back to the home page.", + // TODO New key - Add a translation + "403.help": "Du saknar behörighet att nå denna sida. Använd knappen nedan för att återvända till startsidan.", + + // "403.link.home-page": "Take me to the home page", + // TODO New key - Add a translation + "403.link.home-page": "Ta mig till startsidan", + + // "403.forbidden": "forbidden", + // TODO New key - Add a translation + "403.forbidden": "förbjuden", + + // "500.page-internal-server-error": "Service Unavailable", + // TODO New key - Add a translation + "500.page-internal-server-error": "Tjänsten kan inte nås", + + // "500.help": "The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.", + // TODO New key - Add a translation + "500.help": "Tjänsten är tillfälligt nere. Försök senare.", + + // "500.link.home-page": "Take me to the home page", + // TODO New key - Add a translation + "500.link.home-page": "Till startsidan", + + + // "404.help": "We can't find the page you're looking for. The page may have been moved or deleted. You can use the button below to get back to the home page. ", + // TODO New key - Add a translation + "404.help": "Sidan kan inte hittas. Den kan ha blivit flyttad eller raderad. Använd knappen nedan för att återvända till startsidan. ", + + // "404.link.home-page": "Take me to the home page", + // TODO New key - Add a translation + "404.link.home-page": "Till startsidan", + + // "404.page-not-found": "page not found", + // TODO New key - Add a translation + "404.page-not-found": "sidan hittas inte", + + // "admin.curation-tasks.breadcrumbs": "System curation tasks", + // TODO New key - Add a translation + "admin.curation-tasks.breadcrumbs": "System curation tasks", + + // "admin.curation-tasks.title": "System curation tasks", + // TODO New key - Add a translation + "admin.curation-tasks.title": "System curation tasks", + + // "admin.curation-tasks.header": "System curation tasks", + // TODO New key - Add a translation + "admin.curation-tasks.header": "System curation tasks", + + // "admin.registries.bitstream-formats.breadcrumbs": "Format registry", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.breadcrumbs": "Format registry", + + // "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.breadcrumbs": "Filformat", + + // "admin.registries.bitstream-formats.create.failure.content": "An error occurred while creating the new bitstream format.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.failure.content": "Ett fel uppstod när nytt filformat skulle skapas.", + + // "admin.registries.bitstream-formats.create.failure.head": "Failure", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.failure.head": "Misslyckades", + + // "admin.registries.bitstream-formats.create.head": "Create Bitstream format", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.head": "Skapa nytt filformat", + + // "admin.registries.bitstream-formats.create.new": "Add a new bitstream format", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.new": "Lägg till nytt filformat", + + // "admin.registries.bitstream-formats.create.success.content": "The new bitstream format was successfully created.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.success.content": "Nytt filformat har skapats.", + + // "admin.registries.bitstream-formats.create.success.head": "Success", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.create.success.head": "Lyckades", + + // "admin.registries.bitstream-formats.delete.failure.amount": "Failed to remove {{ amount }} format(s)", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.delete.failure.amount": "Misslyckades med att radera {{ amount }} format", + + // "admin.registries.bitstream-formats.delete.failure.head": "Failure", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.delete.failure.head": "Misslyckades", + + // "admin.registries.bitstream-formats.delete.success.amount": "Successfully removed {{ amount }} format(s)", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.delete.success.amount": "Har raderat {{ amount }} format", + + // "admin.registries.bitstream-formats.delete.success.head": "Success", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.delete.success.head": "Lyckades", + + // "admin.registries.bitstream-formats.description": "This list of bitstream formats provides information about known formats and their support level.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.description": "Listan innehåller information om kända filformat.", + + // "admin.registries.bitstream-formats.edit.breadcrumbs": "Bitstream format", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.breadcrumbs": "Filformat", + + // "admin.registries.bitstream-formats.edit.description.hint": "", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.description.hint": "", + + // "admin.registries.bitstream-formats.edit.description.label": "Beskrivning", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.description.label": "Beskrivning", + + // "admin.registries.bitstream-formats.edit.extensions.hint": "Extensions are file extensions that are used to automatically identify the format of uploaded files. You can enter several extensions for each format.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.extensions.hint": "Extensions are file extensions that are used to automatically identify the format of uploaded files. You can enter several extensions for each format.", + + // "admin.registries.bitstream-formats.edit.extensions.label": "File extensions", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.extensions.label": "Filtillägg", + + // "admin.registries.bitstream-formats.edit.extensions.placeholder": "Enter a file extension without the dot", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.extensions.placeholder": "Ange ett filtillägg (utan punkt)", + + // "admin.registries.bitstream-formats.edit.failure.content": "An error occurred while editing the bitstream format.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.failure.content": "Ett fel uppstod vid redigering av filformat.", + + // "admin.registries.bitstream-formats.edit.failure.head": "Failure", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.failure.head": "Misslyckades", + + // "admin.registries.bitstream-formats.edit.head": "Bitstream format: {{ format }}", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.head": "Filformat: {{ format }}", + + // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.internal.hint": "Format som har markerats som interna visas inte utåt och används enbart för administrativa syften.", + + // "admin.registries.bitstream-formats.edit.internal.label": "Internal", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.internal.label": "Interna", + + // "admin.registries.bitstream-formats.edit.mimetype.hint": "The MIME type associated with this format, does not have to be unique.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.mimetype.hint": "MIME typ som associeras med detta format, beöver inte vara unikt.", + + // "admin.registries.bitstream-formats.edit.mimetype.label": "MIME Type", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.mimetype.label": "MIME typ", + + // "admin.registries.bitstream-formats.edit.shortDescription.hint": "A unique name for this format, (e.g. Microsoft Word XP or Microsoft Word 2000)", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.shortDescription.hint": "Unikt namn för detta format, (t ex Microsoft Word XP eller Microsoft Word 2000)", + + // "admin.registries.bitstream-formats.edit.shortDescription.label": "Name", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.shortDescription.label": "Namn", + + // "admin.registries.bitstream-formats.edit.success.content": "The bitstream format was successfully edited.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.success.content": "Filformatet har ändrats.", + + // "admin.registries.bitstream-formats.edit.success.head": "Success", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.success.head": "Lyckades", + + // "admin.registries.bitstream-formats.edit.supportLevel.hint": "The level of support your institution pledges for this format.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.supportLevel.hint": "Nivån som din organisation stödjer detta format.", + + // "admin.registries.bitstream-formats.edit.supportLevel.label": "Support level", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.edit.supportLevel.label": "Supportnivå", + + // "admin.registries.bitstream-formats.head": "Bitstream Format Registry", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.head": "Filformat registry", + + // "admin.registries.bitstream-formats.no-items": "No bitstream formats to show.", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.no-items": "Det finns inga filformat att visa.", + + // "admin.registries.bitstream-formats.table.delete": "Delete selected", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.delete": "Radera markerade", + + // "admin.registries.bitstream-formats.table.deselect-all": "Deselect all", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.deselect-all": "Avmarkera alla", + + // "admin.registries.bitstream-formats.table.internal": "internal", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.internal": "interna", + + // "admin.registries.bitstream-formats.table.mimetype": "MIME Type", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.mimetype": "MIME typ", + + // "admin.registries.bitstream-formats.table.name": "Name", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.name": "Namn", + + // "admin.registries.bitstream-formats.table.return": "Back", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.return": "Tillbaka", + + // "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Känd", + + // "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Supported", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.supportLevel.SUPPORTED": "Stöds", + + // "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Unknown", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.supportLevel.UNKNOWN": "Okänd", + + // "admin.registries.bitstream-formats.table.supportLevel.head": "Support Level", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.table.supportLevel.head": "Support (nivå))", + + // "admin.registries.bitstream-formats.title": "Bitstream Format Registry", + // TODO New key - Add a translation + "admin.registries.bitstream-formats.title": "Filformat registry", + + + + // "admin.registries.metadata.breadcrumbs": "Metadata registry", + // TODO New key - Add a translation + "admin.registries.metadata.breadcrumbs": "Metadata registry", + + // "admin.registries.metadata.description": "The metadata registry maintains a list of all metadata fields available in the repository. These fields may be divided amongst multiple schemas. However, DSpace requires the qualified Dublin Core schema.", + // TODO New key - Add a translation + "admin.registries.metadata.description": "Metadata registry inneåller en lista med samtliga fält som stöds av detta repository. Fälten kan förekomma i flera scheman. DSpace kräver dock det utökade Dublin Core (qdc) schemat.", + + // "admin.registries.metadata.form.create": "Create metadata schema", + // TODO New key - Add a translation + "admin.registries.metadata.form.create": "Skapa metadataschema", + + // "admin.registries.metadata.form.edit": "Edit metadata schema", + // TODO New key - Add a translation + "admin.registries.metadata.form.edit": "Redigera metadataschema", + + // "admin.registries.metadata.form.name": "Name", + // TODO New key - Add a translation + "admin.registries.metadata.form.name": "Namn", + + // "admin.registries.metadata.form.namespace": "Namespace", + // TODO New key - Add a translation + "admin.registries.metadata.form.namespace": "Namnrymd", + + // "admin.registries.metadata.head": "Metadata Registry", + // TODO New key - Add a translation + "admin.registries.metadata.head": "Metadata registry", + + // "admin.registries.metadata.schemas.no-items": "No metadata schemas to show.", + // TODO New key - Add a translation + "admin.registries.metadata.schemas.no-items": "Det finns inga metadatascema att visa.", + + // "admin.registries.metadata.schemas.table.delete": "Delete selected", + // TODO New key - Add a translation + "admin.registries.metadata.schemas.table.delete": "Radera markerade", + + // "admin.registries.metadata.schemas.table.id": "ID", + // TODO New key - Add a translation + "admin.registries.metadata.schemas.table.id": "ID", + + // "admin.registries.metadata.schemas.table.name": "Name", + // TODO New key - Add a translation + "admin.registries.metadata.schemas.table.name": "Namn", + + // "admin.registries.metadata.schemas.table.namespace": "Namespace", + // TODO New key - Add a translation + "admin.registries.metadata.schemas.table.namespace": "Namespace", + + // "admin.registries.metadata.title": "Metadata Registry", + // TODO New key - Add a translation + "admin.registries.metadata.title": "Metadata registry", + + // "admin.registries.schema.breadcrumbs": "Metadata schema", + // TODO New key - Add a translation + "admin.registries.schema.breadcrumbs": "Metadataschema", + + // "admin.registries.schema.description": "This is the metadata schema for \"{{namespace}}\".", + // TODO New key - Add a translation + "admin.registries.schema.description": "Metadatascema för \"{{namespace}}\".", + + // "admin.registries.schema.fields.head": "Schema metadata fields", + // TODO New key - Add a translation + "admin.registries.schema.fields.head": "Schema metadata fält", + + // "admin.registries.schema.fields.no-items": "No metadata fields to show.", + // TODO New key - Add a translation + "admin.registries.schema.fields.no-items": "Det finns inga metadatafält att visa.", + + // "admin.registries.schema.fields.table.delete": "Delete selected", + // TODO New key - Add a translation + "admin.registries.schema.fields.table.delete": "Radera markerade", + + // "admin.registries.schema.fields.table.field": "Field", + // TODO New key - Add a translation + "admin.registries.schema.fields.table.field": "Fält", + + // "admin.registries.schema.fields.table.scopenote": "Scope Note", + // TODO New key - Add a translation + "admin.registries.schema.fields.table.scopenote": "Anmärkning (scope note)", + + // "admin.registries.schema.form.create": "Create metadata field", + // TODO New key - Add a translation + "admin.registries.schema.form.create": "Skapa metadatafält", + + // "admin.registries.schema.form.edit": "Edit metadata field", + // TODO New key - Add a translation + "admin.registries.schema.form.edit": "Redigera metadatafält", + + // "admin.registries.schema.form.element": "Element", + // TODO New key - Add a translation + "admin.registries.schema.form.element": "Element", + + // "admin.registries.schema.form.qualifier": "Qualifier", + // TODO New key - Add a translation + "admin.registries.schema.form.qualifier": "Qualifier", + + // "admin.registries.schema.form.scopenote": "Scope Note", + // TODO New key - Add a translation + "admin.registries.schema.form.scopenote": "Anmärkning (scope note)", + + // "admin.registries.schema.head": "Metadata Schema", + // TODO New key - Add a translation + "admin.registries.schema.head": "Metadataschema", + + // "admin.registries.schema.notification.created": "Successfully created metadata schema \"{{prefix}}\"", + // TODO New key - Add a translation + "admin.registries.schema.notification.created": "ar skapat metadataschemat \"{{prefix}}\"", + + // "admin.registries.schema.notification.deleted.failure": "Failed to delete {{amount}} metadata schemas", + // TODO New key - Add a translation + "admin.registries.schema.notification.deleted.failure": "Misslyckades med att radera {{amount}} metadatascheman", + + // "admin.registries.schema.notification.deleted.success": "Successfully deleted {{amount}} metadata schemas", + // TODO New key - Add a translation + "admin.registries.schema.notification.deleted.success": "Har raderat {{amount}} metadatascheman", + + // "admin.registries.schema.notification.edited": "Successfully edited metadata schema \"{{prefix}}\"", + // TODO New key - Add a translation + "admin.registries.schema.notification.edited": "Metadataschema \"{{prefix}}\" har redigerats", + + // "admin.registries.schema.notification.failure": "Error", + // TODO New key - Add a translation + "admin.registries.schema.notification.failure": "Fel", + + // "admin.registries.schema.notification.field.created": "Successfully created metadata field \"{{field}}\"", + // TODO New key - Add a translation + "admin.registries.schema.notification.field.created": "har skapat metadatafält \"{{field}}\"", + + // "admin.registries.schema.notification.field.deleted.failure": "Failed to delete {{amount}} metadata fields", + // TODO New key - Add a translation + "admin.registries.schema.notification.field.deleted.failure": "Misslyckades med att radera {{amount}} metadatafält", + + // "admin.registries.schema.notification.field.deleted.success": "Successfully deleted {{amount}} metadata fields", + // TODO New key - Add a translation + "admin.registries.schema.notification.field.deleted.success": "Har raderat {{amount}} metadatafält", + + // "admin.registries.schema.notification.field.edited": "Successfully edited metadata field \"{{field}}\"", + // TODO New key - Add a translation + "admin.registries.schema.notification.field.edited": "Har redigerat metadatafält \"{{field}}\"", + + // "admin.registries.schema.notification.success": "Success", + // TODO New key - Add a translation + "admin.registries.schema.notification.success": "Lyckades", + + // "admin.registries.schema.return": "Back", + // TODO New key - Add a translation + "admin.registries.schema.return": "Tillbaka", + + // "admin.registries.schema.title": "Metadata Schema Registry", + // TODO New key - Add a translation + "admin.registries.schema.title": "Metadata Schema Registry", + + + + // "admin.access-control.epeople.actions.delete": "Delete EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.actions.delete": "Radera EPerson", + + // "admin.access-control.epeople.actions.impersonate": "Impersonate EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.actions.impersonate": "Agera som EPerson", + + // "admin.access-control.epeople.actions.reset": "Reset password", + // TODO New key - Add a translation + "admin.access-control.epeople.actions.reset": "Återställ lösenord", + + // "admin.access-control.epeople.actions.stop-impersonating": "Stop impersonating EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.actions.stop-impersonating": "Sluta agera som EPerson", + + // "admin.access-control.epeople.breadcrumbs": "EPeople", + // TODO New key - Add a translation + "admin.access-control.epeople.breadcrumbs": "EPersoner", + + // "admin.access-control.epeople.title": "EPeople", + // TODO New key - Add a translation + "admin.access-control.epeople.title": "EPersoner", + + // "admin.access-control.epeople.head": "EPeople", + // TODO New key - Add a translation + "admin.access-control.epeople.head": "EPersoner", + + // "admin.access-control.epeople.search.head": "Search", + // TODO New key - Add a translation + "admin.access-control.epeople.search.head": "Sök", + + // "admin.access-control.epeople.button.see-all": "Browse All", + // TODO New key - Add a translation + "admin.access-control.epeople.button.see-all": "Bläddra bland alla", + + // "admin.access-control.epeople.search.scope.metadata": "Metadata", + // TODO New key - Add a translation + "admin.access-control.epeople.search.scope.metadata": "Metadata", + + // "admin.access-control.epeople.search.scope.email": "E-mail (exact)", + // TODO New key - Add a translation + "admin.access-control.epeople.search.scope.email": "E-post (exakt)", + + // "admin.access-control.epeople.search.button": "Search", + // TODO New key - Add a translation + "admin.access-control.epeople.search.button": "Sök", + + // "admin.access-control.epeople.search.placeholder": "Search people...", + // TODO New key - Add a translation + "admin.access-control.epeople.search.placeholder": "Sök personer...", + + // "admin.access-control.epeople.button.add": "Add EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.button.add": "Lägg till EPerson", + + // "admin.access-control.epeople.table.id": "ID", + // TODO New key - Add a translation + "admin.access-control.epeople.table.id": "ID", + + // "admin.access-control.epeople.table.name": "Name", + // TODO New key - Add a translation + "admin.access-control.epeople.table.name": "Namn", + + // "admin.access-control.epeople.table.email": "E-mail (exact)", + // TODO New key - Add a translation + "admin.access-control.epeople.table.email": "E-post (exakt)", + + // "admin.access-control.epeople.table.edit": "Edit", + // TODO New key - Add a translation + "admin.access-control.epeople.table.edit": "Redigera", + + // "admin.access-control.epeople.table.edit.buttons.edit": "Edit \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.table.edit.buttons.edit": "Redigera \"{{name}}\"", + + // "admin.access-control.epeople.table.edit.buttons.edit-disabled": "You are not authorized to edit this group", + // TODO New key - Add a translation + "admin.access-control.epeople.table.edit.buttons.edit-disabled": "Du har inte behöriget att redigera denna grupp", + + // "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.table.edit.buttons.remove": "Radera \"{{name}}\"", + + // "admin.access-control.epeople.no-items": "No EPeople to show.", + // TODO New key - Add a translation + "admin.access-control.epeople.no-items": "Det finns inga Epersoner att visa.", + + // "admin.access-control.epeople.form.create": "Create EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.form.create": "Skapa EPerson", + + // "admin.access-control.epeople.form.edit": "Edit EPerson", + // TODO New key - Add a translation + "admin.access-control.epeople.form.edit": "Redigera EPerson", + + // "admin.access-control.epeople.form.firstName": "First name", + // TODO New key - Add a translation + "admin.access-control.epeople.form.firstName": "Förnamn", + + // "admin.access-control.epeople.form.lastName": "Last name", + // TODO New key - Add a translation + "admin.access-control.epeople.form.lastName": "Efternamn", + + // "admin.access-control.epeople.form.email": "E-mail", + // TODO New key - Add a translation + "admin.access-control.epeople.form.email": "E-post", + + // "admin.access-control.epeople.form.emailHint": "Must be valid e-mail address", + // TODO New key - Add a translation + "admin.access-control.epeople.form.emailHint": "Det måste vara en giltig e-postadress", + + // "admin.access-control.epeople.form.canLogIn": "Can log in", + // TODO New key - Add a translation + "admin.access-control.epeople.form.canLogIn": "Kan logga in", + + // "admin.access-control.epeople.form.requireCertificate": "Requires certificate", + // TODO New key - Add a translation + "admin.access-control.epeople.form.requireCertificate": "Kräver certificate", + + // "admin.access-control.epeople.form.return": "Back", + // TODO New key - Add a translation + "admin.access-control.epeople.form.return": "Tillbaka", + + // "admin.access-control.epeople.form.notification.created.success": "Successfully created EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.created.success": "EPerson \"{{name}}\" har skapats", + + // "admin.access-control.epeople.form.notification.created.failure": "Failed to create EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.created.failure": "Misslyckades med att skapa EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Failed to create EPerson \"{{name}}\", email \"{{email}}\" already in use.", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.created.failure.emailInUse": "Misslyckades med att skapa EPerson \"{{name}}\", e-postadressen \"{{email}}\" används redan.", + + // "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Failed to edit EPerson \"{{name}}\", email \"{{email}}\" already in use.", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.edited.failure.emailInUse": "Misslyckades med att redigera EPerson \"{{name}}\", e-postadressen \"{{email}}\" används redan.", + + // "admin.access-control.epeople.form.notification.edited.success": "Successfully edited EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.edited.success": "EPerson \"{{name}}\" har redigerats", + + // "admin.access-control.epeople.form.notification.edited.failure": "Failed to edit EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.edited.failure": "Misslyckades med att redigera EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.notification.deleted.success": "Successfully deleted EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.deleted.success": "EPerson \"{{name}}\" har raderats", + + // "admin.access-control.epeople.form.notification.deleted.failure": "Failed to delete EPerson \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.form.notification.deleted.failure": "Misslyckades med att radera EPerson \"{{name}}\"", + + // "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Member of these groups:", + // TODO New key - Add a translation + "admin.access-control.epeople.form.groupsEPersonIsMemberOf": "Medlem i följande grupper:", + + // "admin.access-control.epeople.form.table.id": "ID", + // TODO New key - Add a translation + "admin.access-control.epeople.form.table.id": "ID", + + // "admin.access-control.epeople.form.table.name": "Name", + // TODO New key - Add a translation + "admin.access-control.epeople.form.table.name": "Namn", + + // "admin.access-control.epeople.form.table.collectionOrCommunity": "Collection/Community", + // TODO New key - Add a translation + "admin.access-control.epeople.form.table.collectionOrCommunity": "Samling/Enhet", + + // "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", + // TODO New key - Add a translation + "admin.access-control.epeople.form.memberOfNoGroups": "Denna EPerson är inte medlem i någon grupp", + + // "admin.access-control.epeople.form.goToGroups": "Add to groups", + // TODO New key - Add a translation + "admin.access-control.epeople.form.goToGroups": "Lägg till i grupper", + + // "admin.access-control.epeople.notification.deleted.failure": "Failed to delete EPerson: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.notification.deleted.failure": "Misslyckades med att radera EPerson: \"{{name}}\"", + + // "admin.access-control.epeople.notification.deleted.success": "Successfully deleted EPerson: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.epeople.notification.deleted.success": "EPerson: \"{{name}}\" har raderats", + + + + // "admin.access-control.groups.title": "Groups", + // TODO New key - Add a translation + "admin.access-control.groups.title": "Grupper", + + // "admin.access-control.groups.breadcrumbs": "Groups", + // TODO New key - Add a translation + "admin.access-control.groups.breadcrumbs": "Grupper", + + // "admin.access-control.groups.singleGroup.breadcrumbs": "Edit Group", + // TODO New key - Add a translation + "admin.access-control.groups.singleGroup.breadcrumbs": "Redigera grupp", + + // "admin.access-control.groups.title.singleGroup": "Edit Group", + // TODO New key - Add a translation + "admin.access-control.groups.title.singleGroup": "Redigera grupp", + + // "admin.access-control.groups.title.addGroup": "New Group", + // TODO New key - Add a translation + "admin.access-control.groups.title.addGroup": "Ny grupp", + + // "admin.access-control.groups.addGroup.breadcrumbs": "New Group", + // TODO New key - Add a translation + "admin.access-control.groups.addGroup.breadcrumbs": "Ny grupp", + + // "admin.access-control.groups.head": "Groups", + // TODO New key - Add a translation + "admin.access-control.groups.head": "Grupper", + + // "admin.access-control.groups.button.add": "Add group", + // TODO New key - Add a translation + "admin.access-control.groups.button.add": "Lägg till grupp", + + // "admin.access-control.groups.search.head": "Search groups", + // TODO New key - Add a translation + "admin.access-control.groups.search.head": "Sök grupper", + + // "admin.access-control.groups.button.see-all": "Browse all", + // TODO New key - Add a translation + "admin.access-control.groups.button.see-all": "Browsa alla", + + // "admin.access-control.groups.search.button": "Search", + // TODO New key - Add a translation + "admin.access-control.groups.search.button": "Sök", + + // "admin.access-control.groups.search.placeholder": "Search groups...", + // TODO New key - Add a translation + "admin.access-control.groups.search.placeholder": "Sök grupper...", + + // "admin.access-control.groups.table.id": "ID", + // TODO New key - Add a translation + "admin.access-control.groups.table.id": "ID", + + // "admin.access-control.groups.table.name": "Name", + // TODO New key - Add a translation + "admin.access-control.groups.table.name": "Namn", + + // "admin.access-control.groups.table.collectionOrCommunity": "Collection/Community", + // TODO New key - Add a translation + "admin.access-control.groups.table.collectionOrCommunity": "Samling/Enhet", + + // "admin.access-control.groups.table.members": "Members", + // TODO New key - Add a translation + "admin.access-control.groups.table.members": "Medlemmar", + + // "admin.access-control.groups.table.edit": "Edit", + // TODO New key - Add a translation + "admin.access-control.groups.table.edit": "Redigera", + + // "admin.access-control.groups.table.edit.buttons.edit": "Edit \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.table.edit.buttons.edit": "Redigera \"{{name}}\"", + + // "admin.access-control.groups.table.edit.buttons.remove": "Delete \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.table.edit.buttons.remove": "Radera \"{{name}}\"", + + // "admin.access-control.groups.no-items": "No groups found with this in their name or this as UUID", + // TODO New key - Add a translation + "admin.access-control.groups.no-items": "Ingan grupper kunde hittas", + + // "admin.access-control.groups.notification.deleted.success": "Successfully deleted group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.notification.deleted.success": "Grupp \"{{name}}\" har raderats", + + // "admin.access-control.groups.notification.deleted.failure.title": "Failed to delete group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.notification.deleted.failure.title": "Misslyckades med att radera grupp \"{{name}}\"", + + // "admin.access-control.groups.notification.deleted.failure.content": "Cause: \"{{cause}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.notification.deleted.failure.content": "Orsak: \"{{cause}}\"", + + + + // "admin.access-control.groups.form.alert.permanent": "This group is permanent, so it can't be edited or deleted. You can still add and remove group members using this page.", + // TODO New key - Add a translation + "admin.access-control.groups.form.alert.permanent": "Denna grupp är permant och kan inte raderas eller redigeras. Du kan fortfarande lägga till eller ta bort medlemmar i gruppen här.", + + // "admin.access-control.groups.form.alert.workflowGroup": "This group can’t be modified or deleted because it corresponds to a role in the submission and workflow process in the \"{{name}}\" {{comcol}}. You can delete it from the \"assign roles\" tab on the edit {{comcol}} page. You can still add and remove group members using this page.", + // TODO New key - Add a translation + "admin.access-control.groups.form.alert.workflowGroup": "Denna grupp kan inte raderas eller redigeras eftersom den används i submission eller workflow process i \"{{name}}\" {{comcol}}. Du kan radera den från fliken \"tilldela roller\" på sidan {{comcol}} för att redigera. Du kan fortfarande lägga till eller ta bort medlemmar i gruppen här.", + + // "admin.access-control.groups.form.head.create": "Create group", + // TODO New key - Add a translation + "admin.access-control.groups.form.head.create": "Skapa grupp", + + // "admin.access-control.groups.form.head.edit": "Edit group", + // TODO New key - Add a translation + "admin.access-control.groups.form.head.edit": "Redigera grupp", + + // "admin.access-control.groups.form.groupName": "Group name", + // TODO New key - Add a translation + "admin.access-control.groups.form.groupName": "Gruppens namn", + + // "admin.access-control.groups.form.groupCommunity": "Community or Collection", + // TODO New key - Add a translation + "admin.access-control.groups.form.groupCommunity": "Enhet eller samling", + + // "admin.access-control.groups.form.groupDescription": "Beskrivning", + // TODO New key - Add a translation + "admin.access-control.groups.form.groupDescription": "Beskrivning", + + // "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.created.success": "Gruppen \"{{name}}\" har skapats", + + // "admin.access-control.groups.form.notification.created.failure": "Failed to create Group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.created.failure": "Misslyckades med att skapa grupp \"{{name}}\"", + + // "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Failed to create Group with name: \"{{name}}\", make sure the name is not already in use.", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.created.failure.groupNameInUse": "Misslyckades med att skapa grupp: \"{{name}}\", kontrollera om namnet redan används.", + + // "admin.access-control.groups.form.notification.edited.failure": "Failed to edit Group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.edited.failure": "Misslyckades med att redigera grupp \"{{name}}\"", + + // "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Name \"{{name}}\" already in use!", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.edited.failure.groupNameInUse": "Namnet \"{{name}}\" används redan!", + + // "admin.access-control.groups.form.notification.edited.success": "Successfully edited Group \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.edited.success": "Gruppen \"{{name}}\" har redigerats", + + // "admin.access-control.groups.form.actions.delete": "Delete Group", + // TODO New key - Add a translation + "admin.access-control.groups.form.actions.delete": "Radera grupp", + + // "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.delete-group.modal.header": "Radera grupp \"{{ dsoName }}\"", + + // "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.delete-group.modal.info": "Är du säker på att du vill radera gruppen \"{{ dsoName }}\"", + + // "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel", + // TODO New key - Add a translation + "admin.access-control.groups.form.delete-group.modal.cancel": "Avbryt", + + // "admin.access-control.groups.form.delete-group.modal.confirm": "Delete", + // TODO New key - Add a translation + "admin.access-control.groups.form.delete-group.modal.confirm": "Radera", + + // "admin.access-control.groups.form.notification.deleted.success": "Successfully deleted group \"{{ name }}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.deleted.success": "Gruppen \"{{ name }}\" har raderats", + + // "admin.access-control.groups.form.notification.deleted.failure.title": "Failed to delete group \"{{ name }}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.deleted.failure.title": "Misslyckades med att radera grupp \"{{ name }}\"", + + // "admin.access-control.groups.form.notification.deleted.failure.content": "Cause: \"{{ cause }}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.notification.deleted.failure.content": "Orsak: \"{{ cause }}\"", + + // "admin.access-control.groups.form.members-list.head": "EPeople", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.head": "EPersoner", + + // "admin.access-control.groups.form.members-list.search.head": "Add EPeople", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.search.head": "Lägg till EPersoner", + + // "admin.access-control.groups.form.members-list.button.see-all": "Browse All", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.button.see-all": "Browsa alla", + + // "admin.access-control.groups.form.members-list.headMembers": "Current Members", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.headMembers": "Nuvarande medlemmar", + + // "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.search.scope.metadata": "Metadata", + + // "admin.access-control.groups.form.members-list.search.scope.email": "E-mail (exact)", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.search.scope.email": "E-post (exakt)", + + // "admin.access-control.groups.form.members-list.search.button": "Search", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.search.button": "Sök", + + // "admin.access-control.groups.form.members-list.table.id": "ID", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.id": "ID", + + // "admin.access-control.groups.form.members-list.table.name": "Name", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.name": "Namn", + + // "admin.access-control.groups.form.members-list.table.identity": "Identity", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.identity": "Identitet", + + // "admin.access-control.groups.form.members-list.table.email": "Email", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.email": "E-post", + + // "admin.access-control.groups.form.members-list.table.netid": "NetID", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.netid": "NetID", + + // "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.edit": "Radera / Lägg till", + + // "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Ta bort medlem \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.success.addMember": "Successfully added member: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.notification.success.addMember": "Medlem: \"{{name}}\" har lagts till", + + // "admin.access-control.groups.form.members-list.notification.failure.addMember": "Failed to add member: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.notification.failure.addMember": "Misslyckades med att lägga till medlem: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Successfully deleted member: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.notification.success.deleteMember": "Medlem: \"{{name}}\" har tagits bort", + + // "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Failed to delete member: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.notification.failure.deleteMember": "Misslyckades med att ta bort medlem: \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Add member with name \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.table.edit.buttons.add": "Lägg till medlem \"{{name}}\"", + + // "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.notification.failure.noActiveGroup": "Det finns ingen aktiv grupp, ange ett namn först.", + + // "admin.access-control.groups.form.members-list.no-members-yet": "No members in group yet, search and add.", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.no-members-yet": "Det finns inga medlemmar i gruppen, sök och Lägg till.", + + // "admin.access-control.groups.form.members-list.no-items": "No EPeople found in that search", + // TODO New key - Add a translation + "admin.access-control.groups.form.members-list.no-items": "Inga EPersoner hittades", + + // "admin.access-control.groups.form.subgroups-list.notification.failure": "Something went wrong: \"{{cause}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.failure": "Något gick fel: \"{{cause}}\"", + + // "admin.access-control.groups.form.subgroups-list.head": "Groups", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.head": "Grupper", + + // "admin.access-control.groups.form.subgroups-list.search.head": "Add Subgroup", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.search.head": "Lägg till undergrupp", + + // "admin.access-control.groups.form.subgroups-list.button.see-all": "Browse All", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.button.see-all": "Browsa alla", + + // "admin.access-control.groups.form.subgroups-list.headSubgroups": "Current Subgroups", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.headSubgroups": "Nuvarande undergrupper", + + // "admin.access-control.groups.form.subgroups-list.search.button": "Search", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.search.button": "Sök", + + // "admin.access-control.groups.form.subgroups-list.table.id": "ID", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.id": "ID", + + // "admin.access-control.groups.form.subgroups-list.table.name": "Name", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.name": "Namn", + + // "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Collection/Community", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Samling/Enhet", + + // "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.edit": "Ta bort / Lägg till", + + // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Ta bort undergrupp \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Add subgroup with name \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.edit.buttons.add": "Lägg till undergrupp \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Current group", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.table.edit.currentGroup": "Nuvarande grupp", + + // "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Successfully added subgroup: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.success.addSubgroup": "Undergrupp: \"{{name}}\" har lagts till", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Failed to add subgroup: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.failure.addSubgroup": "Misslyckades med att lägga till undergrupp: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Successfully deleted subgroup: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.success.deleteSubgroup": "Undergrupp: \"{{name}}\" har raderats", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Failed to delete subgroup: \"{{name}}\"", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.failure.deleteSubgroup": "Misslyckades med att radera undergrupp: \"{{name}}\"", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "No current active group, submit a name first.", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.failure.noActiveGroup": "Det finns ingen aktiv grupp, ange ett namn först.", + + // "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "This is the current group, can't be added.", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.notification.failure.subgroupToAddIsActiveGroup": "Detta är den aktiva gruppen, den kan inte läggas till.", + + // "admin.access-control.groups.form.subgroups-list.no-items": "No groups found with this in their name or this as UUID", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.no-items": "Inga grupper kunde hittas", + + // "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "No subgroups in group yet.", + // TODO New key - Add a translation + "admin.access-control.groups.form.subgroups-list.no-subgroups-yet": "Det finns inga undergrupper i denna grupp ännu.", + + // "admin.access-control.groups.form.return": "Back", + // TODO New key - Add a translation + "admin.access-control.groups.form.return": "Tillbaka", + + + + // "admin.search.breadcrumbs": "Administrative Search", + // TODO New key - Add a translation + "admin.search.breadcrumbs": "Admin sökning", + + // "admin.search.collection.edit": "Edit", + // TODO New key - Add a translation + "admin.search.collection.edit": "Redigera", + + // "admin.search.community.edit": "Edit", + // TODO New key - Add a translation + "admin.search.community.edit": "Redigera", + + // "admin.search.item.delete": "Delete", + // TODO New key - Add a translation + "admin.search.item.delete": "Radera", + + // "admin.search.item.edit": "Edit", + // TODO New key - Add a translation + "admin.search.item.edit": "Redigera", + + // "admin.search.item.make-private": "Make non-discoverable", + // TODO New key - Add a translation + "admin.search.item.make-private": "Undanta från sökning", + + // "admin.search.item.make-public": "Make discoverable", + // TODO New key - Add a translation + "admin.search.item.make-public": "Gör sökbar", + + // "admin.search.item.move": "Move", + // TODO New key - Add a translation + "admin.search.item.move": "Flytta", + + // "admin.search.item.reinstate": "Reinstate", + // TODO New key - Add a translation + "admin.search.item.reinstate": "Återställ", + + // "admin.search.item.withdraw": "Withdraw", + // TODO New key - Add a translation + "admin.search.item.withdraw": "Återkalla", + + // "admin.search.title": "Administrative Search", + // TODO New key - Add a translation + "admin.search.title": "Admin sökning", + + // "administrativeView.search.results.head": "Administrative Search", + // TODO New key - Add a translation + "administrativeView.search.results.head": "Admin sökning", + + + + + // "admin.workflow.breadcrumbs": "Administer Workflow", + // TODO New key - Add a translation + "admin.workflow.breadcrumbs": "Administrera arbetsflöde", + + // "admin.workflow.title": "Administer Workflow", + // TODO New key - Add a translation + "admin.workflow.title": "Administrera arbetsflöde", + + // "admin.workflow.item.workflow": "Workflow", + // TODO New key - Add a translation + "admin.workflow.item.workflow": "Arbetsflöde", + + // "admin.workflow.item.delete": "Delete", + // TODO New key - Add a translation + "admin.workflow.item.delete": "Radera", + + // "admin.workflow.item.send-back": "Send back", + // TODO New key - Add a translation + "admin.workflow.item.send-back": "Skicka tillbaka", + + + + // "admin.metadata-import.breadcrumbs": "Import Metadata", + // TODO New key - Add a translation + "admin.metadata-import.breadcrumbs": "Importera metadata", + + // "admin.metadata-import.title": "Import Metadata", + // TODO New key - Add a translation + "admin.metadata-import.title": "Importera metadata", + + // "admin.metadata-import.page.header": "Import Metadata", + // TODO New key - Add a translation + "admin.metadata-import.page.header": "Importera metadata", + + // "admin.metadata-import.page.help": "You can drop or browse CSV files that contain batch metadata operations on files here", + // TODO New key - Add a translation + "admin.metadata-import.page.help": "Du kan öppna eller dra och släppa CSV-filer som innehåller batchvisa metadaåtgärder på filer här", + + // "admin.metadata-import.page.dropMsg": "Drop a metadata CSV to import", + // TODO New key - Add a translation + "admin.metadata-import.page.dropMsg": "Dra och släpp CSV-fil för att importera", + + // "admin.metadata-import.page.dropMsgReplace": "Drop to replace the metadata CSV to import", + // TODO New key - Add a translation + "admin.metadata-import.page.dropMsgReplace": "Dra och släpp för att ersätta CSV-fil att importera", + + // "admin.metadata-import.page.button.return": "Back", + // TODO New key - Add a translation + "admin.metadata-import.page.button.return": "Tillbaka", + + // "admin.metadata-import.page.button.proceed": "Proceed", + // TODO New key - Add a translation + "admin.metadata-import.page.button.proceed": "Fortsätt", + + // "admin.metadata-import.page.error.addFile": "Select file first!", + // TODO New key - Add a translation + "admin.metadata-import.page.error.addFile": "Välj fil först!", + + + + + // "auth.errors.invalid-user": "Invalid email address or password.", + // TODO New key - Add a translation + "auth.errors.invalid-user": "Ogiltig e-postadress eller lösenord.", + + // "auth.messages.expired": "Your session has expired. Please log in again.", + // TODO New key - Add a translation + "auth.messages.expired": "Din session har upphört. Logga in igen.", + + // "auth.messages.token-refresh-failed": "Refreshing your session token failed. Please log in again.", + // TODO New key - Add a translation + "auth.messages.token-refresh-failed": "Misslyckades med att förnya session token. Logga in igen.", + + + + // "bitstream.download.page": "Now downloading {{bitstream}}..." , + // TODO New key - Add a translation + "bitstream.download.page": "Laddar ner {{bitstream}}..." , + + // "bitstream.download.page.back": "Back" , + // TODO New key - Add a translation + "bitstream.download.page.back": "Tillbaka" , + + + // "bitstream.edit.authorizations.link": "Edit bitstream's Policies", + // TODO New key - Add a translation + "bitstream.edit.authorizations.link": "Redigera policy för fil", + + // "bitstream.edit.authorizations.title": "Edit bitstream's Policies", + // TODO New key - Add a translation + "bitstream.edit.authorizations.title": "Redigera policy för fil", + + // "bitstream.edit.return": "Back", + // TODO New key - Add a translation + "bitstream.edit.return": "Tillbaka", + + // "bitstream.edit.bitstream": "Bitstream: ", + // TODO New key - Add a translation + "bitstream.edit.bitstream": "Fil: ", + + // "bitstream.edit.form.description.hint": "Optionally, provide a brief description of the file, for example \"Main article\" or \"Experiment data readings\".", + // TODO New key - Add a translation + "bitstream.edit.form.description.hint": "Du kan ange en kort beskrivning av innehållet, t ex \"Main article\" or \"Experiment data readings\".", + + // "bitstream.edit.form.description.label": "Beskrivning", + // TODO New key - Add a translation + "bitstream.edit.form.description.label": "Beskrivning", + + // "bitstream.edit.form.embargo.hint": "The first day from which access is allowed. This date cannot be modified on this form. To set an embargo date for a bitstream, go to the Item Status tab, click Authorizations..., create or edit the bitstream's READ policy, and set the Start Date as desired.", + // TODO New key - Add a translation + "bitstream.edit.form.embargo.hint": "Tidigaste datum när filen skall vara åtkomplig. Detta datum kan inte ändras här. För att ange embargodatum för en post, gå till fliken Poststatus, klicka Behörigheter..., skapa eller redigera filens READ policy, och ange startdatum.", + + // "bitstream.edit.form.embargo.label": "Embargo until specific date", + // TODO New key - Add a translation + "bitstream.edit.form.embargo.label": "Skall vara under embrgo till angivet datum", + + // "bitstream.edit.form.fileName.hint": "Change the filename for the bitstream. Note that this will change the display bitstream URL, but old links will still resolve as long as the sequence ID does not change.", + // TODO New key - Add a translation + "bitstream.edit.form.fileName.hint": "Ändra filnamnet. Detta kommer att förändra den publika URL:en, men tidigare länkar kommer att fortätta fungera som vanligt.", + + // "bitstream.edit.form.fileName.label": "Filename", + // TODO New key - Add a translation + "bitstream.edit.form.fileName.label": "Filnamn", + + // "bitstream.edit.form.newFormat.label": "Describe new format", + // TODO New key - Add a translation + "bitstream.edit.form.newFormat.label": "Beskriv nytt format", + + // "bitstream.edit.form.newFormat.hint": "The application you used to create the file, and the version number (for example, \"ACMESoft SuperApp version 1.5\").", + // TODO New key - Add a translation + "bitstream.edit.form.newFormat.hint": "Programmet som använts för att skapa filen, samt versionsnummer (t ex, \"ACMESoft SuperApp version 1.5\").", + + // "bitstream.edit.form.primaryBitstream.label": "Primary bitstream", + // TODO New key - Add a translation + "bitstream.edit.form.primaryBitstream.label": "Primär fil", + + // "bitstream.edit.form.selectedFormat.hint": "If the format is not in the above list, select \"format not in list\" above and describe it under \"Describe new format\".", + // TODO New key - Add a translation + "bitstream.edit.form.selectedFormat.hint": "Om formatet inte visas i listan ovan, välj \"formatet saknas\" och lägg till beskrivning under \"Beskriv nytt format\".", + + // "bitstream.edit.form.selectedFormat.label": "Selected Format", + // TODO New key - Add a translation + "bitstream.edit.form.selectedFormat.label": "Välj format", + + // "bitstream.edit.form.selectedFormat.unknown": "Format not in list", + // TODO New key - Add a translation + "bitstream.edit.form.selectedFormat.unknown": "Formatet saknas", + + // "bitstream.edit.notifications.error.format.title": "An error occurred saving the bitstream's format", + // TODO New key - Add a translation + "bitstream.edit.notifications.error.format.title": "Det uppstod ett fel när formatet skulle sparas", + + // "bitstream.edit.form.iiifLabel.label": "IIIF Label", + // TODO New key - Add a translation + "bitstream.edit.form.iiifLabel.label": "IIIF Label", + + // "bitstream.edit.form.iiifLabel.hint": "Canvas label for this image. If not provided default label will be used.", + // TODO New key - Add a translation + "bitstream.edit.form.iiifLabel.hint": "Canvas label for this image. If not provided default label will be used.", + + // "bitstream.edit.form.iiifToc.label": "IIIF Table of Contents", + // TODO New key - Add a translation + "bitstream.edit.form.iiifToc.label": "IIIF Table of Contents", + + // "bitstream.edit.form.iiifToc.hint": "Adding text here makes this the start of a new table of contents range.", + // TODO New key - Add a translation + "bitstream.edit.form.iiifToc.hint": "Adding text here makes this the start of a new table of contents range.", + + // "bitstream.edit.form.iiifWidth.label": "IIIF Canvas Width", + // TODO New key - Add a translation + "bitstream.edit.form.iiifWidth.label": "IIIF Canvas Width", + + // "bitstream.edit.form.iiifWidth.hint": "The canvas width should usually match the image width.", + // TODO New key - Add a translation + "bitstream.edit.form.iiifWidth.hint": "The canvas width should usually match the image width.", + + // "bitstream.edit.form.iiifHeight.label": "IIIF Canvas Height", + // TODO New key - Add a translation + "bitstream.edit.form.iiifHeight.label": "IIIF Canvas Height", + + // "bitstream.edit.form.iiifHeight.hint": "The canvas height should usually match the image height.", + // TODO New key - Add a translation + "bitstream.edit.form.iiifHeight.hint": "The canvas height should usually match the image height.", + + + // "bitstream.edit.notifications.saved.content": "Your changes to this bitstream were saved.", + // TODO New key - Add a translation + "bitstream.edit.notifications.saved.content": "Ändringarna sparades.", + + // "bitstream.edit.notifications.saved.title": "Bitstream saved", + // TODO New key - Add a translation + "bitstream.edit.notifications.saved.title": "Filen har sparats", + + // "bitstream.edit.title": "Edit bitstream", + // TODO New key - Add a translation + "bitstream.edit.title": "Redigera fil", + + // "bitstream-request-a-copy.alert.canDownload1": "You already have access to this file. If you want to download the file, click ", + // TODO New key - Add a translation + "bitstream-request-a-copy.alert.canDownload1": "Du har redan åtkomst till denna, för att ladda ner den, klicka ", + + // "bitstream-request-a-copy.alert.canDownload2": "here", + // TODO New key - Add a translation + "bitstream-request-a-copy.alert.canDownload2": "här", + + // "bitstream-request-a-copy.header": "Request a copy of the file", + // TODO New key - Add a translation + "bitstream-request-a-copy.header": "Begär en kopia av filen", + + // "bitstream-request-a-copy.intro": "Enter the following information to request a copy for the following item: ", + // TODO New key - Add a translation + "bitstream-request-a-copy.intro": "Ange följande information för att begära en kopia: ", + + // "bitstream-request-a-copy.intro.bitstream.one": "Requesting the following file: ", + // TODO New key - Add a translation + "bitstream-request-a-copy.intro.bitstream.one": "Önskar följande fil: ", + // "bitstream-request-a-copy.intro.bitstream.all": "Requesting all files. ", + // TODO New key - Add a translation + "bitstream-request-a-copy.intro.bitstream.all": "Önskar samtliga filer. ", + + // "bitstream-request-a-copy.name.label": "Name *", + // TODO New key - Add a translation + "bitstream-request-a-copy.name.label": "Namn *", + + // "bitstream-request-a-copy.name.error": "The name is required", + // TODO New key - Add a translation + "bitstream-request-a-copy.name.error": "Namn måste anges", + + // "bitstream-request-a-copy.email.label": "Your e-mail address *", + // TODO New key - Add a translation + "bitstream-request-a-copy.email.label": "E-post *", + + // "bitstream-request-a-copy.email.hint": "This email address is used for sending the file.", + // TODO New key - Add a translation + "bitstream-request-a-copy.email.hint": "Filen kommer skickas till denna e-postadress.", + + // "bitstream-request-a-copy.email.error": "Please enter a valid email address.", + // TODO New key - Add a translation + "bitstream-request-a-copy.email.error": "Ange en giltig e-postadress.", + + // "bitstream-request-a-copy.allfiles.label": "Files", + // TODO New key - Add a translation + "bitstream-request-a-copy.allfiles.label": "Filer", + + // "bitstream-request-a-copy.files-all-false.label": "Only the requested file", + // TODO New key - Add a translation + "bitstream-request-a-copy.files-all-false.label": "Endast den begärda filen", + + // "bitstream-request-a-copy.files-all-true.label": "All files (of this item) in restricted access", + // TODO New key - Add a translation + "bitstream-request-a-copy.files-all-true.label": "Alla filer (i denna post) som har begränsad åtkomst", + + // "bitstream-request-a-copy.message.label": "Message", + // TODO New key - Add a translation + "bitstream-request-a-copy.message.label": "Meddelande", + + // "bitstream-request-a-copy.return": "Back", + // TODO New key - Add a translation + "bitstream-request-a-copy.return": "Tillbaka", + + // "bitstream-request-a-copy.submit": "Request copy", + // TODO New key - Add a translation + "bitstream-request-a-copy.submit": "Begär kopia", + + // "bitstream-request-a-copy.submit.success": "The item request was submitted successfully.", + // TODO New key - Add a translation + "bitstream-request-a-copy.submit.success": "Begäran har skickats.", + + // "bitstream-request-a-copy.submit.error": "Something went wrong with submitting the item request.", + // TODO New key - Add a translation + "bitstream-request-a-copy.submit.error": "Ett fel uppstod när begäran skulle skickas.", + + + + // "browse.comcol.by.author": "By Author", + // TODO New key - Add a translation + "browse.comcol.by.author": "Författare", + + // "browse.comcol.by.dateissued": "By Issue Date", + // TODO New key - Add a translation + "browse.comcol.by.dateissued": "Datum", + + // "browse.comcol.by.subject": "By Subject", + // TODO New key - Add a translation + "browse.comcol.by.subject": "Ämne", + + // "browse.comcol.by.title": "By Title", + // TODO New key - Add a translation + "browse.comcol.by.title": "Titel", + + // "browse.comcol.head": "Browse", + // TODO New key - Add a translation + "browse.comcol.head": "Browse", + + // "browse.empty": "No items to show.", + // TODO New key - Add a translation + "browse.empty": "Inga poster att visa.", + + // "browse.metadata.author": "Author", + // TODO New key - Add a translation + "browse.metadata.author": "Författare", + + // "browse.metadata.dateissued": "Issue Date", + // TODO New key - Add a translation + "browse.metadata.dateissued": "Publicerad", + + // "browse.metadata.subject": "Subject", + // TODO New key - Add a translation + "browse.metadata.subject": "Ämnesord", + + // "browse.metadata.title": "Title", + // TODO New key - Add a translation + "browse.metadata.title": "Titel", + + // "browse.metadata.author.breadcrumbs": "Browse by Author", + // TODO New key - Add a translation + "browse.metadata.author.breadcrumbs": "Författare", + + // "browse.metadata.dateissued.breadcrumbs": "Browse by Date", + // TODO New key - Add a translation + "browse.metadata.dateissued.breadcrumbs": "Publiceringsdatum", + + // "browse.metadata.subject.breadcrumbs": "Browse by Subject", + // TODO New key - Add a translation + "browse.metadata.subject.breadcrumbs": "Ämnen", + + // "browse.metadata.title.breadcrumbs": "Browse by Title", + // TODO New key - Add a translation + "browse.metadata.title.breadcrumbs": "Titlar", + + // "pagination.next.button": "Next", + // TODO New key - Add a translation + "pagination.next.button": "Nästa", + + // "pagination.previous.button": "Föregående", + // TODO New key - Add a translation + "pagination.previous.button": "Föregående", + + // "browse.startsWith.choose_start": "(Choose start)", + // TODO New key - Add a translation + "browse.startsWith.choose_start": "(Välj startdatum)", + + // "browse.startsWith.choose_year": "(Välj årtal)", + // TODO New key - Add a translation + "browse.startsWith.choose_year": "(Välj årtal)", + + // "browse.startsWith.choose_year.label": "Choose the issue year", + // TODO New key - Add a translation + "browse.startsWith.choose_year.label": "Välj år", + + // "browse.startsWith.jump": "Jump to a point in the index:", + // TODO New key - Add a translation + "browse.startsWith.jump": "Gå direkt till:", + + // "browse.startsWith.months.april": "April", + // TODO New key - Add a translation + "browse.startsWith.months.april": "April", + + // "browse.startsWith.months.august": "August", + // TODO New key - Add a translation + "browse.startsWith.months.august": "Augusti", + + // "browse.startsWith.months.december": "December", + // TODO New key - Add a translation + "browse.startsWith.months.december": "December", + + // "browse.startsWith.months.february": "February", + // TODO New key - Add a translation + "browse.startsWith.months.february": "Februari", + + // "browse.startsWith.months.january": "January", + // TODO New key - Add a translation + "browse.startsWith.months.january": "Januari", + + // "browse.startsWith.months.july": "July", + // TODO New key - Add a translation + "browse.startsWith.months.july": "Juli", + + // "browse.startsWith.months.june": "June", + // TODO New key - Add a translation + "browse.startsWith.months.june": "June", + + // "browse.startsWith.months.march": "March", + // TODO New key - Add a translation + "browse.startsWith.months.march": "Mars", + + // "browse.startsWith.months.may": "May", + // TODO New key - Add a translation + "browse.startsWith.months.may": "Maj", + + // "browse.startsWith.months.none": "(Välj månad)", + // TODO New key - Add a translation + "browse.startsWith.months.none": "(Välj månad)", + + // "browse.startsWith.months.none.label": "Choose the issue month", + // TODO New key - Add a translation + "browse.startsWith.months.none.label": "Välj utgivningsmånad", + + // "browse.startsWith.months.november": "November", + // TODO New key - Add a translation + "browse.startsWith.months.november": "November", + + // "browse.startsWith.months.october": "October", + // TODO New key - Add a translation + "browse.startsWith.months.october": "Oktober", + + // "browse.startsWith.months.september": "September", + // TODO New key - Add a translation + "browse.startsWith.months.september": "September", + + // "browse.startsWith.submit": "Browse", + // TODO New key - Add a translation + "browse.startsWith.submit": "Browse", + + // "browse.startsWith.type_date": "Or type in a date (year-month) and click 'Browse'", + // TODO New key - Add a translation + "browse.startsWith.type_date": "Eller skriv in ett datum (år-månad) och klicka på 'Browse'", + + // "browse.startsWith.type_date.label": "Or type in a date (year-month) and click on the Browse button", + // TODO New key - Add a translation + "browse.startsWith.type_date.label": "Eller skriv in ett datum (år-månad) och klicka på 'Browse'", + + // "browse.startsWith.type_text": "Type the first few letters and click on the Browse button", + // TODO New key - Add a translation + "browse.startsWith.type_text": "Ange de första bokstäverna och klicka på 'Browse'", + + // "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", + // TODO New key - Add a translation + "browse.title": "Browsar {{ collection }} efter {{ field }} {{ value }}", + + + // "chips.remove": "Remove chip", + // TODO New key - Add a translation + "chips.remove": "Radera chip", + + + + // "collection.create.head": "Create a Collection", + // TODO New key - Add a translation + "collection.create.head": "Skapa samling", + + // "collection.create.notifications.success": "Successfully created the Collection", + // TODO New key - Add a translation + "collection.create.notifications.success": "Samlingen har skapats", + + // "collection.create.sub-head": "Create a Collection for Community {{ parent }}", + // TODO New key - Add a translation + "collection.create.sub-head": "Skapa en samling i enhet {{ parent }}", + + // "collection.curate.header": "Curate Collection: {{collection}}", + // TODO New key - Add a translation + "collection.curate.header": "Kurera samling: {{collection}}", + + // "collection.delete.cancel": "Cancel", + // TODO New key - Add a translation + "collection.delete.cancel": "Avbryt", + + // "collection.delete.confirm": "Confirm", + // TODO New key - Add a translation + "collection.delete.confirm": "Bekräfta", + + // "collection.delete.processing": "Deleting", + // TODO New key - Add a translation + "collection.delete.processing": "Raderar", + + // "collection.delete.head": "Delete Collection", + // TODO New key - Add a translation + "collection.delete.head": "Radera samling", + + // "collection.delete.notification.fail": "Collection could not be deleted", + // TODO New key - Add a translation + "collection.delete.notification.fail": "Samlingen kunde inte raderas", + + // "collection.delete.notification.success": "Successfully deleted collection", + // TODO New key - Add a translation + "collection.delete.notification.success": "Samlingen har raderats", + + // "collection.delete.text": "Are you sure you want to delete collection \"{{ dso }}\"", + // TODO New key - Add a translation + "collection.delete.text": "Är du säker på att du vill radera denna samling: \"{{ dso }}\"", + + + + // "collection.edit.delete": "Delete this collection", + // TODO New key - Add a translation + "collection.edit.delete": "Radera denna samling", + + // "collection.edit.head": "Edit Collection", + // TODO New key - Add a translation + "collection.edit.head": "Redigera denna samling", + + // "collection.edit.breadcrumbs": "Edit Collection", + // TODO New key - Add a translation + "collection.edit.breadcrumbs": "Redigera samling", + + + + // "collection.edit.tabs.mapper.head": "Item Mapper", + // TODO New key - Add a translation + "collection.edit.tabs.mapper.head": "Mappa poster", + + // "collection.edit.tabs.item-mapper.title": "Collection Edit - Item Mapper", + // TODO New key - Add a translation + "collection.edit.tabs.item-mapper.title": "Redigera samling - Mappa poster", + + // "collection.edit.item-mapper.cancel": "Cancel", + // TODO New key - Add a translation + "collection.edit.item-mapper.cancel": "Avbryt", + + // "collection.edit.item-mapper.collection": "Collection: \"{{name}}\"", + // TODO New key - Add a translation + "collection.edit.item-mapper.collection": "Samling: \"{{name}}\"", + + // "collection.edit.item-mapper.confirm": "Map selected items", + // TODO New key - Add a translation + "collection.edit.item-mapper.confirm": "Mappa markerade poster", + + // "collection.edit.item-mapper.description": "This is the item mapper tool that allows collection administrators to map items from other collections into this collection. You can search for items from other collections and map them, or browse the list of currently mapped items.", + // TODO New key - Add a translation + "collection.edit.item-mapper.description": "Detta är ett verktyg som möjliggör för administratörer att mappa poster från andra samlingar till denna. Sök efter poster för att mappa, eller lista redan mappade poster.", + + // "collection.edit.item-mapper.head": "Item Mapper - Map Items from Other Collections", + // TODO New key - Add a translation + "collection.edit.item-mapper.head": "Mappa poster - Mappa poster från andra samlingar", + + // "collection.edit.item-mapper.no-search": "Please enter a query to search", + // TODO New key - Add a translation + "collection.edit.item-mapper.no-search": "Ange en sökfråga", + + // "collection.edit.item-mapper.notifications.map.error.content": "Errors occurred for mapping of {{amount}} items.", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.map.error.content": "Ett fel uppstod vid mappningen för {{amount}} poster.", + + // "collection.edit.item-mapper.notifications.map.error.head": "Mapping errors", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.map.error.head": "Mappningsfel", + + // "collection.edit.item-mapper.notifications.map.success.content": "Successfully mapped {{amount}} items.", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.map.success.content": "{{amount}} poster har mappats.", + + // "collection.edit.item-mapper.notifications.map.success.head": "Mapping completed", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.map.success.head": "Mappningen har slutförts", + + // "collection.edit.item-mapper.notifications.unmap.error.content": "Errors occurred for removing the mappings of {{amount}} items.", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.unmap.error.content": "Fel vid mappningen uppstod för {{amount}} poster.", + + // "collection.edit.item-mapper.notifications.unmap.error.head": "Remove mapping errors", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.unmap.error.head": "Ta bort mappningsfel", + + // "collection.edit.item-mapper.notifications.unmap.success.content": "Successfully removed the mappings of {{amount}} items.", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.unmap.success.content": "Mappningen för {{amount}} poster har tagits bort.", + + // "collection.edit.item-mapper.notifications.unmap.success.head": "Remove mapping completed", + // TODO New key - Add a translation + "collection.edit.item-mapper.notifications.unmap.success.head": "Mappning har tagits bort", + + // "collection.edit.item-mapper.remove": "Remove selected item mappings", + // TODO New key - Add a translation + "collection.edit.item-mapper.remove": "Ta bort markerade mappningar", + + // "collection.edit.item-mapper.search-form.placeholder": "Search items...", + // TODO New key - Add a translation + "collection.edit.item-mapper.search-form.placeholder": "Sök...", + + // "collection.edit.item-mapper.tabs.browse": "Browse mapped items", + // TODO New key - Add a translation + "collection.edit.item-mapper.tabs.browse": "Browsa mappade poster", + + // "collection.edit.item-mapper.tabs.map": "Map new items", + // TODO New key - Add a translation + "collection.edit.item-mapper.tabs.map": "Mappa nya poster", + + + // "collection.edit.logo.delete.title": "Delete logo", + // TODO New key - Add a translation + "collection.edit.logo.delete.title": "Radera logga", + + // "collection.edit.logo.delete-undo.title": "Undo delete", + // TODO New key - Add a translation + "collection.edit.logo.delete-undo.title": "Ångra radera", + + // "collection.edit.logo.label": "Collection logo", + // TODO New key - Add a translation + "collection.edit.logo.label": "Logga för samlingen", + + // "collection.edit.logo.notifications.add.error": "Uploading Collection logo failed. Please verify the content before retrying.", + // TODO New key - Add a translation + "collection.edit.logo.notifications.add.error": "Uppladdning av logga för samlingen misslyckades. Kontrollera filen och försök igen.", + + // "collection.edit.logo.notifications.add.success": "Upload Collection logo successful.", + // TODO New key - Add a translation + "collection.edit.logo.notifications.add.success": "Logga för samlingen har laddats upp.", + + // "collection.edit.logo.notifications.delete.success.title": "Logo deleted", + // TODO New key - Add a translation + "collection.edit.logo.notifications.delete.success.title": "Logga har raderats", + + // "collection.edit.logo.notifications.delete.success.content": "Successfully deleted the collection's logo", + // TODO New key - Add a translation + "collection.edit.logo.notifications.delete.success.content": "Samlingens logga har raderats", + + // "collection.edit.logo.notifications.delete.error.title": "Error deleting logo", + // TODO New key - Add a translation + "collection.edit.logo.notifications.delete.error.title": "Ett fel uppstod när logga skulle raderas", + + // "collection.edit.logo.upload": "Drop a Collection Logo to upload", + // TODO New key - Add a translation + "collection.edit.logo.upload": "Släpp en logga här för att ladda upp", + + + + // "collection.edit.notifications.success": "Successfully edited the Collection", + // TODO New key - Add a translation + "collection.edit.notifications.success": "Samlingen har redigerats", + + // "collection.edit.return": "Back", + // TODO New key - Add a translation + "collection.edit.return": "Tillbaka", + + + + // "collection.edit.tabs.curate.head": "Curate", + // TODO New key - Add a translation + "collection.edit.tabs.curate.head": "Kurera", + + // "collection.edit.tabs.curate.title": "Collection Edit - Curate", + // TODO New key - Add a translation + "collection.edit.tabs.curate.title": "Redigera samling - kurera", + + // "collection.edit.tabs.authorizations.head": "Authorizations", + // TODO New key - Add a translation + "collection.edit.tabs.authorizations.head": "Behörigheter", + + // "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", + // TODO New key - Add a translation + "collection.edit.tabs.authorizations.title": "Redigera samling - Behörigheter", + + // "collection.edit.tabs.metadata.head": "Edit Metadata", + // TODO New key - Add a translation + "collection.edit.tabs.metadata.head": "Redigera metadata", + + // "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", + // TODO New key - Add a translation + "collection.edit.tabs.metadata.title": "Redigera samling - Metadata", + + // "collection.edit.tabs.roles.head": "Assign Roles", + // TODO New key - Add a translation + "collection.edit.tabs.roles.head": "Tilldela behörighet (roller)", + + // "collection.edit.tabs.roles.title": "Collection Edit - Roles", + // TODO New key - Add a translation + "collection.edit.tabs.roles.title": "Redigera samling - Behörigheter", + + // "collection.edit.tabs.source.external": "This collection harvests its content from an external source", + // TODO New key - Add a translation + "collection.edit.tabs.source.external": "Denna samling höstar in sitt innehåll från en extern källa", + + // "collection.edit.tabs.source.form.errors.oaiSource.required": "You must provide a set id of the target collection.", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.errors.oaiSource.required": "Du måste ange set id för målsamlingen.", + + // "collection.edit.tabs.source.form.harvestType": "Content being harvested", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.harvestType": "Innehåll höstas in", + + // "collection.edit.tabs.source.form.head": "Configure an external source", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.head": "Konfigurera en extern källa", + + // "collection.edit.tabs.source.form.metadataConfigId": "Metadata Format", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.metadataConfigId": "Metadataformat", + + // "collection.edit.tabs.source.form.oaiSetId": "OAI specific set id", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.oaiSetId": "OAI specifikt set id", + + // "collection.edit.tabs.source.form.oaiSource": "OAI Provider", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.oaiSource": "OAI Provider", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Harvest metadata and bitstreams (requires ORE support)", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_BITSTREAMS": "Hösta både metadata och filer (kräver stöd för ORE)", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Harvest metadata and references to bitstreams (requires ORE support)", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.options.harvestType.METADATA_AND_REF": "Hösta både metadata och referenser till filer (kräver stöd för ORE)", + + // "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Harvest metadata only", + // TODO New key - Add a translation + "collection.edit.tabs.source.form.options.harvestType.METADATA_ONLY": "Hösta enbart metadata", + + // "collection.edit.tabs.source.head": "Content Source", + // TODO New key - Add a translation + "collection.edit.tabs.source.head": "Källa för innehåll", + + // "collection.edit.tabs.source.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.discarded.content": "Ändringarna sparades inte. För att återkalla dina förändringar, klicka 'Ångra'", + + // "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.discarded.title": "Changed discarded", + + // "collection.edit.tabs.source.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.invalid.content": "Ändringarna sparades inte. Kontrollera att alla fält är giltiga och försök att spara igen.", + + // "collection.edit.tabs.source.notifications.invalid.title": "Metadata invalid", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.invalid.title": "Metadatan är ogiltig", + + // "collection.edit.tabs.source.notifications.saved.content": "Your changes to this collection's content source were saved.", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.saved.content": "Ändringarna har sparats.", + + // "collection.edit.tabs.source.notifications.saved.title": "Content Source saved", + // TODO New key - Add a translation + "collection.edit.tabs.source.notifications.saved.title": "Källa sparades.", + + // "collection.edit.tabs.source.title": "Collection Edit - Content Source", + // TODO New key - Add a translation + "collection.edit.tabs.source.title": "Redigera samling - Källa för innehåll", + + + + // "collection.edit.template.add-button": "Add", + // TODO New key - Add a translation + "collection.edit.template.add-button": "Lägg till", + + // "collection.edit.template.breadcrumbs": "Item template", + // TODO New key - Add a translation + "collection.edit.template.breadcrumbs": "postmall", + + // "collection.edit.template.cancel": "Cancel", + // TODO New key - Add a translation + "collection.edit.template.cancel": "Avbryt", + + // "collection.edit.template.delete-button": "Delete", + // TODO New key - Add a translation + "collection.edit.template.delete-button": "Radera", + + // "collection.edit.template.edit-button": "Edit", + // TODO New key - Add a translation + "collection.edit.template.edit-button": "Redigera", + + // "collection.edit.template.error": "An error occurred retrieving the template item", + // TODO New key - Add a translation + "collection.edit.template.error": "Ett fel uppstod när mallen hämtades", + + // "collection.edit.template.head": "Edit Template Item for Collection \"{{ collection }}\"", + // TODO New key - Add a translation + "collection.edit.template.head": "Redigera postmall för samlingen \"{{ collection }}\"", + + // "collection.edit.template.label": "Template item", + // TODO New key - Add a translation + "collection.edit.template.label": "Postmall", + + // "collection.edit.template.loading": "Loading template item...", + // TODO New key - Add a translation + "collection.edit.template.loading": "Laddar postmall...", + + // "collection.edit.template.notifications.delete.error": "Failed to delete the item template", + // TODO New key - Add a translation + "collection.edit.template.notifications.delete.error": "Misslickades med att radera postmall", + + // "collection.edit.template.notifications.delete.success": "Successfully deleted the item template", + // TODO New key - Add a translation + "collection.edit.template.notifications.delete.success": "Postmall har raderats", + + // "collection.edit.template.title": "Edit Template Item", + // TODO New key - Add a translation + "collection.edit.template.title": "Redigera postmall", + + + + // "collection.form.abstract": "Short Beskrivning", + // TODO New key - Add a translation + "collection.form.abstract": "Kort beskrivning", + + // "collection.form.description": "Introductory text (HTML)", + // TODO New key - Add a translation + "collection.form.description": "Inledande text (HTML)", + + // "collection.form.errors.title.required": "Please enter a collection name", + // TODO New key - Add a translation + "collection.form.errors.title.required": "Ange ett namn för samlingen", + + // "collection.form.license": "License", + // TODO New key - Add a translation + "collection.form.license": "Licens", + + // "collection.form.provenance": "Provenance", + // TODO New key - Add a translation + "collection.form.provenance": "Provenance", + + // "collection.form.rights": "Copyright text (HTML)", + // TODO New key - Add a translation + "collection.form.rights": "Copyright text (HTML)", + + // "collection.form.tableofcontents": "News (HTML)", + // TODO New key - Add a translation + "collection.form.tableofcontents": "Nyheter (HTML)", + + // "collection.form.title": "Name", + // TODO New key - Add a translation + "collection.form.title": "Namn", + + // "collection.form.entityType": "Entity Type", + // TODO New key - Add a translation + "collection.form.entityType": "Entitetstyp", + + + + // "collection.listelement.badge": "Collection", + // TODO New key - Add a translation + "collection.listelement.badge": "Samling", + + + + // "collection.page.browse.recent.head": "Recent Submissions", + // TODO New key - Add a translation + "collection.page.browse.recent.head": "Senast publicerade", + + // "collection.page.browse.recent.empty": "No items to show", + // TODO New key - Add a translation + "collection.page.browse.recent.empty": "Det finns ingenting att visa", + + // "collection.page.edit": "Edit this collection", + // TODO New key - Add a translation + "collection.page.edit": "Redigera denna samling", + + // "collection.page.handle": "Permanent URI for this collection", + // TODO New key - Add a translation + "collection.page.handle": "Använd denna länk för att länka till denna samling:", + + // "collection.page.license": "License", + // TODO New key - Add a translation + "collection.page.license": "Licens", + + // "collection.page.news": "News", + // TODO New key - Add a translation + "collection.page.news": "Nyheter", + + + + // "collection.select.confirm": "Confirm selected", + // TODO New key - Add a translation + "collection.select.confirm": "Bekräfta val", + + // "collection.select.empty": "No collections to show", + // TODO New key - Add a translation + "collection.select.empty": "Det finns inga samlingar att visa", + + // "collection.select.table.title": "Title", + // TODO New key - Add a translation + "collection.select.table.title": "Titel", + + + // "collection.source.controls.head": "Harvest Controls", + // TODO New key - Add a translation + "collection.source.controls.head": "Inställningar för höstning", + // "collection.source.controls.test.submit.error": "Something went wrong with initiating the testing of the settings", + // TODO New key - Add a translation + "collection.source.controls.test.submit.error": "Något gick fel när testet av inställningarna initierades", + // "collection.source.controls.test.failed": "The script to test the settings has failed", + // TODO New key - Add a translation + "collection.source.controls.test.failed": "Skriptet som testar inställningarna kunde inte köras", + // "collection.source.controls.test.completed": "The script to test the settings has successfully finished", + // TODO New key - Add a translation + "collection.source.controls.test.completed": "Skriptet som testar inställningarna har körts med lyckat resultat", + // "collection.source.controls.test.submit": "Test configuration", + // TODO New key - Add a translation + "collection.source.controls.test.submit": "Testa konfigurationen", + // "collection.source.controls.test.running": "Testing configuration...", + // TODO New key - Add a translation + "collection.source.controls.test.running": "Testar konfigurationen...", + // "collection.source.controls.import.submit.success": "The import has been successfully initiated", + // TODO New key - Add a translation + "collection.source.controls.import.submit.success": "Importen har initierats", + // "collection.source.controls.import.submit.error": "Something went wrong with initiating the import", + // TODO New key - Add a translation + "collection.source.controls.import.submit.error": "Något gick fel när importen skulle initieras", + // "collection.source.controls.import.submit": "Import now", + // TODO New key - Add a translation + "collection.source.controls.import.submit": "Importera nu", + // "collection.source.controls.import.running": "Importing...", + // TODO New key - Add a translation + "collection.source.controls.import.running": "Importerar...", + // "collection.source.controls.import.failed": "An error occurred during the import", + // TODO New key - Add a translation + "collection.source.controls.import.failed": "Ett fel uppstod under importen", + // "collection.source.controls.import.completed": "The import completed", + // TODO New key - Add a translation + "collection.source.controls.import.completed": "Importen har slutförts", + // "collection.source.controls.reset.submit.success": "The reset and reimport has been successfully initiated", + // TODO New key - Add a translation + "collection.source.controls.reset.submit.success": "Återställning och omimport har initierats", + // "collection.source.controls.reset.submit.error": "Something went wrong with initiating the reset and reimport", + // TODO New key - Add a translation + "collection.source.controls.reset.submit.error": "Något gick fel vid initiering av återställning och omimport", + // "collection.source.controls.reset.failed": "An error occurred during the reset and reimport", + // TODO New key - Add a translation + "collection.source.controls.reset.failed": "Ett fel uppstod under återställning och omimport", + // "collection.source.controls.reset.completed": "The reset and reimport completed", + // TODO New key - Add a translation + "collection.source.controls.reset.completed": "Återställningen och omimporten har slutförts", + // "collection.source.controls.reset.submit": "Reset and reimport", + // TODO New key - Add a translation + "collection.source.controls.reset.submit": "Återställ och importera om", + // "collection.source.controls.reset.running": "Resetting and reimporting...", + // TODO New key - Add a translation + "collection.source.controls.reset.running": "Återställer och importerar om...", + // "collection.source.controls.harvest.status": "Harvest status:", + // TODO New key - Add a translation + "collection.source.controls.harvest.status": "Status:", + // "collection.source.controls.harvest.start": "Harvest start time:", + // TODO New key - Add a translation + "collection.source.controls.harvest.start": "Starttid:", + // "collection.source.controls.harvest.last": "Last time harvested:", + // TODO New key - Add a translation + "collection.source.controls.harvest.last": "Senaste höstning:", + // "collection.source.controls.harvest.message": "Harvest info:", + // TODO New key - Add a translation + "collection.source.controls.harvest.message": "Info om höstning:", + // "collection.source.controls.harvest.no-information": "N/A", + // TODO New key - Add a translation + "collection.source.controls.harvest.no-information": "saknas", + + + // "collection.source.update.notifications.error.content": "The provided settings have been tested and didn't work.", + // TODO New key - Add a translation + "collection.source.update.notifications.error.content": "Inställningarna har testats och fungerade inte.", + + // "collection.source.update.notifications.error.title": "Server Error", + // TODO New key - Add a translation + "collection.source.update.notifications.error.title": "Serverfel", + + + + // "communityList.breadcrumbs": "Community List", + // TODO New key - Add a translation + "communityList.breadcrumbs": "Enheter", + + // "communityList.tabTitle": "Community List", + // TODO New key - Add a translation + "communityList.tabTitle": "Enheter", + + // "communityList.title": "Samlingar i Chalmers ODR", + // TODO New key - Add a translation + "communityList.title": "Samlingar i Chalmers ODR", + + // "communityList.showMore": "Show More", + // TODO New key - Add a translation + "communityList.showMore": "Visa fler", + + + + // "community.create.head": "Create a Community", + // TODO New key - Add a translation + "community.create.head": "Skapa en ny enhet", + + // "community.create.notifications.success": "Successfully created the Community", + // TODO New key - Add a translation + "community.create.notifications.success": "Enheten har skapats", + + // "community.create.sub-head": "Create a Sub-Community for Community {{ parent }}", + // TODO New key - Add a translation + "community.create.sub-head": "Skapa en underenhet till enheten {{ parent }}", + + // "community.curate.header": "Curate Community: {{community}}", + // TODO New key - Add a translation + "community.curate.header": "Kurera enhet: {{community}}", + + // "community.delete.cancel": "Cancel", + // TODO New key - Add a translation + "community.delete.cancel": "Avbryt", + + // "community.delete.confirm": "Confirm", + // TODO New key - Add a translation + "community.delete.confirm": "Bekräfta", + + // "community.delete.processing": "Deleting...", + // TODO New key - Add a translation + "community.delete.processing": "Raderar...", + + // "community.delete.head": "Delete Community", + // TODO New key - Add a translation + "community.delete.head": "Radera enhet", + + // "community.delete.notification.fail": "Community could not be deleted", + // TODO New key - Add a translation + "community.delete.notification.fail": "Eneten kunde inte raderas", + + // "community.delete.notification.success": "Successfully deleted community", + // TODO New key - Add a translation + "community.delete.notification.success": "Enheten har raderats", + + // "community.delete.text": "Are you sure you want to delete community \"{{ dso }}\"", + // TODO New key - Add a translation + "community.delete.text": "Är du säker på att du vill radera denna enhet \"{{ dso }}\"", + + // "community.edit.delete": "Delete this community", + // TODO New key - Add a translation + "community.edit.delete": "Radera denna enhet", + + // "community.edit.head": "Edit Community", + // TODO New key - Add a translation + "community.edit.head": "Redigera enhet", + + // "community.edit.breadcrumbs": "Edit Community", + // TODO New key - Add a translation + "community.edit.breadcrumbs": "Redigera enhet", + + + // "community.edit.logo.delete.title": "Delete logo", + // TODO New key - Add a translation + "community.edit.logo.delete.title": "Radera logga", + + // "community.edit.logo.delete-undo.title": "Undo delete", + // TODO New key - Add a translation + "community.edit.logo.delete-undo.title": "Ångra radering", + + // "community.edit.logo.label": "Community logo", + // TODO New key - Add a translation + "community.edit.logo.label": "Enhetens logga", + + // "community.edit.logo.notifications.add.error": "Uploading Community logo failed. Please verify the content before retrying.", + // TODO New key - Add a translation + "community.edit.logo.notifications.add.error": "Uppladdningen misslyckades. Kontrollera filen och försök igen.", + + // "community.edit.logo.notifications.add.success": "Upload Community logo successful.", + // TODO New key - Add a translation + "community.edit.logo.notifications.add.success": "Uppladdningen lyckades.", + + // "community.edit.logo.notifications.delete.success.title": "Logo deleted", + // TODO New key - Add a translation + "community.edit.logo.notifications.delete.success.title": "Loggan har raderats", + + // "community.edit.logo.notifications.delete.success.content": "Successfully deleted the community's logo", + // TODO New key - Add a translation + "community.edit.logo.notifications.delete.success.content": "Loggan har raderats", + + // "community.edit.logo.notifications.delete.error.title": "Error deleting logo", + // TODO New key - Add a translation + "community.edit.logo.notifications.delete.error.title": "Logga kunde inte raderas", + + // "community.edit.logo.upload": "Drop a Community Logo to upload", + // TODO New key - Add a translation + "community.edit.logo.upload": "Släpp en logga här för att ladda upp", + + + + // "community.edit.notifications.success": "Successfully edited the Community", + // TODO New key - Add a translation + "community.edit.notifications.success": "Enheten har redigerats", + + // "community.edit.notifications.unauthorized": "You do not have privileges to make this change", + // TODO New key - Add a translation + "community.edit.notifications.unauthorized": "Du har inte behörighet att göra denna ändring", + + // "community.edit.notifications.error": "An error occured while editing the Community", + // TODO New key - Add a translation + "community.edit.notifications.error": "Ett fel uppstod när enheten redigerades", + + // "community.edit.return": "Back", + // TODO New key - Add a translation + "community.edit.return": "Tillbaka", + + + + // "community.edit.tabs.curate.head": "Curate", + // TODO New key - Add a translation + "community.edit.tabs.curate.head": "Kurera", + + // "community.edit.tabs.curate.title": "Community Edit - Curate", + // TODO New key - Add a translation + "community.edit.tabs.curate.title": "Redigera enhet - Kurera", + + // "community.edit.tabs.metadata.head": "Edit Metadata", + // TODO New key - Add a translation + "community.edit.tabs.metadata.head": "Redigera metadata", + + // "community.edit.tabs.metadata.title": "Community Edit - Metadata", + // TODO New key - Add a translation + "community.edit.tabs.metadata.title": "Redigera enhet - Metadata", + + // "community.edit.tabs.roles.head": "Assign Roles", + // TODO New key - Add a translation + "community.edit.tabs.roles.head": "Tilldela roller", + + // "community.edit.tabs.roles.title": "Community Edit - Roles", + // TODO New key - Add a translation + "community.edit.tabs.roles.title": "Redigera enhet - Roller", + + // "community.edit.tabs.authorizations.head": "Authorizations", + // TODO New key - Add a translation + "community.edit.tabs.authorizations.head": "Behörigheter", + + // "community.edit.tabs.authorizations.title": "Community Edit - Authorizations", + // TODO New key - Add a translation + "community.edit.tabs.authorizations.title": "Redigera enhet - Behörigheter", + + + + // "community.listelement.badge": "Community", + // TODO New key - Add a translation + "community.listelement.badge": "Enhet", + + + + // "comcol-role.edit.no-group": "None", + // TODO New key - Add a translation + "comcol-role.edit.no-group": "Ingen", + + // "comcol-role.edit.create": "Create", + // TODO New key - Add a translation + "comcol-role.edit.create": "Skapa", + + // "comcol-role.edit.restrict": "Restrict", + // TODO New key - Add a translation + "comcol-role.edit.restrict": "Begränsa", + + // "comcol-role.edit.delete": "Delete", + // TODO New key - Add a translation + "comcol-role.edit.delete": "Radera", + + + // "comcol-role.edit.community-admin.name": "Administrators", + // TODO New key - Add a translation + "comcol-role.edit.community-admin.name": "Administratörer", + + // "comcol-role.edit.collection-admin.name": "Administrators", + // TODO New key - Add a translation + "comcol-role.edit.collection-admin.name": "Administratörer", + + + // "comcol-role.edit.community-admin.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", + // TODO New key - Add a translation + "comcol-role.edit.community-admin.description": "Administratörer för enheter kan skapa underenheter eller samlingar och administrera dessa. De kan också avgöra vem skall ha behörighet till dessa, redigera metadata (på befintliga poster), och mappa existerande poster från andra samlingar (beroende på behörighet till dessa).", + + // "comcol-role.edit.collection-admin.description": "Collection administrators decide who can submit items to the collection, edit item metadata (after submission), and add (map) existing items from other collections to this collection (subject to authorization for that collection).", + // TODO New key - Add a translation + "comcol-role.edit.collection-admin.description": "Administratörer för samlingar avgör vem som kan skapa nya poster i dessa, redigera metadata (på befintliga poster) och mappa existerande poster från andra samlingar till denna (beroende på behörighet).", + + + // "comcol-role.edit.submitters.name": "Submitters", + // TODO New key - Add a translation + "comcol-role.edit.submitters.name": "Submitters", + + // "comcol-role.edit.submitters.description": "The E-People and Groups that have permission to submit new items to this collection.", + // TODO New key - Add a translation + "comcol-role.edit.submitters.description": "EPersoner och grupper som har behörighet att skapa nya poster i denna samling.", + + + // "comcol-role.edit.item_read.name": "Default item read access", + // TODO New key - Add a translation + "comcol-role.edit.item_read.name": "Default läsåtkomst till post", + + // "comcol-role.edit.item_read.description": "E-People and Groups that can read new items submitted to this collection. Changes to this role are not retroactive. Existing items in the system will still be viewable by those who had read access at the time of their addition.", + // TODO New key - Add a translation + "comcol-role.edit.item_read.description": "EPersoner och grupper som kan läsa nya poster som skapats i denna samling. Förändringar i rollen är inte retroaktiva. Existerande poster kommer fortfarande att vara synliga för dem som hade läsåtkomst när de skapades.", + + // "comcol-role.edit.item_read.anonymous-group": "Default read for incoming items is currently set to Anonymous.", + // TODO New key - Add a translation + "comcol-role.edit.item_read.anonymous-group": "Default läsåtkomst till nyskapade poster är för närvarande satt till Anonymous.", + + + // "comcol-role.edit.bitstream_read.name": "Default bitstream read access", + // TODO New key - Add a translation + "comcol-role.edit.bitstream_read.name": "Default läsåtkomst till filer", + + // "comcol-role.edit.bitstream_read.description": "Community administrators can create sub-communities or collections, and manage or assign management for those sub-communities or collections. In addition, they decide who can submit items to any sub-collections, edit item metadata (after submission), and add (map) existing items from other collections (subject to authorization).", + // TODO New key - Add a translation + "comcol-role.edit.bitstream_read.description": "Administratörer för enheter kan skapa underenheter eller samlingar och administrera dessa. De kan också avgöra vem skall ha behörighet till dessa, redigera metadata (på befintliga poster), och mappa existerande poster från andra samlingar (beroende på behörighet till dessa).", + + // "comcol-role.edit.bitstream_read.anonymous-group": "Default read for incoming bitstreams is currently set to Anonymous.", + // TODO New key - Add a translation + "comcol-role.edit.bitstream_read.anonymous-group": "Default läsåtkomst till nyuppladdade filer är för närvarande satt till Anonymous.", + + + // "comcol-role.edit.editor.name": "Editors", + // TODO New key - Add a translation + "comcol-role.edit.editor.name": "Editors", + + // "comcol-role.edit.editor.description": "Editors are able to edit the metadata of incoming submissions, and then accept or reject them.", + // TODO New key - Add a translation + "comcol-role.edit.editor.description": "Dessa kan redigera metadata på inkommande bidrag, samt acceptera eller neka dessa.", + + + // "comcol-role.edit.finaleditor.name": "Final editors", + // TODO New key - Add a translation + "comcol-role.edit.finaleditor.name": "Final editors", + + // "comcol-role.edit.finaleditor.description": "Final editors are able to edit the metadata of incoming submissions, but will not be able to reject them.", + // TODO New key - Add a translation + "comcol-role.edit.finaleditor.description": "Dessa kan redigera metadata på inkommande bidrag, men har inte möjlighet att neka dem.", + + + // "comcol-role.edit.reviewer.name": "Reviewers", + // TODO New key - Add a translation + "comcol-role.edit.reviewer.name": "Reviewers", + + // "comcol-role.edit.reviewer.description": "Reviewers are able to accept or reject incoming submissions. However, they are not able to edit the submission's metadata.", + // TODO New key - Add a translation + "comcol-role.edit.reviewer.description": "Reviewers kan acceptera eller neka inkommande bidrag. Men de kan inte redigera metadata.", + + + + // "community.form.abstract": "Short Beskrivning", + // TODO New key - Add a translation + "community.form.abstract": "Kort beskrivning", + + // "community.form.description": "Introductory text (HTML)", + // TODO New key - Add a translation + "community.form.description": "Inledande text (HTML)", + + // "community.form.errors.title.required": "Please enter a community name", + // TODO New key - Add a translation + "community.form.errors.title.required": "Ange ett namn på enheten", + + // "community.form.rights": "Copyright text (HTML)", + // TODO New key - Add a translation + "community.form.rights": "Copyright text (HTML)", + + // "community.form.tableofcontents": "News (HTML)", + // TODO New key - Add a translation + "community.form.tableofcontents": "Nyheter (HTML)", + + // "community.form.title": "Name", + // TODO New key - Add a translation + "community.form.title": "Namn", + + // "community.page.edit": "Edit this community", + // TODO New key - Add a translation + "community.page.edit": "Redigera denna enhet", + + // "community.page.handle": "Permanent URI for this community", + // TODO New key - Add a translation + "community.page.handle": "Använd denna länk för att länka till samlingen:", + + // "community.page.license": "License", + // TODO New key - Add a translation + "community.page.license": "Licens", + + // "community.page.news": "News", + // TODO New key - Add a translation + "community.page.news": "News", + + // "community.all-lists.head": "Subcommunities and Collections", + // TODO New key - Add a translation + "community.all-lists.head": "Samling", + + // "community.sub-collection-list.head": "Samlingar Community", + // TODO New key - Add a translation + "community.sub-collection-list.head": "Samlingar", + + // "community.sub-community-list.head": "Communities of this Community", + // TODO New key - Add a translation + "community.sub-community-list.head": "Enheter under denna enhet", + + + + // "cookies.consent.accept-all": "Accept all", + // TODO New key - Add a translation + "cookies.consent.accept-all": "Acceptera alla", + + // "cookies.consent.accept-selected": "Accept selected", + // TODO New key - Add a translation + "cookies.consent.accept-selected": "Acceptera markerade", + + // "cookies.consent.app.opt-out.description": "This app is loaded by default (but you can opt out)", + // TODO New key - Add a translation + "cookies.consent.app.opt-out.description": "Denna app har laddats per default (men du kan välja opt out)", + + // "cookies.consent.app.opt-out.title": "(opt-out)", + // TODO New key - Add a translation + "cookies.consent.app.opt-out.title": "(opt-out)", + + // "cookies.consent.app.purpose": "purpose", + // TODO New key - Add a translation + "cookies.consent.app.purpose": "syfte", + + // "cookies.consent.app.required.description": "This application is always required", + // TODO New key - Add a translation + "cookies.consent.app.required.description": "Denna applikation krävs alltid", + + // "cookies.consent.app.required.title": "(always required)", + // TODO New key - Add a translation + "cookies.consent.app.required.title": "(krävs alltid)", + + // "cookies.consent.update": "There were changes since your last visit, please update your consent.", + // TODO New key - Add a translation + "cookies.consent.update": "Ändringar har gjorts sedan ditt senaste besök, vänligen uppdatera ditt medgivande.", + + // "cookies.consent.close": "Close", + // TODO New key - Add a translation + "cookies.consent.close": "Stäng", + + // "cookies.consent.decline": "Decline", + // TODO New key - Add a translation + "cookies.consent.decline": "Avböj", + + // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
    To learn more, please read our {privacyPolicy}.", + // TODO New key - Add a translation + "cookies.consent.content-notice.description": "Vi samlar in och hanterar dina persondata för följande syften: Autenticering, inställningar, godkännanden och statistik.
    För mer information, läs {privacyPolicy}.", + + // "cookies.consent.content-notice.learnMore": "Customize", + // TODO New key - Add a translation + "cookies.consent.content-notice.learnMore": "Anpassa", + + // "cookies.consent.content-modal.description": "Here you can see and customize the information that we collect about you.", + // TODO New key - Add a translation + "cookies.consent.content-modal.description": "Se och anpassa den information som vi samlar in.", + + // "cookies.consent.content-modal.privacy-policy.name": "privacy policy", + // TODO New key - Add a translation + "cookies.consent.content-modal.privacy-policy.name": "personuppgifter och cookies", + + // "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", + // TODO New key - Add a translation + "cookies.consent.content-modal.privacy-policy.text": "För mer information, läs {privacyPolicy}.", + + // "cookies.consent.content-modal.title": "Information that we collect", + // TODO New key - Add a translation + "cookies.consent.content-modal.title": "Information som vi samlar in", + + + + // "cookies.consent.app.title.authentication": "Authentication", + // TODO New key - Add a translation + "cookies.consent.app.title.authentication": "Autenticering", + + // "cookies.consent.app.description.authentication": "Required for signing you in", + // TODO New key - Add a translation + "cookies.consent.app.description.authentication": "Behövs för att du skall kunna logga in", + + + // "cookies.consent.app.title.preferences": "Preferences", + // TODO New key - Add a translation + "cookies.consent.app.title.preferences": "Inställningar", + + // "cookies.consent.app.description.preferences": "Required for saving your preferences", + // TODO New key - Add a translation + "cookies.consent.app.description.preferences": "Behövs för att kunna spara dina inställningar", + + + + // "cookies.consent.app.title.acknowledgement": "Acknowledgement", + // TODO New key - Add a translation + "cookies.consent.app.title.acknowledgement": "Godkännande", + + // "cookies.consent.app.description.acknowledgement": "Required for saving your acknowledgements and consents", + // TODO New key - Add a translation + "cookies.consent.app.description.acknowledgement": "Behövs för att spara dina godkännanden och medgivanden", + + + + // "cookies.consent.app.title.google-analytics": "Google Analytics", + // TODO New key - Add a translation + "cookies.consent.app.title.google-analytics": "Google Analytics", + + // "cookies.consent.app.description.google-analytics": "Allows us to track statistical data", + // TODO New key - Add a translation + "cookies.consent.app.description.google-analytics": "Tillåt oss att spåra statistiska data", + + + + // "cookies.consent.purpose.functional": "Functional", + // TODO New key - Add a translation + "cookies.consent.purpose.functional": "Funktionella", + + // "cookies.consent.purpose.statistical": "Statistical", + // TODO New key - Add a translation + "cookies.consent.purpose.statistical": "Statistiska", + + + // "curation-task.task.checklinks.label": "Check Links in Metadata", + // TODO New key - Add a translation + "curation-task.task.checklinks.label": "Kontrollera länkar i metadata", + + // "curation-task.task.noop.label": "NOOP", + // TODO New key - Add a translation + "curation-task.task.noop.label": "NOOP", + + // "curation-task.task.profileformats.label": "Profile Bitstream Formats", + // TODO New key - Add a translation + "curation-task.task.profileformats.label": "Profile Bitstream Formats", + + // "curation-task.task.requiredmetadata.label": "Check for Required Metadata", + // TODO New key - Add a translation + "curation-task.task.requiredmetadata.label": "Kontrollera obligatoriska metadata", + + // "curation-task.task.translate.label": "Microsoft Translator", + // TODO New key - Add a translation + "curation-task.task.translate.label": "Microsoft Translator", + + // "curation-task.task.vscan.label": "Virus Scan", + // TODO New key - Add a translation + "curation-task.task.vscan.label": "Virus Scan", + + // "curation.form.task-select.label": "Task:", + // TODO New key - Add a translation + "curation.form.task-select.label": "Uppgift:", + + // "curation.form.submit": "Start", + // TODO New key - Add a translation + "curation.form.submit": "Starta", + + // "curation.form.submit.success.head": "The curation task has been started successfully", + // TODO New key - Add a translation + "curation.form.submit.success.head": "Kureringsjobbet har startats", + + // "curation.form.submit.success.content": "You will be redirected to the corresponding process page.", + // TODO New key - Add a translation + "curation.form.submit.success.content": "Du kommer att skickas till sidan för att övervaka processen.", + + // "curation.form.submit.error.head": "Running the curation task failed", + // TODO New key - Add a translation + "curation.form.submit.error.head": "Kureringsjobbet misslyckades", + + // "curation.form.submit.error.content": "An error occured when trying to start the curation task.", + // TODO New key - Add a translation + "curation.form.submit.error.content": "Ett fel uppstod när kureringsjobbet skulle startas.", + + // "curation.form.handle.label": "Handle:", + // TODO New key - Add a translation + "curation.form.handle.label": "Handle:", + + // "curation.form.handle.hint": "Hint: Enter [your-handle-prefix]/0 to run a task across entire site (not all tasks may support this capability)", + // TODO New key - Add a translation + "curation.form.handle.hint": "Tips: Ange [your-handle-prefix]/0 för att köra ett jobb för hela sajten (alla jobb kanske inte stöder detta)", + + + + // "deny-request-copy.email.message": "Dear {{ recipientName }},\nIn response to your request I regret to inform you that it's not possible to send you a copy of the file(s) you have requested, concerning the document: \"{{ itemUrl }}\" ({{ itemName }}), of which I am an author.\n\nBest regards,\n{{ authorName }} <{{ authorEmail }}>", + // TODO New key - Add a translation + "deny-request-copy.email.message": "Hej {{ recipientName }},\nDet är tyvärr inte möjligt att skicka den eller de filer som du har begärt. Angående: \"{{ itemUrl }}\" ({{ itemName }}), som jag har författat.\n\nMed vänliga hälsningar,\n{{ authorName }} <{{ authorEmail }}>", + + // "deny-request-copy.email.subject": "Request copy of document", + // TODO New key - Add a translation + "deny-request-copy.email.subject": "Begär en kopia av dokument", + + // "deny-request-copy.error": "An error occurred", + // TODO New key - Add a translation + "deny-request-copy.error": "Ett fel uppstod", + + // "deny-request-copy.header": "Deny document copy request", + // TODO New key - Add a translation + "deny-request-copy.header": "Neka begäran", + + // "deny-request-copy.intro": "This message will be sent to the applicant of the request", + // TODO New key - Add a translation + "deny-request-copy.intro": "Detta meddelande kommer att skickas till personen som har begärt kopian", + + // "deny-request-copy.success": "Successfully denied item request", + // TODO New key - Add a translation + "deny-request-copy.success": "Begäran nekades", + + + + // "dso.name.untitled": "Untitled", + // TODO New key - Add a translation + "dso.name.untitled": "Utan titel", + + + + // "dso-selector.create.collection.head": "New collection", + // TODO New key - Add a translation + "dso-selector.create.collection.head": "Ny samling", + + // "dso-selector.create.collection.sub-level": "Create a new collection in", + // TODO New key - Add a translation + "dso-selector.create.collection.sub-level": "Skapa en ny samling i", + + // "dso-selector.create.community.head": "New community", + // TODO New key - Add a translation + "dso-selector.create.community.head": "Ny enhet", + + // "dso-selector.create.community.sub-level": "Create a new community in", + // TODO New key - Add a translation + "dso-selector.create.community.sub-level": "Skapa en ny enhet i", + + // "dso-selector.create.community.top-level": "Create a new top-level community", + // TODO New key - Add a translation + "dso-selector.create.community.top-level": "Skapa en ny enhet på toppnivå", + + // "dso-selector.create.item.head": "New item", + // TODO New key - Add a translation + "dso-selector.create.item.head": "Ny post", + + // "dso-selector.create.item.sub-level": "Create a new item in", + // TODO New key - Add a translation + "dso-selector.create.item.sub-level": "Skapa en ny post i", + + // "dso-selector.create.submission.head": "New submission", + // TODO New key - Add a translation + "dso-selector.create.submission.head": "Nytt bidrag", + + // "dso-selector.edit.collection.head": "Edit collection", + // TODO New key - Add a translation + "dso-selector.edit.collection.head": "Redigera samling", + + // "dso-selector.edit.community.head": "Edit community", + // TODO New key - Add a translation + "dso-selector.edit.community.head": "Redigera enhet", + + // "dso-selector.edit.item.head": "Edit item", + // TODO New key - Add a translation + "dso-selector.edit.item.head": "Redigera post", + + // "dso-selector.error.title": "An error occurred searching for a {{ type }}", + // TODO New key - Add a translation + "dso-selector.error.title": "Ett fel uppstod vid sökning på {{ type }}", + + // "dso-selector.export-metadata.dspaceobject.head": "Export metadata from", + // TODO New key - Add a translation + "dso-selector.export-metadata.dspaceobject.head": "Exportera metadata från", + + // "dso-selector.no-results": "No {{ type }} found", + // TODO New key - Add a translation + "dso-selector.no-results": "Ingen {{ type }} kunde hittas", + + // "dso-selector.placeholder": "Search for a {{ type }}", + // TODO New key - Add a translation + "dso-selector.placeholder": "Sök efter en {{ type }}", + + // "dso-selector.select.collection.head": "Select a collection", + // TODO New key - Add a translation + "dso-selector.select.collection.head": "Välj en samling", + + // "dso-selector.set-scope.community.head": "Select a search scope", + // TODO New key - Add a translation + "dso-selector.set-scope.community.head": "Välj ett scope för sökning", + + // "dso-selector.set-scope.community.button": "Search all of DSpace", + // TODO New key - Add a translation + "dso-selector.set-scope.community.button": "Sök i hela arkivet", + + // "dso-selector.set-scope.community.input-header": "Search for a community or collection", + // TODO New key - Add a translation + "dso-selector.set-scope.community.input-header": "Sök efter en samling eller enhet", + + + + // "confirmation-modal.export-metadata.header": "Export metadata for {{ dsoName }}", + // TODO New key - Add a translation + "confirmation-modal.export-metadata.header": "Exportera metadata från {{ dsoName }}", + + // "confirmation-modal.export-metadata.info": "Are you sure you want to export metadata for {{ dsoName }}", + // TODO New key - Add a translation + "confirmation-modal.export-metadata.info": "Vill du exportera metadata från {{ dsoName }}", + + // "confirmation-modal.export-metadata.cancel": "Cancel", + // TODO New key - Add a translation + "confirmation-modal.export-metadata.cancel": "Avbryt", + + // "confirmation-modal.export-metadata.confirm": "Export", + // TODO New key - Add a translation + "confirmation-modal.export-metadata.confirm": "Exportera", + + // "confirmation-modal.delete-eperson.header": "Delete EPerson \"{{ dsoName }}\"", + // TODO New key - Add a translation + "confirmation-modal.delete-eperson.header": "Radera e-Person \"{{ dsoName }}\"", + + // "confirmation-modal.delete-eperson.info": "Are you sure you want to delete EPerson \"{{ dsoName }}\"", + // TODO New key - Add a translation + "confirmation-modal.delete-eperson.info": "Vill du radera e-Person \"{{ dsoName }}\"", + + // "confirmation-modal.delete-eperson.cancel": "Cancel", + // TODO New key - Add a translation + "confirmation-modal.delete-eperson.cancel": "Avbryt", + + // "confirmation-modal.delete-eperson.confirm": "Delete", + // TODO New key - Add a translation + "confirmation-modal.delete-eperson.confirm": "Radera", + + + // "error.bitstream": "Error fetching bitstream", + // TODO New key - Add a translation + "error.bitstream": "Ett fel uppstod när felen hämtades", + + // "error.browse-by": "Error fetching items", + // TODO New key - Add a translation + "error.browse-by": "Ett fel uppstod när posterna hämtades", + + // "error.collection": "Error fetching collection", + // TODO New key - Add a translation + "error.collection": "Ett fel uppstod när samling hämtades", + + // "error.collections": "Error fetching collections", + // TODO New key - Add a translation + "error.collections": "Ett fel uppstod när samlingar hämtades", + + // "error.community": "Error fetching community", + // TODO New key - Add a translation + "error.community": "Ett fel uppstod när enhet hämtades", + + // "error.identifier": "No item found for the identifier", + // TODO New key - Add a translation + "error.identifier": "Inga post med denna identifiererare kunde hittas", + + // "error.default": "Error", + // TODO New key - Add a translation + "error.default": "Fel", + + // "error.item": "Error fetching item", + // TODO New key - Add a translation + "error.item": "Ett fel uppstod när posten hämtades", + + // "error.items": "Error fetching items", + // TODO New key - Add a translation + "error.items": "Ett fel uppstod när poster hämtades", + + // "error.objects": "Error fetching objects", + // TODO New key - Add a translation + "error.objects": "Ett fel uppstod när objekt hämtades", + + // "error.recent-submissions": "Error fetching recent submissions", + // TODO New key - Add a translation + "error.recent-submissions": "Ett fel uppstod när senste bidrag hämtades", + + // "error.search-results": "Error fetching search results", + // TODO New key - Add a translation + "error.search-results": "Ett fel uppstod när sökresultaten hämtades", + + // "error.invalid-search-query": "Search query is not valid. Please check Solr query syntax best practices for further information about this error.", + // TODO New key - Add a translation + "error.invalid-search-query": "Ogiltig sökfråga. Se Solr query syntax för hjälp och mer information.", + + // "error.sub-collections": "Error fetching sub-collections", + // TODO New key - Add a translation + "error.sub-collections": "Ett fel uppstod när undersamlingar hämtades", + + // "error.sub-communities": "Error fetching sub-communities", + // TODO New key - Add a translation + "error.sub-communities": "Ett fel uppstod när underenheter hämtades", + + // "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

    ", + // TODO New key - Add a translation + "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below :

    ", + + // "error.top-level-communities": "Error fetching top-level communities", + // TODO New key - Add a translation + "error.top-level-communities": "Ett fel uppstod när enheter på toppnivå hämtades", + + // "error.validation.license.notgranted": "You must grant this license to complete your submission. If you are unable to grant this license at this time you may save your work and return later or remove the submission.", + // TODO New key - Add a translation + "error.validation.license.notgranted": "Du måste godkänna dessa villkor för att skutföra registreringen. Om detta inte är möjligt så kan du spara nu och återvända hit senare, eller radera bidraget.", + + // "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", + // TODO New key - Add a translation + "error.validation.pattern": "This input is restricted by the current pattern: {{ pattern }}.", + + // "error.validation.filerequired": "The file upload is mandatory", + // TODO New key - Add a translation + "error.validation.filerequired": "Filuppladdning är obligatorisk", + + // "error.validation.required": "This field is required", + // TODO New key - Add a translation + "error.validation.required": "Detta fält är obligatoriskt", + + // "error.validation.NotValidEmail": "This E-mail is not a valid email", + // TODO New key - Add a translation + "error.validation.NotValidEmail": "Ogiltig e-postadress", + + // "error.validation.emailTaken": "This E-mail is already taken", + // TODO New key - Add a translation + "error.validation.emailTaken": "E-postadressen finns redan", + + // "error.validation.groupExists": "This group already exists", + // TODO New key - Add a translation + "error.validation.groupExists": "Denna grupp existerar redan", + + + // "file-section.error.header": "Error obtaining files for this item", + // TODO New key - Add a translation + "file-section.error.header": "Det gick inte att hämta filerna till denna post", + + + + // "footer.copyright": "copyright © 2002-{{ year }}", + // TODO New key - Add a translation + "footer.copyright": "copyright © 2002-{{ year }}", + + // "footer.link.dspace": "DSpace software", + // TODO New key - Add a translation + "footer.link.dspace": "DSpace software", + + // "footer.link.lyrasis": "LYRASIS", + // TODO New key - Add a translation + "footer.link.lyrasis": "LYRASIS", + + // "footer.link.cookies": "Cookie settings", + // TODO New key - Add a translation + "footer.link.cookies": "Cookieinställningar", + + // "footer.link.privacy-policy": "Privacy policy", + // TODO New key - Add a translation + "footer.link.privacy-policy": "Privacy policy", + + // "footer.link.end-user-agreement":"End User Agreement", + // TODO New key - Add a translation + "footer.link.end-user-agreement":"End User Agreement", + + // "footer.link.feedback":"Send Feedback", + // TODO New key - Add a translation + "footer.link.feedback":"Skicka feedback", + + + + // "forgot-email.form.header": "Forgot Password", + // TODO New key - Add a translation + "forgot-email.form.header": "Glömt lösenord", + + // "forgot-email.form.info": "Enter Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + // TODO New key - Add a translation + "forgot-email.form.info": "Registrera dig som användare för att prenumerera på nyheter eller ladda upp nya filer till arkivet.", + + // "forgot-email.form.email": "E-post *", + // TODO New key - Add a translation + "forgot-email.form.email": "E-post *", + + // "forgot-email.form.email.error.required": "Please fill in an email address", + // TODO New key - Add a translation + "forgot-email.form.email.error.required": "Ange en giltig e-postadress", + + // "forgot-email.form.email.error.pattern": "Please fill in a valid email address", + // TODO New key - Add a translation + "forgot-email.form.email.error.pattern": "Ange en giltig e-postadress", + + // "forgot-email.form.email.hint": "This address will be verified and used as your login name.", + // TODO New key - Add a translation + "forgot-email.form.email.hint": "E-postadressen kommer att verifieras och användas som ditt användarnamn.", + + // "forgot-email.form.submit": "Save", + // TODO New key - Add a translation + "forgot-email.form.submit": "Spara", + + // "forgot-email.form.success.head": "Verification email sent", + // TODO New key - Add a translation + "forgot-email.form.success.head": "Ett verifieringsmejl har skickats", + + // "forgot-email.form.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + // TODO New key - Add a translation + "forgot-email.form.success.content": "Ett mejl med vidare instruktioner har skickats till {{ email }}.", + + // "forgot-email.form.error.head": "Error when trying to register email", + // TODO New key - Add a translation + "forgot-email.form.error.head": "Ett fel har uppstått", + + // "forgot-email.form.error.content": "An error occured when registering the following email address: {{ email }}", + // TODO New key - Add a translation + "forgot-email.form.error.content": "Ett fel uppstod när följande e-postadress skulle registreras: {{ email }}", + + + + // "forgot-password.title": "Forgot Password", + // TODO New key - Add a translation + "forgot-password.title": "Glömt lösenord", + + // "forgot-password.form.head": "Forgot Password", + // TODO New key - Add a translation + "forgot-password.form.head": "Glömt lösenord", + + // "forgot-password.form.info": "Enter a new password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", + // TODO New key - Add a translation + "forgot-password.form.info": "Ange och bekräfta ett nytt lösenord nedan (minst 6 tecken).", + + // "forgot-password.form.card.security": "Säkerhet", + // TODO New key - Add a translation + "forgot-password.form.card.security": "Säkerhet", + + // "forgot-password.form.identification.header": "Identify", + // TODO New key - Add a translation + "forgot-password.form.identification.header": "Identifiera", + + // "forgot-password.form.identification.email": "Email address: ", + // TODO New key - Add a translation + "forgot-password.form.identification.email": "E-post: ", + + // "forgot-password.form.label.password": "Password", + // TODO New key - Add a translation + "forgot-password.form.label.password": "Lösenord", + + // "forgot-password.form.label.passwordrepeat": "Bekräfta", + // TODO New key - Add a translation + "forgot-password.form.label.passwordrepeat": "Bekräfta", + + // "forgot-password.form.error.empty-password": "Please enter a password in the box below.", + // TODO New key - Add a translation + "forgot-password.form.error.empty-password": "Ange ett lösenord nedan.", + + // "forgot-password.form.error.matching-passwords": "Lösenorden överensstämmer inte.", + // TODO New key - Add a translation + "forgot-password.form.error.matching-passwords": "Lösenorden överensstämmer inte.", + + // "forgot-password.form.error.password-length": "The password should be at least 6 characters long.", + // TODO New key - Add a translation + "forgot-password.form.error.password-length": "Lösenordet måste bestå av minst 6 tecken.", + + // "forgot-password.form.notification.error.title": "Error when trying to submit new password", + // TODO New key - Add a translation + "forgot-password.form.notification.error.title": "Ett fel uppstod när det nya lösenordet skulle sparas", + + // "forgot-password.form.notification.success.content": "The password reset was successful. You have been logged in as the created user.", + // TODO New key - Add a translation + "forgot-password.form.notification.success.content": "Lösenordet har återställts. Du är nu inloggad.", + + // "forgot-password.form.notification.success.title": "Password reset completed", + // TODO New key - Add a translation + "forgot-password.form.notification.success.title": "Lösenordet har återställts", + + // "forgot-password.form.submit": "Submit password", + // TODO New key - Add a translation + "forgot-password.form.submit": "Spara lösenord", + + + // "form.add": "Add more", + // TODO New key - Add a translation + "form.add": "Lägg till fler", + + // "form.add-help": "Click here to add the current entry and to add another one", + // TODO New key - Add a translation + "form.add-help": "Klicka här för att spara nuvarande post och lägga till en ny", + + // "form.cancel": "Cancel", + // TODO New key - Add a translation + "form.cancel": "Avbryt", + + // "form.clear": "Clear", + // TODO New key - Add a translation + "form.clear": "Rensa", + + // "form.clear-help": "Click here to remove the selected value", + // TODO New key - Add a translation + "form.clear-help": "Klicka för att avmarkera", + + // "form.discard": "Discard", + // TODO New key - Add a translation + "form.discard": "Dra tillbaka", + + // "form.drag": "Drag", + // TODO New key - Add a translation + "form.drag": "Dra", + + // "form.edit": "Edit", + // TODO New key - Add a translation + "form.edit": "Redigera", + + // "form.edit-help": "Click here to edit the selected value", + // TODO New key - Add a translation + "form.edit-help": "Klicka för att redigera det markerade", + + // "form.first-name": "First name", + // TODO New key - Add a translation + "form.first-name": "Förnamn", + + // "form.group-collapse": "Collapse", + // TODO New key - Add a translation + "form.group-collapse": "Fäll ihop", + + // "form.group-collapse-help": "Click here to collapse", + // TODO New key - Add a translation + "form.group-collapse-help": "Klicka här för att fälla ihop", + + // "form.group-expand": "Expand", + // TODO New key - Add a translation + "form.group-expand": "Expandera", + + // "form.group-expand-help": "Click here to expand and add more elements", + // TODO New key - Add a translation + "form.group-expand-help": "Klicka här för att expandera och lägga till fler element", + + // "form.last-name": "Last name", + // TODO New key - Add a translation + "form.last-name": "Efternamn", + + // "form.loading": "Loading...", + // TODO New key - Add a translation + "form.loading": "Laddar...", + + // "form.lookup": "Lookup", + // TODO New key - Add a translation + "form.lookup": "Slå upp", + + // "form.lookup-help": "Click here to look up an existing relation", + // TODO New key - Add a translation + "form.lookup-help": "Klicka för att leta upp en befintlig relation", + + // "form.no-results": "No results found", + // TODO New key - Add a translation + "form.no-results": "Inga resultat", + + // "form.no-value": "No value entered", + // TODO New key - Add a translation + "form.no-value": "Inget värde har angivits", + + // "form.other-information": {}, + // TODO New key - Add a translation + "form.other-information": {}, + + // "form.remove": "Remove", + // TODO New key - Add a translation + "form.remove": "Ta bort", + + // "form.save": "Save", + // TODO New key - Add a translation + "form.save": "Spara", + + // "form.save-help": "Save changes", + // TODO New key - Add a translation + "form.save-help": "Spara ändringar", + + // "form.search": "Search", + // TODO New key - Add a translation + "form.search": "Sök", + + // "form.search-help": "Click here to look for an existing correspondence", + // TODO New key - Add a translation + "form.search-help": "Klicka här för att leta efter en befintlig korrespondens", + + // "form.submit": "Save", + // TODO New key - Add a translation + "form.submit": "Spara", + + // "form.repeatable.sort.tip": "Drop the item in the new position", + // TODO New key - Add a translation + "form.repeatable.sort.tip": "Släpp posten i den nya positionen", + + + + // "grant-deny-request-copy.deny": "Don't send copy", + // TODO New key - Add a translation + "grant-deny-request-copy.deny": "Skicka inte kopia", + + // "grant-deny-request-copy.email.back": "Back", + // TODO New key - Add a translation + "grant-deny-request-copy.email.back": "Tillbaka", + + // "grant-deny-request-copy.email.message": "Message", + // TODO New key - Add a translation + "grant-deny-request-copy.email.message": "Meddelande", + + // "grant-deny-request-copy.email.message.empty": "Please enter a message", + // TODO New key - Add a translation + "grant-deny-request-copy.email.message.empty": "Skriv ett meddelande", + + // "grant-deny-request-copy.email.permissions.info": "You may use this occasion to reconsider the access restrictions on the document, to avoid having to respond to these requests. If you’d like to ask the repository administrators to remove these restrictions, please check the box below.", + // TODO New key - Add a translation + "grant-deny-request-copy.email.permissions.info": "You may use this occasion to reconsider the access restrictions on the document, to avoid having to respond to these requests. If you’d like to ask the repository administrators to remove these restrictions, please check the box below.", + + // "grant-deny-request-copy.email.permissions.label": "Change to open access", + // TODO New key - Add a translation + "grant-deny-request-copy.email.permissions.label": "Ändra till öppen tillgång", + + // "grant-deny-request-copy.email.send": "Send", + // TODO New key - Add a translation + "grant-deny-request-copy.email.send": "Skicka", + + // "grant-deny-request-copy.email.subject": "Subject", + // TODO New key - Add a translation + "grant-deny-request-copy.email.subject": "Ämne", + + // "grant-deny-request-copy.email.subject.empty": "Please enter a subject", + // TODO New key - Add a translation + "grant-deny-request-copy.email.subject.empty": "Ange ett ämne", + + // "grant-deny-request-copy.grant": "Send copy", + // TODO New key - Add a translation + "grant-deny-request-copy.grant": "Skicka kopia", + + // "grant-deny-request-copy.header": "Document copy request", + // TODO New key - Add a translation + "grant-deny-request-copy.header": "Begäran om kopia", + + // "grant-deny-request-copy.home-page": "Take me to the home page", + // TODO New key - Add a translation + "grant-deny-request-copy.home-page": "Till startsidan", + + // "grant-deny-request-copy.intro1": "If you are one of the Författare of the document {{ name }}, then please use one of the options below to respond to the user's request.", + // TODO New key - Add a translation + "grant-deny-request-copy.intro1": "Om du är en av författarna av {{ name }}, välj svar på användarens förfrågan nedan.", + + // "grant-deny-request-copy.intro2": "After choosing an option, you will be presented with a suggested email reply which you may edit.", + // TODO New key - Add a translation + "grant-deny-request-copy.intro2": "När du har gjort ditt val kommer du att se det mejl som skall skickas till användaren. Du kan redigera innehållet i detta.", + + // "grant-deny-request-copy.processed": "This request has already been processed. You can use the button below to get back to the home page.", + // TODO New key - Add a translation + "grant-deny-request-copy.processed": "Denna begäran har redan behandlats. Använd knappen nedan för att komma till startsidan.", + + + + // "grant-request-copy.email.message": "Dear {{ recipientName }},\nIn response to your request I have the pleasure to send you in attachment a copy of the file(s) concerning the document: \"{{ itemUrl }}\" ({{ itemName }}), of which I am an author.\n\nBest regards,\n{{ authorName }} <{{ authorEmail }}>", + // TODO New key - Add a translation + "grant-request-copy.email.message": "Hej {{ recipientName }},\nDet dokument du har begärt, och som jag är författare till, bifogas i detta mejl: \"{{ itemUrl }}\" ({{ itemName }}).\n\nMed vänliga hälsningar,\n{{ authorName }} <{{ authorEmail }}>", + + // "grant-request-copy.email.subject": "Request copy of document", + // TODO New key - Add a translation + "grant-request-copy.email.subject": "Begär kopia av dokument", + + // "grant-request-copy.error": "An error occurred", + // TODO New key - Add a translation + "grant-request-copy.error": "Ett fel uppstod", + + // "grant-request-copy.header": "Grant document copy request", + // TODO New key - Add a translation + "grant-request-copy.header": "Bevilja begäran av kopia", + + // "grant-request-copy.intro": "This message will be sent to the applicant of the request. The requested document(s) will be attached.", + // TODO New key - Add a translation + "grant-request-copy.intro": "Detta meddelande kommer att skickas till personen som begärt detta. Filer kommer att bifogas.", + + // "grant-request-copy.success": "Successfully granted item request", + // TODO New key - Add a translation + "grant-request-copy.success": "Begäran beviljades.", + + + + // "home.description": "", + // TODO New key - Add a translation + "home.description": "Till startsidan", + + // "home.breadcrumbs": "Home", + // TODO New key - Add a translation + "home.breadcrumbs": "Hem", + + // "home.search-form.placeholder": "Search the repository ...", + // TODO New key - Add a translation + "home.search-form.placeholder": "Sök i arkivet ...", + + // "home.title": "Home", + // TODO New key - Add a translation + "home.title": "Hem", + + // "home.top-level-communities.head": "Enheter i ODR", + // TODO New key - Add a translation + "home.top-level-communities.head": "Enheter i DSpace", + + // "home.top-level-communities.help": "Select a community to browse its collections.", + // TODO New key - Add a translation + "home.top-level-communities.help": "Välj en enhet för att se alla samlingar.", + + + + // "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.accept": "Jag har läst och förstått villkoren i användaravtalet", + + // "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.accept.error": "Ett fel uppstod när användaravtalet godkändes", + + // "info.end-user-agreement.accept.success": "Successfully updated the End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.accept.success": "Användaravtalet har uppdaterats", + + // "info.end-user-agreement.breadcrumbs": "End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.breadcrumbs": "Användaravtal", + + // "info.end-user-agreement.buttons.cancel": "Cancel", + // TODO New key - Add a translation + "info.end-user-agreement.buttons.cancel": "Avbryt", + + // "info.end-user-agreement.buttons.save": "Save", + // TODO New key - Add a translation + "info.end-user-agreement.buttons.save": "Spara", + + // "info.end-user-agreement.head": "End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.head": "Användaravtal", + + // "info.end-user-agreement.title": "End User Agreement", + // TODO New key - Add a translation + "info.end-user-agreement.title": "Användaravtal", + + // "info.privacy.breadcrumbs": "Privacy Statement", + // TODO New key - Add a translation + "info.privacy.breadcrumbs": "Integritetspolicy", + + // "info.privacy.head": "Privacy Statement", + // TODO New key - Add a translation + "info.privacy.head": "Integritetspolicy", + + // "info.privacy.title": "Privacy Statement", + // TODO New key - Add a translation + "info.privacy.title": "Integritetspolicy", + + // "info.feedback.breadcrumbs": "Feedback", + // TODO New key - Add a translation + "info.feedback.breadcrumbs": "Feedback", + + // "info.feedback.head": "Feedback", + // TODO New key - Add a translation + "info.feedback.head": "Feedback", + + // "info.feedback.title": "Feedback", + // TODO New key - Add a translation + "info.feedback.title": "Feedback", + + // "info.feedback.info": "Thanks for sharing your feedback about the DSpace system. Your comments are appreciated!", + // TODO New key - Add a translation + "info.feedback.info": "Tack för att du lämnar dina synpunkter på tjänsten. Dina åsikter betyder mycket för oss!", + + // "info.feedback.email_help": "This address will be used to follow up on your feedback.", + // TODO New key - Add a translation + "info.feedback.email_help": "Denna adress kommer att användas för att återkoppla till dig.", + + // "info.feedback.send": "Send Feedback", + // TODO New key - Add a translation + "info.feedback.send": "Skicka feedback", + + // "info.feedback.comments": "Comments", + // TODO New key - Add a translation + "info.feedback.comments": "Kommentarer", + + // "info.feedback.email-label": "Your Email", + // TODO New key - Add a translation + "info.feedback.email-label": "Din e-postadress", + + // "info.feedback.create.success" : "Feedback Sent Successfully!", + // TODO New key - Add a translation + "info.feedback.create.success" : "Feedback har skickats!", + + // "info.feedback.error.email.required" : "A valid email address is required", + // TODO New key - Add a translation + "info.feedback.error.email.required" : "Du måste ange en giltig e-postadress", + + // "info.feedback.error.message.required" : "A comment is required", + // TODO New key - Add a translation + "info.feedback.error.message.required" : "Du måste skriva en kommentar", + + // "info.feedback.page-label" : "Page", + // TODO New key - Add a translation + "info.feedback.page-label" : "Sida", + + // "info.feedback.page_help" : "Tha page related to your feedback", + // TODO New key - Add a translation + "info.feedback.page_help" : "Den är sidan är relaterad till din feedback", + + + + // "item.alerts.private": "This item is non-discoverable", + // TODO New key - Add a translation + "item.alerts.private": "Denna post är dold vid sökning", + + // "item.alerts.withdrawn": "This item has been withdrawn", + // TODO New key - Add a translation + "item.alerts.withdrawn": "Denna post har återkallats", + + + + // "item.edit.authorizations.heading": "With this editor you can view and alter the policies of an item, plus alter policies of individual item components: bundles and bitstreams. Briefly, an item is a container of bundles, and bundles are containers of bitstreams. Containers usually have ADD/REMOVE/READ/WRITE policies, while bitstreams only have READ/WRITE policies.", + // TODO New key - Add a translation + "item.edit.authorizations.heading": "Här kan du se och ändra de villkor som gäller för en post och dess ingående komponenter: buntar (bundles) och filer. En post är en container som innehåller en eller flera buntar (bundles), som i sin tur är en container med en eller flera filer. Buntar har behörigheter för att LÄGGA TILL/RADERA/LÄSA/SKRIVA, medan filer bara har behörigheter för att LÄSA och SKRIVA.", + + // "item.edit.authorizations.title": "Edit item's Policies", + // TODO New key - Add a translation + "item.edit.authorizations.title": "Redigera behörigheter för post", + + + + // "item.badge.private": "Non-discoverable", + // TODO New key - Add a translation + "item.badge.private": "Dold vid sökning", + + // "item.badge.withdrawn": "Withdrawn", + // TODO New key - Add a translation + "item.badge.withdrawn": "Återkallad", + + + + // "item.bitstreams.upload.bundle": "Bundle", + // TODO New key - Add a translation + "item.bitstreams.upload.bundle": "Bunt", + + // "item.bitstreams.upload.bundle.placeholder": "Select a bundle", + // TODO New key - Add a translation + "item.bitstreams.upload.bundle.placeholder": "Välj en bunt", + + // "item.bitstreams.upload.bundle.new": "Create bundle", + // TODO New key - Add a translation + "item.bitstreams.upload.bundle.new": "Skapa bunt", + + // "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.", + // TODO New key - Add a translation + "item.bitstreams.upload.bundles.empty": "Denna post innehåller inga buntar som man kan ladda upp filer i.", + + // "item.bitstreams.upload.cancel": "Cancel", + // TODO New key - Add a translation + "item.bitstreams.upload.cancel": "Avbryt", + + // "item.bitstreams.upload.drop-message": "Drop a file to upload", + // TODO New key - Add a translation + "item.bitstreams.upload.drop-message": "Dra och släpp en fil här för att ladda upp", + + // "item.bitstreams.upload.item": "Item: ", + // TODO New key - Add a translation + "item.bitstreams.upload.item": "Post: ", + + // "item.bitstreams.upload.notifications.bundle.created.content": "Successfully created new bundle.", + // TODO New key - Add a translation + "item.bitstreams.upload.notifications.bundle.created.content": "En ny bunt har skapats.", + + // "item.bitstreams.upload.notifications.bundle.created.title": "Created bundle", + // TODO New key - Add a translation + "item.bitstreams.upload.notifications.bundle.created.title": "Skapad bunt", + + // "item.bitstreams.upload.notifications.upload.failed": "Upload failed. Please verify the content before retrying.", + // TODO New key - Add a translation + "item.bitstreams.upload.notifications.upload.failed": "Uppladdningen misslyckades. Kontrollera filen och försök igen.", + + // "item.bitstreams.upload.title": "Upload bitstream", + // TODO New key - Add a translation + "item.bitstreams.upload.title": "Ladda upp fil", + + + + // "item.edit.bitstreams.bundle.edit.buttons.upload": "Upload", + // TODO New key - Add a translation + "item.edit.bitstreams.bundle.edit.buttons.upload": "Ladda upp", + + // "item.edit.bitstreams.bundle.displaying": "Currently displaying {{ amount }} bitstreams of {{ total }}.", + // TODO New key - Add a translation + "item.edit.bitstreams.bundle.displaying": "Visar {{ amount }} av {{ total }} filer.", + + // "item.edit.bitstreams.bundle.load.all": "Load all ({{ total }})", + // TODO New key - Add a translation + "item.edit.bitstreams.bundle.load.all": "Ladda alla ({{ total }})", + + // "item.edit.bitstreams.bundle.load.more": "Load more", + // TODO New key - Add a translation + "item.edit.bitstreams.bundle.load.more": "Ladda fler", + + // "item.edit.bitstreams.bundle.name": "BUNDLE: {{ name }}", + // TODO New key - Add a translation + "item.edit.bitstreams.bundle.name": "BUNT: {{ name }}", + + // "item.edit.bitstreams.discard-button": "Discard", + // TODO New key - Add a translation + "item.edit.bitstreams.discard-button": "Förkasta", + + // "item.edit.bitstreams.edit.buttons.download": "Download", + // TODO New key - Add a translation + "item.edit.bitstreams.edit.buttons.download": "Ladda ner", + + // "item.edit.bitstreams.edit.buttons.drag": "Drag", + // TODO New key - Add a translation + "item.edit.bitstreams.edit.buttons.drag": "Dra", + + // "item.edit.bitstreams.edit.buttons.edit": "Edit", + // TODO New key - Add a translation + "item.edit.bitstreams.edit.buttons.edit": "Redigera", + + // "item.edit.bitstreams.edit.buttons.remove": "Remove", + // TODO New key - Add a translation + "item.edit.bitstreams.edit.buttons.remove": "Radera", + + // "item.edit.bitstreams.edit.buttons.undo": "Undo changes", + // TODO New key - Add a translation + "item.edit.bitstreams.edit.buttons.undo": "Ångra ändringar", + + // "item.edit.bitstreams.empty": "This item doesn't contain any bitstreams. Click the upload button to create one.", + // TODO New key - Add a translation + "item.edit.bitstreams.empty": "Posten innehåller inga filer. Välj ladda upp.", + + // "item.edit.bitstreams.headers.actions": "Actions", + // TODO New key - Add a translation + "item.edit.bitstreams.headers.actions": "Händelser", + + // "item.edit.bitstreams.headers.bundle": "Bundle", + // TODO New key - Add a translation + "item.edit.bitstreams.headers.bundle": "Bunt", + + // "item.edit.bitstreams.headers.description": "Beskrivning", + // TODO New key - Add a translation + "item.edit.bitstreams.headers.description": "Beskrivning", + + // "item.edit.bitstreams.headers.format": "Format", + // TODO New key - Add a translation + "item.edit.bitstreams.headers.format": "Format", + + // "item.edit.bitstreams.headers.name": "Name", + // TODO New key - Add a translation + "item.edit.bitstreams.headers.name": "Namn", + + // "item.edit.bitstreams.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.discarded.content": "Dina ändringar förkastades. Klicka på 'Ångra' för att göra om", + + // "item.edit.bitstreams.notifications.discarded.title": "Changes discarded", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.discarded.title": "Ändringarna förkastades", + + // "item.edit.bitstreams.notifications.move.failed.title": "Error moving bitstreams", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.move.failed.title": "Ett fel uppstod när fil skulle flyttas", + + // "item.edit.bitstreams.notifications.move.saved.content": "Your move changes to this item's bitstreams and bundles have been saved.", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.move.saved.content": "Ändringarna har sparats.", + + // "item.edit.bitstreams.notifications.move.saved.title": "Move changes saved", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.move.saved.title": "Ändringarna har sparats", + + // "item.edit.bitstreams.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.outdated.content": "Den aktuella posten har ändrats av en annan användare. Dina ändringar har förkastats för att undvika konflikter", + + // "item.edit.bitstreams.notifications.outdated.title": "Changes outdated", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.outdated.title": "Ändringarna är föråldrade", + + // "item.edit.bitstreams.notifications.remove.failed.title": "Error deleting bitstream", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.remove.failed.title": "Ett fel uppstod när filen skulle raderas", + + // "item.edit.bitstreams.notifications.remove.saved.content": "Your removal changes to this item's bitstreams have been saved.", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.remove.saved.content": "Ändringarna har sparats.", + + // "item.edit.bitstreams.notifications.remove.saved.title": "Removal changes saved", + // TODO New key - Add a translation + "item.edit.bitstreams.notifications.remove.saved.title": "Ändringarna har sparats", + + // "item.edit.bitstreams.reinstate-button": "Undo", + // TODO New key - Add a translation + "item.edit.bitstreams.reinstate-button": "Ångra", + + // "item.edit.bitstreams.save-button": "Save", + // TODO New key - Add a translation + "item.edit.bitstreams.save-button": "Spara", + + // "item.edit.bitstreams.upload-button": "Upload", + // TODO New key - Add a translation + "item.edit.bitstreams.upload-button": "Ladda upp", + + + + // "item.edit.delete.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.delete.cancel": "Avbryt", + + // "item.edit.delete.confirm": "Delete", + // TODO New key - Add a translation + "item.edit.delete.confirm": "Radera", + + // "item.edit.delete.description": "Are you sure this item should be completely deleted? Caution: At present, no tombstone would be left.", + // TODO New key - Add a translation + "item.edit.delete.description": "Är du säker på att du vill radera denna post? Notera: Posten kommer att raderas helt från systemet, utan historik.", + + // "item.edit.delete.error": "An error occurred while deleting the item", + // TODO New key - Add a translation + "item.edit.delete.error": "Ett fel uppstod när posten skulle raderas", + + // "item.edit.delete.header": "Delete item: {{ id }}", + // TODO New key - Add a translation + "item.edit.delete.header": "Radera post: {{ id }}", + + // "item.edit.delete.success": "The item has been deleted", + // TODO New key - Add a translation + "item.edit.delete.success": "Posten har raderats", + + // "item.edit.head": "Edit Item", + // TODO New key - Add a translation + "item.edit.head": "Redigera post", + + // "item.edit.breadcrumbs": "Edit Item", + // TODO New key - Add a translation + "item.edit.breadcrumbs": "Redigera post", + + // "item.edit.tabs.disabled.tooltip": "You're not authorized to access this tab", + // TODO New key - Add a translation + "item.edit.tabs.disabled.tooltip": "Du har inte behöriget att använda denna flik", + + + // "item.edit.tabs.mapper.head": "Collection Mapper", + // TODO New key - Add a translation + "item.edit.tabs.mapper.head": "Mappa samlingar", + + // "item.edit.tabs.item-mapper.title": "Item Edit - Collection Mapper", + // TODO New key - Add a translation + "item.edit.tabs.item-mapper.title": "Redigera post - mappa samlingar", + + // "item.edit.item-mapper.buttons.add": "Map item to selected collections", + // TODO New key - Add a translation + "item.edit.item-mapper.buttons.add": "Mappa post till denna samling", + + // "item.edit.item-mapper.buttons.remove": "Remove item's mapping for selected collections", + // TODO New key - Add a translation + "item.edit.item-mapper.buttons.remove": "Ta bort postens mappning till markerade samlingar", + + // "item.edit.item-mapper.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.item-mapper.cancel": "Avbryt", + + // "item.edit.item-mapper.description": "This is the item mapper tool that allows administrators to map this item to other collections. You can search for collections and map them, or browse the list of collections the item is currently mapped to.", + // TODO New key - Add a translation + "item.edit.item-mapper.description": "Detta är ett verktyg för att mappa poster till samlingar. Du kan söka efter samlingar eller bläddra i listan över samlingar som posten är mappad till nu.", + + // "item.edit.item-mapper.head": "Item Mapper - Map Item to Collections", + // TODO New key - Add a translation + "item.edit.item-mapper.head": "Mappa post till samling(ar)", + + // "item.edit.item-mapper.item": "Item: \"{{name}}\"", + // TODO New key - Add a translation + "item.edit.item-mapper.item": "Post: \"{{name}}\"", + + // "item.edit.item-mapper.no-search": "Please enter a query to search", + // TODO New key - Add a translation + "item.edit.item-mapper.no-search": "Ange en sökfråga", + + // "item.edit.item-mapper.notifications.add.error.content": "Errors occurred for mapping of item to {{amount}} collections.", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.add.error.content": "Ett fel uppstod när post skulle mappas till {{amount}} samling(ar).", + + // "item.edit.item-mapper.notifications.add.error.head": "Mapping errors", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.add.error.head": "Fel uppstod vid mappning", + + // "item.edit.item-mapper.notifications.add.success.content": "Successfully mapped item to {{amount}} collections.", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.add.success.content": "Posten har mappats till {{amount}} samling(ar)s.", + + // "item.edit.item-mapper.notifications.add.success.head": "Mapping completed", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.add.success.head": "Mappning har avslutats", + + // "item.edit.item-mapper.notifications.remove.error.content": "Errors occurred for the removal of the mapping to {{amount}} collections.", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.remove.error.content": "Det uppstod ett fel när posten skulle mappas till {{amount}} samling(ar).", + + // "item.edit.item-mapper.notifications.remove.error.head": "Removal of mapping errors", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.remove.error.head": "Ett fel uppstod när mappning skulle tas bort", + + // "item.edit.item-mapper.notifications.remove.success.content": "Successfully removed mapping of item to {{amount}} collections.", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.remove.success.content": "Mappning till {{amount}} samling(ar) har tagits bort.", + + // "item.edit.item-mapper.notifications.remove.success.head": "Removal of mapping completed", + // TODO New key - Add a translation + "item.edit.item-mapper.notifications.remove.success.head": "Mappning borttagen", + + // "item.edit.item-mapper.search-form.placeholder": "Search collections...", + // TODO New key - Add a translation + "item.edit.item-mapper.search-form.placeholder": "Sök samlingar...", + + // "item.edit.item-mapper.tabs.browse": "Browse mapped collections", + // TODO New key - Add a translation + "item.edit.item-mapper.tabs.browse": "Bläddra bland mappade samlingar", + + // "item.edit.item-mapper.tabs.map": "Map new collections", + // TODO New key - Add a translation + "item.edit.item-mapper.tabs.map": "Mappa en ny samling", + + + + // "item.edit.metadata.add-button": "Add", + // TODO New key - Add a translation + "item.edit.metadata.add-button": "Lägg till", + + // "item.edit.metadata.discard-button": "Discard", + // TODO New key - Add a translation + "item.edit.metadata.discard-button": "Avbryt", + + // "item.edit.metadata.edit.buttons.edit": "Edit", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.edit": "Radera", + + // "item.edit.metadata.edit.buttons.remove": "Remove", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.remove": "Ta bort", + + // "item.edit.metadata.edit.buttons.undo": "Undo changes", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.undo": "Ängra ändringar", + + // "item.edit.metadata.edit.buttons.unedit": "Stop editing", + // TODO New key - Add a translation + "item.edit.metadata.edit.buttons.unedit": "Avbryt redigering", + + // "item.edit.metadata.empty": "The item currently doesn't contain any metadata. Click Add to start adding a metadata value.", + // TODO New key - Add a translation + "item.edit.metadata.empty": "Denna post innehåller inga metadata. Klicka på Lägg till.", + + // "item.edit.metadata.headers.edit": "Edit", + // TODO New key - Add a translation + "item.edit.metadata.headers.edit": "Redigera", + + // "item.edit.metadata.headers.field": "Field", + // TODO New key - Add a translation + "item.edit.metadata.headers.field": "Fält", + + // "item.edit.metadata.headers.language": "Lang", + // TODO New key - Add a translation + "item.edit.metadata.headers.language": "Språk", + + // "item.edit.metadata.headers.value": "Value", + // TODO New key - Add a translation + "item.edit.metadata.headers.value": "Värde", + + // "item.edit.metadata.metadatafield.invalid": "Please choose a valid metadata field", + // TODO New key - Add a translation + "item.edit.metadata.metadatafield.invalid": "Välj ett giltigt metadatafält", + + // "item.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + // TODO New key - Add a translation + "item.edit.metadata.notifications.discarded.content": "Dina ändringar förkastades. För att återställa, klicka på 'Ångra'", + + // "item.edit.metadata.notifications.discarded.title": "Changed discarded", + // TODO New key - Add a translation + "item.edit.metadata.notifications.discarded.title": "Ändringar förkastade", + + // "item.edit.metadata.notifications.error.title": "An error occurred", + // TODO New key - Add a translation + "item.edit.metadata.notifications.error.title": "Ett fel har uppstått", + + // "item.edit.metadata.notifications.invalid.content": "Your changes were not saved. Please make sure all fields are valid before you save.", + // TODO New key - Add a translation + "item.edit.metadata.notifications.invalid.content": "Dina ändringar sparades inte. Kontrollera att alla fält innehåller giltiga värden.", + + // "item.edit.metadata.notifications.invalid.title": "Metadata invalid", + // TODO New key - Add a translation + "item.edit.metadata.notifications.invalid.title": "Ogiltiga metadata", + + // "item.edit.metadata.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", + // TODO New key - Add a translation + "item.edit.metadata.notifications.outdated.content": "Posten har ändrats av en annan användare. Dina ändringar har inte sparats", + + // "item.edit.metadata.notifications.outdated.title": "Changed outdated", + // TODO New key - Add a translation + "item.edit.metadata.notifications.outdated.title": "Ändring är föräldrad", + + // "item.edit.metadata.notifications.saved.content": "Your changes to this item's metadata were saved.", + // TODO New key - Add a translation + "item.edit.metadata.notifications.saved.content": "Dina ändringar har sparats.", + + // "item.edit.metadata.notifications.saved.title": "Metadata saved", + // TODO New key - Add a translation + "item.edit.metadata.notifications.saved.title": "Metadata har sparats", + + // "item.edit.metadata.reinstate-button": "Undo", + // TODO New key - Add a translation + "item.edit.metadata.reinstate-button": "Ångra", + + // "item.edit.metadata.save-button": "Save", + // TODO New key - Add a translation + "item.edit.metadata.save-button": "Spara", + + + + // "item.edit.modify.overview.field": "Field", + // TODO New key - Add a translation + "item.edit.modify.overview.field": "Fält", + + // "item.edit.modify.overview.language": "Språk", + // TODO New key - Add a translation + "item.edit.modify.overview.language": "Språk", + + // "item.edit.modify.overview.value": "Value", + // TODO New key - Add a translation + "item.edit.modify.overview.value": "Värde", + + + + // "item.edit.move.cancel": "Back", + // TODO New key - Add a translation + "item.edit.move.cancel": "Tillbaka", + + // "item.edit.move.save-button": "Save", + // TODO New key - Add a translation + "item.edit.move.save-button": "Spara", + + // "item.edit.move.discard-button": "Discard", + // TODO New key - Add a translation + "item.edit.move.discard-button": "Ta bort", + + // "item.edit.move.description": "Select the collection you wish to move this item to. To narrow down the list of displayed collections, you can enter a search query in the box.", + // TODO New key - Add a translation + "item.edit.move.description": "Välj samling som du vill flytta denna post till. Du kan söka efter samling(ar) i fältet nedan.", + + // "item.edit.move.error": "An error occurred when attempting to move the item", + // TODO New key - Add a translation + "item.edit.move.error": "Ett fel uppstod när posten skulle flyttas", + + // "item.edit.move.head": "Move item: {{id}}", + // TODO New key - Add a translation + "item.edit.move.head": "Flytta post: {{id}}", + + // "item.edit.move.inheritpolicies.checkbox": "Inherit policies", + // TODO New key - Add a translation + "item.edit.move.inheritpolicies.checkbox": "Ärv policies", + + // "item.edit.move.inheritpolicies.description": "Inherit the default policies of the destination collection", + // TODO New key - Add a translation + "item.edit.move.inheritpolicies.description": "Använd samma policies som i den mottagande samlingen", + + // "item.edit.move.move": "Move", + // TODO New key - Add a translation + "item.edit.move.move": "Flytta", + + // "item.edit.move.processing": "Moving...", + // TODO New key - Add a translation + "item.edit.move.processing": "Flyttar...", + + // "item.edit.move.search.placeholder": "Enter a search query to look for collections", + // TODO New key - Add a translation + "item.edit.move.search.placeholder": "Ange sökord för att söka efter samling", + + // "item.edit.move.success": "The item has been moved successfully", + // TODO New key - Add a translation + "item.edit.move.success": "Posten har flyttats", + + // "item.edit.move.title": "Move item", + // TODO New key - Add a translation + "item.edit.move.title": "Flytta post", + + + + // "item.edit.private.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.private.cancel": "Avbryt", + + // "item.edit.private.confirm": "Make it non-discoverable", + // TODO New key - Add a translation + "item.edit.private.confirm": "Gör posten ej sökbar", + + // "item.edit.private.description": "Are you sure this item should be made non-discoverable in the archive?", + // TODO New key - Add a translation + "item.edit.private.description": "Är du säker på att posten inte skall vara sökbar i arkivet?", + + // "item.edit.private.error": "An error occurred while making the item non-discoverable", + // TODO New key - Add a translation + "item.edit.private.error": "Ett fel uppstod", + + // "item.edit.private.header": "Make item non-discoverable: {{ id }}", + // TODO New key - Add a translation + "item.edit.private.header": "Gör denna post ej sökbar: {{ id }}", + + // "item.edit.private.success": "The item is now non-discoverable", + // TODO New key - Add a translation + "item.edit.private.success": "Denna post är nu inte längre sökbar", + + + + // "item.edit.public.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.public.cancel": "Avbryt", + + // "item.edit.public.confirm": "Make it discoverable", + // TODO New key - Add a translation + "item.edit.public.confirm": "Gör denna sökbar", + + // "item.edit.public.description": "Are you sure this item should be made discoverable in the archive?", + // TODO New key - Add a translation + "item.edit.public.description": "Är du säker på att denna post skall vara sökbar i arkivet?", + + // "item.edit.public.error": "An error occurred while making the item discoverable", + // TODO New key - Add a translation + "item.edit.public.error": "Ett fel uppstod", + + // "item.edit.public.header": "Make item discoverable: {{ id }}", + // TODO New key - Add a translation + "item.edit.public.header": "Gör post sökbar: {{ id }}", + + // "item.edit.public.success": "The item is now discoverable", + // TODO New key - Add a translation + "item.edit.public.success": "Posten är nu sökbar", + + + + // "item.edit.reinstate.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.reinstate.cancel": "Avbryt", + + // "item.edit.reinstate.confirm": "Reinstate", + // TODO New key - Add a translation + "item.edit.reinstate.confirm": "Återställ", + + // "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?", + // TODO New key - Add a translation + "item.edit.reinstate.description": "Är du säker på att denna post skall återställas?", + + // "item.edit.reinstate.error": "An error occurred while reinstating the item", + // TODO New key - Add a translation + "item.edit.reinstate.error": "Ett fel uppstod", + + // "item.edit.reinstate.header": "Reinstate item: {{ id }}", + // TODO New key - Add a translation + "item.edit.reinstate.header": "Återställ post: {{ id }}", + + // "item.edit.reinstate.success": "The item was reinstated successfully", + // TODO New key - Add a translation + "item.edit.reinstate.success": "Posten har nu återställts", + + + + + // "item.edit.relationships.discard-button": "Discard", + // TODO New key - Add a translation + "item.edit.relationships.discard-button": "Kasta bort", + + // "item.edit.relationships.edit.buttons.add": "Add", + // TODO New key - Add a translation + "item.edit.relationships.edit.buttons.add": "Lägg till", + + // "item.edit.relationships.edit.buttons.remove": "Remove", + // TODO New key - Add a translation + "item.edit.relationships.edit.buttons.remove": "Ta bort", + + // "item.edit.relationships.edit.buttons.undo": "Undo changes", + // TODO New key - Add a translation + "item.edit.relationships.edit.buttons.undo": "Ångra ändringar", + + // "item.edit.relationships.no-relationships": "No relationships", + // TODO New key - Add a translation + "item.edit.relationships.no-relationships": "Relationer saknas", + + // "item.edit.relationships.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button", + // TODO New key - Add a translation + "item.edit.relationships.notifications.discarded.content": "Dina ändringar sparades inte. Klicka på 'Ångra' för att göra om", + + // "item.edit.relationships.notifications.discarded.title": "Changes discarded", + // TODO New key - Add a translation + "item.edit.relationships.notifications.discarded.title": "Ändringarna sparades inte", + + // "item.edit.relationships.notifications.failed.title": "Error editing relationships", + // TODO New key - Add a translation + "item.edit.relationships.notifications.failed.title": "Ett fel uppstod när relationer redigerades", + + // "item.edit.relationships.notifications.outdated.content": "The item you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts", + // TODO New key - Add a translation + "item.edit.relationships.notifications.outdated.content": "Denna post har nyligen ändrats av en annan användare. Dina ändringar har inte sparats, för att undvika konflikterer", + + // "item.edit.relationships.notifications.outdated.title": "Changes outdated", + // TODO New key - Add a translation + "item.edit.relationships.notifications.outdated.title": "Ändringarna är föråldrade", + + // "item.edit.relationships.notifications.saved.content": "Your changes to this item's relationships were saved.", + // TODO New key - Add a translation + "item.edit.relationships.notifications.saved.content": "Ändringarna har sparats.", + + // "item.edit.relationships.notifications.saved.title": "Relationships saved", + // TODO New key - Add a translation + "item.edit.relationships.notifications.saved.title": "Relationerna har sparats", + + // "item.edit.relationships.reinstate-button": "Undo", + // TODO New key - Add a translation + "item.edit.relationships.reinstate-button": "Ångra", + + // "item.edit.relationships.save-button": "Save", + // TODO New key - Add a translation + "item.edit.relationships.save-button": "Spara", + + // "item.edit.relationships.no-entity-type": "Add 'dspace.entity.type' metadata to enable relationships for this item", + // TODO New key - Add a translation + "item.edit.relationships.no-entity-type": "Lägg till 'dspace.entity.type' metadata för att möjliggöra relationer till denna post", + // "item.edit.return": "Back", + // TODO New key - Add a translation + "item.edit.return": "Tillbaka", + + + // "item.edit.tabs.bitstreams.head": "Bitstreams", + // TODO New key - Add a translation + "item.edit.tabs.bitstreams.head": "Filer", + + // "item.edit.tabs.bitstreams.title": "Item Edit - Bitstreams", + // TODO New key - Add a translation + "item.edit.tabs.bitstreams.title": "Redigera post - Filer", + + // "item.edit.tabs.curate.head": "Curate", + // TODO New key - Add a translation + "item.edit.tabs.curate.head": "Kurera", + + // "item.edit.tabs.curate.title": "Item Edit - Curate", + // TODO New key - Add a translation + "item.edit.tabs.curate.title": "Redigera post - Kurera", + + // "item.edit.tabs.metadata.head": "Metadata", + // TODO New key - Add a translation + "item.edit.tabs.metadata.head": "Metadata", + + // "item.edit.tabs.metadata.title": "Item Edit - Metadata", + // TODO New key - Add a translation + "item.edit.tabs.metadata.title": "Redigera post - Metadata", + + // "item.edit.tabs.relationships.head": "Relationships", + // TODO New key - Add a translation + "item.edit.tabs.relationships.head": "Relationer", + + // "item.edit.tabs.relationships.title": "Item Edit - Relationships", + // TODO New key - Add a translation + "item.edit.tabs.relationships.title": "Redigera post - Relationer", + + // "item.edit.tabs.status.buttons.authorizations.button": "Authorizations...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.authorizations.button": "Behörigheter...", + + // "item.edit.tabs.status.buttons.authorizations.label": "Edit item's authorization policies", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.authorizations.label": "Redigera behörigheter för post", + + // "item.edit.tabs.status.buttons.delete.button": "Permanently delete", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.delete.button": "Radera permanent", + + // "item.edit.tabs.status.buttons.delete.label": "Completely expunge item", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.delete.label": "Radera fullständigt", + + // "item.edit.tabs.status.buttons.mappedCollections.button": "Mapped collections", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.mappedCollections.button": "Mappade samlingar", + + // "item.edit.tabs.status.buttons.mappedCollections.label": "Manage mapped collections", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.mappedCollections.label": "Hantera mappade samlingar", + + // "item.edit.tabs.status.buttons.move.button": "Move...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.move.button": "Flytta...", + + // "item.edit.tabs.status.buttons.move.label": "Move item to another collection", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.move.label": "Flytta post till en annan samling", + + // "item.edit.tabs.status.buttons.private.button": "Make it non-discoverable...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.private.button": "Exkludera posten från sökningar...", + + // "item.edit.tabs.status.buttons.private.label": "Make item non-discoverable", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.private.label": "Gör post ej sökbar", + + // "item.edit.tabs.status.buttons.public.button": "Make it discoverable...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.public.button": "Gör posten sökbar...", + + // "item.edit.tabs.status.buttons.public.label": "Make item discoverable", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.public.label": "Gör posten sökbar", + + // "item.edit.tabs.status.buttons.reinstate.button": "Reinstate...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.reinstate.button": "Återställ...", + + // "item.edit.tabs.status.buttons.reinstate.label": "Reinstate item into the repository", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.reinstate.label": "Återställ post i arkivet", + + // "item.edit.tabs.status.buttons.unauthorized": "You're not authorized to perform this action", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.unauthorized": "Du saknar behörighet att utföra detta", + + // "item.edit.tabs.status.buttons.withdraw.button": "Withdraw...", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.withdraw.button": "Återkalla...", + + // "item.edit.tabs.status.buttons.withdraw.label": "Withdraw item from the repository", + // TODO New key - Add a translation + "item.edit.tabs.status.buttons.withdraw.label": "Återkalla post från arkivet", + + // "item.edit.tabs.status.description": "Welcome to the item management page. From here you can withdraw, reinstate, move or delete the item. You may also update or add new metadata / bitstreams on the other tabs.", + // TODO New key - Add a translation + "item.edit.tabs.status.description": "Detta är sidan för att hantera poster. Här kan du återkalla, återställa, flytta eller radera poster. Du kan också redigera postens metadata och/eller filer.", + + // "item.edit.tabs.status.head": "Status", + // TODO New key - Add a translation + "item.edit.tabs.status.head": "Status", + + // "item.edit.tabs.status.labels.handle": "Handle", + // TODO New key - Add a translation + "item.edit.tabs.status.labels.handle": "Handle", + + // "item.edit.tabs.status.labels.id": "Item Internal ID", + // TODO New key - Add a translation + "item.edit.tabs.status.labels.id": "Postens interna ID", + + // "item.edit.tabs.status.labels.itemPage": "Item Page", + // TODO New key - Add a translation + "item.edit.tabs.status.labels.itemPage": "Post", + + // "item.edit.tabs.status.labels.lastModified": "Last Modified", + // TODO New key - Add a translation + "item.edit.tabs.status.labels.lastModified": "Senast ändrad", + + // "item.edit.tabs.status.title": "Item Edit - Status", + // TODO New key - Add a translation + "item.edit.tabs.status.title": "Redigera post - Status", + + // "item.edit.tabs.versionhistory.head": "Version History", + // TODO New key - Add a translation + "item.edit.tabs.versionhistory.head": "Versionshistorik", + + // "item.edit.tabs.versionhistory.title": "Item Edit - Version History", + // TODO New key - Add a translation + "item.edit.tabs.versionhistory.title": "Redigera post - Versionshistorik", + + // "item.edit.tabs.versionhistory.under-construction": "Editing or adding new versions is not yet possible in this user interface.", + // TODO New key - Add a translation + "item.edit.tabs.versionhistory.under-construction": "Det är inte möjligt att redigera eller skapa nya versioner på denna sida.", + + // "item.edit.tabs.view.head": "View Item", + // TODO New key - Add a translation + "item.edit.tabs.view.head": "Visa post", + + // "item.edit.tabs.view.title": "Item Edit - View", + // TODO New key - Add a translation + "item.edit.tabs.view.title": "Redigera post - Visa", + + + + // "item.edit.withdraw.cancel": "Cancel", + // TODO New key - Add a translation + "item.edit.withdraw.cancel": "Avbryt", + + // "item.edit.withdraw.confirm": "Withdraw", + // TODO New key - Add a translation + "item.edit.withdraw.confirm": "Återkalla", + + // "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?", + // TODO New key - Add a translation + "item.edit.withdraw.description": "Är du säker på att du vill återkalla denna post från arkivet?", + + // "item.edit.withdraw.error": "An error occurred while withdrawing the item", + // TODO New key - Add a translation + "item.edit.withdraw.error": "Ett fel uppstod när posten skulle återkallas", + + // "item.edit.withdraw.header": "Withdraw item: {{ id }}", + // TODO New key - Add a translation + "item.edit.withdraw.header": "Återkalla post: {{ id }}", + + // "item.edit.withdraw.success": "The item was withdrawn successfully", + // TODO New key - Add a translation + "item.edit.withdraw.success": "Posten har återkallats", + + + + // "item.listelement.badge": "Item", + // TODO New key - Add a translation + "item.listelement.badge": "Post", + + // "item.page.description": "Beskrivning", + // TODO New key - Add a translation + "item.page.description": "Beskrivning", + + // "item.page.journal-issn": "Journal ISSN", + // TODO New key - Add a translation + "item.page.journal-issn": "ISSN", + + // "item.page.journal-title": "Journal Title", + // TODO New key - Add a translation + "item.page.journal-title": "Tidskriftstitel", + + // "item.page.publisher": "Publisher", + // TODO New key - Add a translation + "item.page.publisher": "Utgivare", + + // "item.page.titleprefix": "Item: ", + // TODO New key - Add a translation + "item.page.titleprefix": "Post: ", + + // "item.page.volume-title": "Volume Title", + // TODO New key - Add a translation + "item.page.volume-title": "Volymtitel", + + // "item.search.results.head": "Item Search Results", + // TODO New key - Add a translation + "item.search.results.head": "Sökresultat", + + // "item.search.title": "Item Search", + // TODO New key - Add a translation + "item.search.title": "Sökresultat", + + + + // "item.page.abstract": "Abstract", + // TODO New key - Add a translation + "item.page.abstract": "Sammanfattning", + + // "item.page.author": "Författare", + // TODO New key - Add a translation + "item.page.author": "Författare", + + // "item.page.citation": "Citation", + // TODO New key - Add a translation + "item.page.citation": "Citation", + + // "item.page.collections": "Collections", + // TODO New key - Add a translation + "item.page.collections": "Samling", + + // "item.page.collections.loading": "Loading...", + // TODO New key - Add a translation + "item.page.collections.loading": "Laddar..", + + // "item.page.collections.load-more": "Load more", + // TODO New key - Add a translation + "item.page.collections.load-more": "Ladda fler", + + // "item.page.date": "Date", + // TODO New key - Add a translation + "item.page.date": "Publicerad", + + // "item.page.edit": "Edit this item", + // TODO New key - Add a translation + "item.page.edit": "Redigera denna post", + + // "item.page.files": "Files", + // TODO New key - Add a translation + "item.page.files": "Filer", + + // "item.page.filesection.description": "Beskrivning:", + // TODO New key - Add a translation + "item.page.filesection.description": "Beskrivning:", + + // "item.page.filesection.download": "Download", + // TODO New key - Add a translation + "item.page.filesection.download": "Ladda ner", + + // "item.page.filesection.format": "Format:", + // TODO New key - Add a translation + "item.page.filesection.format": "Format:", + + // "item.page.filesection.name": "Name:", + // TODO New key - Add a translation + "item.page.filesection.name": "Namn:", + + // "item.page.filesection.size": "Storlek:", + // TODO New key - Add a translation + "item.page.filesection.size": "Storlek:", + + // "item.page.journal.search.title": "Articles in this journal", + // TODO New key - Add a translation + "item.page.journal.search.title": "Artiklar i denna tidskrift", + + // "item.page.link.full": "Full item page", + // TODO New key - Add a translation + "item.page.link.full": "Visa fullständig post", + + // "item.page.link.simple": "Simple item page", + // TODO New key - Add a translation + "item.page.link.simple": "Visa enkel post", + + // "item.page.person.search.title": "Articles by this author", + // TODO New key - Add a translation + "item.page.person.search.title": "Artiklar av denna författare", + + // "item.page.related-items.view-more": "Show {{ amount }} more", + // TODO New key - Add a translation + "item.page.related-items.view-more": "Visa {{ amount }} fler", + + // "item.page.related-items.view-less": "Hide last {{ amount }}", + // TODO New key - Add a translation + "item.page.related-items.view-less": "Göm senaste {{ amount }}", + + // "item.page.relationships.isAuthorOfPublication": "Publications", + // TODO New key - Add a translation + "item.page.relationships.isAuthorOfPublication": "Publikationer", + + // "item.page.relationships.isJournalOfPublication": "Publications", + // TODO New key - Add a translation + "item.page.relationships.isJournalOfPublication": "Publikationer", + + // "item.page.relationships.isOrgUnitOfPerson": "Författare", + // TODO New key - Add a translation + "item.page.relationships.isOrgUnitOfPerson": "Författare", + + // "item.page.relationships.isOrgUnitOfProject": "Research Projects", + // TODO New key - Add a translation + "item.page.relationships.isOrgUnitOfProject": "Forskningsprojekt", + + // "item.page.subject": "Keywords", + // TODO New key - Add a translation + "item.page.subject": "Ämne/nyckelord", + + // "item.page.uri": "URI", + // TODO New key - Add a translation + "item.page.uri": "URI", + + // "item.page.bitstreams.view-more": "Show more", + // TODO New key - Add a translation + "item.page.bitstreams.view-more": "Visa mer", + + // "item.page.bitstreams.collapse": "Collapse", + // TODO New key - Add a translation + "item.page.bitstreams.collapse": "Fäll ihop", + + // "item.page.filesection.original.bundle" : "Original bundle", + // TODO New key - Add a translation + "item.page.filesection.original.bundle" : "Original bundle", + + // "item.page.filesection.license.bundle" : "License bundle", + // TODO New key - Add a translation + "item.page.filesection.license.bundle" : "License bundle", + + // "item.page.return": "Back", + // TODO New key - Add a translation + "item.page.return": "Tillbaka", + + // "item.page.version.create": "Create new version", + // TODO New key - Add a translation + "item.page.version.create": "Skapa ny version", + + // "item.page.version.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // TODO New key - Add a translation + "item.page.version.hasDraft": "Ny version kan inte skapas pga pågående uppladdning i versionshistoriken", + + // "item.preview.dc.identifier.uri": "Identifier:", + // TODO New key - Add a translation + "item.preview.dc.identifier.uri": "Identifierare:", + + // "item.preview.dc.contributor.author": "Författare:", + // TODO New key - Add a translation + "item.preview.dc.contributor.author": "Författare:", + + // "item.preview.dc.date.issued": "Published date:", + // TODO New key - Add a translation + "item.preview.dc.date.issued": "Publicerad:", + + // "item.preview.dc.description.abstract": "Abstract:", + // TODO New key - Add a translation + "item.preview.dc.description.abstract": "Sammanfattning:", + + // "item.preview.dc.identifier.other": "Other identifier:", + // TODO New key - Add a translation + "item.preview.dc.identifier.other": "Annan identifierare:", + + // "item.preview.dc.language.iso": "Språk:", + // TODO New key - Add a translation + "item.preview.dc.language.iso": "Språk:", + + // "item.preview.dc.subject": "Subjects:", + // TODO New key - Add a translation + "item.preview.dc.subject": "Ämnen:", + + // "item.preview.dc.title": "Title:", + // TODO New key - Add a translation + "item.preview.dc.title": "Titel:", + + // "item.preview.person.familyName": "Surname:", + // TODO New key - Add a translation + "item.preview.person.familyName": "Förnamn:", + + // "item.preview.person.givenName": "Name:", + // TODO New key - Add a translation + "item.preview.person.givenName": "Namn:", + + // "item.preview.person.identifier.orcid": "ORCID:", + // TODO New key - Add a translation + "item.preview.person.identifier.orcid": "ORCID:", + + // "item.preview.project.funder.name": "Funder:", + // TODO New key - Add a translation + "item.preview.project.funder.name": "Finansiär:", + + // "item.preview.project.funder.identifier": "Funder Identifier:", + // TODO New key - Add a translation + "item.preview.project.funder.identifier": "Finansiär ID:", + + // "item.preview.oaire.awardNumber": "Funding ID:", + // TODO New key - Add a translation + "item.preview.oaire.awardNumber": "Finansiering ID:", + + // "item.preview.dc.title.alternative": "Acronym:", + // TODO New key - Add a translation + "item.preview.dc.title.alternative": "Akronym:", + + // "item.preview.dc.coverage.spatial": "Jurisdiction:", + // TODO New key - Add a translation + "item.preview.dc.coverage.spatial": "Jurisdiktion:", + + // "item.preview.oaire.fundingStream": "Funding Stream:", + // TODO New key - Add a translation + "item.preview.oaire.fundingStream": "Funding Stream:", + + + + // "item.select.confirm": "Confirm selected", + // TODO New key - Add a translation + "item.select.confirm": "Bekräfta valda", + + // "item.select.empty": "No items to show", + // TODO New key - Add a translation + "item.select.empty": "Inga poster att visa. ", + + // "item.select.table.author": "Author", + // TODO New key - Add a translation + "item.select.table.author": "Författare", + + // "item.select.table.collection": "Collection", + // TODO New key - Add a translation + "item.select.table.collection": "Samling", + + // "item.select.table.title": "Title", + // TODO New key - Add a translation + "item.select.table.title": "Titel", + + + // "item.version.history.empty": "There are no other versions for this item yet.", + // TODO New key - Add a translation + "item.version.history.empty": "Det finns inga andra versioner av denna post.", + + // "item.version.history.head": "Version History", + // TODO New key - Add a translation + "item.version.history.head": "Versionshistorik", + + // "item.version.history.return": "Back", + // TODO New key - Add a translation + "item.version.history.return": "Tillbaka", + + // "item.version.history.selected": "Selected version", + // TODO New key - Add a translation + "item.version.history.selected": "Vald version", + + // "item.version.history.selected.alert": "You are currently viewing version {{version}} of the item.", + // TODO New key - Add a translation + "item.version.history.selected.alert": "Du tittat på version {{version}} av denna post.", + + // "item.version.history.table.version": "Version", + // TODO New key - Add a translation + "item.version.history.table.version": "Version", + + // "item.version.history.table.item": "Item", + // TODO New key - Add a translation + "item.version.history.table.item": "Post", + + // "item.version.history.table.editor": "Editor", + // TODO New key - Add a translation + "item.version.history.table.editor": "Redaktör", + + // "item.version.history.table.date": "Date", + // TODO New key - Add a translation + "item.version.history.table.date": "Datum", + + // "item.version.history.table.summary": "Summary", + // TODO New key - Add a translation + "item.version.history.table.summary": "Sammanfattning", + + // "item.version.history.table.workspaceItem": "Workspace item", + // TODO New key - Add a translation + "item.version.history.table.workspaceItem": "Workspace item", + + // "item.version.history.table.workflowItem": "Workflow item", + // TODO New key - Add a translation + "item.version.history.table.workflowItem": "Post i arbetsflöde", + + // "item.version.history.table.actions": "Action", + // TODO New key - Add a translation + "item.version.history.table.actions": "Åtgärd", + + // "item.version.history.table.action.editWorkspaceItem": "Edit workspace item", + // TODO New key - Add a translation + "item.version.history.table.action.editWorkspaceItem": "Redigera post", + + // "item.version.history.table.action.editSummary": "Edit summary", + // TODO New key - Add a translation + "item.version.history.table.action.editSummary": "Redigera sammanfattning", + + // "item.version.history.table.action.saveSummary": "Save summary edits", + // TODO New key - Add a translation + "item.version.history.table.action.saveSummary": "Spara ändringar", + + // "item.version.history.table.action.discardSummary": "Discard summary edits", + // TODO New key - Add a translation + "item.version.history.table.action.discardSummary": "Förkasta ändringar", + + // "item.version.history.table.action.newVersion": "Create new version from this one", + // TODO New key - Add a translation + "item.version.history.table.action.newVersion": "Skapa ny version av denna", + + // "item.version.history.table.action.deleteVersion": "Delete version", + // TODO New key - Add a translation + "item.version.history.table.action.deleteVersion": "Radera version", + + // "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + // TODO New key - Add a translation + "item.version.history.table.action.hasDraft": "A new version cannot be created because there is an inprogress submission in the version history", + + + // "item.version.notice": "This is not the latest version of this item. The latest version can be found here.", + // TODO New key - Add a translation + "item.version.notice": "Detta är inte den senaste versionen. Senaste versionen finns här.", + + + // "item.version.create.modal.header": "New version", + // TODO New key - Add a translation + "item.version.create.modal.header": "Ny version", + + // "item.version.create.modal.text": "Create a new version for this item", + // TODO New key - Add a translation + "item.version.create.modal.text": "Skapa ny version av denna post", + + // "item.version.create.modal.text.startingFrom": "starting from version {{version}}", + // TODO New key - Add a translation + "item.version.create.modal.text.startingFrom": "med början från version {{version}}", + + // "item.version.create.modal.button.confirm": "Create", + // TODO New key - Add a translation + "item.version.create.modal.button.confirm": "Skapa", + + // "item.version.create.modal.button.confirm.tooltip": "Create new version", + // TODO New key - Add a translation + "item.version.create.modal.button.confirm.tooltip": "Skapa ny version", + + // "item.version.create.modal.button.cancel": "Cancel", + // TODO New key - Add a translation + "item.version.create.modal.button.cancel": "Avbryt", + + // "item.version.create.modal.button.cancel.tooltip": "Do not create new version", + // TODO New key - Add a translation + "item.version.create.modal.button.cancel.tooltip": "Skapa inte ny version", + + // "item.version.create.modal.form.summary.label": "Summary", + // TODO New key - Add a translation + "item.version.create.modal.form.summary.label": "Sammanfattning", + + // "item.version.create.modal.form.summary.placeholder": "Insert the summary for the new version", + // TODO New key - Add a translation + "item.version.create.modal.form.summary.placeholder": "Lägg till sammanfattning av den nya versionen", + + // "item.version.create.notification.success" : "New version has been created with version number {{version}}", + // TODO New key - Add a translation + "item.version.create.notification.success" : "En ny version med nummer {{version}} har skapats", + + // "item.version.create.notification.failure" : "New version has not been created", + // TODO New key - Add a translation + "item.version.create.notification.failure" : "Ny version har inte skapats", + + // "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + // TODO New key - Add a translation + "item.version.create.notification.inProgress" : "A new version cannot be created because there is an inprogress submission in the version history", + + + // "item.version.delete.modal.header": "Delete version", + // TODO New key - Add a translation + "item.version.delete.modal.header": "Radera version", + + // "item.version.delete.modal.text": "Do you want to delete version {{version}}?", + // TODO New key - Add a translation + "item.version.delete.modal.text": "Vill du radera version {{version}}?", + + // "item.version.delete.modal.button.confirm": "Delete", + // TODO New key - Add a translation + "item.version.delete.modal.button.confirm": "Radera", + + // "item.version.delete.modal.button.confirm.tooltip": "Delete this version", + // TODO New key - Add a translation + "item.version.delete.modal.button.confirm.tooltip": "Radera denna version", + + // "item.version.delete.modal.button.cancel": "Cancel", + // TODO New key - Add a translation + "item.version.delete.modal.button.cancel": "Avbryt", + + // "item.version.delete.modal.button.cancel.tooltip": "Do not delete this version", + // TODO New key - Add a translation + "item.version.delete.modal.button.cancel.tooltip": "Radera inte denna version", + + // "item.version.delete.notification.success" : "Version number {{version}} has been deleted", + // TODO New key - Add a translation + "item.version.delete.notification.success" : "Version {{version}} har raderats", + + // "item.version.delete.notification.failure" : "Version number {{version}} has not been deleted", + // TODO New key - Add a translation + "item.version.delete.notification.failure" : "Version {{version}} har inte raderats", + + + // "item.version.edit.notification.success" : "The summary of version number {{version}} has been changed", + // TODO New key - Add a translation + "item.version.edit.notification.success" : "Sammanfattningen av version {{version}} har ändrats", + + // "item.version.edit.notification.failure" : "The summary of version number {{version}} has not been changed", + // TODO New key - Add a translation + "item.version.edit.notification.failure" : "Sammanfattningen av version {{version}} har inte ändrats", + + + + // "journal.listelement.badge": "Journal", + // TODO New key - Add a translation + "journal.listelement.badge": "Tidskrift", + + // "journal.page.description": "Beskrivning", + // TODO New key - Add a translation + "journal.page.description": "Beskrivning", + + // "journal.page.edit": "Edit this item", + // TODO New key - Add a translation + "journal.page.edit": "Redigera denna", + + // "journal.page.editor": "Editor-in-Chief", + // TODO New key - Add a translation + "journal.page.editor": "Editor-in-Chief", + + // "journal.page.issn": "ISSN", + // TODO New key - Add a translation + "journal.page.issn": "ISSN", + + // "journal.page.publisher": "Publisher", + // TODO New key - Add a translation + "journal.page.publisher": "Utgivare", + + // "journal.page.titleprefix": "Journal: ", + // TODO New key - Add a translation + "journal.page.titleprefix": "Tidskrift: ", + + // "journal.search.results.head": "Journal Search Results", + // TODO New key - Add a translation + "journal.search.results.head": "Sökresultat", + + // "journal.search.title": "Journal Search", + // TODO New key - Add a translation + "journal.search.title": "Sök tidskrift", + + + + // "journalissue.listelement.badge": "Journal Issue", + // TODO New key - Add a translation + "journalissue.listelement.badge": "Journal Issue", + + // "journalissue.page.description": "Beskrivning", + // TODO New key - Add a translation + "journalissue.page.description": "Beskrivning", + + // "journalissue.page.edit": "Edit this item", + // TODO New key - Add a translation + "journalissue.page.edit": "Edit this item", + + // "journalissue.page.issuedate": "Issue Date", + // TODO New key - Add a translation + "journalissue.page.issuedate": "Issue Date", + + // "journalissue.page.journal-issn": "Journal ISSN", + // TODO New key - Add a translation + "journalissue.page.journal-issn": "Journal ISSN", + + // "journalissue.page.journal-title": "Journal Title", + // TODO New key - Add a translation + "journalissue.page.journal-title": "Journal Title", + + // "journalissue.page.keyword": "Keywords", + // TODO New key - Add a translation + "journalissue.page.keyword": "Ämne/nyckelord", + + // "journalissue.page.number": "Number", + // TODO New key - Add a translation + "journalissue.page.number": "Number", + + // "journalissue.page.titleprefix": "Journal Issue: ", + // TODO New key - Add a translation + "journalissue.page.titleprefix": "Journal Issue: ", + + + + // "journalvolume.listelement.badge": "Journal Volume", + // TODO New key - Add a translation + "journalvolume.listelement.badge": "Journal Volume", + + // "journalvolume.page.description": "Beskrivning", + // TODO New key - Add a translation + "journalvolume.page.description": "Beskrivning", + + // "journalvolume.page.edit": "Edit this item", + // TODO New key - Add a translation + "journalvolume.page.edit": "Edit this item", + + // "journalvolume.page.issuedate": "Issue Date", + // TODO New key - Add a translation + "journalvolume.page.issuedate": "Issue Date", + + // "journalvolume.page.titleprefix": "Journal Volume: ", + // TODO New key - Add a translation + "journalvolume.page.titleprefix": "Journal Volume: ", + + // "journalvolume.page.volume": "Volume", + // TODO New key - Add a translation + "journalvolume.page.volume": "Volume", + + + // "iiifsearchable.listelement.badge": "Document Media", + // TODO New key - Add a translation + "iiifsearchable.listelement.badge": "Document Media", + + // "iiifsearchable.page.titleprefix": "Document: ", + // TODO New key - Add a translation + "iiifsearchable.page.titleprefix": "Document: ", + + // "iiifsearchable.page.doi": "Permanent Link: ", + // TODO New key - Add a translation + "iiifsearchable.page.doi": "Permanent Link: ", + + // "iiifsearchable.page.issue": "Issue: ", + // TODO New key - Add a translation + "iiifsearchable.page.issue": "Issue: ", + + // "iiifsearchable.page.description": "Beskrivning: ", + // TODO New key - Add a translation + "iiifsearchable.page.description": "Beskrivning: ", + + // "iiifviewer.fullscreen.notice": "Use full screen for better viewing.", + // TODO New key - Add a translation + "iiifviewer.fullscreen.notice": "Use full screen for better viewing.", + + // "iiif.listelement.badge": "Image Media", + // TODO New key - Add a translation + "iiif.listelement.badge": "Image Media", + + // "iiif.page.titleprefix": "Image: ", + // TODO New key - Add a translation + "iiif.page.titleprefix": "Image: ", + + // "iiif.page.doi": "Permanent Link: ", + // TODO New key - Add a translation + "iiif.page.doi": "Permanent Link: ", + + // "iiif.page.issue": "Issue: ", + // TODO New key - Add a translation + "iiif.page.issue": "Issue: ", + + // "iiif.page.description": "Beskrivning: ", + // TODO New key - Add a translation + "iiif.page.description": "Beskrivning: ", + + + // "loading.bitstream": "Loading bitstream...", + // TODO New key - Add a translation + "loading.bitstream": "Hämtar fil...", + + // "loading.bitstreams": "Loading bitstreams...", + // TODO New key - Add a translation + "loading.bitstreams": "Hämtar filer...", + + // "loading.browse-by": "Loading items...", + // TODO New key - Add a translation + "loading.browse-by": "Hämtar poster...", + + // "loading.browse-by-page": "Loading page...", + // TODO New key - Add a translation + "loading.browse-by-page": "Hämtar sida...", + + // "loading.collection": "Loading collection...", + // TODO New key - Add a translation + "loading.collection": "Hämtar samling...", + + // "loading.collections": "Loading collections...", + // TODO New key - Add a translation + "loading.collections": "Hämtar samlingar..", + + // "loading.content-source": "Loading content source...", + // TODO New key - Add a translation + "loading.content-source": "Hämtar källa...", + + // "loading.community": "Loading community...", + // TODO New key - Add a translation + "loading.community": "Hämtar enhet...", + + // "loading.default": "Loading...", + // TODO New key - Add a translation + "loading.default": "Hämtar...", + + // "loading.item": "Loading item...", + // TODO New key - Add a translation + "loading.item": "Hämtar post...", + + // "loading.items": "Loading items...", + // TODO New key - Add a translation + "loading.items": "Hämtar poster...", + + // "loading.mydspace-results": "Loading items...", + // TODO New key - Add a translation + "loading.mydspace-results": "Hämtar poster...", + + // "loading.objects": "Loading...", + // TODO New key - Add a translation + "loading.objects": "Hämtar...", + + // "loading.recent-submissions": "Loading recent submissions...", + // TODO New key - Add a translation + "loading.recent-submissions": "Hämtar de senaste bidragen...", + + // "loading.search-results": "Loading search results...", + // TODO New key - Add a translation + "loading.search-results": "Hämtar sökresultat...", + + // "loading.sub-collections": "Loading sub-collections...", + // TODO New key - Add a translation + "loading.sub-collections": "Hämtar underavdelningar...", + + // "loading.sub-communities": "Loading sub-communities...", + // TODO New key - Add a translation + "loading.sub-communities": "Hämtar underenheter...", + + // "loading.top-level-communities": "Loading top-level communities...", + // TODO New key - Add a translation + "loading.top-level-communities": "Hämtar enheter på toppnivå...", + + + + // "login.form.email": "Email address", + // TODO New key - Add a translation + "login.form.email": "E-postadress", + + // "login.form.forgot-password": "Have you forgotten your password?", + // TODO New key - Add a translation + "login.form.forgot-password": "Har du glömt lösenordet?", + + // "login.form.header": "Please log in to DSpace", + // TODO New key - Add a translation + "login.form.header": "Logga in i ODR", + + // "login.form.new-user": "New user? Click here to register.", + // TODO New key - Add a translation + "login.form.new-user": "Ny användare? Klicka här för att skapa ett användarkonto.", + + // "login.form.or-divider": "or", + // TODO New key - Add a translation + "login.form.or-divider": "eller", + + // "login.form.oidc": "Log in with OIDC", + // TODO New key - Add a translation + "login.form.oidc": "Logga in med OIDC", + + // "login.form.password": "Password", + // TODO New key - Add a translation + "login.form.password": "Lösenord", + + // "login.form.shibboleth": "Log in with Shibboleth", + // TODO New key - Add a translation + "login.form.shibboleth": "Logga in med Shibboleth", + + // "login.form.submit": "Log in", + // TODO New key - Add a translation + "login.form.submit": "Logga in", + + // "login.title": "Login", + // TODO New key - Add a translation + "login.title": "Logga in", + + // "login.breadcrumbs": "Login", + // TODO New key - Add a translation + "login.breadcrumbs": "Logga in", + + + + // "logout.form.header": "Log out from DSpace", + // TODO New key - Add a translation + "logout.form.header": "Logga ut", + + // "logout.form.submit": "Log out", + // TODO New key - Add a translation + "logout.form.submit": "Logga ut", + + // "logout.title": "Logout", + // TODO New key - Add a translation + "logout.title": "Logga ut", + + + + // "menu.header.admin": "Management", + // TODO New key - Add a translation + "menu.header.admin": "Administration", + + // "menu.header.image.logo": "Repository logo", + // TODO New key - Add a translation + "menu.header.image.logo": "Logga för arkivet", + + // "menu.header.admin.description": "Management menu", + // TODO New key - Add a translation + "menu.header.admin.description": "Administration meny", + + + + // "menu.section.access_control": "Access Control", + // TODO New key - Add a translation + "menu.section.access_control": "Åtkomst", + + // "menu.section.access_control_authorizations": "Authorizations", + // TODO New key - Add a translation + "menu.section.access_control_authorizations": "Behörigheter", + + // "menu.section.access_control_groups": "Groups", + // TODO New key - Add a translation + "menu.section.access_control_groups": "Grupper", + + // "menu.section.access_control_people": "People", + // TODO New key - Add a translation + "menu.section.access_control_people": "EPersoner", + + + + // "menu.section.admin_search": "Admin Search", + // TODO New key - Add a translation + "menu.section.admin_search": "Admin sök", + + + + // "menu.section.browse_community": "This Community", + // TODO New key - Add a translation + "menu.section.browse_community": "Denna samling", + + // "menu.section.browse_community_by_author": "By Author", + // TODO New key - Add a translation + "menu.section.browse_community_by_author": "Författare", + + // "menu.section.browse_community_by_issue_date": "By Issue Date", + // TODO New key - Add a translation + "menu.section.browse_community_by_issue_date": "Utgivningsår", + + // "menu.section.browse_community_by_title": "By Title", + // TODO New key - Add a translation + "menu.section.browse_community_by_title": "Titel", + + // "menu.section.browse_global": "All of DSpace", + // TODO New key - Add a translation + "menu.section.browse_global": "Hela arkivet", + + // "menu.section.browse_global_by_author": "By Author", + // TODO New key - Add a translation + "menu.section.browse_global_by_author": "Författare", + + // "menu.section.browse_global_by_dateissued": "By Issue Date", + // TODO New key - Add a translation + "menu.section.browse_global_by_dateissued": "Utgivningsår", + + // "menu.section.browse_global_by_subject": "By Subject", + // TODO New key - Add a translation + "menu.section.browse_global_by_subject": "Ämne", + + // "menu.section.browse_global_by_title": "By Title", + // TODO New key - Add a translation + "menu.section.browse_global_by_title": "Titel", + + // "menu.section.browse_global_communities_and_collections": "Communities & Collections", + // TODO New key - Add a translation + "menu.section.browse_global_communities_and_collections": "Enheter och samlingar", + + + + // "menu.section.control_panel": "Control Panel", + // TODO New key - Add a translation + "menu.section.control_panel": "Kontrollpanel", + + // "menu.section.curation_task": "Curation Task", + // TODO New key - Add a translation + "menu.section.curation_task": "Kurationsuppgift", + + + + // "menu.section.edit": "Edit", + // TODO New key - Add a translation + "menu.section.edit": "Redigera", + + // "menu.section.edit_collection": "Collection", + // TODO New key - Add a translation + "menu.section.edit_collection": "Samling", + + // "menu.section.edit_community": "Community", + // TODO New key - Add a translation + "menu.section.edit_community": "Enhet", + + // "menu.section.edit_item": "Item", + // TODO New key - Add a translation + "menu.section.edit_item": "Post", + + + + // "menu.section.export": "Export", + // TODO New key - Add a translation + "menu.section.export": "Exportera", + + // "menu.section.export_collection": "Collection", + // TODO New key - Add a translation + "menu.section.export_collection": "Samling", + + // "menu.section.export_community": "Community", + // TODO New key - Add a translation + "menu.section.export_community": "Enhet", + + // "menu.section.export_item": "Item", + // TODO New key - Add a translation + "menu.section.export_item": "Post", + + // "menu.section.export_metadata": "Metadata", + // TODO New key - Add a translation + "menu.section.export_metadata": "Metadata", + + + + // "menu.section.icon.access_control": "Access Control menu section", + // TODO New key - Add a translation + "menu.section.icon.access_control": "Åtkomstkontroll - meny", + + // "menu.section.icon.admin_search": "Admin search menu section", + // TODO New key - Add a translation + "menu.section.icon.admin_search": "Admin sök - meny", + + // "menu.section.icon.control_panel": "Control Panel menu section", + // TODO New key - Add a translation + "menu.section.icon.control_panel": "Kontrollpanel - meny", + + // "menu.section.icon.curation_tasks": "Curation Task menu section", + // TODO New key - Add a translation + "menu.section.icon.curation_tasks": "Kureringsuppgift - meny", + + // "menu.section.icon.edit": "Edit menu section", + // TODO New key - Add a translation + "menu.section.icon.edit": "Redigera - meny", + + // "menu.section.icon.export": "Export menu section", + // TODO New key - Add a translation + "menu.section.icon.export": "Exportera - meny", + + // "menu.section.icon.find": "Find menu section", + // TODO New key - Add a translation + "menu.section.icon.find": "Sök - meny", + + // "menu.section.icon.import": "Import menu section", + // TODO New key - Add a translation + "menu.section.icon.import": "Importera - meny", + + // "menu.section.icon.new": "New menu section", + // TODO New key - Add a translation + "menu.section.icon.new": "Ny - meny", + + // "menu.section.icon.pin": "Pin sidebar", + // TODO New key - Add a translation + "menu.section.icon.pin": "Fäst sidomenyn", + + // "menu.section.icon.processes": "Processes menu section", + // TODO New key - Add a translation + "menu.section.icon.processes": "Processer - meny", + + // "menu.section.icon.registries": "Registries menu section", + // TODO New key - Add a translation + "menu.section.icon.registries": "Registries- meny", + + // "menu.section.icon.statistics_task": "Statistics Task menu section", + // TODO New key - Add a translation + "menu.section.icon.statistics_task": "Statistik - meny", + + // "menu.section.icon.workflow": "Administer workflow menu section", + // TODO New key - Add a translation + "menu.section.icon.workflow": "Administrera arbetsflöde - meny", + + // "menu.section.icon.unpin": "Unpin sidebar", + // TODO New key - Add a translation + "menu.section.icon.unpin": "Koppla loss sidomenyn", + + + + // "menu.section.import": "Import", + // TODO New key - Add a translation + "menu.section.import": "Importera", + + // "menu.section.import_batch": "Batch Import (ZIP)", + // TODO New key - Add a translation + "menu.section.import_batch": "Importera batch (ZIP)", + + // "menu.section.import_metadata": "Metadata", + // TODO New key - Add a translation + "menu.section.import_metadata": "Metadata", + + + + // "menu.section.new": "New", + // TODO New key - Add a translation + "menu.section.new": "Ny", + + // "menu.section.new_collection": "Collection", + // TODO New key - Add a translation + "menu.section.new_collection": "Samling", + + // "menu.section.new_community": "Community", + // TODO New key - Add a translation + "menu.section.new_community": "Enhet", + + // "menu.section.new_item": "Item", + // TODO New key - Add a translation + "menu.section.new_item": "Post", + + // "menu.section.new_item_version": "Item Version", + // TODO New key - Add a translation + "menu.section.new_item_version": "Post version", + + // "menu.section.new_process": "Process", + // TODO New key - Add a translation + "menu.section.new_process": "Process", + + + + // "menu.section.pin": "Pin sidebar", + // TODO New key - Add a translation + "menu.section.pin": "Fäst sidomenyn", + + // "menu.section.unpin": "Unpin sidebar", + // TODO New key - Add a translation + "menu.section.unpin": "Koppla loss sidomenyn", + + + + // "menu.section.processes": "Processes", + // TODO New key - Add a translation + "menu.section.processes": "Processer", + + + + // "menu.section.registries": "Registries", + // TODO New key - Add a translation + "menu.section.registries": "Registries", + + // "menu.section.registries_format": "Format", + // TODO New key - Add a translation + "menu.section.registries_format": "Format", + + // "menu.section.registries_metadata": "Metadata", + // TODO New key - Add a translation + "menu.section.registries_metadata": "Metadata", + + + + // "menu.section.statistics": "Statistics", + // TODO New key - Add a translation + "menu.section.statistics": "Statistik", + + // "menu.section.statistics_task": "Statistics Task", + // TODO New key - Add a translation + "menu.section.statistics_task": "Statistik uppgift", + + + + // "menu.section.toggle.access_control": "Toggle Access Control section", + // TODO New key - Add a translation + "menu.section.toggle.access_control": "Växla till åtkomstkontroll", + + // "menu.section.toggle.control_panel": "Toggle Control Panel section", + // TODO New key - Add a translation + "menu.section.toggle.control_panel": "Växla till kontrollpanel", + + // "menu.section.toggle.curation_task": "Toggle Curation Task section", + // TODO New key - Add a translation + "menu.section.toggle.curation_task": "Växla till kureringsuppgift", + + // "menu.section.toggle.edit": "Toggle Edit section", + // TODO New key - Add a translation + "menu.section.toggle.edit": "Växla till redigera", + + // "menu.section.toggle.export": "Toggle Export section", + // TODO New key - Add a translation + "menu.section.toggle.export": "Växla till exportera", + + // "menu.section.toggle.find": "Toggle Find section", + // TODO New key - Add a translation + "menu.section.toggle.find": "Växla till sök", + + // "menu.section.toggle.import": "Toggle Import section", + // TODO New key - Add a translation + "menu.section.toggle.import": "Växla till importera", + + // "menu.section.toggle.new": "Toggle New section", + // TODO New key - Add a translation + "menu.section.toggle.new": "Växla till ny", + + // "menu.section.toggle.registries": "Toggle Registries section", + // TODO New key - Add a translation + "menu.section.toggle.registries": "Växla till registries", + + // "menu.section.toggle.statistics_task": "Toggle Statistics Task section", + // TODO New key - Add a translation + "menu.section.toggle.statistics_task": "Växla till statistik", + + + // "menu.section.workflow": "Administer Workflow", + // TODO New key - Add a translation + "menu.section.workflow": "Administrera arbetsflöde", + + + // "mydspace.breadcrumbs": "MyDSpace", + // TODO New key - Add a translation + "mydspace.breadcrumbs": "Mitt DSpace", + + // "mydspace.description": "", + // TODO New key - Add a translation + "mydspace.description": "", + + // "mydspace.general.text-here": "here", + // TODO New key - Add a translation + "mydspace.general.text-here": "här", + + // "mydspace.messages.controller-help": "Select this option to send a message to item's submitter.", + // TODO New key - Add a translation + "mydspace.messages.controller-help": "Välj detta för att skicka ett meddelande till uppladdare.", + + // "mydspace.messages.description-placeholder": "Insert your message here...", + // TODO New key - Add a translation + "mydspace.messages.description-placeholder": "Skriv meddelande här...", + + // "mydspace.messages.hide-msg": "Hide message", + // TODO New key - Add a translation + "mydspace.messages.hide-msg": "Göm meddelande", + + // "mydspace.messages.mark-as-read": "Mark as read", + // TODO New key - Add a translation + "mydspace.messages.mark-as-read": "Markera som läst", + + // "mydspace.messages.mark-as-unread": "Mark as unread", + // TODO New key - Add a translation + "mydspace.messages.mark-as-unread": "Markera som oläst", + + // "mydspace.messages.no-content": "No content.", + // TODO New key - Add a translation + "mydspace.messages.no-content": "Innehåll saknas.", + + // "mydspace.messages.no-messages": "No messages yet.", + // TODO New key - Add a translation + "mydspace.messages.no-messages": "Inga meddelanden finns.", + + // "mydspace.messages.send-btn": "Send", + // TODO New key - Add a translation + "mydspace.messages.send-btn": "Skicka", + + // "mydspace.messages.show-msg": "Show message", + // TODO New key - Add a translation + "mydspace.messages.show-msg": "Visa meddelande", + + // "mydspace.messages.subject-placeholder": "Subject...", + // TODO New key - Add a translation + "mydspace.messages.subject-placeholder": "Ämne...", + + // "mydspace.messages.submitter-help": "Select this option to send a message to controller.", + // TODO New key - Add a translation + "mydspace.messages.submitter-help": "Välj detta för att skicka ett meddelande till kontrollant.", + + // "mydspace.messages.title": "Messages", + // TODO New key - Add a translation + "mydspace.messages.title": "Meddelanden", + + // "mydspace.messages.to": "To", + // TODO New key - Add a translation + "mydspace.messages.to": "Till", + + // "mydspace.new-submission": "New submission", + // TODO New key - Add a translation + "mydspace.new-submission": "Nytt bidrag", + + // "mydspace.new-submission-external": "Import metadata from external source", + // TODO New key - Add a translation + "mydspace.new-submission-external": "Importera metadada från extern källa", + + // "mydspace.new-submission-external-short": "Import metadata", + // TODO New key - Add a translation + "mydspace.new-submission-external-short": "Importera metadata", + + // "mydspace.results.head": "Your submissions", + // TODO New key - Add a translation + "mydspace.results.head": "Dina registreringar", + + // "mydspace.results.no-abstract": "No Abstract", + // TODO New key - Add a translation + "mydspace.results.no-abstract": "Ingen sammanfattning", + + // "mydspace.results.no-Författare": "No Författare", + // TODO New key - Add a translation + "mydspace.results.no-Författare": "Inga författare", + + // "mydspace.results.no-collections": "No Collections", + // TODO New key - Add a translation + "mydspace.results.no-collections": "Inga samlingar", + + // "mydspace.results.no-date": "No Date", + // TODO New key - Add a translation + "mydspace.results.no-date": "Inget datum", + + // "mydspace.results.no-files": "No Files", + // TODO New key - Add a translation + "mydspace.results.no-files": "Inga filer", + + // "mydspace.results.no-results": "There were no items to show", + // TODO New key - Add a translation + "mydspace.results.no-results": "Det finns inga poster att visa", + + // "mydspace.results.no-title": "No title", + // TODO New key - Add a translation + "mydspace.results.no-title": "Ingen titel", + + // "mydspace.results.no-uri": "No Uri", + // TODO New key - Add a translation + "mydspace.results.no-uri": "Ingen Uri", + + // "mydspace.search-form.placeholder": "Search in mydspace...", + // TODO New key - Add a translation + "mydspace.search-form.placeholder": "Sök i mydspace...", + + // "mydspace.show.workflow": "Workflow tasks", + // TODO New key - Add a translation + "mydspace.show.workflow": "Arbetsflöde uppgifter", + + // "mydspace.show.workspace": "Your Submissions", + // TODO New key - Add a translation + "mydspace.show.workspace": "Dina registreringar", + + // "mydspace.status.archived": "Archived", + // TODO New key - Add a translation + "mydspace.status.archived": "I arkivet", + + // "mydspace.status.validation": "Validation", + // TODO New key - Add a translation + "mydspace.status.validation": "Validering", + + // "mydspace.status.waiting-for-controller": "Waiting for controller", + // TODO New key - Add a translation + "mydspace.status.waiting-for-controller": "Väntar på kontrollant", + + // "mydspace.status.workflow": "Workflow", + // TODO New key - Add a translation + "mydspace.status.workflow": "Arbetsflöde", + + // "mydspace.status.workspace": "Workspace", + // TODO New key - Add a translation + "mydspace.status.workspace": "I arbetsflödet", + + // "mydspace.title": "MyDSpace", + // TODO New key - Add a translation + "mydspace.title": "MyDSpace", + + // "mydspace.upload.upload-failed": "Error creating new workspace. Please verify the content uploaded before retry.", + // TODO New key - Add a translation + "mydspace.upload.upload-failed": "Ett fel uppstod när arbetsyta skulle skapas. Verifiera inneållet i det som skall laddas upp och försök igen.", + + // "mydspace.upload.upload-failed-manyentries": "Unprocessable file. Detected too many entries but allowed only one for file.", + // TODO New key - Add a translation + "mydspace.upload.upload-failed-manyentries": "Fil kan inte processes. Detected too many entries but allowed only one for file.", + + // "mydspace.upload.upload-failed-moreonefile": "Unprocessable request. Only one file is allowed.", + // TODO New key - Add a translation + "mydspace.upload.upload-failed-moreonefile": "Begäran kunde inte bearbetas. Endast en fil är möjlig.", + + // "mydspace.upload.upload-multiple-successful": "{{qty}} new workspace items created.", + // TODO New key - Add a translation + "mydspace.upload.upload-multiple-successful": "{{qty}} nya poster har skapats i arbetsytan.", + + // "mydspace.upload.upload-successful": "New workspace item created. Click {{here}} for edit it.", + // TODO New key - Add a translation + "mydspace.upload.upload-successful": "Ny post har skapats i arbetsytan. Klicka {{here}} för att redigera den.", + + // "mydspace.view-btn": "View", + // TODO New key - Add a translation + "mydspace.view-btn": "Visa", + + + + // "nav.browse.header": "All of DSpace", + // TODO New key - Add a translation + "nav.browse.header": "Hela DSpace", + + // "nav.community-browse.header": "By Community", + // TODO New key - Add a translation + "nav.community-browse.header": "Efter enhet", + + // "nav.language": "Språk switch", + // TODO New key - Add a translation + "nav.language": "Välj språk", + + // "nav.login": "Log In", + // TODO New key - Add a translation + "nav.login": "Logga in", + + // "nav.logout": "User profile menu and Log Out", + // TODO New key - Add a translation + "nav.logout": "User profile menu and Log Out", + + // "nav.main.description": "Main navigation bar", + // TODO New key - Add a translation + "nav.main.description": "Main navigation bar", + + // "nav.mydspace": "MyDSpace", + // TODO New key - Add a translation + "nav.mydspace": "Mitt ODR", + + // "nav.profile": "Profile", + // TODO New key - Add a translation + "nav.profile": "Profil", + + // "nav.search": "Search", + // TODO New key - Add a translation + "nav.search": "Sök", + + // "nav.statistics.header": "Statistics", + // TODO New key - Add a translation + "nav.statistics.header": "Statistik", + + // "nav.stop-impersonating": "Stop impersonating EPerson", + // TODO New key - Add a translation + "nav.stop-impersonating": "Stop impersonating EPerson", + + // "nav.toggle" : "Toggle navigation", + // TODO New key - Add a translation + "nav.toggle" : "Toggle navigation", + + // "nav.user.description" : "User profile bar", + // TODO New key - Add a translation + "nav.user.description" : "User profile bar", + + // "none.listelement.badge": "Item", + // TODO New key - Add a translation + "none.listelement.badge": "Item", + + + // "orgunit.listelement.badge": "Organizational Unit", + // TODO New key - Add a translation + "orgunit.listelement.badge": "Organizational Unit", + + // "orgunit.page.city": "City", + // TODO New key - Add a translation + "orgunit.page.city": "City", + + // "orgunit.page.country": "Country", + // TODO New key - Add a translation + "orgunit.page.country": "Country", + + // "orgunit.page.dateestablished": "Date established", + // TODO New key - Add a translation + "orgunit.page.dateestablished": "Date established", + + // "orgunit.page.description": "Beskrivning", + // TODO New key - Add a translation + "orgunit.page.description": "Beskrivning", + + // "orgunit.page.edit": "Edit this item", + // TODO New key - Add a translation + "orgunit.page.edit": "Edit this item", + + // "orgunit.page.id": "ID", + // TODO New key - Add a translation + "orgunit.page.id": "ID", + + // "orgunit.page.titleprefix": "Organizational Unit: ", + // TODO New key - Add a translation + "orgunit.page.titleprefix": "Organizational Unit: ", + + // "pagination.options.description": "Pagination options", + // TODO New key - Add a translation + "pagination.options.description": "Träffar per sida", + + // "pagination.results-per-page": "Results Per Page", + // TODO New key - Add a translation + "pagination.results-per-page": "Sökresultat per sida", + + // "pagination.showing.detail": "{{ range }} of {{ total }}", + // TODO New key - Add a translation + "pagination.showing.detail": "{{ range }} av {{ total }}", + + // "pagination.showing.label": "Now showing ", + // TODO New key - Add a translation + "pagination.showing.label": "Visar ", + + // "pagination.sort-direction": "Sort Options", + // TODO New key - Add a translation + "pagination.sort-direction": "Sortera efter", + + + + // "person.listelement.badge": "Person", + // TODO New key - Add a translation + "person.listelement.badge": "Person", + + // "person.listelement.no-title": "No name found", + // TODO New key - Add a translation + "person.listelement.no-title": "No name found", + + // "person.page.birthdate": "Birth Date", + // TODO New key - Add a translation + "person.page.birthdate": "Birth Date", + + // "person.page.edit": "Edit this item", + // TODO New key - Add a translation + "person.page.edit": "Edit this item", + + // "person.page.email": "E-post", + // TODO New key - Add a translation + "person.page.email": "E-post", + + // "person.page.firstname": "First Name", + // TODO New key - Add a translation + "person.page.firstname": "Förnamn", + + // "person.page.jobtitle": "Job Title", + // TODO New key - Add a translation + "person.page.jobtitle": "Job Title", + + // "person.page.lastname": "Last Name", + // TODO New key - Add a translation + "person.page.lastname": "Efternamn", + + // "person.page.link.full": "Show all metadata", + // TODO New key - Add a translation + "person.page.link.full": "Show all metadata", + + // "person.page.orcid": "ORCID", + // TODO New key - Add a translation + "person.page.orcid": "ORCID", + + // "person.page.staffid": "Staff ID", + // TODO New key - Add a translation + "person.page.staffid": "Staff ID", + + // "person.page.titleprefix": "Person: ", + // TODO New key - Add a translation + "person.page.titleprefix": "Person: ", + + // "person.search.results.head": "Person Search Results", + // TODO New key - Add a translation + "person.search.results.head": "Person Search Results", + + // "person.search.title": "Person Search", + // TODO New key - Add a translation + "person.search.title": "Person Search", + + + + // "process.new.select-parameters": "Parameters", + // TODO New key - Add a translation + "process.new.select-parameters": "Parameters", + + // "process.new.cancel": "Cancel", + // TODO New key - Add a translation + "process.new.cancel": "Cancel", + + // "process.new.submit": "Save", + // TODO New key - Add a translation + "process.new.submit": "Spara", + + // "process.new.select-script": "Script", + // TODO New key - Add a translation + "process.new.select-script": "Script", + + // "process.new.select-script.placeholder": "Choose a script...", + // TODO New key - Add a translation + "process.new.select-script.placeholder": "Choose a script...", + + // "process.new.select-script.required": "Script is required", + // TODO New key - Add a translation + "process.new.select-script.required": "Script is required", + + // "process.new.parameter.file.upload-button": "Select file...", + // TODO New key - Add a translation + "process.new.parameter.file.upload-button": "Select file...", + + // "process.new.parameter.file.required": "Please select a file", + // TODO New key - Add a translation + "process.new.parameter.file.required": "Please select a file", + + // "process.new.parameter.string.required": "Parameter value is required", + // TODO New key - Add a translation + "process.new.parameter.string.required": "Parameter value is required", + + // "process.new.parameter.type.value": "value", + // TODO New key - Add a translation + "process.new.parameter.type.value": "value", + + // "process.new.parameter.type.file": "file", + // TODO New key - Add a translation + "process.new.parameter.type.file": "file", + + // "process.new.parameter.required.missing": "The following parameters are required but still missing:", + // TODO New key - Add a translation + "process.new.parameter.required.missing": "The following parameters are required but still missing:", + + // "process.new.notification.success.title": "Success", + // TODO New key - Add a translation + "process.new.notification.success.title": "Success", + + // "process.new.notification.success.content": "The process was successfully created", + // TODO New key - Add a translation + "process.new.notification.success.content": "The process was successfully created", + + // "process.new.notification.error.title": "Error", + // TODO New key - Add a translation + "process.new.notification.error.title": "Error", + + // "process.new.notification.error.content": "An error occurred while creating this process", + // TODO New key - Add a translation + "process.new.notification.error.content": "An error occurred while creating this process", + + // "process.new.header": "Create a new process", + // TODO New key - Add a translation + "process.new.header": "Create a new process", + + // "process.new.title": "Create a new process", + // TODO New key - Add a translation + "process.new.title": "Create a new process", + + // "process.new.breadcrumbs": "Create a new process", + // TODO New key - Add a translation + "process.new.breadcrumbs": "Create a new process", + + + + // "process.detail.arguments" : "Arguments", + // TODO New key - Add a translation + "process.detail.arguments" : "Arguments", + + // "process.detail.arguments.empty" : "This process doesn't contain any arguments", + // TODO New key - Add a translation + "process.detail.arguments.empty" : "This process doesn't contain any arguments", + + // "process.detail.back" : "Back", + // TODO New key - Add a translation + "process.detail.back" : "Back", + + // "process.detail.output" : "Process Output", + // TODO New key - Add a translation + "process.detail.output" : "Process Output", + + // "process.detail.logs.button": "Retrieve process output", + // TODO New key - Add a translation + "process.detail.logs.button": "Retrieve process output", + + // "process.detail.logs.loading": "Retrieving", + // TODO New key - Add a translation + "process.detail.logs.loading": "Retrieving", + + // "process.detail.logs.none": "This process has no output", + // TODO New key - Add a translation + "process.detail.logs.none": "This process has no output", + + // "process.detail.output-files" : "Output Files", + // TODO New key - Add a translation + "process.detail.output-files" : "Output Files", + + // "process.detail.output-files.empty" : "This process doesn't contain any output files", + // TODO New key - Add a translation + "process.detail.output-files.empty" : "This process doesn't contain any output files", + + // "process.detail.script" : "Script", + // TODO New key - Add a translation + "process.detail.script" : "Script", + + // "process.detail.title" : "Process: {{ id }} - {{ name }}", + // TODO New key - Add a translation + "process.detail.title" : "Process: {{ id }} - {{ name }}", + + // "process.detail.start-time" : "Start time", + // TODO New key - Add a translation + "process.detail.start-time" : "Start time", + + // "process.detail.end-time" : "Finish time", + // TODO New key - Add a translation + "process.detail.end-time" : "Finish time", + + // "process.detail.status" : "Status", + // TODO New key - Add a translation + "process.detail.status" : "Status", + + // "process.detail.create" : "Create similar process", + // TODO New key - Add a translation + "process.detail.create" : "Create similar process", + + + + // "process.overview.table.finish" : "Finish time (UTC)", + // TODO New key - Add a translation + "process.overview.table.finish" : "Sluttid (UTC)", + + // "process.overview.table.id" : "Process ID", + // TODO New key - Add a translation + "process.overview.table.id" : "Process ID", + + // "process.overview.table.name" : "Name", + // TODO New key - Add a translation + "process.overview.table.name" : "Namn", + + // "process.overview.table.start" : "Start time (UTC)", + // TODO New key - Add a translation + "process.overview.table.start" : "Starttid (UTC)", + + // "process.overview.table.status" : "Status", + // TODO New key - Add a translation + "process.overview.table.status" : "Status", + + // "process.overview.table.user" : "User", + // TODO New key - Add a translation + "process.overview.table.user" : "Användare", + + // "process.overview.title": "Processes Overview", + // TODO New key - Add a translation + "process.overview.title": "Processer översikt", + + // "process.overview.breadcrumbs": "Processes Overview", + // TODO New key - Add a translation + "process.overview.breadcrumbs": "Processer översikt", + + // "process.overview.new": "New", + // TODO New key - Add a translation + "process.overview.new": "Ny", + + + // "profile.breadcrumbs": "Update Profile", + // TODO New key - Add a translation + "profile.breadcrumbs": "Uppdatera profil", + + // "profile.card.identify": "Identify", + // TODO New key - Add a translation + "profile.card.identify": "Identifiera", + + // "profile.card.security": "Säkerhet", + // TODO New key - Add a translation + "profile.card.security": "Säkerhet och inloggning", + + // "profile.form.submit": "Save", + // TODO New key - Add a translation + "profile.form.submit": "Spara", + + // "profile.groups.head": "Authorization groups you belong to", + // TODO New key - Add a translation + "profile.groups.head": "Behörighetsgrupper som du är medlem i", + + // "profile.head": "Update Profile", + // TODO New key - Add a translation + "profile.head": "Uppdatera profil", + + // "profile.metadata.form.error.firstname.required": "First Name is required", + // TODO New key - Add a translation + "profile.metadata.form.error.firstname.required": "Förnamn är obligatotiskt", + + // "profile.metadata.form.error.lastname.required": "Last Name is required", + // TODO New key - Add a translation + "profile.metadata.form.error.lastname.required": "Efternamn är obligatoriskt", + + // "profile.metadata.form.label.email": "E-post", + // TODO New key - Add a translation + "profile.metadata.form.label.email": "E-post", + + // "profile.metadata.form.label.firstname": "First Name", + // TODO New key - Add a translation + "profile.metadata.form.label.firstname": "Förnamn", + + // "profile.metadata.form.label.language": "Språk", + // TODO New key - Add a translation + "profile.metadata.form.label.language": "Språk", + + // "profile.metadata.form.label.lastname": "Last Name", + // TODO New key - Add a translation + "profile.metadata.form.label.lastname": "Efternamn", + + // "profile.metadata.form.label.phone": "Telefonnummer", + // TODO New key - Add a translation + "profile.metadata.form.label.phone": "Telefonnummer", + + // "profile.metadata.form.notifications.success.content": "Your changes to the profile were saved.", + // TODO New key - Add a translation + "profile.metadata.form.notifications.success.content": "Dina ändringar har sparats.", + + // "profile.metadata.form.notifications.success.title": "Profile saved", + // TODO New key - Add a translation + "profile.metadata.form.notifications.success.title": "Profilen har sparats", + + // "profile.notifications.warning.no-changes.content": "No changes were made to the Profile.", + // TODO New key - Add a translation + "profile.notifications.warning.no-changes.content": "Inga ändringar gjordes.", + + // "profile.notifications.warning.no-changes.title": "No changes", + // TODO New key - Add a translation + "profile.notifications.warning.no-changes.title": "Inga ändringar", + + // "profile.security.form.error.matching-passwords": "Lösenorden överensstämmer inte.", + // TODO New key - Add a translation + "profile.security.form.error.matching-passwords": "Lösenorden överensstämmer inte.", + + // "profile.security.form.error.password-length": "The password should be at least 6 characters long.", + // TODO New key - Add a translation + "profile.security.form.error.password-length": "Lösenordet måste bestå av minst 6 tecken.", + + // "profile.security.form.info": "Optionally, you can enter a new password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", + // TODO New key - Add a translation + "profile.security.form.info": "Om du vill byta lösenord så kan du göra det nedan. Lösenordet måste bestå av minst 6 tecken.", + + // "profile.security.form.label.password": "Password", + // TODO New key - Add a translation + "profile.security.form.label.password": "Lösenord", + + // "profile.security.form.label.passwordrepeat": "Bekräfta", + // TODO New key - Add a translation + "profile.security.form.label.passwordrepeat": "Bekräfta", + + // "profile.security.form.notifications.success.content": "Your changes to the password were saved.", + // TODO New key - Add a translation + "profile.security.form.notifications.success.content": "Det nya lösenordet har sparats.", + + // "profile.security.form.notifications.success.title": "Password saved", + // TODO New key - Add a translation + "profile.security.form.notifications.success.title": "Lösenordet har sparats", + + // "profile.security.form.notifications.error.title": "Error changing passwords", + // TODO New key - Add a translation + "profile.security.form.notifications.error.title": "Ett del uppstod när lösenordet skulle sparas", + + // "profile.security.form.notifications.error.not-long-enough": "The password has to be at least 6 characters long.", + // TODO New key - Add a translation + "profile.security.form.notifications.error.not-long-enough": "Lösenordet måste bestå av minst 6 tecken.", + + // "profile.security.form.notifications.error.not-same": "The provided passwords are not the same.", + // TODO New key - Add a translation + "profile.security.form.notifications.error.not-same": "Lösenorden överensstämmer inte.", + + // "profile.title": "Update Profile", + // TODO New key - Add a translation + "profile.title": "Uppdatera profil", + + + + // "project.listelement.badge": "Research Project", + // TODO New key - Add a translation + "project.listelement.badge": "Research Project", + + // "project.page.contributor": "Contributors", + // TODO New key - Add a translation + "project.page.contributor": "Contributors", + + // "project.page.description": "Beskrivning", + // TODO New key - Add a translation + "project.page.description": "Beskrivning", + + // "project.page.edit": "Edit this item", + // TODO New key - Add a translation + "project.page.edit": "Edit this item", + + // "project.page.expectedcompletion": "Expected Completion", + // TODO New key - Add a translation + "project.page.expectedcompletion": "Expected Completion", + + // "project.page.funder": "Funders", + // TODO New key - Add a translation + "project.page.funder": "Funders", + + // "project.page.id": "ID", + // TODO New key - Add a translation + "project.page.id": "ID", + + // "project.page.keyword": "Keywords", + // TODO New key - Add a translation + "project.page.keyword": "Ämne/nyckelord", + + // "project.page.status": "Status", + // TODO New key - Add a translation + "project.page.status": "Status", + + // "project.page.titleprefix": "Research Project: ", + // TODO New key - Add a translation + "project.page.titleprefix": "Research Project: ", + + // "project.search.results.head": "Project Search Results", + // TODO New key - Add a translation + "project.search.results.head": "Project Search Results", + + + + // "publication.listelement.badge": "Publication", + // TODO New key - Add a translation + "publication.listelement.badge": "Publication", + + // "publication.page.description": "Beskrivning", + // TODO New key - Add a translation + "publication.page.description": "Beskrivning", + + // "publication.page.edit": "Edit this item", + // TODO New key - Add a translation + "publication.page.edit": "Edit this item", + + // "publication.page.journal-issn": "Journal ISSN", + // TODO New key - Add a translation + "publication.page.journal-issn": "Journal ISSN", + + // "publication.page.journal-title": "Journal Title", + // TODO New key - Add a translation + "publication.page.journal-title": "Journal Title", + + // "publication.page.publisher": "Publisher", + // TODO New key - Add a translation + "publication.page.publisher": "Utgivare", + + // "publication.page.titleprefix": "Publication: ", + // TODO New key - Add a translation + "publication.page.titleprefix": "Publication: ", + + // "publication.page.volume-title": "Volume Title", + // TODO New key - Add a translation + "publication.page.volume-title": "Volume Title", + + // "publication.search.results.head": "Publication Search Results", + // TODO New key - Add a translation + "publication.search.results.head": "Publication Search Results", + + // "publication.search.title": "Publication Search", + // TODO New key - Add a translation + "publication.search.title": "Publication Search", + + + // "media-viewer.next": "Next", + // TODO New key - Add a translation + "media-viewer.next": "Nästa", + + // "media-viewer.previous": "Föregående", + // TODO New key - Add a translation + "media-viewer.previous": "Föregående", + + // "media-viewer.playlist": "Playlist", + // TODO New key - Add a translation + "media-viewer.playlist": "Playlist", + + + // "register-email.title": "Ny användare", + // TODO New key - Add a translation + "register-email.title": "Ny användare", + + // "register-page.create-profile.header": "Create Profile", + // TODO New key - Add a translation + "register-page.create-profile.header": "Skapa profil", + + // "register-page.create-profile.identification.header": "Identify", + // TODO New key - Add a translation + "register-page.create-profile.identification.header": "Identifera", + + // "register-page.create-profile.identification.email": "E-post", + // TODO New key - Add a translation + "register-page.create-profile.identification.email": "E-post", + + // "register-page.create-profile.identification.first-name": "First Name *", + // TODO New key - Add a translation + "register-page.create-profile.identification.first-name": "Förnamn *", + + // "register-page.create-profile.identification.first-name.error": "Please fill in a First Name", + // TODO New key - Add a translation + "register-page.create-profile.identification.first-name.error": "Ange förnamn", + + // "register-page.create-profile.identification.last-name": "Last Name *", + // TODO New key - Add a translation + "register-page.create-profile.identification.last-name": "Efternamn *", + + // "register-page.create-profile.identification.last-name.error": "Please fill in a Last Name", + // TODO New key - Add a translation + "register-page.create-profile.identification.last-name.error": "Ange efternamn", + + // "register-page.create-profile.identification.contact": "Telefonnummer", + // TODO New key - Add a translation + "register-page.create-profile.identification.contact": "Telefonnummer", + + // "register-page.create-profile.identification.language": "Språk", + // TODO New key - Add a translation + "register-page.create-profile.identification.language": "Språk", + + // "register-page.create-profile.security.header": "Säkerhet", + // TODO New key - Add a translation + "register-page.create-profile.security.header": "Säkerhet", + + // "register-page.create-profile.security.info": "Please enter a password in the box below, and confirm it by typing it again into the second box. It should be at least six characters long.", + // TODO New key - Add a translation + "register-page.create-profile.security.info": "Ange och bekräfta ett lösenord nedan. Det måste bestå av minst 6 tecken.", + + // "register-page.create-profile.security.label.password": "Password *", + // TODO New key - Add a translation + "register-page.create-profile.security.label.password": "Lösenord *", + + // "register-page.create-profile.security.label.passwordrepeat": "Bekräfta *", + // TODO New key - Add a translation + "register-page.create-profile.security.label.passwordrepeat": "Bekräfta *", + + // "register-page.create-profile.security.error.empty-password": "Please enter a password in the box below.", + // TODO New key - Add a translation + "register-page.create-profile.security.error.empty-password": "Ange ett lösnord nedan.", + + // "register-page.create-profile.security.error.matching-passwords": "Lösenorden överensstämmer inte.", + // TODO New key - Add a translation + "register-page.create-profile.security.error.matching-passwords": "Lösenorden överensstämmer inte.", + + // "register-page.create-profile.security.error.password-length": "The password should be at least 6 characters long.", + // TODO New key - Add a translation + "register-page.create-profile.security.error.password-length": "Lösenordet måste bestå av minst 6 tecken.", + + // "register-page.create-profile.submit": "Complete Registration", + // TODO New key - Add a translation + "register-page.create-profile.submit": "Slutför registrering", + + // "register-page.create-profile.submit.error.content": "Something went wrong while registering a new user.", + // TODO New key - Add a translation + "register-page.create-profile.submit.error.content": "Ett fel uppstod när ny användare registrerades.", + + // "register-page.create-profile.submit.error.head": "Registration failed", + // TODO New key - Add a translation + "register-page.create-profile.submit.error.head": "Registreringen misslyckades", + + // "register-page.create-profile.submit.success.content": "The registration was successful. You have been logged in as the created user.", + // TODO New key - Add a translation + "register-page.create-profile.submit.success.content": "Regsitreringen är klar. Du är nu inloggad som den nya användaren.", + + // "register-page.create-profile.submit.success.head": "Registration completed", + // TODO New key - Add a translation + "register-page.create-profile.submit.success.head": "Registreringen är klar", + + + // "register-page.registration.header": "Ny användare", + // TODO New key - Add a translation + "register-page.registration.header": "Ny användare", + + // "register-page.registration.info": "Register an account to subscribe to collections for email updates, and submit new items to DSpace.", + // TODO New key - Add a translation + "register-page.registration.info": "Skapa ett konto för att få uppdateringar eller för att kunna registrera nya bidrag i arkivet.", + + // "register-page.registration.email": "E-post *", + // TODO New key - Add a translation + "register-page.registration.email": "E-post *", + + // "register-page.registration.email.error.required": "Please fill in an email address", + // TODO New key - Add a translation + "register-page.registration.email.error.required": "Ange e-post", + + // "register-page.registration.email.error.pattern": "Please fill in a valid email address", + // TODO New key - Add a translation + "register-page.registration.email.error.pattern": "Ange en giltig e-postadress", + + // "register-page.registration.email.hint": "This address will be verified and used as your login name.", + // TODO New key - Add a translation + "register-page.registration.email.hint": "Denna adress kommer att verifieras och användas när du loggar in.", + + // "register-page.registration.submit": "Register", + // TODO New key - Add a translation + "register-page.registration.submit": "Skapa konto", + + // "register-page.registration.success.head": "Verification email sent", + // TODO New key - Add a translation + "register-page.registration.success.head": "Ett verifieringsmejl har skickats", + + // "register-page.registration.success.content": "An email has been sent to {{ email }} containing a special URL and further instructions.", + // TODO New key - Add a translation + "register-page.registration.success.content": "Ett mejl med instruktioner har skickats till {{ email }}.", + + // "register-page.registration.error.head": "Error when trying to register email", + // TODO New key - Add a translation + "register-page.registration.error.head": "Ett fel uppstod när kontot skulle skapas", + + // "register-page.registration.error.content": "An error occured when registering the following email address: {{ email }}", + // TODO New key - Add a translation + "register-page.registration.error.content": "Ett fel uppstod när kontot skulle skapas för: {{ email }}", + + + + // "relationships.add.error.relationship-type.content": "No suitable match could be found for relationship type {{ type }} between the two items", + // TODO New key - Add a translation + "relationships.add.error.relationship-type.content": "Det gick inte att hitta något som matchade relationstyp {{ type }} mellan dessa poster", + + // "relationships.add.error.server.content": "The server returned an error", + // TODO New key - Add a translation + "relationships.add.error.server.content": "Servern returnerade ett fel", + + // "relationships.add.error.title": "Unable to add relationship", + // TODO New key - Add a translation + "relationships.add.error.title": "Det gick inte att skapa relation", + + // "relationships.isAuthorOf": "Författare", + // TODO New key - Add a translation + "relationships.isAuthorOf": "Författare", + + // "relationships.isAuthorOf.Person": "Författare (persons)", + // TODO New key - Add a translation + "relationships.isAuthorOf.Person": "Författare (personer)", + + // "relationships.isAuthorOf.OrgUnit": "Författare (organizational units)", + // TODO New key - Add a translation + "relationships.isAuthorOf.OrgUnit": "Författare (organisatoriska enheter)", + + // "relationships.isIssueOf": "Journal Issues", + // TODO New key - Add a translation + "relationships.isIssueOf": "Tidskriftsexemplar", + + // "relationships.isJournalIssueOf": "Journal Issue", + // TODO New key - Add a translation + "relationships.isJournalIssueOf": "Tidskriftsexemplar", + + // "relationships.isJournalOf": "Journals", + // TODO New key - Add a translation + "relationships.isJournalOf": "Tidskrifter", + + // "relationships.isOrgUnitOf": "Organizational Units", + // TODO New key - Add a translation + "relationships.isOrgUnitOf": "Organisatoriska enheter", + + // "relationships.isPersonOf": "Författare", + // TODO New key - Add a translation + "relationships.isPersonOf": "Författare", + + // "relationships.isProjectOf": "Research Projects", + // TODO New key - Add a translation + "relationships.isProjectOf": "Forskningsprojekt", + + // "relationships.isPublicationOf": "Publications", + // TODO New key - Add a translation + "relationships.isPublicationOf": "Publikationer", + + // "relationships.isPublicationOfJournalIssue": "Articles", + // TODO New key - Add a translation + "relationships.isPublicationOfJournalIssue": "Artiklar", + + // "relationships.isSingleJournalOf": "Journal", + // TODO New key - Add a translation + "relationships.isSingleJournalOf": "Tidskrift", + + // "relationships.isSingleVolumeOf": "Journal Volume", + // TODO New key - Add a translation + "relationships.isSingleVolumeOf": "Tidskriftsexemplar", + + // "relationships.isVolumeOf": "Journal Volumes", + // TODO New key - Add a translation + "relationships.isVolumeOf": "Tidskriftsvolymer", + + // "relationships.isContributorOf": "Contributors", + // TODO New key - Add a translation + "relationships.isContributorOf": "Medverkande", + + // "relationships.isContributorOf.OrgUnit": "Contributor (Organizational Unit)", + // TODO New key - Add a translation + "relationships.isContributorOf.OrgUnit": "Medverkande (organisatorisk enhet)", + + // "relationships.isContributorOf.Person": "Contributor", + // TODO New key - Add a translation + "relationships.isContributorOf.Person": "Medverkande", + + // "relationships.isFundingAgencyOf.OrgUnit": "Funder", + // TODO New key - Add a translation + "relationships.isFundingAgencyOf.OrgUnit": "Finansiär", + + + // "repository.image.logo": "Repository logo", + // TODO New key - Add a translation + "repository.image.logo": "Repositoriets logga", + + // "repository.title.prefix": "DSpace Angular :: ", + // TODO New key - Add a translation + "repository.title.prefix": "DSpace Angular :: ", + + // "repository.title.prefixDSpace": "DSpace Angular ::", + // TODO New key - Add a translation + "repository.title.prefixDSpace": "DSpace Angular ::", + + + // "resource-policies.add.button": "Add", + // TODO New key - Add a translation + "resource-policies.add.button": "Lägg till", + + // "resource-policies.add.for.": "Add a new policy", + // TODO New key - Add a translation + "resource-policies.add.for.": "Lägg till ny policy", + + // "resource-policies.add.for.bitstream": "Add a new Bitstream policy", + // TODO New key - Add a translation + "resource-policies.add.for.bitstream": "Lägg till ny policy för fil", + + // "resource-policies.add.for.bundle": "Add a new Bundle policy", + // TODO New key - Add a translation + "resource-policies.add.for.bundle": "Lägg till ny policy för bunt", + + // "resource-policies.add.for.item": "Add a new Item policy", + // TODO New key - Add a translation + "resource-policies.add.for.item": "Lägg till ny policy för post", + + // "resource-policies.add.for.community": "Add a new Community policy", + // TODO New key - Add a translation + "resource-policies.add.for.community": "Lägg till ny policy för enhet", + + // "resource-policies.add.for.collection": "Add a new Collection policy", + // TODO New key - Add a translation + "resource-policies.add.for.collection": "Lägg till ny policy för samling", + + // "resource-policies.create.page.heading": "Create new resource policy for ", + // TODO New key - Add a translation + "resource-policies.create.page.heading": "Lägg till ny policy för ", + + // "resource-policies.create.page.failure.content": "An error occurred while creating the resource policy.", + // TODO New key - Add a translation + "resource-policies.create.page.failure.content": "Ett fel har uppstått.", + + // "resource-policies.create.page.success.content": "Operation successful", + // TODO New key - Add a translation + "resource-policies.create.page.success.content": "Operationen lyckades", + + // "resource-policies.create.page.title": "Create new resource policy", + // TODO New key - Add a translation + "resource-policies.create.page.title": "Skapa ny policy för resurs", + + // "resource-policies.delete.btn": "Delete selected", + // TODO New key - Add a translation + "resource-policies.delete.btn": "Radera valda", + + // "resource-policies.delete.btn.title": "Delete selected resource policies", + // TODO New key - Add a translation + "resource-policies.delete.btn.title": "Radera valda policies", + + // "resource-policies.delete.failure.content": "An error occurred while deleting selected resource policies.", + // TODO New key - Add a translation + "resource-policies.delete.failure.content": "Ett fel uppstod när policies skulle raderas.", + + // "resource-policies.delete.success.content": "Operation successful", + // TODO New key - Add a translation + "resource-policies.delete.success.content": "Operationen lyckades", + + // "resource-policies.edit.page.heading": "Edit resource policy ", + // TODO New key - Add a translation + "resource-policies.edit.page.heading": "Redigera policy för resurs ", + + // "resource-policies.edit.page.failure.content": "An error occurred while editing the resource policy.", + // TODO New key - Add a translation + "resource-policies.edit.page.failure.content": "Ett fel uppstod när policy redigerades.", + + // "resource-policies.edit.page.success.content": "Operation successful", + // TODO New key - Add a translation + "resource-policies.edit.page.success.content": "Operationen lyckades", + + // "resource-policies.edit.page.title": "Edit resource policy", + // TODO New key - Add a translation + "resource-policies.edit.page.title": "Redigera policy för resurs", + + // "resource-policies.form.action-type.label": "Select the action type", + // TODO New key - Add a translation + "resource-policies.form.action-type.label": "Välj typ av åtgärd", + + // "resource-policies.form.action-type.required": "You must select the resource policy action.", + // TODO New key - Add a translation + "resource-policies.form.action-type.required": "Du måste välja typ av åtgärd.", + + // "resource-policies.form.eperson-group-list.label": "The eperson or group that will be granted the permission", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.label": "ePerson och/eller grupp som kommer att beviljas åtkomst", + + // "resource-policies.form.eperson-group-list.select.btn": "Select", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.select.btn": "Välj", + + // "resource-policies.form.eperson-group-list.tab.eperson": "Search for a ePerson", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.tab.eperson": "Sök ePerson", + + // "resource-policies.form.eperson-group-list.tab.group": "Search for a group", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.tab.group": "Sök grupp", + + // "resource-policies.form.eperson-group-list.table.headers.action": "Action", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.table.headers.action": "Åtgärd", + + // "resource-policies.form.eperson-group-list.table.headers.id": "ID", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.table.headers.id": "ID", + + // "resource-policies.form.eperson-group-list.table.headers.name": "Name", + // TODO New key - Add a translation + "resource-policies.form.eperson-group-list.table.headers.name": "Namn", + + // "resource-policies.form.date.end.label": "End Date", + // TODO New key - Add a translation + "resource-policies.form.date.end.label": "Slutdatum", + + // "resource-policies.form.date.start.label": "Start Date", + // TODO New key - Add a translation + "resource-policies.form.date.start.label": "Startdatum", + + // "resource-policies.form.description.label": "Beskrivning", + // TODO New key - Add a translation + "resource-policies.form.description.label": "Beskrivning", + + // "resource-policies.form.name.label": "Name", + // TODO New key - Add a translation + "resource-policies.form.name.label": "Namn", + + // "resource-policies.form.policy-type.label": "Select the policy type", + // TODO New key - Add a translation + "resource-policies.form.policy-type.label": "Välj typ av policy", + + // "resource-policies.form.policy-type.required": "You must select the resource policy type.", + // TODO New key - Add a translation + "resource-policies.form.policy-type.required": "YDu måste välja typ av policy.", + + // "resource-policies.table.headers.action": "Action", + // TODO New key - Add a translation + "resource-policies.table.headers.action": "Åtgärd", + + // "resource-policies.table.headers.date.end": "End Date", + // TODO New key - Add a translation + "resource-policies.table.headers.date.end": "Slutdatum", + + // "resource-policies.table.headers.date.start": "Start Date", + // TODO New key - Add a translation + "resource-policies.table.headers.date.start": "Startdatum", + + // "resource-policies.table.headers.edit": "Edit", + // TODO New key - Add a translation + "resource-policies.table.headers.edit": "Redigera", + + // "resource-policies.table.headers.edit.group": "Edit group", + // TODO New key - Add a translation + "resource-policies.table.headers.edit.group": "Redigera grupp", + + // "resource-policies.table.headers.edit.policy": "Edit policy", + // TODO New key - Add a translation + "resource-policies.table.headers.edit.policy": "Redigera policy", + + // "resource-policies.table.headers.eperson": "EPerson", + // TODO New key - Add a translation + "resource-policies.table.headers.eperson": "EPerson", + + // "resource-policies.table.headers.group": "Group", + // TODO New key - Add a translation + "resource-policies.table.headers.group": "Grupp", + + // "resource-policies.table.headers.id": "ID", + // TODO New key - Add a translation + "resource-policies.table.headers.id": "ID", + + // "resource-policies.table.headers.name": "Name", + // TODO New key - Add a translation + "resource-policies.table.headers.name": "Namn", + + // "resource-policies.table.headers.policyType": "type", + // TODO New key - Add a translation + "resource-policies.table.headers.policyType": "typ", + + // "resource-policies.table.headers.title.for.bitstream": "Policies for Bitstream", + // TODO New key - Add a translation + "resource-policies.table.headers.title.for.bitstream": "Policies för fil", + + // "resource-policies.table.headers.title.for.bundle": "Policies for Bundle", + // TODO New key - Add a translation + "resource-policies.table.headers.title.for.bundle": "Policies för bunt", + + // "resource-policies.table.headers.title.for.item": "Policies for Item", + // TODO New key - Add a translation + "resource-policies.table.headers.title.for.item": "Policies för post", + + // "resource-policies.table.headers.title.for.community": "Policies for Community", + // TODO New key - Add a translation + "resource-policies.table.headers.title.for.community": "Policies för enhet", + + // "resource-policies.table.headers.title.for.collection": "Policies for Collection", + // TODO New key - Add a translation + "resource-policies.table.headers.title.for.collection": "Policies för samling", + + + // "search.description": "", + // TODO New key - Add a translation + "search.description": "", + + // "search.switch-configuration.title": "Show", + // TODO New key - Add a translation + "search.switch-configuration.title": "Visa", + + // "search.title": "Search", + // TODO New key - Add a translation + "search.title": "Sök", + + // "search.breadcrumbs": "Search", + // TODO New key - Add a translation + "search.breadcrumbs": "Sök", + + // "search.search-form.placeholder": "Search the repository ...", + // TODO New key - Add a translation + "search.search-form.placeholder": "Sök i DSpace...", + + + // "search.filters.applied.f.author": "Author", + // TODO New key - Add a translation + "search.filters.applied.f.author": "Författare", + + // "search.filters.applied.f.dateIssued.max": "End date", + // TODO New key - Add a translation + "search.filters.applied.f.dateIssued.max": "Slut", + + // "search.filters.applied.f.dateIssued.min": "Start date", + // TODO New key - Add a translation + "search.filters.applied.f.dateIssued.min": "Start", + + // "search.filters.applied.f.dateSubmitted": "Date submitted", + // TODO New key - Add a translation + "search.filters.applied.f.dateSubmitted": "Skapad", + + // "search.filters.applied.f.discoverable": "Non-discoverable", + // TODO New key - Add a translation + "search.filters.applied.f.discoverable": "Ej sökbar", + + // "search.filters.applied.f.entityType": "Item Type", + // TODO New key - Add a translation + "search.filters.applied.f.entityType": "Typ", + + // "search.filters.applied.f.has_content_in_original_bundle": "Has files", + // TODO New key - Add a translation + "search.filters.applied.f.has_content_in_original_bundle": "Innehåller filer", + + // "search.filters.applied.f.itemtype": "Type", + // TODO New key - Add a translation + "search.filters.applied.f.itemtype": "Typ", + + // "search.filters.applied.f.namedresourcetype": "Status", + // TODO New key - Add a translation + "search.filters.applied.f.namedresourcetype": "Status", + + // "search.filters.applied.f.subject": "Subject", + // TODO New key - Add a translation + "search.filters.applied.f.subject": "Ämne", + + // "search.filters.applied.f.submitter": "Submitter", + // TODO New key - Add a translation + "search.filters.applied.f.submitter": "Skapad av", + + // "search.filters.applied.f.jobTitle": "Job Title", + // TODO New key - Add a translation + "search.filters.applied.f.jobTitle": "Job Title", + + // "search.filters.applied.f.birthDate.max": "End birth date", + // TODO New key - Add a translation + "search.filters.applied.f.birthDate.max": "Födelsedatum (till)", + + // "search.filters.applied.f.birthDate.min": "Start birth date", + // TODO New key - Add a translation + "search.filters.applied.f.birthDate.min": "Födelsedatum (från)", + + // "search.filters.applied.f.withdrawn": "Withdrawn", + // TODO New key - Add a translation + "search.filters.applied.f.withdrawn": "Återkallad", + + + + // "search.filters.filter.author.head": "Author", + // TODO New key - Add a translation + "search.filters.filter.author.head": "Författare", + + // "search.filters.filter.author.placeholder": "Author name", + // TODO New key - Add a translation + "search.filters.filter.author.placeholder": "Författare (namn)", + + // "search.filters.filter.author.label": "Search author name", + // TODO New key - Add a translation + "search.filters.filter.author.label": "Sök författare", + + // "search.filters.filter.birthDate.head": "Birth Date", + // TODO New key - Add a translation + "search.filters.filter.birthDate.head": "Födelsedatum", + + // "search.filters.filter.birthDate.placeholder": "Birth Date", + // TODO New key - Add a translation + "search.filters.filter.birthDate.placeholder": "Födelsedatum", + + // "search.filters.filter.birthDate.label": "Search birth date", + // TODO New key - Add a translation + "search.filters.filter.birthDate.label": "Sök födelsedatum", + + // "search.filters.filter.collapse": "Collapse filter", + // TODO New key - Add a translation + "search.filters.filter.collapse": "Fäll ihop filter", + + // "search.filters.filter.creativeDatePublished.head": "Date Published", + // TODO New key - Add a translation + "search.filters.filter.creativeDatePublished.head": "Publicerad", + + // "search.filters.filter.creativeDatePublished.placeholder": "Date Published", + // TODO New key - Add a translation + "search.filters.filter.creativeDatePublished.placeholder": "Publicerad", + + // "search.filters.filter.creativeDatePublished.label": "Search date published", + // TODO New key - Add a translation + "search.filters.filter.creativeDatePublished.label": "Sök på publiceringsdatum", + + // "search.filters.filter.creativeWorkEditor.head": "Editor", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkEditor.head": "Redaktör", + + // "search.filters.filter.creativeWorkEditor.placeholder": "Editor", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkEditor.placeholder": "Redaktör", + + // "search.filters.filter.creativeWorkEditor.label": "Search editor", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkEditor.label": "Sök redaktör", + + // "search.filters.filter.creativeWorkKeywords.head": "Subject", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkKeywords.head": "Ämne", + + // "search.filters.filter.creativeWorkKeywords.placeholder": "Subject", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkKeywords.placeholder": "Ämne", + + // "search.filters.filter.creativeWorkKeywords.label": "Search subject", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkKeywords.label": "Sök ämne", + + // "search.filters.filter.creativeWorkPublisher.head": "Publisher", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkPublisher.head": "Utgivare", + + // "search.filters.filter.creativeWorkPublisher.placeholder": "Publisher", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkPublisher.placeholder": "Utgivare", + + // "search.filters.filter.creativeWorkPublisher.label": "Search publisher", + // TODO New key - Add a translation + "search.filters.filter.creativeWorkPublisher.label": "Sök utgivare", + + // "search.filters.filter.dateIssued.head": "Date", + // TODO New key - Add a translation + "search.filters.filter.dateIssued.head": "Datum", + + // "search.filters.filter.dateIssued.max.placeholder": "Maximum Date", + // TODO New key - Add a translation + "search.filters.filter.dateIssued.max.placeholder": "Datum (max)", + + // "search.filters.filter.dateIssued.max.label": "End", + // TODO New key - Add a translation + "search.filters.filter.dateIssued.max.label": "Till", + + // "search.filters.filter.dateIssued.min.placeholder": "Minimum Date", + // TODO New key - Add a translation + "search.filters.filter.dateIssued.min.placeholder": "Datum (min)", + + // "search.filters.filter.dateIssued.min.label": "Start", + // TODO New key - Add a translation + "search.filters.filter.dateIssued.min.label": "Från", + + // "search.filters.filter.dateSubmitted.head": "Date submitted", + // TODO New key - Add a translation + "search.filters.filter.dateSubmitted.head": "Skapad", + + // "search.filters.filter.dateSubmitted.placeholder": "Date submitted", + // TODO New key - Add a translation + "search.filters.filter.dateSubmitted.placeholder": "Skapad", + + // "search.filters.filter.dateSubmitted.label": "Search date submitted", + // TODO New key - Add a translation + "search.filters.filter.dateSubmitted.label": "Sök skapad datum", + + // "search.filters.filter.discoverable.head": "Non-discoverable", + // TODO New key - Add a translation + "search.filters.filter.discoverable.head": "Ej sökbar", + + // "search.filters.filter.withdrawn.head": "Withdrawn", + // TODO New key - Add a translation + "search.filters.filter.withdrawn.head": "Återkallad", + + // "search.filters.filter.entityType.head": "Item Type", + // TODO New key - Add a translation + "search.filters.filter.entityType.head": "Typ", + + // "search.filters.filter.entityType.placeholder": "Item Type", + // TODO New key - Add a translation + "search.filters.filter.entityType.placeholder": "Typ", + + // "search.filters.filter.entityType.label": "Search item type", + // TODO New key - Add a translation + "search.filters.filter.entityType.label": "Sök typ av post", + + // "search.filters.filter.expand": "Expand filter", + // TODO New key - Add a translation + "search.filters.filter.expand": "Expandera filter", + + // "search.filters.filter.has_content_in_original_bundle.head": "Has files", + // TODO New key - Add a translation + "search.filters.filter.has_content_in_original_bundle.head": "Innehåller filer", + + // "search.filters.filter.itemtype.head": "Type", + // TODO New key - Add a translation + "search.filters.filter.itemtype.head": "Typ", + + // "search.filters.filter.itemtype.placeholder": "Type", + // TODO New key - Add a translation + "search.filters.filter.itemtype.placeholder": "Typ", + + // "search.filters.filter.itemtype.label": "Search type", + // TODO New key - Add a translation + "search.filters.filter.itemtype.label": "Sök typ", + + // "search.filters.filter.jobTitle.head": "Job Title", + // TODO New key - Add a translation + "search.filters.filter.jobTitle.head": "Job Title", + + // "search.filters.filter.jobTitle.placeholder": "Job Title", + // TODO New key - Add a translation + "search.filters.filter.jobTitle.placeholder": "Job Title", + + // "search.filters.filter.jobTitle.label": "Search job title", + // TODO New key - Add a translation + "search.filters.filter.jobTitle.label": "Sök job title", + + // "search.filters.filter.knowsLanguage.head": "Known language", + // TODO New key - Add a translation + "search.filters.filter.knowsLanguage.head": "Känt språk", + + // "search.filters.filter.knowsLanguage.placeholder": "Known language", + // TODO New key - Add a translation + "search.filters.filter.knowsLanguage.placeholder": "Känt språk", + + // "search.filters.filter.knowsLanguage.label": "Search known language", + // TODO New key - Add a translation + "search.filters.filter.knowsLanguage.label": "Sök språk", + + // "search.filters.filter.namedresourcetype.head": "Status", + // TODO New key - Add a translation + "search.filters.filter.namedresourcetype.head": "Status", + + // "search.filters.filter.namedresourcetype.placeholder": "Status", + // TODO New key - Add a translation + "search.filters.filter.namedresourcetype.placeholder": "Status", + + // "search.filters.filter.namedresourcetype.label": "Search status", + // TODO New key - Add a translation + "search.filters.filter.namedresourcetype.label": "Sök status", + + // "search.filters.filter.objectpeople.head": "People", + // TODO New key - Add a translation + "search.filters.filter.objectpeople.head": "Personer", + + // "search.filters.filter.objectpeople.placeholder": "People", + // TODO New key - Add a translation + "search.filters.filter.objectpeople.placeholder": "Personer", + + // "search.filters.filter.objectpeople.label": "Search people", + // TODO New key - Add a translation + "search.filters.filter.objectpeople.label": "Sök personer", + + // "search.filters.filter.organizationAddressCountry.head": "Country", + // TODO New key - Add a translation + "search.filters.filter.organizationAddressCountry.head": "Land", + + // "search.filters.filter.organizationAddressCountry.placeholder": "Country", + // TODO New key - Add a translation + "search.filters.filter.organizationAddressCountry.placeholder": "Land", + + // "search.filters.filter.organizationAddressCountry.label": "Search country", + // TODO New key - Add a translation + "search.filters.filter.organizationAddressCountry.label": "Sök land", + + // "search.filters.filter.organizationAddressLocality.head": "City", + // TODO New key - Add a translation + "search.filters.filter.organizationAddressLocality.head": "Stad", + + // "search.filters.filter.organizationAddressLocality.placeholder": "City", + // TODO New key - Add a translation + "search.filters.filter.organizationAddressLocality.placeholder": "Stad", + + // "search.filters.filter.organizationAddressLocality.label": "Search city", + // TODO New key - Add a translation + "search.filters.filter.organizationAddressLocality.label": "Sök stad", + + // "search.filters.filter.organizationFoundingDate.head": "Date Founded", + // TODO New key - Add a translation + "search.filters.filter.organizationFoundingDate.head": "Grundad", + + // "search.filters.filter.organizationFoundingDate.placeholder": "Date Founded", + // TODO New key - Add a translation + "search.filters.filter.organizationFoundingDate.placeholder": "Grundad", + + // "search.filters.filter.organizationFoundingDate.label": "Search date founded", + // TODO New key - Add a translation + "search.filters.filter.organizationFoundingDate.label": "Sök grundad (datum)", + + // "search.filters.filter.scope.head": "Scope", + // TODO New key - Add a translation + "search.filters.filter.scope.head": "Scope", + + // "search.filters.filter.scope.placeholder": "Scope filter", + // TODO New key - Add a translation + "search.filters.filter.scope.placeholder": "Scope filter", + + // "search.filters.filter.scope.label": "Search scope filter", + // TODO New key - Add a translation + "search.filters.filter.scope.label": "Search scope filter", + + // "search.filters.filter.show-less": "Collapse", + // TODO New key - Add a translation + "search.filters.filter.show-less": "Visa färre", + + // "search.filters.filter.show-more": "Show more", + // TODO New key - Add a translation + "search.filters.filter.show-more": "Visa fler", + + // "search.filters.filter.subject.head": "Subject", + // TODO New key - Add a translation + "search.filters.filter.subject.head": "Ämne", + + // "search.filters.filter.subject.placeholder": "Subject", + // TODO New key - Add a translation + "search.filters.filter.subject.placeholder": "Ämne", + + // "search.filters.filter.subject.label": "Search subject", + // TODO New key - Add a translation + "search.filters.filter.subject.label": "Sök ämne", + + // "search.filters.filter.submitter.head": "Submitter", + // TODO New key - Add a translation + "search.filters.filter.submitter.head": "Skapad av", + + // "search.filters.filter.submitter.placeholder": "Submitter", + // TODO New key - Add a translation + "search.filters.filter.submitter.placeholder": "Skapad av", + + // "search.filters.filter.submitter.label": "Search submitter", + // TODO New key - Add a translation + "search.filters.filter.submitter.label": "Sök skapad av", + + + + // "search.filters.entityType.JournalIssue": "Journal Issue", + // TODO New key - Add a translation + "search.filters.entityType.JournalIssue": "Utgåva", + + // "search.filters.entityType.JournalVolume": "Journal Volume", + // TODO New key - Add a translation + "search.filters.entityType.JournalVolume": "Volym", + + // "search.filters.entityType.OrgUnit": "Organizational Unit", + // TODO New key - Add a translation + "search.filters.entityType.OrgUnit": "Organisatorisk enhet", + + // "search.filters.has_content_in_original_bundle.true": "Yes", + // TODO New key - Add a translation + "search.filters.has_content_in_original_bundle.true": "Ja", + + // "search.filters.has_content_in_original_bundle.false": "No", + // TODO New key - Add a translation + "search.filters.has_content_in_original_bundle.false": "Nej", + + // "search.filters.discoverable.true": "No", + // TODO New key - Add a translation + "search.filters.discoverable.true": "Nej", + + // "search.filters.discoverable.false": "Yes", + // TODO New key - Add a translation + "search.filters.discoverable.false": "Ja", + + // "search.filters.withdrawn.true": "Yes", + // TODO New key - Add a translation + "search.filters.withdrawn.true": "Ja", + + // "search.filters.withdrawn.false": "No", + // TODO New key - Add a translation + "search.filters.withdrawn.false": "Nej", + + + // "search.filters.head": "Filters", + // TODO New key - Add a translation + "search.filters.head": "Filtrera", + + // "search.filters.reset": "Reset filters", + // TODO New key - Add a translation + "search.filters.reset": "Rensa filter", + + // "search.filters.search.submit": "Submit", + // TODO New key - Add a translation + "search.filters.search.submit": "Submit", + + + + // "search.form.search": "Search", + // TODO New key - Add a translation + "search.form.search": "Sök", + + // "search.form.search_dspace": "All repository", + // TODO New key - Add a translation + "search.form.search_dspace": "Hela arkivet", + + // "search.form.scope.all": "All of DSpace", + // TODO New key - Add a translation + "search.form.scope.all": "Hela arkivet", + + + + // "search.results.head": "Search Results", + // TODO New key - Add a translation + "search.results.head": "Sökresultat", + + // "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting", + // TODO New key - Add a translation + "search.results.no-results": "Sökningen resulterade inte i några träffar. Du kan testa att använda", + + // "search.results.no-results-link": "quotes around it", + // TODO New key - Add a translation + "search.results.no-results-link": "citationstecken före och efter sökfrågan", + + // "search.results.empty": "Your search returned no results.", + // TODO New key - Add a translation + "search.results.empty": "Sökningen resulterade inte i några träffar.", + + // "search.results.view-result": "View", + // TODO New key - Add a translation + "search.results.view-result": "Visa", + + + // "default.search.results.head": "Search Results", + // TODO New key - Add a translation + "default.search.results.head": "Sökresultat", + + + // "search.sidebar.close": "Back to results", + // TODO New key - Add a translation + "search.sidebar.close": "Tillbaka till sökresultaten", + + // "search.sidebar.filters.title": "Filters", + // TODO New key - Add a translation + "search.sidebar.filters.title": "Filtrera", + + // "search.sidebar.open": "Search Tools", + // TODO New key - Add a translation + "search.sidebar.open": "Sökverktyg", + + // "search.sidebar.results": "results", + // TODO New key - Add a translation + "search.sidebar.results": "resultat", + + // "search.sidebar.settings.rpp": "Results per page", + // TODO New key - Add a translation + "search.sidebar.settings.rpp": "Träffar per sida", + + // "search.sidebar.settings.sort-by": "Sort By", + // TODO New key - Add a translation + "search.sidebar.settings.sort-by": "Sortera efter", + + // "search.sidebar.settings.title": "Settings", + // TODO New key - Add a translation + "search.sidebar.settings.title": "Inställningar", + + + + // "search.view-switch.show-detail": "Show detail", + // TODO New key - Add a translation + "search.view-switch.show-detail": "Visa detaljer", + + // "search.view-switch.show-grid": "Show as grid", + // TODO New key - Add a translation + "search.view-switch.show-grid": "Visa som rutmönster", + + // "search.view-switch.show-list": "Show as list", + // TODO New key - Add a translation + "search.view-switch.show-list": "Visa som lista", + + // "sorting.ASC": "Ascending", + // TODO New key - Add a translation + "sorting.ASC": "Stigande", + + // "sorting.DESC": "Descending", + // TODO New key - Add a translation + "sorting.DESC": "Fallande", + + // "sorting.dc.title.ASC": "Title Ascending", + // TODO New key - Add a translation + "sorting.dc.title.ASC": "Titel", + + // "sorting.dc.title.DESC": "Title Descending", + // TODO New key - Add a translation + "sorting.dc.title.DESC": "Titel", + + // "sorting.score.ASC": "Least Relevant", + // TODO New key - Add a translation + "sorting.score.ASC": "Minst relevant", + + // "sorting.score.DESC": "Most Relevant", + // TODO New key - Add a translation + "sorting.score.DESC": "Mest relevant", + + // "sorting.dc.date.issued.ASC": "Date Issued Ascending", + // TODO New key - Add a translation + "sorting.dc.date.issued.ASC": "Datum (stigande)", + + // "sorting.dc.date.issued.DESC": "Date Issued Descending", + // TODO New key - Add a translation + "sorting.dc.date.issued.DESC": "Datum (fallande)", + + // "sorting.dc.date.accessioned.ASC": "Accessioned Date Ascending", + // TODO New key - Add a translation + "sorting.dc.date.accessioned.ASC": "Accessioned Date Ascending", + + // "sorting.dc.date.accessioned.DESC": "Accessioned Date Descending", + // TODO New key - Add a translation + "sorting.dc.date.accessioned.DESC": "Accessioned Date Descending", + + // "sorting.lastModified.ASC": "Last modified Ascending", + // TODO New key - Add a translation + "sorting.lastModified.ASC": "Senast ändrad (stigande)", + + // "sorting.lastModified.DESC": "Last modified Descending", + // TODO New key - Add a translation + "sorting.lastModified.DESC": "Senast ändrad (fallande)", + + + // "statistics.title": "Statistics", + // TODO New key - Add a translation + "statistics.title": "Statistik", + + // "statistics.header": "Statistics for {{ scope }}", + // TODO New key - Add a translation + "statistics.header": "Statistik för {{ scope }}", + + // "statistics.breadcrumbs": "Statistics", + // TODO New key - Add a translation + "statistics.breadcrumbs": "Statistik", + + // "statistics.page.no-data": "No data available", + // TODO New key - Add a translation + "statistics.page.no-data": "Data saknas", + + // "statistics.table.no-data": "No data available", + // TODO New key - Add a translation + "statistics.table.no-data": "Data saknas", + + // "statistics.table.title.TotalVisits": "Totalt antal besök", + // TODO New key - Add a translation + "statistics.table.title.TotalVisits": "Totalt antal besök", + + // "statistics.table.title.TotalVisitsPerMonth": "Totalt antal besök per month", + // TODO New key - Add a translation + "statistics.table.title.TotalVisitsPerMonth": "Totalt antal besök per månad", + + // "statistics.table.title.TotalDownloads": "File Visits", + // TODO New key - Add a translation + "statistics.table.title.TotalDownloads": "Nedladdningar", + + // "statistics.table.title.TopCountries": "Top country views", + // TODO New key - Add a translation + "statistics.table.title.TopCountries": "Visningar per land (topp)", + + // "statistics.table.title.TopCities": "Top city views", + // TODO New key - Add a translation + "statistics.table.title.TopCities": "Visningar per stad (topp)", + + // "statistics.table.header.views": "Views", + // TODO New key - Add a translation + "statistics.table.header.views": "Visningar", + + + + // "submission.edit.breadcrumbs": "Edit Submission", + // TODO New key - Add a translation + "submission.edit.breadcrumbs": "Redigera bidrag", + + // "submission.edit.title": "Edit Submission", + // TODO New key - Add a translation + "submission.edit.title": "Redigera bidrag", + + // "submission.general.cancel": "Cancel", + // TODO New key - Add a translation + "submission.general.cancel": "Avbryt", + + // "submission.general.cannot_submit": "You have not the privilege to make a new submission.", + // TODO New key - Add a translation + "submission.general.cannot_submit": "Du har inte behörighet att ladda upp nya bidrag.", + + // "submission.general.deposit": "Deposit", + // TODO New key - Add a translation + "submission.general.deposit": "Spara och publicera", + + // "submission.general.discard.confirm.cancel": "Cancel", + // TODO New key - Add a translation + "submission.general.discard.confirm.cancel": "Avbryt", + + // "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?", + // TODO New key - Add a translation + "submission.general.discard.confirm.info": "Är du säker? Denna åtgärd kan inte ångras.", + + // "submission.general.discard.confirm.submit": "Yes, I'm sure", + // TODO New key - Add a translation + "submission.general.discard.confirm.submit": "Ja", + + // "submission.general.discard.confirm.title": "Discard submission", + // TODO New key - Add a translation + "submission.general.discard.confirm.title": "Återkalla bidrag", + + // "submission.general.discard.submit": "Discard", + // TODO New key - Add a translation + "submission.general.discard.submit": "Återkalla", + + // "submission.general.info.saved": "Saved", + // TODO New key - Add a translation + "submission.general.info.saved": "Sparat", + + // "submission.general.info.pending-changes": "Unsaved changes", + // TODO New key - Add a translation + "submission.general.info.pending-changes": "Ändringar som inte har sparats", + + // "submission.general.save": "Save", + // TODO New key - Add a translation + "submission.general.save": "Spara", + + // "submission.general.save-later": "Save for later", + // TODO New key - Add a translation + "submission.general.save-later": "Spara till senare", + + + // "submission.import-external.page.title": "Import metadata from an external source", + // TODO New key - Add a translation + "submission.import-external.page.title": "Importera metadata från extern källa", + + // "submission.import-external.title": "Import metadata from an external source", + // TODO New key - Add a translation + "submission.import-external.title": "Importera metadata från extern källa", + + // "submission.import-external.title.Journal": "Import a journal from an external source", + // TODO New key - Add a translation + "submission.import-external.title.Journal": "Importera tidskrift från extern källa", + + // "submission.import-external.title.JournalIssue": "Import a journal issue from an external source", + // TODO New key - Add a translation + "submission.import-external.title.JournalIssue": "Importera tidskrift från extern källa", + + // "submission.import-external.title.JournalVolume": "Import a journal volume from an external source", + // TODO New key - Add a translation + "submission.import-external.title.JournalVolume": "Importera tidskriftsvolym från extern källa", + + // "submission.import-external.title.OrgUnit": "Import a publisher from an external source", + // TODO New key - Add a translation + "submission.import-external.title.OrgUnit": "Importera förlag från extern källa", + + // "submission.import-external.title.Person": "Import a person from an external source", + // TODO New key - Add a translation + "submission.import-external.title.Person": "Importera person från extern källa", + + // "submission.import-external.title.Project": "Import a project from an external source", + // TODO New key - Add a translation + "submission.import-external.title.Project": "Importera projekt från extern källa", + + // "submission.import-external.title.Publication": "Import a publication from an external source", + // TODO New key - Add a translation + "submission.import-external.title.Publication": "Importera publikation från extern källa", + + // "submission.import-external.title.none": "Import metadata from an external source", + // TODO New key - Add a translation + "submission.import-external.title.none": "Importera metadata från extern källa", + + // "submission.import-external.page.hint": "Enter a query above to find items from the web to import in to DSpace.", + // TODO New key - Add a translation + "submission.import-external.page.hint": "Ange en sökfråga för att hitta information på webben att importera.", + + // "submission.import-external.back-to-my-dspace": "Back to MyDSpace", + // TODO New key - Add a translation + "submission.import-external.back-to-my-dspace": "Tillbaka till MyDSpace", + + // "submission.import-external.search.placeholder": "Search the external source", + // TODO New key - Add a translation + "submission.import-external.search.placeholder": "Sök i extern källa", + + // "submission.import-external.search.button": "Search", + // TODO New key - Add a translation + "submission.import-external.search.button": "Sök", + + // "submission.import-external.search.button.hint": "Write some words to search", + // TODO New key - Add a translation + "submission.import-external.search.button.hint": "Ange sökord", + + // "submission.import-external.search.source.hint": "Pick an external source", + // TODO New key - Add a translation + "submission.import-external.search.source.hint": "Välj extern källa", + + // "submission.import-external.source.arxiv": "arXiv", + // TODO New key - Add a translation + "submission.import-external.source.arxiv": "arXiv", + + // "submission.import-external.source.loading": "Loading ...", + // TODO New key - Add a translation + "submission.import-external.source.loading": "Laddar ...", + + // "submission.import-external.source.sherpaJournal": "SHERPA Journals", + // TODO New key - Add a translation + "submission.import-external.source.sherpaJournal": "SHERPA Journals", + + // "submission.import-external.source.sherpaJournalIssn": "SHERPA Journals by ISSN", + // TODO New key - Add a translation + "submission.import-external.source.sherpaJournalIssn": "SHERPA Journals by ISSN", + + // "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", + // TODO New key - Add a translation + "submission.import-external.source.sherpaPublisher": "SHERPA Publishers", + + // "submission.import-external.source.openAIREFunding": "Funding OpenAIRE API", + // TODO New key - Add a translation + "submission.import-external.source.openAIREFunding": "Funding OpenAIRE API", + + // "submission.import-external.source.orcid": "ORCID", + // TODO New key - Add a translation + "submission.import-external.source.orcid": "ORCID", + + // "submission.import-external.source.pubmed": "Pubmed", + // TODO New key - Add a translation + "submission.import-external.source.pubmed": "Pubmed", + + // "submission.import-external.source.lcname": "Library of Congress Names", + // TODO New key - Add a translation + "submission.import-external.source.lcname": "Library of Congress Names", + + // "submission.import-external.preview.title": "Item Preview", + // TODO New key - Add a translation + "submission.import-external.preview.title": "Förandsgranska post", + + // "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", + // TODO New key - Add a translation + "submission.import-external.preview.subtitle": "Informationen nedan har importats från en extern källa. Den kommer att vara ifylld när du påbörjar ett nytt bidrag.", + + // "submission.import-external.preview.button.import": "Start submission", + // TODO New key - Add a translation + "submission.import-external.preview.button.import": "Påbörja bidrag", + + // "submission.import-external.preview.error.import.title": "Submission error", + // TODO New key - Add a translation + "submission.import-external.preview.error.import.title": "Fel", + + // "submission.import-external.preview.error.import.body": "An error occurs during the external source entry import process.", + // TODO New key - Add a translation + "submission.import-external.preview.error.import.body": "Ett fel uppstod när externa data skulle importeras.", + + // "submission.sections.describe.relationship-lookup.close": "Close", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.close": "Stäng", + + // "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.added": "Successfully added local entry to the selection", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Import remote author", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isAuthorOfPublication": "Importera författare", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Import remote journal", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal": "Importera tidskrift", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Import remote journal issue", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Issue": "Importera tidskriftsexemplar", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Import remote journal volume", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Journal Volume": "Importera tidskriftsvolym", + + // "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Project", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Projekt", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "New Entity Added!", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "Ny information har lagts till!", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Project", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Projekt", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.openAIREFunding": "Funding OpenAIRE API", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Import Remote Author", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.title": "Importera författare", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Successfully added local author to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.local-entity": "Lokal författare har lagts till", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Successfully imported and added external author to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.isAuthorOfPublication.added.new-entity": "Extern författare har lagts till", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Authority", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority": "Auktoritet", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Import as a new local authority entry", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.authority.new": "Importera som ny lokal auktoritet", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Cancel", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.cancel": "Avbryt", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Select a collection to import new entries to", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.collection": "Välj samling att importera till", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Entities", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities": "Beståndsdelar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Import as a new local entity", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.entities.new": "Importera som ny lokal beståndsdel", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importing from LC Name", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.lcname": "Importera från LC Name", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importing from ORCID", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.orcid": "Importera från ORCID", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importing from Sherpa Journal", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaJournal": "Importera från Sherpa Journal", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importing from Sherpa Publisher", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.sherpaPublisher": "Importera från Sherpa Publisher", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importing from PubMed", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.pubmed": "Importera från PubMed", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importing from arXiv", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.head.arxiv": "Importera från arXiv", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Import", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.import": "Importera", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Import Remote Journal", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.title": "Importera tidskrift", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Successfully added local journal to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.local-entity": "Lokal tidskrift har lagts till", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Successfully imported and added external journal to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal.added.new-entity": "Extern tidskrift har importerats och lagts till", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Import Remote Journal Issue", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.title": "Importera externt tidskriftsexemplar", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Successfully added local journal issue to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.local-entity": "Lokal tidskrift har lagts till", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Successfully imported and added external journal issue to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Issue.added.new-entity": "Externt tidskriftsexemplar har importerats och lagts till", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Import Remote Journal Volume", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.title": "Importera tidskriftsvolym", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Successfully added local journal volume to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.local-entity": "Lokal tidskriftsvolym har lagts till", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Successfully imported and added external journal volume to the selection", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.Journal Volume.added.new-entity": "Extern tidskriftsvolym har importerats och lagts till", + + // "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Select a local match:", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.external-source.import-modal.select": "Välj lokal träff:", + + // "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Deselect all", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.deselect-all": "Avmarkera alla", + + // "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Deselect page", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.deselect-page": "Avmarkera sida", + + // "submission.sections.describe.relationship-lookup.search-tab.loading": "Loading...", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.loading": "Laddar...", + + // "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Search query", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.placeholder": "Sökfråga", + + // "submission.sections.describe.relationship-lookup.search-tab.search": "Go", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.search": "Kör", + + // "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Search...", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.search-form.placeholder": "Sök...", + + // "submission.sections.describe.relationship-lookup.search-tab.select-all": "Select all", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.select-all": "Välj alla", + + // "submission.sections.describe.relationship-lookup.search-tab.select-page": "Select page", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.select-page": "Välj sida", + + // "submission.sections.describe.relationship-lookup.selected": "Selected {{ size }} items", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selected": "Har markerat {{ size }} poster", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Local Författare ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isAuthorOfPublication": "Lokal författare ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Local Journals ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalOfPublication": "Lokala tidskrifter ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Local Projects ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Project": "Lokala projekt ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Local Publications ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Publication": "Lokala publikationer ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Local Författare ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Person": "Lokala författare ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Local Organizational Units ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.OrgUnit": "Locala organisatoriska enheter ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Local Data Packages ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataPackage": "Lokala datapaket ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Local Data Files ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.DataFile": "Lokala filer ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Local Journals ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.Journal": "Lokala tidskrifter ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalIssueOfPublication": "Local Journal Issues ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Local Journal Issues ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalIssue": "Lokala tidskriftsexemplar ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isJournalVolumeOfPublication": "Local Journal Volumes ({{ count }})", + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Local Journal Volumes ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.JournalVolume": "Lokala tidskriftsvolymer ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaJournal": "Sherpa Journals ({{ count }})", + // TODO New key - Add a translation + "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 }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.sherpaPublisher": "Sherpa Publishers ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.orcid": "ORCID ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.lcname": "LC Names ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.pubmed": "PubMed ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.arxiv": "arXiv ({{ count }})", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Search for Funding Agencies", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfPublication": "Sök finansiärer", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Search for Funding", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingOfPublication": "Sök finansiering", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Search for Organizational Units", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isChildOrgUnitOf": "Sök organisatoriska enheter", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.openAIREFunding": "Funding OpenAIRE API", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projects", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isProjectOfPublication": "Projekt", + + // "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Funder of the Project", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.tab-title.isFundingAgencyOfProject": "Finansiär", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.openAIREFunding": "Funding OpenAIRE API", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Project", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isProjectOfPublication": "Projekt", + + // "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projects", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isProjectOfPublication": "Projekt", + + // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Funder of the Project", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfProject": "Projektets finansiär", + + + + + // "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Search...", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.search-form.placeholder": "Sök...", + + // "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Current Selection ({{ count }})", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.tab-title": "Aktuellt urval ({{ count }})", + + // "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isJournalIssueOfPublication": "Journal Issues", + // "submission.sections.describe.relationship-lookup.title.JournalIssue": "Journal Issues", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.JournalIssue": "Tidskriftsexemplar", + + // "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isJournalVolumeOfPublication": "Journal Volumes", + // "submission.sections.describe.relationship-lookup.title.JournalVolume": "Journal Volumes", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.JournalVolume": "Tidskriftsvolymer", + + // "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Journals", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isJournalOfPublication": "Tidskrifter", + + // "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Författare", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isAuthorOfPublication": "Författare", + + // "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Funding Agency", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isFundingAgencyOfPublication": "Finansiär", + // "submission.sections.describe.relationship-lookup.title.Project": "Projects", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.Project": "Projekt", + + // "submission.sections.describe.relationship-lookup.title.Publication": "Publications", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.Publication": "Publikationer", + + // "submission.sections.describe.relationship-lookup.title.Person": "Författare", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.Person": "Författare", + + // "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organizational Units", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.OrgUnit": "Organisatoriska enheter", + + // "submission.sections.describe.relationship-lookup.title.DataPackage": "Data Packages", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.DataPackage": "Datapaket", + + // "submission.sections.describe.relationship-lookup.title.DataFile": "Data Files", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.DataFile": "Filer", + + // "submission.sections.describe.relationship-lookup.title.Funding Agency": "Funding Agency", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.Funding Agency": "Finansiär", + + // "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Funding", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isFundingOfPublication": "Finansiering", + + // "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Parent Organizational Unit", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.title.isChildOrgUnitOf": "Organisatorisk förälder", + + // "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Toggle dropdown", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.search-tab.toggle-dropdown": "Växla dropdown", + + // "submission.sections.describe.relationship-lookup.selection-tab.settings": "Settings", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.settings": "Inställningar", + + // "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Your selection is currently empty.", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.no-selection": "Inget har valts.", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Selected Författare", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isAuthorOfPublication": "Valdra författare", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Selected Journals", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalOfPublication": "Valda tidskrifter", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Selected Journal Volume", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalVolumeOfPublication": "Valda tidskriftsvolymer", + // "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Selected Projects", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.Project": "Valda projekt", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Selected Publications", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.Publication": "Valda publikationer", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Selected Författare", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.Person": "Valda författare", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Selected Organizational Units", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.OrgUnit": "Valda organisatoriska enheter", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Selected Data Packages", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.DataPackage": "Valda datapaket", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Selected Data Files", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.DataFile": "Valda filer", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Selected Journals", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.Journal": "Valda tidskrifter", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Selected Issue", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isJournalIssueOfPublication": "Valt exemnplar", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Selected Journal Volume", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalVolume": "Vald volym", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Selected Funding Agency", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingAgencyOfPublication": "Vald finansiär", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Selected Funding", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isFundingOfPublication": "Vald finansiering", + // "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Selected Issue", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.JournalIssue": "Valt exemplar ", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Selected Organizational Unit", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.isChildOrgUnitOf": "Vald organisatorisk enet", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaJournal": "Sökresultat", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.sherpaPublisher": "Sökresultat", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.orcid": "Sökresultat", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.orcidv2": "Sökresultat", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.lcname": "Sökresultat", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.pubmed": "Sökresultat", + + // "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Sökresultat", + + // "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Vill du spara \"{{ value }}\" som en namnvariation för denna person? Om inte så kan du fortfarande använda det i detta bidrag.", + + // "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Spara en ny namnvariation", + + // "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Use only for this submission", + // TODO New key - Add a translation + "submission.sections.describe.relationship-lookup.name-variant.notification.decline": "Använd bara i detta bidrag", + + // "submission.sections.ccLicense.type": "License Type", + // TODO New key - Add a translation + "submission.sections.ccLicense.type": "Typ av license", + + // "submission.sections.ccLicense.select": "Select a license type…", + // TODO New key - Add a translation + "submission.sections.ccLicense.select": "Välj licenstyp…", + + // "submission.sections.ccLicense.change": "Change your license type…", + // TODO New key - Add a translation + "submission.sections.ccLicense.change": "Ändra licenstyp…", + + // "submission.sections.ccLicense.none": "No licenses available", + // TODO New key - Add a translation + "submission.sections.ccLicense.none": "Det finns inga licenser", + + // "submission.sections.ccLicense.option.select": "Select an option…", + // TODO New key - Add a translation + "submission.sections.ccLicense.option.select": "Välj…", + + // "submission.sections.ccLicense.link": "You’ve selected the following license:", + // TODO New key - Add a translation + "submission.sections.ccLicense.link": "Du har valt följande licens:", + + // "submission.sections.ccLicense.confirmation": "I grant the license above", + // TODO New key - Add a translation + "submission.sections.ccLicense.confirmation": "Jag beviljar licensen ovan", + + // "submission.sections.general.add-more": "Add more", + // TODO New key - Add a translation + "submission.sections.general.add-more": "Lägg till fler", + + // "submission.sections.general.collection": "Collection", + // TODO New key - Add a translation + "submission.sections.general.collection": "Samling", + + // "submission.sections.general.deposit_error_notice": "There was an issue when submitting the item, please try again later.", + // TODO New key - Add a translation + "submission.sections.general.deposit_error_notice": "Ett fel uppstod, försök igen senare.", + + // "submission.sections.general.deposit_success_notice": "Submission deposited successfully.", + // TODO New key - Add a translation + "submission.sections.general.deposit_success_notice": "Bidraget har deponerats.", + + // "submission.sections.general.discard_error_notice": "There was an issue when discarding the item, please try again later.", + // TODO New key - Add a translation + "submission.sections.general.discard_error_notice": "Ett fel har uppstått. Försök igen senare.", + + // "submission.sections.general.discard_success_notice": "Submission discarded successfully.", + // TODO New key - Add a translation + "submission.sections.general.discard_success_notice": "Bidraget har dragits tillbaka.", + + // "submission.sections.general.metadata-extracted": "New metadata have been extracted and added to the {{sectionId}} section.", + // TODO New key - Add a translation + "submission.sections.general.metadata-extracted": "Nya metadata har extraherats och lagts till i {{sectionId}}.", + + // "submission.sections.general.metadata-extracted-new-section": "New {{sectionId}} section has been added to submission.", + // TODO New key - Add a translation + "submission.sections.general.metadata-extracted-new-section": "Ny sektion {{sectionId}} har lagts till i bidraget.", + + // "submission.sections.general.no-collection": "No collection found", + // TODO New key - Add a translation + "submission.sections.general.no-collection": "Ingen samling kunde hittas", + + // "submission.sections.general.no-sections": "No options available", + // TODO New key - Add a translation + "submission.sections.general.no-sections": "Det finns inga alternativ att välja", + + // "submission.sections.general.save_error_notice": "There was an issue when saving the item, please try again later.", + // TODO New key - Add a translation + "submission.sections.general.save_error_notice": "Ett fel uppstod när posten skulle sparas. Försök igen senare.", + + // "submission.sections.general.save_success_notice": "Submission saved successfully.", + // TODO New key - Add a translation + "submission.sections.general.save_success_notice": "Bidraget har sparats.", + + // "submission.sections.general.search-collection": "Search for a collection", + // TODO New key - Add a translation + "submission.sections.general.search-collection": "Sök efter samling", + + // "submission.sections.general.sections_not_valid": "There are incomplete sections.", + // TODO New key - Add a translation + "submission.sections.general.sections_not_valid": "Det saknas data i vissa delar.", + + + + // "submission.sections.submit.progressbar.accessCondition": "Item access conditions", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.accessCondition": "Villkor för åtkomst till post", + + // "submission.sections.submit.progressbar.CClicense": "Creative commons license", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.CClicense": "Creative commons licens", + + // "submission.sections.submit.progressbar.describe.recycle": "Recycle", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.describe.recycle": "Återanvänd", + + // "submission.sections.submit.progressbar.describe.stepcustom": "Describe", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.describe.stepcustom": "Beskriv", + + // "submission.sections.submit.progressbar.describe.stepone": "Describe", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.describe.stepone": "Beskriv", + + // "submission.sections.submit.progressbar.describe.steptwo": "Describe", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.describe.steptwo": "Beskriv", + + // "submission.sections.submit.progressbar.detect-duplicate": "Potential duplicates", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.detect-duplicate": "Potentiell dubblett", + + // "submission.sections.submit.progressbar.license": "Deposit license", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.license": "Licensvillkor", + + // "submission.sections.submit.progressbar.upload": "Upload files", + // TODO New key - Add a translation + "submission.sections.submit.progressbar.upload": "Ladda upp filer", + + + + // "submission.sections.status.errors.title": "Errors", + // TODO New key - Add a translation + "submission.sections.status.errors.title": "Fel", + + // "submission.sections.status.valid.title": "Valid", + // TODO New key - Add a translation + "submission.sections.status.valid.title": "Giltig", + + // "submission.sections.status.warnings.title": "Warnings", + // TODO New key - Add a translation + "submission.sections.status.warnings.title": "Varningar", + + // "submission.sections.status.errors.aria": "has errors", + // TODO New key - Add a translation + "submission.sections.status.errors.aria": "inneåller fel", + + // "submission.sections.status.valid.aria": "is valid", + // TODO New key - Add a translation + "submission.sections.status.valid.aria": "är giltig", + + // "submission.sections.status.warnings.aria": "has warnings", + // TODO New key - Add a translation + "submission.sections.status.warnings.aria": "ger varningar", + + // "submission.sections.toggle.open": "Open section", + // TODO New key - Add a translation + "submission.sections.toggle.open": "Öppna sektion", + + // "submission.sections.toggle.close": "Close section", + // TODO New key - Add a translation + "submission.sections.toggle.close": "Stäng sektion", + + // "submission.sections.toggle.aria.open": "Expand {{sectionHeader}} section", + // TODO New key - Add a translation + "submission.sections.toggle.aria.open": "Expandera {{sectionHeader}} sektion", + + // "submission.sections.toggle.aria.close": "Collapse {{sectionHeader}} section", + // TODO New key - Add a translation + "submission.sections.toggle.aria.close": "Fäll ihop {{sectionHeader}} sektion", + + // "submission.sections.upload.delete.confirm.cancel": "Cancel", + // TODO New key - Add a translation + "submission.sections.upload.delete.confirm.cancel": "Avbryt", + + // "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?", + // TODO New key - Add a translation + "submission.sections.upload.delete.confirm.info": "Är du säker? Detta kan inte ångras.", + + // "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure", + // TODO New key - Add a translation + "submission.sections.upload.delete.confirm.submit": "Ja", + + // "submission.sections.upload.delete.confirm.title": "Delete bitstream", + // TODO New key - Add a translation + "submission.sections.upload.delete.confirm.title": "Radera fil", + + // "submission.sections.upload.delete.submit": "Delete", + // TODO New key - Add a translation + "submission.sections.upload.delete.submit": "Radera", + + // "submission.sections.upload.download.title": "Download bitstream", + // TODO New key - Add a translation + "submission.sections.upload.download.title": "Ladda ner fil", + + // "submission.sections.upload.drop-message": "Drop files to attach them to the item", + // TODO New key - Add a translation + "submission.sections.upload.drop-message": "Släpp filer för att lägga till dem i posten", + + // "submission.sections.upload.edit.title": "Edit bitstream", + // TODO New key - Add a translation + "submission.sections.upload.edit.title": "Redigera fil", + + // "submission.sections.upload.form.access-condition-label": "Access condition type", + // TODO New key - Add a translation + "submission.sections.upload.form.access-condition-label": "Typ av villkor för åtkomst", + + // "submission.sections.upload.form.access-condition-hint": "Select an access condition to apply on the bitstream once the item is deposited", + // TODO New key - Add a translation + "submission.sections.upload.form.access-condition-hint": "Välj typ av villkor för åtkomst till filen när posten har sparats", + + // "submission.sections.upload.form.date-required": "Date is required.", + // TODO New key - Add a translation + "submission.sections.upload.form.date-required": "Datum krävs.", + + // "submission.sections.upload.form.date-required-from": "Grant access from date is required.", + // TODO New key - Add a translation + "submission.sections.upload.form.date-required-from": "Du måste ange från vilket datum den skall vara tillgänglig.", + + // "submission.sections.upload.form.date-required-until": "Grant access until date is required.", + // TODO New key - Add a translation + "submission.sections.upload.form.date-required-until": "Du måste ange till vilket datum den skall vara tillgänglig.", + + // "submission.sections.upload.form.from-label": "Grant access from", + // TODO New key - Add a translation + "submission.sections.upload.form.from-label": "Tillåt åtkomst från", + + // "submission.sections.upload.form.from-hint": "Select the date from which the related access condition is applied", + // TODO New key - Add a translation + "submission.sections.upload.form.from-hint": "Välj datum från när villkoren för åtkomst skall gälla", + + // "submission.sections.upload.form.from-placeholder": "From", + // TODO New key - Add a translation + "submission.sections.upload.form.from-placeholder": "Från", + + // "submission.sections.upload.form.group-label": "Group", + // TODO New key - Add a translation + "submission.sections.upload.form.group-label": "Grupp", + + // "submission.sections.upload.form.group-required": "Group is required.", + // TODO New key - Add a translation + "submission.sections.upload.form.group-required": "Du måste välja en grupp.", + + // "submission.sections.upload.form.until-label": "Grant access until", + // TODO New key - Add a translation + "submission.sections.upload.form.until-label": "Bevilja åtkomst till", + + // "submission.sections.upload.form.until-hint": "Select the date until which the related access condition is applied", + // TODO New key - Add a translation + "submission.sections.upload.form.until-hint": "Välj datum till när villkoren för åtkomst skall gälla", + + // "submission.sections.upload.form.until-placeholder": "Until", + // TODO New key - Add a translation + "submission.sections.upload.form.until-placeholder": "Till", + + // "submission.sections.upload.header.policy.default.nolist": "Uploaded files in the {{collectionName}} collection will be accessible according to the following group(s):", + // TODO New key - Add a translation + "submission.sections.upload.header.policy.default.nolist": "Uppladdade filer i samlingen {{collectionName}} kommer att vara åtkomliga för följande grupp(er):", + + // "submission.sections.upload.header.policy.default.withlist": "Please note that uploaded files in the {{collectionName}} collection will be accessible, in addition to what is explicitly decided for the single file, with the following group(s):", + // TODO New key - Add a translation + "submission.sections.upload.header.policy.default.withlist": "Notera att uppladdade filer i samlingen {{collectionName}} också kommer att vara åtkompliga för följande grupp(er):", + + // "submission.sections.upload.info": "Here you will find all the files currently in the item. You can update the file metadata and access conditions or upload additional files just dragging & dropping them everywhere in the page", + // TODO New key - Add a translation + "submission.sections.upload.info": "Här visas samtliga filer som ingår i posten. Du kan uppdatera filernas metadata och villkor för åtkomst, samt ladda upp nya filer genom att dra och släppa dem här", + + // "submission.sections.upload.no-entry": "No", + // TODO New key - Add a translation + "submission.sections.upload.no-entry": "Nej", + + // "submission.sections.upload.no-file-uploaded": "No file uploaded yet.", + // TODO New key - Add a translation + "submission.sections.upload.no-file-uploaded": "Inga filer har laddats upp.", + + // "submission.sections.upload.save-metadata": "Save metadata", + // TODO New key - Add a translation + "submission.sections.upload.save-metadata": "Spara metadata", + + // "submission.sections.upload.undo": "Cancel", + // TODO New key - Add a translation + "submission.sections.upload.undo": "Avbryt", + + // "submission.sections.upload.upload-failed": "Upload failed", + // TODO New key - Add a translation + "submission.sections.upload.upload-failed": "Uppladdningen misslyckades", + + // "submission.sections.upload.upload-successful": "Upload successful", + // TODO New key - Add a translation + "submission.sections.upload.upload-successful": "Uppladdningen lyckades", + + // "submission.sections.accesses.form.discoverable-description": "When checked, this item will be discoverable in search/browse. When unchecked, the item will only be available via a direct link and will never appear in search/browse.", + // TODO New key - Add a translation + "submission.sections.accesses.form.discoverable-description": "När denna är markerad kommer posten att vara sökbar och visas i listor. I annat fall så kommer den bara att kunna nås med en direktlänk.", + + // "submission.sections.accesses.form.discoverable-label": "Discoverable", + // TODO New key - Add a translation + "submission.sections.accesses.form.discoverable-label": "Synlig och sökbar", + + // "submission.sections.accesses.form.access-condition-label": "Access condition type", + // TODO New key - Add a translation + "submission.sections.accesses.form.access-condition-label": "Typ av villkor för åtkomst", + + // "submission.sections.accesses.form.access-condition-hint": "Select an access condition to apply on the item once it is deposited", + // TODO New key - Add a translation + "submission.sections.accesses.form.access-condition-hint": "Välj typ av åtkomst som skall gälla när posten har deponerats", + + // "submission.sections.accesses.form.date-required": "Date is required.", + // TODO New key - Add a translation + "submission.sections.accesses.form.date-required": "Du måste ange datum.", + + // "submission.sections.accesses.form.date-required-from": "Grant access from date is required.", + // TODO New key - Add a translation + "submission.sections.accesses.form.date-required-from": "Du måste ange datum från när villkoren skall gälla.", + + // "submission.sections.accesses.form.date-required-until": "Grant access until date is required.", + // TODO New key - Add a translation + "submission.sections.accesses.form.date-required-until": "Du måste ange datum till när villkoren skall gälla.", + + // "submission.sections.accesses.form.from-label": "Grant access from", + // TODO New key - Add a translation + "submission.sections.accesses.form.from-label": "Bevilja åtkomst från", + + // "submission.sections.accesses.form.from-hint": "Select the date from which the related access condition is applied", + // TODO New key - Add a translation + "submission.sections.accesses.form.from-hint": "Välj datum från när villkoren för åtkomst skall gälla", + + // "submission.sections.accesses.form.from-placeholder": "From", + // TODO New key - Add a translation + "submission.sections.accesses.form.from-placeholder": "Från", + + // "submission.sections.accesses.form.group-label": "Group", + // TODO New key - Add a translation + "submission.sections.accesses.form.group-label": "Grupp", + + // "submission.sections.accesses.form.group-required": "Group is required.", + // TODO New key - Add a translation + "submission.sections.accesses.form.group-required": "Du måste välja grupp.", + + // "submission.sections.accesses.form.until-label": "Grant access until", + // TODO New key - Add a translation + "submission.sections.accesses.form.until-label": "Bevilja åtkomst till", + + // "submission.sections.accesses.form.until-hint": "Select the date until which the related access condition is applied", + // TODO New key - Add a translation + "submission.sections.accesses.form.until-hint": "Välj datum till när villkoren för åtkomst skall gälla", + + // "submission.sections.accesses.form.until-placeholder": "Until", + // TODO New key - Add a translation + "submission.sections.accesses.form.until-placeholder": "Till", + + + // "submission.submit.breadcrumbs": "New submission", + // TODO New key - Add a translation + "submission.submit.breadcrumbs": "Nytt bidrag", + + // "submission.submit.title": "New submission", + // TODO New key - Add a translation + "submission.submit.title": "Nytt bidrag", + + + + // "submission.workflow.generic.delete": "Delete", + // TODO New key - Add a translation + "submission.workflow.generic.delete": "Radera", + + // "submission.workflow.generic.delete-help": "If you would to discard this item, select \"Delete\". You will then be asked to confirm it.", + // TODO New key - Add a translation + "submission.workflow.generic.delete-help": "Välj \"Radera\" om du vill ta bort detta bidrag. Du kommer att få bekräfta detta.", + + // "submission.workflow.generic.edit": "Edit", + // TODO New key - Add a translation + "submission.workflow.generic.edit": "Redigera", + + // "submission.workflow.generic.edit-help": "Select this option to change the item's metadata.", + // TODO New key - Add a translation + "submission.workflow.generic.edit-help": "Redigera postens metadata.", + + // "submission.workflow.generic.view": "View", + // TODO New key - Add a translation + "submission.workflow.generic.view": "Visa", + + // "submission.workflow.generic.view-help": "Select this option to view the item's metadata.", + // TODO New key - Add a translation + "submission.workflow.generic.view-help": "Visa postens metadata.", + + + + // "submission.workflow.tasks.claimed.approve": "Approve", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.approve": "Godkänn", + + // "submission.workflow.tasks.claimed.approve_help": "If you have reviewed the item and it is suitable for inclusion in the collection, select \"Approve\".", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.approve_help": "Om du har granskat posten och funnit att den kan ingå i samlingen, välj \"Godkänn\".", + + // "submission.workflow.tasks.claimed.edit": "Edit", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.edit": "Redigera", + + // "submission.workflow.tasks.claimed.edit_help": "Select this option to change the item's metadata.", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.edit_help": "Redigera postens metadata.", + + // "submission.workflow.tasks.claimed.reject.reason.info": "Please enter your reason for rejecting the submission into the box below, indicating whether the submitter may fix a problem and resubmit.", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject.reason.info": "Ange orsaken till att du inte godkänner bidraget i rutan nedan, samt om uppladdaren skall ändra något och skicka in igen.", + + // "submission.workflow.tasks.claimed.reject.reason.placeholder": "Describe the reason of reject", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject.reason.placeholder": "Beskriv orsak", + + // "submission.workflow.tasks.claimed.reject.reason.submit": "Reject item", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject.reason.submit": "Godkänn inte bidrag", + + // "submission.workflow.tasks.claimed.reject.reason.title": "Reason", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject.reason.title": "Orsak", + + // "submission.workflow.tasks.claimed.reject.submit": "Reject", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject.submit": "Neka", + + // "submission.workflow.tasks.claimed.reject_help": "If you have reviewed the item and found it is not suitable for inclusion in the collection, select \"Reject\". You will then be asked to enter a message indicating why the item is unsuitable, and whether the submitter should change something and resubmit.", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.reject_help": "Om du har granskat posten och funnit att den inte uppfyller villkoren för att ingå i samlingen, välj \"Neka\". Du kommer du att få ange orsaken till detta, samt om uppladdaren skall ändra något och försöka igen.", + + // "submission.workflow.tasks.claimed.return": "Return to pool", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.return": "Returnera till uppladdningspoolen", + + // "submission.workflow.tasks.claimed.return_help": "Return the task to the pool so that another user may perform the task.", + // TODO New key - Add a translation + "submission.workflow.tasks.claimed.return_help": "Returnera till uppladdningspoolen så att den blir tillgänglig för andra användare.", + + + + // "submission.workflow.tasks.generic.error": "Error occurred during operation...", + // TODO New key - Add a translation + "submission.workflow.tasks.generic.error": "Ett fel har uppstått...", + + // "submission.workflow.tasks.generic.processing": "Processing...", + // TODO New key - Add a translation + "submission.workflow.tasks.generic.processing": "Bearbetar...", + + // "submission.workflow.tasks.generic.submitter": "Submitter", + // TODO New key - Add a translation + "submission.workflow.tasks.generic.submitter": "Uppladdare", + + // "submission.workflow.tasks.generic.success": "Operation successful", + // TODO New key - Add a translation + "submission.workflow.tasks.generic.success": "Operationen lyckades", + + + + // "submission.workflow.tasks.pool.claim": "Claim", + // TODO New key - Add a translation + "submission.workflow.tasks.pool.claim": "Claim", + + // "submission.workflow.tasks.pool.claim_help": "Assign this task to yourself.", + // TODO New key - Add a translation + "submission.workflow.tasks.pool.claim_help": "Ta denna uppgift själv.", + + // "submission.workflow.tasks.pool.hide-detail": "Hide detail", + // TODO New key - Add a translation + "submission.workflow.tasks.pool.hide-detail": "Göm detaljvy", + + // "submission.workflow.tasks.pool.show-detail": "Show detail", + // TODO New key - Add a translation + "submission.workflow.tasks.pool.show-detail": "Visa detaljvy", + + + + // "thumbnail.default.alt": "Thumbnail Image", + // TODO New key - Add a translation + "thumbnail.default.alt": "Bild (thumbnail)", + + // "thumbnail.default.placeholder": "No Thumbnail Available", + // TODO New key - Add a translation + "thumbnail.default.placeholder": "Bild saknas", + + // "thumbnail.project.alt": "Project Logo", + // TODO New key - Add a translation + "thumbnail.project.alt": "Projekt logotyp", + + // "thumbnail.project.placeholder": "Project Placeholder Image", + // TODO New key - Add a translation + "thumbnail.project.placeholder": "Projekt bild (platshållare)", + + // "thumbnail.orgunit.alt": "OrgUnit Logo", + // TODO New key - Add a translation + "thumbnail.orgunit.alt": "Organisationens logotyp", + + // "thumbnail.orgunit.placeholder": "OrgUnit Placeholder Image", + // TODO New key - Add a translation + "thumbnail.orgunit.placeholder": "Organisationens bild (platshållare)", + + // "thumbnail.person.alt": "Profile Picture", + // TODO New key - Add a translation + "thumbnail.person.alt": "Profilbild", + + // "thumbnail.person.placeholder": "No Profile Picture Available", + // TODO New key - Add a translation + "thumbnail.person.placeholder": "Profilbild saknas", + + + + // "title": "DSpace", + // TODO New key - Add a translation + "title": "DSpace", + + + + // "vocabulary-treeview.header": "Hierarchical tree view", + // TODO New key - Add a translation + "vocabulary-treeview.header": "Hierarkisk trädvy", + + // "vocabulary-treeview.load-more": "Load more", + // TODO New key - Add a translation + "vocabulary-treeview.load-more": "Ladda fler", + + // "vocabulary-treeview.search.form.reset": "Reset", + // TODO New key - Add a translation + "vocabulary-treeview.search.form.reset": "Återställ", + + // "vocabulary-treeview.search.form.search": "Search", + // TODO New key - Add a translation + "vocabulary-treeview.search.form.search": "Sök", + + // "vocabulary-treeview.search.no-result": "There were no items to show", + // TODO New key - Add a translation + "vocabulary-treeview.search.no-result": "Det finns inga poster att visa", + + // "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", + // TODO New key - Add a translation + "vocabulary-treeview.tree.description.nsi": "The Norwegian Science Index", + + // "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", + // TODO New key - Add a translation + "vocabulary-treeview.tree.description.srsc": "Research Subject Categories", + + + + // "uploader.browse": "browse", + // TODO New key - Add a translation + "uploader.browse": "sök efter filen på din dator", + + // "uploader.drag-message": "Drag & Drop your files here", + // TODO New key - Add a translation + "uploader.drag-message": "Dra och släpp filerna här", + + // "uploader.delete.btn-title": "Delete", + // TODO New key - Add a translation + "uploader.delete.btn-title": "Radera", + + // "uploader.or": ", or ", + // TODO New key - Add a translation + "uploader.or": ", eller ", + + // "uploader.processing": "Processing", + // TODO New key - Add a translation + "uploader.processing": "Bearbetar", + + // "uploader.queue-length": "Queue length", + // TODO New key - Add a translation + "uploader.queue-length": "Kölängd", + + // "virtual-metadata.delete-item.info": "Select the types for which you want to save the virtual metadata as real metadata", + // TODO New key - Add a translation + "virtual-metadata.delete-item.info": "Välj vilka typer ", + + // "virtual-metadata.delete-item.modal-head": "The virtual metadata of this relation", + // TODO New key - Add a translation + "virtual-metadata.delete-item.modal-head": "Denna relations virtuella metadata", + + // "virtual-metadata.delete-relationship.modal-head": "Select the items for which you want to save the virtual metadata as real metadata", + // TODO New key - Add a translation + "virtual-metadata.delete-relationship.modal-head": "Välj poster som dessa metadata skall sparas för", + + + + // "workspace.search.results.head": "Your submissions", + // TODO New key - Add a translation + "workspace.search.results.head": "Dina registreringar", + + // "workflowAdmin.search.results.head": "Administer Workflow", + // TODO New key - Add a translation + "workflowAdmin.search.results.head": "Administrera arbetsflöde", + + // "workflow.search.results.head": "Workflow tasks", + // TODO New key - Add a translation + "workflow.search.results.head": "Uppgifter", + + + + // "workflow-item.edit.breadcrumbs": "Edit workflowitem", + // TODO New key - Add a translation + "workflow-item.edit.breadcrumbs": "Redigera post i arbetsflöde", + + // "workflow-item.edit.title": "Edit workflowitem", + // TODO New key - Add a translation + "workflow-item.edit.title": "Redigera post i arbetsflöde", + + // "workflow-item.delete.notification.success.title": "Deleted", + // TODO New key - Add a translation + "workflow-item.delete.notification.success.title": "Raderad", + + // "workflow-item.delete.notification.success.content": "This workflow item was successfully deleted", + // TODO New key - Add a translation + "workflow-item.delete.notification.success.content": "Posten har raderats", + + // "workflow-item.delete.notification.error.title": "Something went wrong", + // TODO New key - Add a translation + "workflow-item.delete.notification.error.title": "Något gick fel", + + // "workflow-item.delete.notification.error.content": "The workflow item could not be deleted", + // TODO New key - Add a translation + "workflow-item.delete.notification.error.content": "Posten kunde inte raderas", + + // "workflow-item.delete.title": "Delete workflow item", + // TODO New key - Add a translation + "workflow-item.delete.title": "Radera post i arbetsflöde", + + // "workflow-item.delete.header": "Delete workflow item", + // TODO New key - Add a translation + "workflow-item.delete.header": "Radera post i arbetsflöde", + + // "workflow-item.delete.button.cancel": "Cancel", + // TODO New key - Add a translation + "workflow-item.delete.button.cancel": "Avbryt", + + // "workflow-item.delete.button.confirm": "Delete", + // TODO New key - Add a translation + "workflow-item.delete.button.confirm": "Radera", + + + // "workflow-item.send-back.notification.success.title": "Sent back to submitter", + // TODO New key - Add a translation + "workflow-item.send-back.notification.success.title": "Skicka tillbaka till uppladdare", + + // "workflow-item.send-back.notification.success.content": "This workflow item was successfully sent back to the submitter", + // TODO New key - Add a translation + "workflow-item.send-back.notification.success.content": "Posten i arbetsflödet har skickats tillbaka till uppladdaren", + + // "workflow-item.send-back.notification.error.title": "Something went wrong", + // TODO New key - Add a translation + "workflow-item.send-back.notification.error.title": "Något gick fel", + + // "workflow-item.send-back.notification.error.content": "The workflow item could not be sent back to the submitter", + // TODO New key - Add a translation + "workflow-item.send-back.notification.error.content": "Posten i arbetsflödet kunde inte skickas tillbaka", + + // "workflow-item.send-back.title": "Send workflow item back to submitter", + // TODO New key - Add a translation + "workflow-item.send-back.title": "Skicka tillbaka post i arbetsflödet till uppladdare", + + // "workflow-item.send-back.header": "Send workflow item back to submitter", + // TODO New key - Add a translation + "workflow-item.send-back.header": "Skicka tillbaka post i arbetsflödet till uppladdare", + + // "workflow-item.send-back.button.cancel": "Cancel", + // TODO New key - Add a translation + "workflow-item.send-back.button.cancel": "Avbryt", + + // "workflow-item.send-back.button.confirm": "Send back", + // TODO New key - Add a translation + "workflow-item.send-back.button.confirm": "Skicka tillbaka", + + // "workflow-item.view.breadcrumbs": "Workflow View", + // TODO New key - Add a translation + "workflow-item.view.breadcrumbs": "Arbetsflöde", + + + // "idle-modal.header": "Session will expire soon", + // TODO New key - Add a translation + "idle-modal.header": "Sessionen kommer att upphöra snart", + + // "idle-modal.info": "For security reasons, user sessions expire after {{ timeToExpire }} minutes of inactivity. Your session will expire soon. Would you like to extend it or log out?", + // TODO New key - Add a translation + "idle-modal.info": "Sessionen kommer att upphöra efter {{ timeToExpire }} minuters inaktivitet. Vill du fortsätta eller logga ut?", + + // "idle-modal.log-out": "Log out", + // TODO New key - Add a translation + "idle-modal.log-out": "Logga ut", + + // "idle-modal.extend-session": "Extend session" + // TODO New key - Add a translation + "idle-modal.extend-session": "Fortsätt" + +} From cb4620e536cd448d26b88891ec6abeb88622f608 Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Wed, 24 Aug 2022 10:42:37 -0500 Subject: [PATCH 050/119] Enable Swedish language --- config/config.example.yml | 3 +++ src/config/default-app-config.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/config/config.example.yml b/config/config.example.yml index 9e1fcc8d1e..ae733e0be5 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -150,6 +150,9 @@ languages: - code: fi label: Suomi active: true + - code: sv + label: Svenska + active: true - code: tr label: Türkçe active: true diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index 11761af49a..d2d0608a03 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -193,6 +193,7 @@ export class DefaultAppConfig implements AppConfig { { code: 'pt-PT', label: 'Português', active: true }, { code: 'pt-BR', label: 'Português do Brasil', active: true }, { code: 'fi', label: 'Suomi', active: true }, + { code: 'sv', label: 'Svenska', active: true }, { code: 'tr', label: 'Türkçe', active: true }, { code: 'bn', label: 'বাংলা', active: true } ]; From 8f4b3b58fba9fa228e708543d8fe63e835f35cd7 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Wed, 24 Aug 2022 12:54:27 +0200 Subject: [PATCH 051/119] 93803: Make data services composable Data services should extend BaseDataService (or IdentifiableDataService) for low-level functionality and optionally wrap "data service feature" classes for - create - findAll - patch / update - put - delete --- .../core/data/base/base-data.service.spec.ts | 627 ++++++++++++++++++ src/app/core/data/base/base-data.service.ts | 373 +++++++++++ src/app/core/data/base/create-data.spec.ts | 112 ++++ src/app/core/data/base/create-data.ts | 107 +++ src/app/core/data/base/delete-data.spec.ts | 208 ++++++ src/app/core/data/base/delete-data.ts | 108 +++ src/app/core/data/base/find-all-data.spec.ts | 306 +++++++++ src/app/core/data/base/find-all-data.ts | 112 ++++ .../base/identifiable-data.service.spec.ts | 145 ++++ .../data/base/identifiable-data.service.ts | 83 +++ src/app/core/data/base/patch-data.spec.ts | 180 +++++ src/app/core/data/base/patch-data.ts | 143 ++++ src/app/core/data/base/put-data.spec.ts | 108 +++ src/app/core/data/base/put-data.ts | 69 ++ src/app/core/data/base/search-data.spec.ts | 146 ++++ src/app/core/data/base/search-data.ts | 145 ++++ 16 files changed, 2972 insertions(+) create mode 100644 src/app/core/data/base/base-data.service.spec.ts create mode 100644 src/app/core/data/base/base-data.service.ts create mode 100644 src/app/core/data/base/create-data.spec.ts create mode 100644 src/app/core/data/base/create-data.ts create mode 100644 src/app/core/data/base/delete-data.spec.ts create mode 100644 src/app/core/data/base/delete-data.ts create mode 100644 src/app/core/data/base/find-all-data.spec.ts create mode 100644 src/app/core/data/base/find-all-data.ts create mode 100644 src/app/core/data/base/identifiable-data.service.spec.ts create mode 100644 src/app/core/data/base/identifiable-data.service.ts create mode 100644 src/app/core/data/base/patch-data.spec.ts create mode 100644 src/app/core/data/base/patch-data.ts create mode 100644 src/app/core/data/base/put-data.spec.ts create mode 100644 src/app/core/data/base/put-data.ts create mode 100644 src/app/core/data/base/search-data.spec.ts create mode 100644 src/app/core/data/base/search-data.ts diff --git a/src/app/core/data/base/base-data.service.spec.ts b/src/app/core/data/base/base-data.service.spec.ts new file mode 100644 index 0000000000..973b9d5095 --- /dev/null +++ b/src/app/core/data/base/base-data.service.spec.ts @@ -0,0 +1,627 @@ +/** + * 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 { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { FindListOptions } from '../find-list-options.model'; +import { Observable, of as observableOf } from 'rxjs'; +import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; +import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; +import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { TestScheduler } from 'rxjs/testing'; +import { RemoteData } from '../remote-data'; +import { RequestEntryState } from '../request-entry-state.model'; +import { fakeAsync, tick } from '@angular/core/testing'; +import { BaseDataService } from './base-data.service'; + +const endpoint = 'https://rest.api/core'; + +const BOOLEAN = { f: false, t: true }; + +class TestService extends BaseDataService { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + ) { + super(undefined, requestService, rdbService, objectCache, halService); + } + + public getBrowseEndpoint(options: FindListOptions = {}, linkPath: string = this.linkPath): Observable { + return observableOf(endpoint); + } +} + +describe('BaseDataService', () => { + let service: TestService; + let requestService; + let halService; + let rdbService; + let objectCache; + let selfLink; + let linksToFollow; + let testScheduler; + let remoteDataMocks; + + function initTestService(): TestService { + requestService = getMockRequestService(); + halService = new HALEndpointServiceStub('url') as any; + rdbService = getMockRemoteDataBuildService(); + objectCache = { + + addPatch: () => { + /* empty */ + }, + getObjectBySelfLink: () => { + /* empty */ + }, + getByHref: () => { + /* empty */ + } + } as any; + selfLink = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; + linksToFollow = [ + followLink('a'), + followLink('b') + ]; + + testScheduler = new TestScheduler((actual, expected) => { + // asserting the two objects are equal + // e.g. using chai. + expect(actual).toEqual(expected); + }); + + const timeStamp = new Date().getTime(); + const msToLive = 15 * 60 * 1000; + const payload = { foo: 'bar' }; + const statusCodeSuccess = 200; + const statusCodeError = 404; + const errorMessage = 'not found'; + remoteDataMocks = { + RequestPending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.RequestPending, undefined, undefined, undefined), + ResponsePending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.ResponsePending, undefined, undefined, undefined), + Success: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Success, undefined, payload, statusCodeSuccess), + SuccessStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.SuccessStale, undefined, payload, statusCodeSuccess), + Error: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Error, errorMessage, undefined, statusCodeError), + ErrorStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.ErrorStale, errorMessage, undefined, statusCodeError), + }; + + return new TestService( + requestService, + rdbService, + objectCache, + halService, + ); + } + + beforeEach(() => { + service = initTestService(); + }); + + describe(`reRequestStaleRemoteData`, () => { + let callback: jasmine.Spy; + + beforeEach(() => { + callback = jasmine.createSpy(); + }); + + + describe(`when shouldReRequest is false`, () => { + it(`shouldn't do anything`, () => { + testScheduler.run(({ cold, expectObservable, flush }) => { + const expected = 'a-b-c-d-e-f'; + const values = { + a: remoteDataMocks.RequestPending, + b: remoteDataMocks.ResponsePending, + c: remoteDataMocks.Success, + d: remoteDataMocks.SuccessStale, + e: remoteDataMocks.Error, + f: remoteDataMocks.ErrorStale, + }; + + expectObservable((service as any).reRequestStaleRemoteData(false, callback)(cold(expected, values))).toBe(expected, values); + // since the callback happens in a tap(), flush to ensure it has been executed + flush(); + expect(callback).not.toHaveBeenCalled(); + }); + }); + }); + + describe(`when shouldReRequest is true`, () => { + it(`should call the callback for stale RemoteData objects, but still pass the source observable unmodified`, () => { + testScheduler.run(({ cold, expectObservable, flush }) => { + const expected = 'a-b'; + const values = { + a: remoteDataMocks.SuccessStale, + b: remoteDataMocks.ErrorStale, + }; + + expectObservable((service as any).reRequestStaleRemoteData(true, callback)(cold(expected, values))).toBe(expected, values); + // since the callback happens in a tap(), flush to ensure it has been executed + flush(); + expect(callback).toHaveBeenCalledTimes(2); + }); + }); + + it(`should only call the callback for stale RemoteData objects if something is subscribed to it`, (done) => { + testScheduler.run(({ cold, expectObservable }) => { + const expected = 'a'; + const values = { + a: remoteDataMocks.SuccessStale, + }; + + const result$ = (service as any).reRequestStaleRemoteData(true, callback)(cold(expected, values)); + expectObservable(result$).toBe(expected, values); + expect(callback).not.toHaveBeenCalled(); + result$.subscribe(() => { + expect(callback).toHaveBeenCalled(); + done(); + }); + }); + }); + + it(`shouldn't do anything for RemoteData objects that aren't stale`, () => { + testScheduler.run(({ cold, expectObservable, flush }) => { + const expected = 'a-b-c-d'; + const values = { + a: remoteDataMocks.RequestPending, + b: remoteDataMocks.ResponsePending, + c: remoteDataMocks.Success, + d: remoteDataMocks.Error, + }; + + expectObservable((service as any).reRequestStaleRemoteData(true, callback)(cold(expected, values))).toBe(expected, values); + // since the callback happens in a tap(), flush to ensure it has been executed + flush(); + expect(callback).not.toHaveBeenCalled(); + }); + }); + }); + + }); + + describe(`findByHref`, () => { + beforeEach(() => { + spyOn(service as any, 'createAndSendGetRequest').and.callFake((href$) => { href$.subscribe().unsubscribe(); }); + }); + + it(`should call buildHrefFromFindOptions with href and linksToFollow`, () => { + testScheduler.run(({ cold }) => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue(selfLink); + spyOn(rdbService, 'buildSingle').and.returnValue(cold('a', { a: remoteDataMocks.Success })); + spyOn(service as any, 'reRequestStaleRemoteData').and.returnValue(() => cold('a', { a: remoteDataMocks.Success })); + + service.findByHref(selfLink, true, true, ...linksToFollow); + expect(service.buildHrefFromFindOptions).toHaveBeenCalledWith(selfLink, {}, [], ...linksToFollow); + }); + }); + + it(`should call createAndSendGetRequest with the result from buildHrefFromFindOptions and useCachedVersionIfAvailable`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue('bingo!'); + spyOn(rdbService, 'buildSingle').and.returnValue(cold('a', { a: remoteDataMocks.Success })); + spyOn(service as any, 'reRequestStaleRemoteData').and.returnValue(() => cold('a', { a: remoteDataMocks.Success })); + + service.findByHref(selfLink, true, true, ...linksToFollow); + expect((service as any).createAndSendGetRequest).toHaveBeenCalledWith(jasmine.anything(), true); + expectObservable(rdbService.buildSingle.calls.argsFor(0)[0]).toBe('(a|)', { a: 'bingo!' }); + + service.findByHref(selfLink, false, true, ...linksToFollow); + expect((service as any).createAndSendGetRequest).toHaveBeenCalledWith(jasmine.anything(), false); + expectObservable(rdbService.buildSingle.calls.argsFor(1)[0]).toBe('(a|)', { a: 'bingo!' }); + }); + }); + + it(`should call rdbService.buildSingle with the result from buildHrefFromFindOptions and linksToFollow`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue('bingo!'); + spyOn(rdbService, 'buildSingle').and.returnValue(cold('a', { a: remoteDataMocks.Success })); + spyOn(service as any, 'reRequestStaleRemoteData').and.returnValue(() => cold('a', { a: remoteDataMocks.Success })); + + service.findByHref(selfLink, true, true, ...linksToFollow); + expect(rdbService.buildSingle).toHaveBeenCalledWith(jasmine.anything() as any, ...linksToFollow); + expectObservable(rdbService.buildSingle.calls.argsFor(0)[0]).toBe('(a|)', { a: 'bingo!' }); + }); + }); + + it(`should return a the output from reRequestStaleRemoteData`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue(selfLink); + spyOn(rdbService, 'buildSingle').and.returnValue(cold('a', { a: remoteDataMocks.Success })); + spyOn(service as any, 'reRequestStaleRemoteData').and.returnValue(() => cold('a', { a: 'bingo!' })); + const expected = 'a'; + const values = { + a: 'bingo!', + }; + + expectObservable(service.findByHref(selfLink, true, true, ...linksToFollow)).toBe(expected, values); + }); + }); + + it(`should call reRequestStaleRemoteData with reRequestOnStale and the exact same findByHref call as a callback`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue(selfLink); + spyOn(rdbService, 'buildSingle').and.returnValue(cold('a', { a: remoteDataMocks.SuccessStale })); + spyOn(service as any, 'reRequestStaleRemoteData').and.returnValue(() => cold('a', { a: remoteDataMocks.SuccessStale })); + + service.findByHref(selfLink, true, true, ...linksToFollow); + expect((service as any).reRequestStaleRemoteData.calls.argsFor(0)[0]).toBeTrue(); + spyOn(service, 'findByHref').and.returnValue(cold('a', { a: remoteDataMocks.SuccessStale })); + // prove that the spy we just added hasn't been called yet + expect(service.findByHref).not.toHaveBeenCalled(); + // call the callback passed to reRequestStaleRemoteData + (service as any).reRequestStaleRemoteData.calls.argsFor(0)[1](); + // verify that findByHref _has_ been called now, with the same params as the original call + expect(service.findByHref).toHaveBeenCalledWith(jasmine.anything(), true, true, ...linksToFollow); + // ... except for selflink, which will have been turned in to an observable. + expectObservable((service.findByHref as jasmine.Spy).calls.argsFor(0)[0]).toBe('(a|)', { a: selfLink }); + }); + }); + + describe(`when useCachedVersionIfAvailable is true`, () => { + beforeEach(() => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue(selfLink); + spyOn(service as any, 'reRequestStaleRemoteData').and.callFake(() => (source) => source); + }); + + it(`should emit a cached completed RemoteData immediately, and keep emitting if it gets rerequested`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(rdbService, 'buildSingle').and.returnValue(cold('a-b-c-d-e', { + a: remoteDataMocks.Success, + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + })); + const expected = 'a-b-c-d-e'; + const values = { + a: remoteDataMocks.Success, + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + }; + + expectObservable(service.findByHref(selfLink, true, true, ...linksToFollow)).toBe(expected, values); + }); + }); + + it(`should not emit a cached stale RemoteData, but only start emitting after the state first changes to RequestPending`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(rdbService, 'buildSingle').and.returnValue(cold('a-b-c-d-e', { + a: remoteDataMocks.SuccessStale, + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + })); + const expected = '--b-c-d-e'; + const values = { + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + }; + + expectObservable(service.findByHref(selfLink, true, true, ...linksToFollow)).toBe(expected, values); + }); + }); + + }); + + describe(`when useCachedVersionIfAvailable is false`, () => { + beforeEach(() => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue(selfLink); + spyOn(service as any, 'reRequestStaleRemoteData').and.callFake(() => (source) => source); + }); + + + it(`should not emit a cached completed RemoteData, but only start emitting after the state first changes to RequestPending`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(rdbService, 'buildSingle').and.returnValue(cold('a-b-c-d-e', { + a: remoteDataMocks.Success, + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + })); + const expected = '--b-c-d-e'; + const values = { + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + }; + + expectObservable(service.findByHref(selfLink, false, true, ...linksToFollow)).toBe(expected, values); + }); + }); + + it(`should not emit a cached stale RemoteData, but only start emitting after the state first changes to RequestPending`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(rdbService, 'buildSingle').and.returnValue(cold('a-b-c-d-e', { + a: remoteDataMocks.SuccessStale, + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + })); + const expected = '--b-c-d-e'; + const values = { + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + }; + + expectObservable(service.findByHref(selfLink, false, true, ...linksToFollow)).toBe(expected, values); + }); + }); + + }); + + }); + + describe(`findAllByHref`, () => { + let findListOptions; + beforeEach(() => { + findListOptions = { currentPage: 5 }; + spyOn(service as any, 'createAndSendGetRequest').and.callFake((href$) => { href$.subscribe().unsubscribe(); }); + }); + + it(`should call buildHrefFromFindOptions with href and linksToFollow`, () => { + testScheduler.run(({ cold }) => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue(selfLink); + spyOn(rdbService, 'buildList').and.returnValue(cold('a', { a: remoteDataMocks.Success })); + spyOn(service as any, 'reRequestStaleRemoteData').and.returnValue(() => cold('a', { a: remoteDataMocks.Success })); + + service.findAllByHref(selfLink, findListOptions, true, true, ...linksToFollow); + expect(service.buildHrefFromFindOptions).toHaveBeenCalledWith(selfLink, findListOptions, [], ...linksToFollow); + }); + }); + + it(`should call createAndSendGetRequest with the result from buildHrefFromFindOptions and useCachedVersionIfAvailable`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue('bingo!'); + spyOn(rdbService, 'buildList').and.returnValue(cold('a', { a: remoteDataMocks.Success })); + spyOn(service as any, 'reRequestStaleRemoteData').and.returnValue(() => cold('a', { a: remoteDataMocks.Success })); + + service.findAllByHref(selfLink, findListOptions, true, true, ...linksToFollow); + expect((service as any).createAndSendGetRequest).toHaveBeenCalledWith(jasmine.anything(), true); + expectObservable(rdbService.buildList.calls.argsFor(0)[0]).toBe('(a|)', { a: 'bingo!' }); + + service.findAllByHref(selfLink, findListOptions, false, true, ...linksToFollow); + expect((service as any).createAndSendGetRequest).toHaveBeenCalledWith(jasmine.anything(), false); + expectObservable(rdbService.buildList.calls.argsFor(1)[0]).toBe('(a|)', { a: 'bingo!' }); + }); + }); + + it(`should call rdbService.buildList with the result from buildHrefFromFindOptions and linksToFollow`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue('bingo!'); + spyOn(rdbService, 'buildList').and.returnValue(cold('a', { a: remoteDataMocks.Success })); + spyOn(service as any, 'reRequestStaleRemoteData').and.returnValue(() => cold('a', { a: remoteDataMocks.Success })); + + service.findAllByHref(selfLink, findListOptions, true, true, ...linksToFollow); + expect(rdbService.buildList).toHaveBeenCalledWith(jasmine.anything() as any, ...linksToFollow); + expectObservable(rdbService.buildList.calls.argsFor(0)[0]).toBe('(a|)', { a: 'bingo!' }); + }); + }); + + it(`should call reRequestStaleRemoteData with reRequestOnStale and the exact same findAllByHref call as a callback`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue('bingo!'); + spyOn(rdbService, 'buildList').and.returnValue(cold('a', { a: remoteDataMocks.SuccessStale })); + spyOn(service as any, 'reRequestStaleRemoteData').and.returnValue(() => cold('a', { a: remoteDataMocks.SuccessStale })); + + service.findAllByHref(selfLink, findListOptions, true, true, ...linksToFollow); + expect((service as any).reRequestStaleRemoteData.calls.argsFor(0)[0]).toBeTrue(); + spyOn(service, 'findAllByHref').and.returnValue(cold('a', { a: remoteDataMocks.SuccessStale })); + // prove that the spy we just added hasn't been called yet + expect(service.findAllByHref).not.toHaveBeenCalled(); + // call the callback passed to reRequestStaleRemoteData + (service as any).reRequestStaleRemoteData.calls.argsFor(0)[1](); + // verify that findAllByHref _has_ been called now, with the same params as the original call + expect(service.findAllByHref).toHaveBeenCalledWith(jasmine.anything(), findListOptions, true, true, ...linksToFollow); + // ... except for selflink, which will have been turned in to an observable. + expectObservable((service.findAllByHref as jasmine.Spy).calls.argsFor(0)[0]).toBe('(a|)', { a: selfLink }); + }); + }); + + it(`should return a the output from reRequestStaleRemoteData`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue(selfLink); + spyOn(rdbService, 'buildList').and.returnValue(cold('a', { a: remoteDataMocks.Success })); + spyOn(service as any, 'reRequestStaleRemoteData').and.returnValue(() => cold('a', { a: 'bingo!' })); + const expected = 'a'; + const values = { + a: 'bingo!', + }; + + expectObservable(service.findAllByHref(selfLink, findListOptions, true, true, ...linksToFollow)).toBe(expected, values); + }); + }); + + describe(`when useCachedVersionIfAvailable is true`, () => { + beforeEach(() => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue(selfLink); + spyOn(service as any, 'reRequestStaleRemoteData').and.callFake(() => (source) => source); + }); + + it(`should emit a cached completed RemoteData immediately, and keep emitting if it gets rerequested`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(rdbService, 'buildList').and.returnValue(cold('a-b-c-d-e', { + a: remoteDataMocks.Success, + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + })); + const expected = 'a-b-c-d-e'; + const values = { + a: remoteDataMocks.Success, + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + }; + + expectObservable(service.findAllByHref(selfLink, findListOptions, true, true, ...linksToFollow)).toBe(expected, values); + }); + }); + + it(`should not emit a cached stale RemoteData, but only start emitting after the state first changes to RequestPending`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(rdbService, 'buildList').and.returnValue(cold('a-b-c-d-e', { + a: remoteDataMocks.SuccessStale, + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + })); + const expected = '--b-c-d-e'; + const values = { + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + }; + + expectObservable(service.findAllByHref(selfLink, findListOptions, true, true, ...linksToFollow)).toBe(expected, values); + }); + }); + + }); + + describe(`when useCachedVersionIfAvailable is false`, () => { + beforeEach(() => { + spyOn(service, 'buildHrefFromFindOptions').and.returnValue(selfLink); + spyOn(service as any, 'reRequestStaleRemoteData').and.callFake(() => (source) => source); + }); + + + it(`should not emit a cached completed RemoteData, but only start emitting after the state first changes to RequestPending`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(rdbService, 'buildList').and.returnValue(cold('a-b-c-d-e', { + a: remoteDataMocks.Success, + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + })); + const expected = '--b-c-d-e'; + const values = { + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + }; + + expectObservable(service.findAllByHref(selfLink, findListOptions, false, true, ...linksToFollow)).toBe(expected, values); + }); + }); + + it(`should not emit a cached stale RemoteData, but only start emitting after the state first changes to RequestPending`, () => { + testScheduler.run(({ cold, expectObservable }) => { + spyOn(rdbService, 'buildList').and.returnValue(cold('a-b-c-d-e', { + a: remoteDataMocks.SuccessStale, + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + })); + const expected = '--b-c-d-e'; + const values = { + b: remoteDataMocks.RequestPending, + c: remoteDataMocks.ResponsePending, + d: remoteDataMocks.Success, + e: remoteDataMocks.SuccessStale, + }; + + expectObservable(service.findAllByHref(selfLink, findListOptions, false, true, ...linksToFollow)).toBe(expected, values); + }); + }); + + }); + }); + + describe('invalidateByHref', () => { + let getByHrefSpy: jasmine.Spy; + + beforeEach(() => { + getByHrefSpy = spyOn(objectCache, 'getByHref').and.returnValue(observableOf({ + requestUUIDs: ['request1', 'request2', 'request3'] + })); + + }); + + it('should call setStaleByUUID for every request associated with this DSO', (done) => { + service.invalidateByHref('some-href').subscribe((ok) => { + expect(ok).toBeTrue(); + expect(getByHrefSpy).toHaveBeenCalledWith('some-href'); + expect(requestService.setStaleByUUID).toHaveBeenCalledWith('request1'); + expect(requestService.setStaleByUUID).toHaveBeenCalledWith('request2'); + expect(requestService.setStaleByUUID).toHaveBeenCalledWith('request3'); + done(); + }); + }); + + it('should call setStaleByUUID even if not subscribing to returned Observable', fakeAsync(() => { + service.invalidateByHref('some-href'); + tick(); + + expect(getByHrefSpy).toHaveBeenCalledWith('some-href'); + expect(requestService.setStaleByUUID).toHaveBeenCalledWith('request1'); + expect(requestService.setStaleByUUID).toHaveBeenCalledWith('request2'); + expect(requestService.setStaleByUUID).toHaveBeenCalledWith('request3'); + })); + + it('should return an Observable that only emits true once all requests are stale', () => { + testScheduler.run(({ cold, expectObservable }) => { + requestService.setStaleByUUID.and.callFake((uuid) => { + switch (uuid) { // fake requests becoming stale at different times + case 'request1': + return cold('--(t|)', BOOLEAN); + case 'request2': + return cold('----(t|)', BOOLEAN); + case 'request3': + return cold('------(t|)', BOOLEAN); + } + }); + + const done$ = service.invalidateByHref('some-href'); + + // emit true as soon as the final request is stale + expectObservable(done$).toBe('------(t|)', BOOLEAN); + }); + }); + + it('should only fire for the current state of the object (instead of tracking it)', () => { + testScheduler.run(({ cold, flush }) => { + getByHrefSpy.and.returnValue(cold('a---b---c---', { + a: { requestUUIDs: ['request1'] }, // this is the state at the moment we're invalidating the cache + b: { requestUUIDs: ['request2'] }, // we shouldn't keep tracking the state + c: { requestUUIDs: ['request3'] }, // because we may invalidate when we shouldn't + })); + + service.invalidateByHref('some-href'); + flush(); + + // requests from the first state are marked as stale + expect(requestService.setStaleByUUID).toHaveBeenCalledWith('request1'); + + // request from subsequent states are ignored + expect(requestService.setStaleByUUID).not.toHaveBeenCalledWith('request2'); + expect(requestService.setStaleByUUID).not.toHaveBeenCalledWith('request3'); + }); + }); + }); +}); diff --git a/src/app/core/data/base/base-data.service.ts b/src/app/core/data/base/base-data.service.ts new file mode 100644 index 0000000000..9679bddf1b --- /dev/null +++ b/src/app/core/data/base/base-data.service.ts @@ -0,0 +1,373 @@ +/** + * 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 { AsyncSubject, from as observableFrom, Observable, of as observableOf } from 'rxjs'; +import { map, mergeMap, skipWhile, switchMap, take, tap, toArray } from 'rxjs/operators'; +import { hasValue, isNotEmpty, isNotEmptyOperator } from '../../../shared/empty.util'; +import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { RequestParam } from '../../cache/models/request-param.model'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { URLCombiner } from '../../url-combiner/url-combiner'; +import { RemoteData } from '../remote-data'; +import { GetRequest } from '../request.models'; +import { RequestService } from '../request.service'; +import { CacheableObject } from '../../cache/cacheable-object.model'; +import { FindListOptions } from '../find-list-options.model'; +import { PaginatedList } from '../paginated-list.model'; +import { ObjectCacheEntry } from '../../cache/object-cache.reducer'; +import { ObjectCacheService } from '../../cache/object-cache.service'; + +/** + * Common functionality for data services. + * Specific functionality that not all services would need + * is implemented in "DataService feature" classes (e.g. {@link CreateData} + * + * All DataService (or DataService feature) classes must + * - extend this class (or {@link IdentifiableDataService}) + * - implement any DataService features it requires in order to forward calls to it + * + * ``` + * export class SomeDataService extends BaseDataService implements CreateData, SearchData { + * private createData: CreateData; + * private searchData: SearchDataData; + * + * create(...) { + * return this.createData.create(...); + * } + * + * searchBy(...) { + * return this.searchData.searchBy(...); + * } + * } + * ``` + */ +export class BaseDataService { + constructor( + protected linkPath: string, + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected responseMsToLive?: number, + ) { + } + + /** + * Allows subclasses to reset the response cache time. + */ + + /** + * Get the endpoint for browsing + * @param options The [[FindListOptions]] object + * @param linkPath The link path for the object + * @returns {Observable} + */ + getBrowseEndpoint(options: FindListOptions = {}, linkPath?: string): Observable { + return this.getEndpoint(); + } + + /** + * Get the base endpoint for all requests + */ + protected getEndpoint(): Observable { + return this.halService.getEndpoint(this.linkPath); + } + + /** + * Turn an options object into a query string and combine it with the given HREF + * + * @param href The HREF to which the query string should be appended + * @param options The [[FindListOptions]] object + * @param extraArgs Array with additional params to combine with query string + * @return {Observable} + * Return an observable that emits created HREF + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + public buildHrefFromFindOptions(href: string, options: FindListOptions, extraArgs: string[] = [], ...linksToFollow: FollowLinkConfig[]): string { + let args = [...extraArgs]; + + if (hasValue(options.currentPage) && typeof options.currentPage === 'number') { + /* TODO: this is a temporary fix for the pagination start index (0 or 1) discrepancy between the rest and the frontend respectively */ + args = this.addHrefArg(href, args, `page=${options.currentPage - 1}`); + } + if (hasValue(options.elementsPerPage)) { + args = this.addHrefArg(href, args, `size=${options.elementsPerPage}`); + } + if (hasValue(options.sort)) { + args = this.addHrefArg(href, args, `sort=${options.sort.field},${options.sort.direction}`); + } + if (hasValue(options.startsWith)) { + args = this.addHrefArg(href, args, `startsWith=${options.startsWith}`); + } + if (hasValue(options.searchParams)) { + options.searchParams.forEach((param: RequestParam) => { + args = this.addHrefArg(href, args, `${param.fieldName}=${param.fieldValue}`); + }); + } + args = this.addEmbedParams(href, args, ...linksToFollow); + if (isNotEmpty(args)) { + return new URLCombiner(href, `?${args.join('&')}`).toString(); + } else { + return href; + } + } + + /** + * Turn an array of RequestParam into a query string and combine it with the given HREF + * + * @param href The HREF to which the query string should be appended + * @param params Array with additional params to combine with query string + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + * + * @return {Observable} + * Return an observable that emits created HREF + */ + buildHrefWithParams(href: string, params: RequestParam[], ...linksToFollow: FollowLinkConfig[]): string { + + let args = []; + if (hasValue(params)) { + params.forEach((param: RequestParam) => { + args = this.addHrefArg(href, args, `${param.fieldName}=${param.fieldValue}`); + }); + } + + args = this.addEmbedParams(href, args, ...linksToFollow); + + if (isNotEmpty(args)) { + return new URLCombiner(href, `?${args.join('&')}`).toString(); + } else { + return href; + } + } + /** + * Adds the embed options to the link for the request + * @param href The href the params are to be added to + * @param args params for the query string + * @param linksToFollow links we want to embed in query string if shouldEmbed is true + */ + protected addEmbedParams(href: string, args: string[], ...linksToFollow: FollowLinkConfig[]) { + linksToFollow.forEach((linkToFollow: FollowLinkConfig) => { + if (hasValue(linkToFollow) && linkToFollow.shouldEmbed) { + const embedString = 'embed=' + String(linkToFollow.name); + // Add the embeds size if given in the FollowLinkConfig.FindListOptions + if (hasValue(linkToFollow.findListOptions) && hasValue(linkToFollow.findListOptions.elementsPerPage)) { + args = this.addHrefArg(href, args, + 'embed.size=' + String(linkToFollow.name) + '=' + linkToFollow.findListOptions.elementsPerPage); + } + // Adds the nested embeds and their size if given + if (isNotEmpty(linkToFollow.linksToFollow)) { + args = this.addNestedEmbeds(embedString, href, args, ...linkToFollow.linksToFollow); + } else { + args = this.addHrefArg(href, args, embedString); + } + } + }); + return args; + } + + /** + * Add a new argument to the list of arguments, only if it doesn't already exist in the given href, + * or the current list of arguments + * + * @param href The href the arguments are to be added to + * @param currentArgs The current list of arguments + * @param newArg The new argument to add + * @return The next list of arguments, with newArg included if it wasn't already. + * Note this function will not modify any of the input params. + */ + protected addHrefArg(href: string, currentArgs: string[], newArg: string): string[] { + if (href.includes(newArg) || currentArgs.includes(newArg)) { + return [...currentArgs]; + } else { + return [...currentArgs, newArg]; + } + } + + /** + * Add the nested followLinks to the embed param, separated by a /, and their sizes, recursively + * @param embedString embedString so far (recursive) + * @param href The href the params are to be added to + * @param args params for the query string + * @param linksToFollow links we want to embed in query string if shouldEmbed is true + */ + protected addNestedEmbeds(embedString: string, href: string, args: string[], ...linksToFollow: FollowLinkConfig[]): string[] { + let nestEmbed = embedString; + linksToFollow.forEach((linkToFollow: FollowLinkConfig) => { + if (hasValue(linkToFollow) && linkToFollow.shouldEmbed) { + nestEmbed = nestEmbed + '/' + String(linkToFollow.name); + // Add the nested embeds size if given in the FollowLinkConfig.FindListOptions + if (hasValue(linkToFollow.findListOptions) && hasValue(linkToFollow.findListOptions.elementsPerPage)) { + const nestedEmbedSize = 'embed.size=' + nestEmbed.split('=')[1] + '=' + linkToFollow.findListOptions.elementsPerPage; + args = this.addHrefArg(href, args, nestedEmbedSize); + } + if (hasValue(linkToFollow.linksToFollow) && isNotEmpty(linkToFollow.linksToFollow)) { + args = this.addNestedEmbeds(nestEmbed, href, args, ...linkToFollow.linksToFollow); + } else { + args = this.addHrefArg(href, args, nestEmbed); + } + } + }); + return args; + } + + /** + * An operator that will call the given function if the incoming RemoteData is stale and + * shouldReRequest is true + * + * @param shouldReRequest Whether or not to call the re-request function if the RemoteData is stale + * @param requestFn The function to call if the RemoteData is stale and shouldReRequest is + * true + */ + protected reRequestStaleRemoteData(shouldReRequest: boolean, requestFn: () => Observable>) { + return (source: Observable>): Observable> => { + if (shouldReRequest === true) { + return source.pipe( + tap((remoteData: RemoteData) => { + if (hasValue(remoteData) && remoteData.isStale) { + requestFn(); + } + }) + ); + } else { + return source; + } + }; + } + + /** + * Returns an observable of {@link RemoteData} of an object, based on an href, with a list of + * {@link FollowLinkConfig}, to automatically resolve {@link HALLink}s of the object + * @param href$ The url of object we want to retrieve. Can be a string or + * an Observable + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + */ + findByHref(href$: string | Observable, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { + if (typeof href$ === 'string') { + href$ = observableOf(href$); + } + + const requestHref$ = href$.pipe( + isNotEmptyOperator(), + take(1), + map((href: string) => this.buildHrefFromFindOptions(href, {}, [], ...linksToFollow)), + ); + + this.createAndSendGetRequest(requestHref$, useCachedVersionIfAvailable); + + return this.rdbService.buildSingle(requestHref$, ...linksToFollow).pipe( + // This skip ensures that if a stale object is present in the cache when you do a + // call it isn't immediately returned, but we wait until the remote data for the new request + // is created. If useCachedVersionIfAvailable is false it also ensures you don't get a + // cached completed object + skipWhile((rd: RemoteData) => useCachedVersionIfAvailable ? rd.isStale : rd.hasCompleted), + this.reRequestStaleRemoteData(reRequestOnStale, () => + this.findByHref(href$, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow)), + ); + } + + /** + * Returns an Observable of a {@link RemoteData} of a {@link PaginatedList} of objects, based on an href, + * with a list of {@link FollowLinkConfig}, to automatically resolve {@link HALLink}s of the object + * + * @param href$ The url of list we want to retrieve. Can be a string or an Observable + * @param options + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's no valid cached version. + * @param reRequestOnStale Whether or not the request should automatically be re-requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + findAllByHref(href$: string | Observable, options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { + if (typeof href$ === 'string') { + href$ = observableOf(href$); + } + + const requestHref$ = href$.pipe( + isNotEmptyOperator(), + take(1), + map((href: string) => this.buildHrefFromFindOptions(href, options, [], ...linksToFollow)), + ); + + this.createAndSendGetRequest(requestHref$, useCachedVersionIfAvailable); + + return this.rdbService.buildList(requestHref$, ...linksToFollow).pipe( + // This skip ensures that if a stale object is present in the cache when you do a + // call it isn't immediately returned, but we wait until the remote data for the new request + // is created. If useCachedVersionIfAvailable is false it also ensures you don't get a + // cached completed object + skipWhile((rd: RemoteData>) => useCachedVersionIfAvailable ? rd.isStale : rd.hasCompleted), + this.reRequestStaleRemoteData(reRequestOnStale, () => + this.findAllByHref(href$, options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow)), + ); + } + + /** + * Create a GET request for the given href, and send it. + * + * @param href$ The url of object we want to retrieve. Can be a string or + * an Observable + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + */ + protected createAndSendGetRequest(href$: string | Observable, useCachedVersionIfAvailable = true): void { + if (isNotEmpty(href$)) { + if (typeof href$ === 'string') { + href$ = observableOf(href$); + } + + href$.pipe( + isNotEmptyOperator(), + take(1) + ).subscribe((href: string) => { + const requestId = this.requestService.generateRequestId(); + const request = new GetRequest(requestId, href); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request, useCachedVersionIfAvailable); + }); + } + } + + /** + * Return the links to traverse from the root of the api to the + * endpoint this DataService represents + * + * e.g. if the api root links to 'foo', and the endpoint at 'foo' + * links to 'bar' the linkPath for the BarDataService would be + * 'foo/bar' + */ + getLinkPath(): string { + return this.linkPath; + } + + /** + * Invalidate a cached object by its href + * @param href the href to invalidate + */ + public invalidateByHref(href: string): Observable { + const done$ = new AsyncSubject(); + + this.objectCache.getByHref(href).pipe( + take(1), + switchMap((oce: ObjectCacheEntry) => observableFrom(oce.requestUUIDs).pipe( + mergeMap((requestUUID: string) => this.requestService.setStaleByUUID(requestUUID)), + toArray(), + )), + ).subscribe(() => { + done$.next(true); + done$.complete(); + }); + + return done$; + } +} diff --git a/src/app/core/data/base/create-data.spec.ts b/src/app/core/data/base/create-data.spec.ts new file mode 100644 index 0000000000..ceefd3c51d --- /dev/null +++ b/src/app/core/data/base/create-data.spec.ts @@ -0,0 +1,112 @@ +/** + * 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 { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { FindListOptions } from '../find-list-options.model'; +import { Observable, of as observableOf } from 'rxjs'; +import { CreateDataImpl } from './create-data'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; +import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; +import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { TestScheduler } from 'rxjs/testing'; +import { RemoteData } from '../remote-data'; +import { RequestEntryState } from '../request-entry-state.model'; + +const endpoint = 'https://rest.api/core'; + +class TestService extends CreateDataImpl { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + ) { + super(undefined, requestService, rdbService, objectCache, halService, notificationsService, undefined); + } + + public getBrowseEndpoint(options: FindListOptions = {}, linkPath: string = this.linkPath): Observable { + return observableOf(endpoint); + } +} + +describe('CreateDataImpl', () => { + let service: TestService; + let requestService; + let halService; + let rdbService; + let objectCache; + let notificationsService; + let selfLink; + let linksToFollow; + let testScheduler; + let remoteDataMocks; + + function initTestService(): TestService { + requestService = getMockRequestService(); + halService = new HALEndpointServiceStub('url') as any; + rdbService = getMockRemoteDataBuildService(); + objectCache = { + + addPatch: () => { + /* empty */ + }, + getObjectBySelfLink: () => { + /* empty */ + }, + getByHref: () => { + /* empty */ + }, + } as any; + notificationsService = {} as NotificationsService; + selfLink = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; + linksToFollow = [ + followLink('a'), + followLink('b'), + ]; + + testScheduler = new TestScheduler((actual, expected) => { + // asserting the two objects are equal + // e.g. using chai. + expect(actual).toEqual(expected); + }); + + const timeStamp = new Date().getTime(); + const msToLive = 15 * 60 * 1000; + const payload = { foo: 'bar' }; + const statusCodeSuccess = 200; + const statusCodeError = 404; + const errorMessage = 'not found'; + remoteDataMocks = { + RequestPending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.RequestPending, undefined, undefined, undefined), + ResponsePending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.ResponsePending, undefined, undefined, undefined), + Success: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Success, undefined, payload, statusCodeSuccess), + SuccessStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.SuccessStale, undefined, payload, statusCodeSuccess), + Error: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Error, errorMessage, undefined, statusCodeError), + ErrorStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.ErrorStale, errorMessage, undefined, statusCodeError), + }; + + return new TestService( + requestService, + rdbService, + objectCache, + halService, + notificationsService, + ); + } + + beforeEach(() => { + service = initTestService(); + }); + + // todo: add specs (there were no ceate specs in original DataService suite!) +}); diff --git a/src/app/core/data/base/create-data.ts b/src/app/core/data/base/create-data.ts new file mode 100644 index 0000000000..3ffcd9adf2 --- /dev/null +++ b/src/app/core/data/base/create-data.ts @@ -0,0 +1,107 @@ +/** + * 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 { CacheableObject } from '../../cache/cacheable-object.model'; +import { BaseDataService } from './base-data.service'; +import { RequestParam } from '../../cache/models/request-param.model'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../remote-data'; +import { hasValue, isNotEmptyOperator } from '../../../shared/empty.util'; +import { distinctUntilChanged, map, take, takeWhile } from 'rxjs/operators'; +import { DSpaceSerializer } from '../../dspace-rest/dspace.serializer'; +import { getClassForType } from '../../cache/builders/build-decorators'; +import { CreateRequest } from '../request.models'; +import { NotificationOptions } from '../../../shared/notifications/models/notification-options.model'; +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; + +/** + * Interface for a data service that can create objects. + */ +export interface CreateData { + /** + * Create a new DSpaceObject on the server, and store the response + * in the object cache + * + * @param object The object to create + * @param params Array with additional params to combine with query string + */ + create(object: T, ...params: RequestParam[]): Observable>; +} + +/** + * A DataService feature to create objects. + * + * Concrete data services can use this feature by implementing {@link CreateData} + * and delegating its method to an inner instance of this class. + */ +export class CreateDataImpl extends BaseDataService implements CreateData { + constructor( + protected linkPath: string, + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected responseMsToLive: number, + ) { + super(linkPath, requestService, rdbService, objectCache, halService, responseMsToLive); + } + + /** + * Create a new object on the server, and store the response in the object cache + * + * @param object The object to create + * @param params Array with additional params to combine with query string + */ + create(object: T, ...params: RequestParam[]): Observable> { + const endpoint$ = this.getEndpoint().pipe( + isNotEmptyOperator(), + distinctUntilChanged(), + map((endpoint: string) => this.buildHrefWithParams(endpoint, params)), + ); + return this.createOnEndpoint(object, endpoint$); + } + + /** + * Send a POST request to create a new resource to a specific endpoint. + * Use this method if the endpoint needs to be adjusted. In most cases {@link create} should be sufficient. + * @param object the object to create + * @param endpoint$ the endpoint to send the POST request to + */ + createOnEndpoint(object: T, endpoint$: Observable): Observable> { + const requestId = this.requestService.generateRequestId(); + const serializedObject = new DSpaceSerializer(getClassForType(object.type)).serialize(object); + + endpoint$.pipe( + take(1), + ).subscribe((endpoint: string) => { + const request = new CreateRequest(requestId, endpoint, JSON.stringify(serializedObject)); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request); + }); + + const result$ = this.rdbService.buildFromRequestUUID(requestId); + + // TODO a dataservice is not the best place to show a notification, + // this should move up to the components that use this method + result$.pipe( + takeWhile((rd: RemoteData) => rd.isLoading, true) + ).subscribe((rd: RemoteData) => { + if (rd.hasFailed) { + this.notificationsService.error('Server Error:', rd.errorMessage, new NotificationOptions(-1)); + } + }); + + return result$; + } +} diff --git a/src/app/core/data/base/delete-data.spec.ts b/src/app/core/data/base/delete-data.spec.ts new file mode 100644 index 0000000000..4c4a2ded6d --- /dev/null +++ b/src/app/core/data/base/delete-data.spec.ts @@ -0,0 +1,208 @@ +/** + * 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 { constructIdEndpointDefault } from './identifiable-data.service'; +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { FindListOptions } from '../find-list-options.model'; +import { Observable, of as observableOf } from 'rxjs'; +import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; +import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; +import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { TestScheduler } from 'rxjs/testing'; +import { RemoteData } from '../remote-data'; +import { RequestEntryState } from '../request-entry-state.model'; +import { DeleteDataImpl } from './delete-data'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { createFailedRemoteDataObject, createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { fakeAsync, tick } from '@angular/core/testing'; + +const endpoint = 'https://rest.api/core'; + +const BOOLEAN = { f: false, t: true }; + +class TestService extends DeleteDataImpl { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + ) { + super(undefined, requestService, rdbService, objectCache, halService, notificationsService, undefined, constructIdEndpointDefault); + } + + public getBrowseEndpoint(options: FindListOptions = {}, linkPath: string = this.linkPath): Observable { + return observableOf(endpoint); + } +} + +describe('DeleteDataImpl', () => { + let service: TestService; + let requestService; + let halService; + let rdbService; + let objectCache; + let notificationsService; + let selfLink; + let linksToFollow; + let testScheduler; + let remoteDataMocks; + + function initTestService(): TestService { + requestService = getMockRequestService(); + halService = new HALEndpointServiceStub('url') as any; + rdbService = getMockRemoteDataBuildService(); + objectCache = { + + addPatch: () => { + /* empty */ + }, + getObjectBySelfLink: () => { + /* empty */ + }, + getByHref: () => { + /* empty */ + } + } as any; + notificationsService = {} as NotificationsService; + selfLink = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; + linksToFollow = [ + followLink('a'), + followLink('b') + ]; + + testScheduler = new TestScheduler((actual, expected) => { + // asserting the two objects are equal + // e.g. using chai. + expect(actual).toEqual(expected); + }); + + const timeStamp = new Date().getTime(); + const msToLive = 15 * 60 * 1000; + const payload = { foo: 'bar' }; + const statusCodeSuccess = 200; + const statusCodeError = 404; + const errorMessage = 'not found'; + remoteDataMocks = { + RequestPending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.RequestPending, undefined, undefined, undefined), + ResponsePending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.ResponsePending, undefined, undefined, undefined), + Success: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Success, undefined, payload, statusCodeSuccess), + SuccessStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.SuccessStale, undefined, payload, statusCodeSuccess), + Error: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Error, errorMessage, undefined, statusCodeError), + ErrorStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.ErrorStale, errorMessage, undefined, statusCodeError), + }; + + return new TestService( + requestService, + rdbService, + objectCache, + halService, + notificationsService, + ); + } + + beforeEach(() => { + service = initTestService(); + }); + + describe('delete', () => { + let MOCK_SUCCEEDED_RD; + let MOCK_FAILED_RD; + + let invalidateByHrefSpy: jasmine.Spy; + let buildFromRequestUUIDSpy: jasmine.Spy; + let getIDHrefObsSpy: jasmine.Spy; + let deleteByHrefSpy: jasmine.Spy; + + beforeEach(() => { + invalidateByHrefSpy = spyOn(service, 'invalidateByHref').and.returnValue(observableOf(true)); + buildFromRequestUUIDSpy = spyOn(rdbService, 'buildFromRequestUUID').and.callThrough(); + getIDHrefObsSpy = spyOn(service, 'getIDHrefObs').and.callThrough(); + deleteByHrefSpy = spyOn(service, 'deleteByHref').and.callThrough(); + + MOCK_SUCCEEDED_RD = createSuccessfulRemoteDataObject({}); + MOCK_FAILED_RD = createFailedRemoteDataObject('something went wrong'); + }); + + it('should retrieve href by ID and call deleteByHref', () => { + getIDHrefObsSpy.and.returnValue(observableOf('some-href')); + buildFromRequestUUIDSpy.and.returnValue(createSuccessfulRemoteDataObject$({})); + + service.delete('some-id', ['a', 'b', 'c']).subscribe(rd => { + expect(getIDHrefObsSpy).toHaveBeenCalledWith('some-id'); + expect(deleteByHrefSpy).toHaveBeenCalledWith('some-href', ['a', 'b', 'c']); + }); + }); + + describe('deleteByHref', () => { + it('should call invalidateByHref if the DELETE request succeeds', (done) => { + buildFromRequestUUIDSpy.and.returnValue(observableOf(MOCK_SUCCEEDED_RD)); + + service.deleteByHref('some-href').subscribe(rd => { + expect(rd).toBe(MOCK_SUCCEEDED_RD); + expect(invalidateByHrefSpy).toHaveBeenCalled(); + done(); + }); + }); + + it('should call invalidateByHref even if not subscribing to returned Observable', fakeAsync(() => { + buildFromRequestUUIDSpy.and.returnValue(observableOf(MOCK_SUCCEEDED_RD)); + + service.deleteByHref('some-href'); + tick(); + + expect(invalidateByHrefSpy).toHaveBeenCalled(); + })); + + it('should not call invalidateByHref if the DELETE request fails', (done) => { + buildFromRequestUUIDSpy.and.returnValue(observableOf(MOCK_FAILED_RD)); + + service.deleteByHref('some-href').subscribe(rd => { + expect(rd).toBe(MOCK_FAILED_RD); + expect(invalidateByHrefSpy).not.toHaveBeenCalled(); + done(); + }); + }); + + it('should wait for invalidateByHref before emitting', () => { + testScheduler.run(({ cold, expectObservable }) => { + buildFromRequestUUIDSpy.and.returnValue( + cold('(r|)', { r: MOCK_SUCCEEDED_RD}) // RD emits right away + ); + invalidateByHrefSpy.and.returnValue( + cold('----(t|)', BOOLEAN) // but we pretend that setting requests to stale takes longer + ); + + const done$ = service.deleteByHref('some-href'); + expectObservable(done$).toBe( + '----(r|)', { r: MOCK_SUCCEEDED_RD} // ...and expect the returned Observable to wait until that's done + ); + }); + }); + + it('should wait for the DELETE request to resolve before emitting', () => { + testScheduler.run(({ cold, expectObservable }) => { + buildFromRequestUUIDSpy.and.returnValue( + cold('----(r|)', { r: MOCK_SUCCEEDED_RD}) // the request takes a while + ); + invalidateByHrefSpy.and.returnValue( + cold('(t|)', BOOLEAN) // but we pretend that setting to stale happens sooner + ); // e.g.: maybe already stale before this call? + + const done$ = service.deleteByHref('some-href'); + expectObservable(done$).toBe( + '----(r|)', { r: MOCK_SUCCEEDED_RD} // ...and expect the returned Observable to wait for the request + ); + }); + }); + }); + }); +}); diff --git a/src/app/core/data/base/delete-data.ts b/src/app/core/data/base/delete-data.ts new file mode 100644 index 0000000000..2e34f0957c --- /dev/null +++ b/src/app/core/data/base/delete-data.ts @@ -0,0 +1,108 @@ +/** + * 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 { CacheableObject } from '../../cache/cacheable-object.model'; +import { AsyncSubject, combineLatest, Observable } from 'rxjs'; +import { RemoteData } from '../remote-data'; +import { NoContent } from '../../shared/NoContent.model'; +import { filter, map, switchMap } from 'rxjs/operators'; +import { DeleteRequest } from '../request.models'; +import { hasNoValue, hasValue } from '../../../shared/empty.util'; +import { getFirstCompletedRemoteData } from '../../shared/operators'; +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { ConstructIdEndpoint, IdentifiableDataService } from './identifiable-data.service'; + +export interface DeleteData { + /** + * Delete an existing object on the server + * @param objectId The id of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + */ + delete(objectId: string, copyVirtualMetadata?: string[]): Observable>; + + /** + * Delete an existing object on the server + * @param href The self link of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + * Only emits once all request related to the DSO has been invalidated. + */ + deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable>; +} + +export class DeleteDataImpl extends IdentifiableDataService implements DeleteData { + constructor( + protected linkPath: string, + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected responseMsToLive: number, + protected constructIdEndpoint: ConstructIdEndpoint, + ) { + super(linkPath, requestService, rdbService, objectCache, halService, responseMsToLive, constructIdEndpoint); + if (hasNoValue(constructIdEndpoint)) { + throw new Error(`DeleteDataImpl initialized without a constructIdEndpoint method (linkPath: ${linkPath})`); + } + } + + delete(objectId: string, copyVirtualMetadata?: string[]): Observable> { + return this.getIDHrefObs(objectId).pipe( + switchMap((href: string) => this.deleteByHref(href, copyVirtualMetadata)), + ); + } + + deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { + const requestId = this.requestService.generateRequestId(); + + if (copyVirtualMetadata) { + copyVirtualMetadata.forEach((id) => + href += (href.includes('?') ? '&' : '?') + + 'copyVirtualMetadata=' + + id, + ); + } + + const request = new DeleteRequest(requestId, href); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request); + + const response$ = this.rdbService.buildFromRequestUUID(requestId); + + const invalidated$ = new AsyncSubject(); + response$.pipe( + getFirstCompletedRemoteData(), + switchMap((rd: RemoteData) => { + if (rd.hasSucceeded) { + return this.invalidateByHref(href); + } else { + return [true]; + } + }) + ).subscribe(() => { + invalidated$.next(true); + invalidated$.complete(); + }); + + return combineLatest([response$, invalidated$]).pipe( + filter(([_, invalidated]) => invalidated), + map(([response, _]) => response), + ); + } +} diff --git a/src/app/core/data/base/find-all-data.spec.ts b/src/app/core/data/base/find-all-data.spec.ts new file mode 100644 index 0000000000..3caa8990f6 --- /dev/null +++ b/src/app/core/data/base/find-all-data.spec.ts @@ -0,0 +1,306 @@ +/** + * 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 { FindAllData, FindAllDataImpl } from './find-all-data'; +import createSpyObj = jasmine.createSpyObj; +import { FindListOptions } from '../find-list-options.model'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; +import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; +import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; +import { TestScheduler } from 'rxjs/testing'; +import { RemoteData } from '../remote-data'; +import { RequestEntryState } from '../request-entry-state.model'; +import { SortDirection, SortOptions } from '../../cache/models/sort-options.model'; +import { RequestParam } from '../../cache/models/request-param.model'; + +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { Observable, of as observableOf } from 'rxjs'; + +/** + * Tests whether calls to `FindAllData` methods are correctly patched through in a concrete data service that implements it + */ +export function testFindAllDataImplementation(service: FindAllData, methods = ['findAll', 'getFindAllHref']) { + describe('FindAllData implementation', () => { + const OPTIONS = Object.assign(new FindListOptions(), { elementsPerPage: 10, currentPage: 3 }); + const FOLLOWLINKS = [ + followLink('test'), + followLink('something'), + ]; + + beforeEach(() => { + (service as any).findAllData = createSpyObj('findAllData', { + findAll: 'TEST findAll', + getFindAllHref: 'TEST getFindAllHref', + }); + }); + + if ('findAll' in methods) { + it('should handle calls to findAll', () => { + const out: any = service.findAll(OPTIONS, false, true, ...FOLLOWLINKS); + + expect((service as any).findAllData.findAll).toHaveBeenCalledWith(OPTIONS, false, true, ...FOLLOWLINKS); + expect(out).toBe('TEST findAll'); + }); + } + + if ('getFindAllHref' in methods) { + it('should handle calls to getFindAllHref', () => { + const out: any = service.getFindAllHref(OPTIONS, 'linkPath', ...FOLLOWLINKS); + + expect((service as any).findAllData.getFindAllHref).toHaveBeenCalledWith(OPTIONS, 'linkPath', ...FOLLOWLINKS); + expect(out).toBe('TEST getFindAllHref'); + }); + } + }); +} + +const endpoint = 'https://rest.api/core'; + +class TestService extends FindAllDataImpl { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + ) { + super(undefined, requestService, rdbService, objectCache, halService, undefined); + } + + public getBrowseEndpoint(options: FindListOptions = {}, linkPath: string = this.linkPath): Observable { + return observableOf(endpoint); + } +} + +describe('FindAllDataImpl', () => { + let service: TestService; + let options: FindListOptions; + let requestService; + let halService; + let rdbService; + let objectCache; + let selfLink; + let linksToFollow; + let testScheduler; + let remoteDataMocks; + + function initTestService(): TestService { + requestService = getMockRequestService(); + halService = new HALEndpointServiceStub('url') as any; + rdbService = getMockRemoteDataBuildService(); + objectCache = { + + addPatch: () => { + /* empty */ + }, + getObjectBySelfLink: () => { + /* empty */ + }, + getByHref: () => { + /* empty */ + }, + } as any; + selfLink = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; + linksToFollow = [ + followLink('a'), + followLink('b'), + ]; + + testScheduler = new TestScheduler((actual, expected) => { + // asserting the two objects are equal + // e.g. using chai. + expect(actual).toEqual(expected); + }); + + const timeStamp = new Date().getTime(); + const msToLive = 15 * 60 * 1000; + const payload = { foo: 'bar' }; + const statusCodeSuccess = 200; + const statusCodeError = 404; + const errorMessage = 'not found'; + remoteDataMocks = { + RequestPending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.RequestPending, undefined, undefined, undefined), + ResponsePending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.ResponsePending, undefined, undefined, undefined), + Success: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Success, undefined, payload, statusCodeSuccess), + SuccessStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.SuccessStale, undefined, payload, statusCodeSuccess), + Error: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Error, errorMessage, undefined, statusCodeError), + ErrorStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.ErrorStale, errorMessage, undefined, statusCodeError), + }; + + return new TestService( + requestService, + rdbService, + objectCache, + halService, + ); + } + + beforeEach(() => { + service = initTestService(); + }); + + describe('getFindAllHref', () => { + + it('should return an observable with the endpoint', () => { + options = {}; + + (service as any).getFindAllHref(options).subscribe((value) => { + expect(value).toBe(endpoint); + }, + ); + }); + + it('should include page in href if currentPage provided in options', () => { + options = { currentPage: 2 }; + const expected = `${endpoint}?page=${options.currentPage - 1}`; + + (service as any).getFindAllHref(options).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include size in href if elementsPerPage provided in options', () => { + options = { elementsPerPage: 5 }; + const expected = `${endpoint}?size=${options.elementsPerPage}`; + + (service as any).getFindAllHref(options).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include sort href if SortOptions provided in options', () => { + const sortOptions = new SortOptions('field1', SortDirection.ASC); + options = { sort: sortOptions }; + const expected = `${endpoint}?sort=${sortOptions.field},${sortOptions.direction}`; + + (service as any).getFindAllHref(options).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include startsWith in href if startsWith provided in options', () => { + options = { startsWith: 'ab' }; + const expected = `${endpoint}?startsWith=${options.startsWith}`; + + (service as any).getFindAllHref(options).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include all provided options in href', () => { + const sortOptions = new SortOptions('field1', SortDirection.DESC); + options = { + currentPage: 6, + elementsPerPage: 10, + sort: sortOptions, + startsWith: 'ab', + + }; + const expected = `${endpoint}?page=${options.currentPage - 1}&size=${options.elementsPerPage}` + + `&sort=${sortOptions.field},${sortOptions.direction}&startsWith=${options.startsWith}`; + + (service as any).getFindAllHref(options).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include all searchParams in href if any provided in options', () => { + options = { + searchParams: [ + new RequestParam('param1', 'test'), + new RequestParam('param2', 'test2'), + ], + }; + const expected = `${endpoint}?param1=test¶m2=test2`; + + (service as any).getFindAllHref(options).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include linkPath in href if any provided', () => { + const expected = `${endpoint}/test/entries`; + + (service as any).getFindAllHref({}, 'test/entries').subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include single linksToFollow as embed', () => { + const expected = `${endpoint}?embed=bundles`; + + (service as any).getFindAllHref({}, null, followLink('bundles')).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include single linksToFollow as embed and its size', () => { + const expected = `${endpoint}?embed.size=bundles=5&embed=bundles`; + const config: FindListOptions = Object.assign(new FindListOptions(), { + elementsPerPage: 5, + }); + (service as any).getFindAllHref({}, null, followLink('bundles', { findListOptions: config })).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include multiple linksToFollow as embed', () => { + const expected = `${endpoint}?embed=bundles&embed=owningCollection&embed=templateItemOf`; + + (service as any).getFindAllHref({}, null, followLink('bundles'), followLink('owningCollection'), followLink('templateItemOf')).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include multiple linksToFollow as embed and its sizes if given', () => { + const expected = `${endpoint}?embed=bundles&embed.size=owningCollection=2&embed=owningCollection&embed=templateItemOf`; + + const config: FindListOptions = Object.assign(new FindListOptions(), { + elementsPerPage: 2, + }); + + (service as any).getFindAllHref({}, null, followLink('bundles'), followLink('owningCollection', { findListOptions: config }), followLink('templateItemOf')).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should not include linksToFollow with shouldEmbed = false', () => { + const expected = `${endpoint}?embed=templateItemOf`; + + (service as any).getFindAllHref( + {}, + null, + followLink('bundles', { shouldEmbed: false }), + followLink('owningCollection', { shouldEmbed: false }), + followLink('templateItemOf'), + ).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include nested linksToFollow 3lvl', () => { + const expected = `${endpoint}?embed=owningCollection/itemtemplate/relationships`; + + (service as any).getFindAllHref({}, null, followLink('owningCollection', {}, followLink('itemtemplate', {}, followLink('relationships')))).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + + it('should include nested linksToFollow 2lvl and nested embed\'s size', () => { + const expected = `${endpoint}?embed.size=owningCollection/itemtemplate=4&embed=owningCollection/itemtemplate`; + const config: FindListOptions = Object.assign(new FindListOptions(), { + elementsPerPage: 4, + }); + (service as any).getFindAllHref({}, null, followLink('owningCollection', {}, followLink('itemtemplate', { findListOptions: config }))).subscribe((value) => { + expect(value).toBe(expected); + }); + }); + }); +}); diff --git a/src/app/core/data/base/find-all-data.ts b/src/app/core/data/base/find-all-data.ts new file mode 100644 index 0000000000..f3666b75ee --- /dev/null +++ b/src/app/core/data/base/find-all-data.ts @@ -0,0 +1,112 @@ +/** + * 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 { Observable } from 'rxjs'; +import { FindListOptions } from '../find-list-options.model'; +import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { RemoteData } from '../remote-data'; +import { PaginatedList } from '../paginated-list.model'; +import { CacheableObject } from '../../cache/cacheable-object.model'; +import { BaseDataService } from './base-data.service'; +import { distinctUntilChanged, filter, map } from 'rxjs/operators'; +import { isNotEmpty } from '../../../shared/empty.util'; +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; + +/** + * Interface for a data service that list all of its objects. + */ +export interface FindAllData { + /** + * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded + * info should be added to the objects + * + * @param options Find list options object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>>} + * Return an observable that emits object list + */ + findAll(options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>>; + + /** + * Create the HREF with given options object + * + * @param options The [[FindListOptions]] object + * @param linkPath The link path for the object + * @return {Observable} + * Return an observable that emits created HREF + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + getFindAllHref?(options: FindListOptions, linkPath?: string, ...linksToFollow: FollowLinkConfig[]): Observable; +} + +/** + * A DataService feature to list all objects. + * + * Concrete data services can use this feature by implementing {@link FindAllData} + * and delegating its method to an inner instance of this class. + */ +export class FindAllDataImpl extends BaseDataService implements FindAllData { + constructor( + protected linkPath: string, + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected responseMsToLive: number, + ) { + super(linkPath, requestService, rdbService, objectCache, halService, responseMsToLive); + } + + /** + * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded + * info should be added to the objects + * + * @param options Find list options object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>>} + * Return an observable that emits object list + */ + findAll(options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllByHref(this.getFindAllHref(options), options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + + /** + * Create the HREF with given options object + * + * @param options The [[FindListOptions]] object + * @param linkPath The link path for the object + * @return {Observable} + * Return an observable that emits created HREF + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + getFindAllHref(options: FindListOptions = {}, linkPath?: string, ...linksToFollow: FollowLinkConfig[]): Observable { + let endpoint$: Observable; + const args = []; + + endpoint$ = this.getBrowseEndpoint(options).pipe( + filter((href: string) => isNotEmpty(href)), + map((href: string) => isNotEmpty(linkPath) ? `${href}/${linkPath}` : href), + distinctUntilChanged(), + ); + + return endpoint$.pipe(map((result: string) => this.buildHrefFromFindOptions(result, options, args, ...linksToFollow))); + } +} diff --git a/src/app/core/data/base/identifiable-data.service.spec.ts b/src/app/core/data/base/identifiable-data.service.spec.ts new file mode 100644 index 0000000000..d08f1141fc --- /dev/null +++ b/src/app/core/data/base/identifiable-data.service.spec.ts @@ -0,0 +1,145 @@ +/** + * 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 { FindListOptions } from '../find-list-options.model'; +import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; +import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; +import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { TestScheduler } from 'rxjs/testing'; +import { RemoteData } from '../remote-data'; +import { RequestEntryState } from '../request-entry-state.model'; +import { Observable, of as observableOf } from 'rxjs'; +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { IdentifiableDataService } from './identifiable-data.service'; + +const endpoint = 'https://rest.api/core'; + +class TestService extends IdentifiableDataService { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + ) { + super(undefined, requestService, rdbService, objectCache, halService); + } + + public getBrowseEndpoint(options: FindListOptions = {}, linkPath: string = this.linkPath): Observable { + return observableOf(endpoint); + } +} + +describe('IdentifiableDataService', () => { + let service: TestService; + let requestService; + let halService; + let rdbService; + let objectCache; + let selfLink; + let linksToFollow; + let testScheduler; + let remoteDataMocks; + + function initTestService(): TestService { + requestService = getMockRequestService(); + halService = new HALEndpointServiceStub('url') as any; + rdbService = getMockRemoteDataBuildService(); + objectCache = { + + addPatch: () => { + /* empty */ + }, + getObjectBySelfLink: () => { + /* empty */ + }, + getByHref: () => { + /* empty */ + } + } as any; + selfLink = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; + linksToFollow = [ + followLink('a'), + followLink('b') + ]; + + testScheduler = new TestScheduler((actual, expected) => { + // asserting the two objects are equal + // e.g. using chai. + expect(actual).toEqual(expected); + }); + + const timeStamp = new Date().getTime(); + const msToLive = 15 * 60 * 1000; + const payload = { foo: 'bar' }; + const statusCodeSuccess = 200; + const statusCodeError = 404; + const errorMessage = 'not found'; + remoteDataMocks = { + RequestPending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.RequestPending, undefined, undefined, undefined), + ResponsePending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.ResponsePending, undefined, undefined, undefined), + Success: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Success, undefined, payload, statusCodeSuccess), + SuccessStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.SuccessStale, undefined, payload, statusCodeSuccess), + Error: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Error, errorMessage, undefined, statusCodeError), + ErrorStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.ErrorStale, errorMessage, undefined, statusCodeError), + }; + + return new TestService( + requestService, + rdbService, + objectCache, + halService, + ); + } + + beforeEach(() => { + service = initTestService(); + }); + + describe('getIDHref', () => { + const endpointMock = 'https://dspace7-internal.atmire.com/server/api/core/items'; + const resourceIdMock = '003c99b4-d4fe-44b0-a945-e12182a7ca89'; + + it('should return endpoint', () => { + const result = (service as any).getIDHref(endpointMock, resourceIdMock); + expect(result).toEqual(endpointMock + '/' + resourceIdMock); + }); + + it('should include single linksToFollow as embed', () => { + const expected = `${endpointMock}/${resourceIdMock}?embed=bundles`; + const result = (service as any).getIDHref(endpointMock, resourceIdMock, followLink('bundles')); + expect(result).toEqual(expected); + }); + + it('should include multiple linksToFollow as embed', () => { + const expected = `${endpointMock}/${resourceIdMock}?embed=bundles&embed=owningCollection&embed=templateItemOf`; + const result = (service as any).getIDHref(endpointMock, resourceIdMock, followLink('bundles'), followLink('owningCollection'), followLink('templateItemOf')); + expect(result).toEqual(expected); + }); + + it('should not include linksToFollow with shouldEmbed = false', () => { + const expected = `${endpointMock}/${resourceIdMock}?embed=templateItemOf`; + const result = (service as any).getIDHref( + endpointMock, + resourceIdMock, + followLink('bundles', { shouldEmbed: false }), + followLink('owningCollection', { shouldEmbed: false }), + followLink('templateItemOf') + ); + expect(result).toEqual(expected); + }); + + it('should include nested linksToFollow 3lvl', () => { + const expected = `${endpointMock}/${resourceIdMock}?embed=owningCollection/itemtemplate/relationships`; + const result = (service as any).getIDHref(endpointMock, resourceIdMock, followLink('owningCollection', {}, followLink('itemtemplate', {}, followLink('relationships')))); + expect(result).toEqual(expected); + }); + }); +}); diff --git a/src/app/core/data/base/identifiable-data.service.ts b/src/app/core/data/base/identifiable-data.service.ts new file mode 100644 index 0000000000..904f925765 --- /dev/null +++ b/src/app/core/data/base/identifiable-data.service.ts @@ -0,0 +1,83 @@ +/** + * 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 { CacheableObject } from '../../cache/cacheable-object.model'; +import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { RemoteData } from '../remote-data'; +import { BaseDataService } from './base-data.service'; +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; + +/** + * Shorthand type for the method to construct an ID endpoint. + */ +export type ConstructIdEndpoint = (endpoint: string, resourceID: string) => string; + +/** + * The default method to construct an ID endpoint + */ +export const constructIdEndpointDefault = (endpoint, resourceID) => `${endpoint}/${resourceID}`; + +/** + * A type of data service that deals with objects that have an ID. + * + * The effective endpoint to use for the ID can be adjusted by providing a different {@link ConstructIdEndpoint} method. + * This method is passed as an argument so that it can be set on data service features without having to override them. + */ +export class IdentifiableDataService extends BaseDataService { + constructor( + protected linkPath: string, + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected responseMsToLive?: number, + protected constructIdEndpoint: ConstructIdEndpoint = constructIdEndpointDefault, + ) { + super(linkPath, requestService, rdbService, objectCache, halService, responseMsToLive); + } + + /** + * Returns an observable of {@link RemoteData} of an object, based on its ID, with a list of + * {@link FollowLinkConfig}, to automatically resolve {@link HALLink}s of the object + * @param id ID of object we want to retrieve + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + */ + findById(id: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { + const href$ = this.getIDHrefObs(encodeURIComponent(id), ...linksToFollow); + return this.findByHref(href$, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + + /** + * Create the HREF for a specific object based on its identifier; with possible embed query params based on linksToFollow + * @param endpoint The base endpoint for the type of object + * @param resourceID The identifier for the object + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + getIDHref(endpoint, resourceID, ...linksToFollow: FollowLinkConfig[]): string { + return this.buildHrefFromFindOptions(this.constructIdEndpoint(endpoint, resourceID), {}, [], ...linksToFollow); + } + + /** + * Create an observable for the HREF of a specific object based on its identifier + * @param resourceID The identifier for the object + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + getIDHrefObs(resourceID: string, ...linksToFollow: FollowLinkConfig[]): Observable { + return this.getEndpoint().pipe( + map((endpoint: string) => this.getIDHref(endpoint, resourceID, ...linksToFollow))); + } +} diff --git a/src/app/core/data/base/patch-data.spec.ts b/src/app/core/data/base/patch-data.spec.ts new file mode 100644 index 0000000000..601188ae7d --- /dev/null +++ b/src/app/core/data/base/patch-data.spec.ts @@ -0,0 +1,180 @@ +/** + * 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/ + */ +/* eslint-disable max-classes-per-file */ +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { FindListOptions } from '../find-list-options.model'; +import { Observable, of as observableOf } from 'rxjs'; +import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; +import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; +import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { TestScheduler } from 'rxjs/testing'; +import { RemoteData } from '../remote-data'; +import { RequestEntryState } from '../request-entry-state.model'; +import { PatchDataImpl } from './patch-data'; +import { ChangeAnalyzer } from '../change-analyzer'; +import { Item } from '../../shared/item.model'; +import { compare, Operation } from 'fast-json-patch'; +import { PatchRequest } from '../request.models'; +import { DSpaceObject } from '../../shared/dspace-object.model'; +import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { constructIdEndpointDefault } from './identifiable-data.service'; + +const endpoint = 'https://rest.api/core'; + +class TestService extends PatchDataImpl { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected comparator: ChangeAnalyzer, + ) { + super(undefined, requestService, rdbService, objectCache, halService, comparator, undefined, constructIdEndpointDefault); + } + + public getBrowseEndpoint(options: FindListOptions = {}, linkPath: string = this.linkPath): Observable { + return observableOf(endpoint); + } +} + +class DummyChangeAnalyzer implements ChangeAnalyzer { + diff(object1: Item, object2: Item): Operation[] { + return compare((object1 as any).metadata, (object2 as any).metadata); + } +} + +describe('PatchDataImpl', () => { + let service: TestService; + let requestService; + let halService; + let rdbService; + let comparator; + let objectCache; + let selfLink; + let linksToFollow; + let testScheduler; + let remoteDataMocks; + + function initTestService(): TestService { + requestService = getMockRequestService(); + halService = new HALEndpointServiceStub('url') as any; + rdbService = getMockRemoteDataBuildService(); + comparator = new DummyChangeAnalyzer() as any; + objectCache = { + + addPatch: () => { + /* empty */ + }, + getObjectBySelfLink: () => { + /* empty */ + }, + getByHref: () => { + /* empty */ + }, + } as any; + selfLink = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; + linksToFollow = [ + followLink('a'), + followLink('b'), + ]; + + testScheduler = new TestScheduler((actual, expected) => { + // asserting the two objects are equal + // e.g. using chai. + expect(actual).toEqual(expected); + }); + + const timeStamp = new Date().getTime(); + const msToLive = 15 * 60 * 1000; + const payload = { foo: 'bar' }; + const statusCodeSuccess = 200; + const statusCodeError = 404; + const errorMessage = 'not found'; + remoteDataMocks = { + RequestPending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.RequestPending, undefined, undefined, undefined), + ResponsePending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.ResponsePending, undefined, undefined, undefined), + Success: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Success, undefined, payload, statusCodeSuccess), + SuccessStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.SuccessStale, undefined, payload, statusCodeSuccess), + Error: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Error, errorMessage, undefined, statusCodeError), + ErrorStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.ErrorStale, errorMessage, undefined, statusCodeError), + }; + + return new TestService( + requestService, + rdbService, + objectCache, + halService, + comparator, + ); + } + + beforeEach(() => { + service = initTestService(); + }); + + describe('patch', () => { + const dso = { + uuid: 'dso-uuid' + }; + const operations = [ + Object.assign({ + op: 'move', + from: '/1', + path: '/5' + }) as Operation + ]; + + beforeEach((done) => { + service.patch(dso, operations).subscribe(() => { + done(); + }); + }); + + it('should send a PatchRequest', () => { + expect(requestService.send).toHaveBeenCalledWith(jasmine.any(PatchRequest)); + }); + }); + + describe('update', () => { + let operations; + let dso; + let dso2; + const name1 = 'random string'; + const name2 = 'another random string'; + beforeEach(() => { + operations = [{ op: 'replace', path: '/0/value', value: name2 } as Operation]; + + dso = Object.assign(new DSpaceObject(), { + _links: { self: { href: selfLink } }, + metadata: [{ key: 'dc.title', value: name1 }] + }); + + dso2 = Object.assign(new DSpaceObject(), { + _links: { self: { href: selfLink } }, + metadata: [{ key: 'dc.title', value: name2 }] + }); + + spyOn(service, 'findByHref').and.returnValue(createSuccessfulRemoteDataObject$(dso)); + spyOn(objectCache, 'addPatch'); + }); + + it('should call addPatch on the object cache with the right parameters when there are differences', () => { + service.update(dso2).subscribe(); + expect(objectCache.addPatch).toHaveBeenCalledWith(selfLink, operations); + }); + + it('should not call addPatch on the object cache with the right parameters when there are no differences', () => { + service.update(dso).subscribe(); + expect(objectCache.addPatch).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/src/app/core/data/base/patch-data.ts b/src/app/core/data/base/patch-data.ts new file mode 100644 index 0000000000..558de928c4 --- /dev/null +++ b/src/app/core/data/base/patch-data.ts @@ -0,0 +1,143 @@ +/** + * 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 { CacheableObject } from '../../cache/cacheable-object.model'; +import { Operation } from 'fast-json-patch'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../remote-data'; +import { find, map, mergeMap } from 'rxjs/operators'; +import { hasNoValue, hasValue, isNotEmpty } from '../../../shared/empty.util'; +import { PatchRequest } from '../request.models'; +import { getFirstSucceededRemoteData, getRemoteDataPayload } from '../../shared/operators'; +import { ChangeAnalyzer } from '../change-analyzer'; +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { RestRequestMethod } from '../rest-request-method'; +import { ConstructIdEndpoint, IdentifiableDataService } from './identifiable-data.service'; + + +/** + * Interface for a data service that can patch and update objects. + */ +export interface PatchData { + /** + * Send a patch request for a specified object + * @param {T} object The object to send a patch request for + * @param {Operation[]} operations The patch operations to be performed + */ + patch(object: T, operations: Operation[]): Observable>; + + /** + * Add a new patch to the object cache + * The patch is derived from the differences between the given object and its version in the object cache + * @param {DSpaceObject} object The given object + */ + update(object: T): Observable>; + + /** + * Commit current object changes to the server + * @param method The RestRequestMethod for which de server sync buffer should be committed + */ + commitUpdates(method?: RestRequestMethod): void; + + /** + * Return a list of operations representing the difference between an object and its latest value in the cache. + * @param object the object to resolve to a list of patch operations + */ + createPatchFromCache?(object: T): Observable; +} + +/** + * A DataService feature to patch and update objects. + * + * Concrete data services can use this feature by implementing {@link PatchData} + * and delegating its method to an inner instance of this class. + * + * Note that this feature requires the object in question to have an ID. + * Make sure to use the same {@link ConstructIdEndpoint} as in the parent data service. + */ +export class PatchDataImpl extends IdentifiableDataService implements PatchData { + constructor( + protected linkPath: string, + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected comparator: ChangeAnalyzer, + protected responseMsToLive: number, + protected constructIdEndpoint: ConstructIdEndpoint, + ) { + super(linkPath, requestService, rdbService, objectCache, halService, responseMsToLive, constructIdEndpoint); + if (hasNoValue(constructIdEndpoint)) { + throw new Error(`PatchDataImpl initialized without a constructIdEndpoint method (linkPath: ${linkPath})`); + } + } + + /** + * Send a patch request for a specified object + * @param {T} object The object to send a patch request for + * @param {Operation[]} operations The patch operations to be performed + */ + patch(object: T, operations: Operation[]): Observable> { + const requestId = this.requestService.generateRequestId(); + + const hrefObs = this.halService.getEndpoint(this.linkPath).pipe( + map((endpoint: string) => this.getIDHref(endpoint, object.uuid)), + ); + + hrefObs.pipe( + find((href: string) => hasValue(href)), + ).subscribe((href: string) => { + const request = new PatchRequest(requestId, href, operations); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request); + }); + + return this.rdbService.buildFromRequestUUID(requestId); + } + + /** + * Add a new patch to the object cache + * The patch is derived from the differences between the given object and its version in the object cache + * @param {DSpaceObject} object The given object + */ + update(object: T): Observable> { + return this.createPatchFromCache(object).pipe( + mergeMap((operations: Operation[]) => { + if (isNotEmpty(operations)) { + this.objectCache.addPatch(object._links.self.href, operations); + } + return this.findByHref(object._links.self.href, true, true); + }), + ); + } + + /** + * Commit current object changes to the server + * @param method The RestRequestMethod for which de server sync buffer should be committed + */ + commitUpdates(method?: RestRequestMethod): void { + this.requestService.commit(method); + } + + /** + * Return a list of operations representing the difference between an object and its latest value in the cache. + * @param object the object to resolve to a list of patch operations + */ + createPatchFromCache(object: T): Observable { + const oldVersion$ = this.findByHref(object._links.self.href, true, false); + return oldVersion$.pipe( + getFirstSucceededRemoteData(), + getRemoteDataPayload(), + map((oldVersion: T) => this.comparator.diff(oldVersion, object)), + ); + } +} diff --git a/src/app/core/data/base/put-data.spec.ts b/src/app/core/data/base/put-data.spec.ts new file mode 100644 index 0000000000..01b5caea5b --- /dev/null +++ b/src/app/core/data/base/put-data.spec.ts @@ -0,0 +1,108 @@ +/** + * 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 { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { FindListOptions } from '../find-list-options.model'; +import { Observable, of as observableOf } from 'rxjs'; +import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; +import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; +import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { TestScheduler } from 'rxjs/testing'; +import { RemoteData } from '../remote-data'; +import { RequestEntryState } from '../request-entry-state.model'; +import { PutDataImpl } from './put-data'; + +const endpoint = 'https://rest.api/core'; + +class TestService extends PutDataImpl { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + ) { + super(undefined, requestService, rdbService, objectCache, halService, undefined); + } + + public getBrowseEndpoint(options: FindListOptions = {}, linkPath: string = this.linkPath): Observable { + return observableOf(endpoint); + } +} + +describe('PutDataImpl', () => { + let service: TestService; + let requestService; + let halService; + let rdbService; + let objectCache; + let selfLink; + let linksToFollow; + let testScheduler; + let remoteDataMocks; + + function initTestService(): TestService { + requestService = getMockRequestService(); + halService = new HALEndpointServiceStub('url') as any; + rdbService = getMockRemoteDataBuildService(); + objectCache = { + + addPatch: () => { + /* empty */ + }, + getObjectBySelfLink: () => { + /* empty */ + }, + getByHref: () => { + /* empty */ + }, + } as any; + selfLink = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; + linksToFollow = [ + followLink('a'), + followLink('b'), + ]; + + testScheduler = new TestScheduler((actual, expected) => { + // asserting the two objects are equal + // e.g. using chai. + expect(actual).toEqual(expected); + }); + + const timeStamp = new Date().getTime(); + const msToLive = 15 * 60 * 1000; + const payload = { foo: 'bar' }; + const statusCodeSuccess = 200; + const statusCodeError = 404; + const errorMessage = 'not found'; + remoteDataMocks = { + RequestPending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.RequestPending, undefined, undefined, undefined), + ResponsePending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.ResponsePending, undefined, undefined, undefined), + Success: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Success, undefined, payload, statusCodeSuccess), + SuccessStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.SuccessStale, undefined, payload, statusCodeSuccess), + Error: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Error, errorMessage, undefined, statusCodeError), + ErrorStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.ErrorStale, errorMessage, undefined, statusCodeError), + }; + + return new TestService( + requestService, + rdbService, + objectCache, + halService, + ); + } + + beforeEach(() => { + service = initTestService(); + }); + + // todo: add specs (there were no put specs in original DataService suite!) +}); diff --git a/src/app/core/data/base/put-data.ts b/src/app/core/data/base/put-data.ts new file mode 100644 index 0000000000..bd2a8d2929 --- /dev/null +++ b/src/app/core/data/base/put-data.ts @@ -0,0 +1,69 @@ +/** + * 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 { CacheableObject } from '../../cache/cacheable-object.model'; +import { BaseDataService } from './base-data.service'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../remote-data'; +import { DSpaceSerializer } from '../../dspace-rest/dspace.serializer'; +import { GenericConstructor } from '../../shared/generic-constructor'; +import { PutRequest } from '../request.models'; +import { hasValue } from '../../../shared/empty.util'; +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; + +/** + * Interface for a data service that can send PUT requests. + */ +export interface PutData { + /** + * Send a PUT request for the specified object + * + * @param object The object to send a put request for. + */ + put(object: T): Observable>; +} + +/** + * A DataService feature to send PUT requests. + * + * Concrete data services can use this feature by implementing {@link PutData} + * and delegating its method to an inner instance of this class. + */ +export class PutDataImpl extends BaseDataService implements PutData { + constructor( + protected linkPath: string, + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected responseMsToLive: number, + ) { + super(linkPath, requestService, rdbService, objectCache, halService, responseMsToLive); + } + + /** + * Send a PUT request for the specified object + * + * @param object The object to send a put request for. + */ + put(object: T): Observable> { + const requestId = this.requestService.generateRequestId(); + const serializedObject = new DSpaceSerializer(object.constructor as GenericConstructor<{}>).serialize(object); + const request = new PutRequest(requestId, object._links.self.href, serializedObject); + + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + + this.requestService.send(request); + + return this.rdbService.buildFromRequestUUID(requestId); + } +} diff --git a/src/app/core/data/base/search-data.spec.ts b/src/app/core/data/base/search-data.spec.ts new file mode 100644 index 0000000000..7abf26b5b8 --- /dev/null +++ b/src/app/core/data/base/search-data.spec.ts @@ -0,0 +1,146 @@ +/** + * 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 { SearchData, SearchDataImpl } from './search-data'; +import createSpyObj = jasmine.createSpyObj; +import { FindListOptions } from '../find-list-options.model'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; +import { Observable, of as observableOf } from 'rxjs'; +import { getMockRequestService } from '../../../shared/mocks/request.service.mock'; +import { HALEndpointServiceStub } from '../../../shared/testing/hal-endpoint-service.stub'; +import { getMockRemoteDataBuildService } from '../../../shared/mocks/remote-data-build.service.mock'; +import { TestScheduler } from 'rxjs/testing'; +import { RemoteData } from '../remote-data'; +import { RequestEntryState } from '../request-entry-state.model'; + +/** + * Tests whether calls to `SearchData` methods are correctly patched through in a concrete data service that implements it + */ +export function testSearchDataImplementation(service: SearchData, methods = ['searchBy', 'getSearchByHref']) { + describe('SearchData implementation', () => { + const OPTIONS = Object.assign(new FindListOptions(), { elementsPerPage: 10, currentPage: 3 }); + const FOLLOWLINKS = [ + followLink('test'), + followLink('something'), + ]; + + beforeEach(() => { + (service as any).searchData = createSpyObj('searchData', { + searchBy: 'TEST searchBy', + getSearchByHref: 'TEST getSearchByHref', + }); + }); + + if ('searchBy' in methods) { + it('should handle calls to searchBy', () => { + const out: any = service.searchBy('searchMethod', OPTIONS, false, true, ...FOLLOWLINKS); + + expect((service as any).searchData.searchBy).toHaveBeenCalledWith('searchMethod', OPTIONS, false, true, ...FOLLOWLINKS); + expect(out).toBe('TEST searchBy'); + }); + } + + if ('getSearchByHref' in methods) { + it('should handle calls to getSearchByHref', () => { + const out: any = service.getSearchByHref('searchMethod', OPTIONS, ...FOLLOWLINKS); + + expect((service as any).searchData.getSearchByHref).toHaveBeenCalledWith('searchMethod', OPTIONS, ...FOLLOWLINKS); + expect(out).toBe('TEST getSearchByHref'); + }); + } + }); +} + +const endpoint = 'https://rest.api/core'; + +class TestService extends SearchDataImpl { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + ) { + super(undefined, requestService, rdbService, objectCache, halService, undefined); + } + + public getBrowseEndpoint(options: FindListOptions = {}, linkPath: string = this.linkPath): Observable { + return observableOf(endpoint); + } +} + +describe('SearchDataImpl', () => { + let service: TestService; + let requestService; + let halService; + let rdbService; + let objectCache; + let selfLink; + let linksToFollow; + let testScheduler; + let remoteDataMocks; + + function initTestService(): TestService { + requestService = getMockRequestService(); + halService = new HALEndpointServiceStub('url') as any; + rdbService = getMockRemoteDataBuildService(); + objectCache = { + + addPatch: () => { + /* empty */ + }, + getObjectBySelfLink: () => { + /* empty */ + }, + getByHref: () => { + /* empty */ + }, + } as any; + selfLink = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; + linksToFollow = [ + followLink('a'), + followLink('b'), + ]; + + testScheduler = new TestScheduler((actual, expected) => { + // asserting the two objects are equal + // e.g. using chai. + expect(actual).toEqual(expected); + }); + + const timeStamp = new Date().getTime(); + const msToLive = 15 * 60 * 1000; + const payload = { foo: 'bar' }; + const statusCodeSuccess = 200; + const statusCodeError = 404; + const errorMessage = 'not found'; + remoteDataMocks = { + RequestPending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.RequestPending, undefined, undefined, undefined), + ResponsePending: new RemoteData(undefined, msToLive, timeStamp, RequestEntryState.ResponsePending, undefined, undefined, undefined), + Success: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Success, undefined, payload, statusCodeSuccess), + SuccessStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.SuccessStale, undefined, payload, statusCodeSuccess), + Error: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.Error, errorMessage, undefined, statusCodeError), + ErrorStale: new RemoteData(timeStamp, msToLive, timeStamp, RequestEntryState.ErrorStale, errorMessage, undefined, statusCodeError), + }; + + return new TestService( + requestService, + rdbService, + objectCache, + halService, + ); + } + + beforeEach(() => { + service = initTestService(); + }); + + // todo: add specs (there were no search specs in original DataService suite!) +}); diff --git a/src/app/core/data/base/search-data.ts b/src/app/core/data/base/search-data.ts new file mode 100644 index 0000000000..226db8fe0d --- /dev/null +++ b/src/app/core/data/base/search-data.ts @@ -0,0 +1,145 @@ +/** + * 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 { CacheableObject } from '../../cache/cacheable-object.model'; +import { BaseDataService } from './base-data.service'; +import { Observable } from 'rxjs'; +import { filter, map } from 'rxjs/operators'; +import { hasNoValue, isNotEmpty } from '../../../shared/empty.util'; +import { FindListOptions } from '../find-list-options.model'; +import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { RemoteData } from '../remote-data'; +import { PaginatedList } from '../paginated-list.model'; +import { RequestService } from '../request.service'; +import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../cache/object-cache.service'; +import { HALEndpointService } from '../../shared/hal-endpoint.service'; + +/** + * Shorthand type for method to construct a search endpoint + */ +export type ConstructSearchEndpoint = (href: string, searchMethod: string) => string; + +/** + * Default method to construct a search endpoint + */ +export const constructSearchEndpointDefault = (href: string, searchMethod: string): string => `${href}/search/${searchMethod}`; + +/** + * Interface for a data service that can search for objects. + */ +export interface SearchData { + /** + * Make a new FindListRequest with given search method + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>} + * Return an observable that emits response from the server + */ + searchBy(searchMethod: string, options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>>; + + /** + * Create the HREF for a specific object's search method with given options object + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @return {Observable} + * Return an observable that emits created HREF + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + getSearchByHref?(searchMethod: string, options?: FindListOptions, ...linksToFollow: FollowLinkConfig[]): Observable; +} + +/** + * A DataService feature to search for objects. + * + * Concrete data services can use this feature by implementing {@link SearchData} + * and delegating its method to an inner instance of this class. + */ +export class SearchDataImpl extends BaseDataService implements SearchData { + /** + * @param linkPath + * @param requestService + * @param rdbService + * @param objectCache + * @param halService + * @param responseMsToLive + * @param constructSearchEndpoint an optional method to construct the search endpoint, passed as an argument so it can be + * modified without extending this class. Defaults to `${href}/search/${searchMethod}` + */ + constructor( + protected linkPath: string, + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected responseMsToLive: number, + private constructSearchEndpoint: ConstructSearchEndpoint = constructSearchEndpointDefault, + ) { + super(linkPath, requestService, rdbService, objectCache, halService, responseMsToLive); + if (hasNoValue(constructSearchEndpoint)) { + throw new Error(`SearchDataImpl initialized without a constructSearchEndpoint method (linkPath: ${linkPath})`); + } + } + + /** + * Make a new FindListRequest with given search method + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>} + * Return an observable that emits response from the server + */ + searchBy(searchMethod: string, options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { + const hrefObs = this.getSearchByHref(searchMethod, options, ...linksToFollow); + + return this.findAllByHref(hrefObs, undefined, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + + /** + * Create the HREF for a specific object's search method with given options object + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @return {Observable} + * Return an observable that emits created HREF + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + getSearchByHref(searchMethod: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable { + let result$: Observable; + const args = []; + + result$ = this.getSearchEndpoint(searchMethod); + + return result$.pipe(map((result: string) => this.buildHrefFromFindOptions(result, options, args, ...linksToFollow))); + } + + /** + * Return object search endpoint by given search method + * + * @param searchMethod The search method for the object + */ + private getSearchEndpoint(searchMethod: string): Observable { + return this.halService.getEndpoint(this.linkPath).pipe( + filter((href: string) => isNotEmpty(href)), + map(href => this.constructSearchEndpoint(href, searchMethod)), + ); + } +} From 42a2c3c7e29f82bf1c5ab94e5e241f42bc09bc7d Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Wed, 24 Aug 2022 14:53:46 +0200 Subject: [PATCH 052/119] 93803: Refactor existing data services --- .../collection-metadata.component.spec.ts | 14 +- .../collection-metadata.component.ts | 27 ++- .../breadcrumbs/dso-breadcrumb.resolver.ts | 13 +- .../browse-definition-data.service.spec.ts | 37 +--- .../browse/browse-definition-data.service.ts | 107 ++--------- src/app/core/config/config.service.spec.ts | 10 +- src/app/core/config/config.service.ts | 53 +----- .../submission-accesses-config.service.ts | 6 +- .../config/submission-forms-config.service.ts | 11 +- .../submission-uploads-config.service.ts | 11 +- src/app/core/core.module.ts | 4 + .../data/access-status-data.service.spec.ts | 2 +- .../core/data/access-status-data.service.ts | 23 +-- .../core/data/bitstream-data.service.spec.ts | 2 +- src/app/core/data/bitstream-data.service.ts | 124 ++++++++++-- .../bitstream-format-data.service.spec.ts | 6 +- .../data/bitstream-format-data.service.ts | 84 ++++++-- src/app/core/data/bundle-data.service.spec.ts | 3 - src/app/core/data/bundle-data.service.ts | 58 ++++-- .../core/data/collection-data.service.spec.ts | 2 +- src/app/core/data/collection-data.service.ts | 22 +-- src/app/core/data/comcol-data.service.spec.ts | 2 +- src/app/core/data/comcol-data.service.ts | 166 +++++++++++++++- src/app/core/data/community-data.service.ts | 10 +- .../data/configuration-data.service.spec.ts | 8 - .../core/data/configuration-data.service.ts | 35 +--- .../data/dso-redirect-data.service.spec.ts | 111 +++++------ .../core/data/dso-redirect-data.service.ts | 95 --------- src/app/core/data/dso-redirect.service.ts | 90 +++++++++ .../data/dspace-object-data.service.spec.ts | 8 - .../core/data/dspace-object-data.service.ts | 98 +--------- src/app/core/data/entity-type.service.ts | 72 +++++-- .../core/data/eperson-registration.service.ts | 8 +- .../core/data/external-source.service.spec.ts | 4 +- src/app/core/data/external-source.service.ts | 41 ++-- .../authorization-data.service.spec.ts | 10 +- .../authorization-data.service.ts | 44 +++-- .../feature-data.service.ts | 15 +- .../core/data/href-only-data.service.spec.ts | 8 +- src/app/core/data/href-only-data.service.ts | 40 +--- src/app/core/data/item-data.service.spec.ts | 12 +- src/app/core/data/item-data.service.ts | 141 ++++++++++++-- .../data/item-request-data.service.spec.ts | 2 +- .../core/data/item-request-data.service.ts | 31 +-- .../data/item-template-data.service.spec.ts | 78 ++++---- .../core/data/item-template-data.service.ts | 180 ++++-------------- .../data/metadata-field-data.service.spec.ts | 12 +- .../core/data/metadata-field-data.service.ts | 120 ++++++++++-- .../data/metadata-schema-data.service.spec.ts | 12 +- .../core/data/metadata-schema-data.service.ts | 84 ++++++-- .../persistent-identifier-data.service.ts | 28 +++ .../data/processes/process-data.service.ts | 41 ++-- .../data/processes/script-data.service.ts | 47 +++-- .../data/relationship-type.service.spec.ts | 18 +- .../core/data/relationship-type.service.ts | 118 ++++++------ .../core/data/relationship.service.spec.ts | 8 +- src/app/core/data/relationship.service.ts | 79 +++++--- src/app/core/data/root-data.service.spec.ts | 15 +- src/app/core/data/root-data.service.ts | 82 +------- src/app/core/data/site-data.service.spec.ts | 12 -- src/app/core/data/site-data.service.ts | 44 +++-- .../core/data/version-data.service.spec.ts | 25 +-- src/app/core/data/version-data.service.ts | 50 +++-- .../data/version-history-data.service.spec.ts | 10 +- .../core/data/version-history-data.service.ts | 25 +-- .../core/data/workflow-action-data.service.ts | 22 +-- .../core/eperson/eperson-data.service.spec.ts | 7 +- src/app/core/eperson/eperson-data.service.ts | 128 +++++++++++-- .../core/eperson/group-data.service.spec.ts | 9 +- src/app/core/eperson/group-data.service.ts | 70 ++++++- .../feedback/feedback-data.service.spec.ts | 8 - .../core/feedback/feedback-data.service.ts | 27 ++- src/app/core/orcid/orcid-auth.service.spec.ts | 11 +- src/app/core/orcid/orcid-auth.service.ts | 4 +- .../core/orcid/orcid-history-data.service.ts | 94 +-------- src/app/core/orcid/orcid-queue.service.ts | 73 ++----- .../researcher-profile.service.spec.ts | 68 +++---- .../profile/researcher-profile.service.ts | 180 ++++++++++-------- .../resource-policy.service.spec.ts | 76 +++----- .../resource-policy.service.ts | 100 +++------- src/app/core/shared/search/search.service.ts | 68 ++----- .../statistics/usage-report-data.service.ts | 47 ++--- .../resolver/submission-object.resolver.ts | 10 +- .../submission-cc-license-data.service.ts | 45 +++-- .../submission-cc-license-url-data.service.ts | 67 ++++--- .../submission-object-data.service.ts | 4 +- ...abulary-entry-details.data.service.spec.ts | 16 ++ .../vocabulary-entry-details.data.service.ts | 104 ++++++++++ .../vocabulary.data.service.spec.ts | 14 ++ .../vocabularies/vocabulary.data.service.ts | 70 +++++++ .../vocabularies/vocabulary.service.spec.ts | 33 +--- .../vocabularies/vocabulary.service.ts | 78 +------- .../workflowitem-data.service.spec.ts | 7 +- .../submission/workflowitem-data.service.ts | 75 ++++++-- .../workspaceitem-data.service.spec.ts | 7 +- .../submission/workspaceitem-data.service.ts | 86 +++++++-- .../tasks/claimed-task-data.service.spec.ts | 14 +- .../core/tasks/claimed-task-data.service.ts | 25 +-- .../core/tasks/pool-task-data.service.spec.ts | 15 +- src/app/core/tasks/pool-task-data.service.ts | 25 +-- src/app/core/tasks/tasks.service.spec.ts | 22 +-- src/app/core/tasks/tasks.service.ts | 66 ++++++- .../item-collection-mapper.component.ts | 1 - .../orcid-sync-settings.component.spec.ts | 12 +- .../orcid-sync-settings.component.ts | 4 +- src/app/lookup-by-id/lookup-by-id.module.ts | 4 +- src/app/lookup-by-id/lookup-guard.ts | 4 +- ...ile-page-researcher-form.component.spec.ts | 2 +- .../profile-page-researcher-form.component.ts | 21 +- ...med-task-actions-approve.component.spec.ts | 8 +- .../claimed-task-actions.component.ts | 13 +- ...sk-actions-edit-metadata.component.spec.ts | 8 +- ...imed-task-actions-reject.component.spec.ts | 8 +- ...k-actions-return-to-pool.component.spec.ts | 8 +- .../mydspace-actions-service.factory.ts | 4 +- .../mydspace-actions/mydspace-actions.ts | 11 +- .../mydspace-reloadable-actions.spec.ts | 16 +- .../mydspace-reloadable-actions.ts | 9 +- .../pool-task-actions.component.spec.ts | 10 +- .../pool-task/pool-task-actions.component.ts | 1 + .../item-select/item-select.component.spec.ts | 2 +- .../eperson-group-list.component.ts | 3 +- .../resource-policy-target.resolver.ts | 5 +- 123 files changed, 2487 insertions(+), 2200 deletions(-) delete mode 100644 src/app/core/data/dso-redirect-data.service.ts create mode 100644 src/app/core/data/dso-redirect.service.ts create mode 100644 src/app/core/data/persistent-identifier-data.service.ts create mode 100644 src/app/core/submission/vocabularies/vocabulary-entry-details.data.service.spec.ts create mode 100644 src/app/core/submission/vocabularies/vocabulary-entry-details.data.service.ts create mode 100644 src/app/core/submission/vocabularies/vocabulary.data.service.spec.ts create mode 100644 src/app/core/submission/vocabularies/vocabulary.data.service.ts diff --git a/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.spec.ts b/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.spec.ts index 2b473bf037..79e7a465e1 100644 --- a/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.spec.ts +++ b/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.spec.ts @@ -13,7 +13,7 @@ import { Item } from '../../../core/shared/item.model'; import { ItemTemplateDataService } from '../../../core/data/item-template-data.service'; import { Collection } from '../../../core/shared/collection.model'; import { RequestService } from '../../../core/data/request.service'; -import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; +import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; import { getCollectionItemTemplateRoute } from '../../collection-page-routing-paths'; describe('CollectionMetadataComponent', () => { @@ -39,8 +39,8 @@ describe('CollectionMetadataComponent', () => { const itemTemplateServiceStub = jasmine.createSpyObj('itemTemplateService', { findByCollectionID: createSuccessfulRemoteDataObject$(template), - create: createSuccessfulRemoteDataObject$(template), - deleteByCollectionID: observableOf(true), + createByCollectionID: createSuccessfulRemoteDataObject$(template), + delete: observableOf(true), getCollectionEndpoint: observableOf(collectionTemplateHref), }); @@ -91,12 +91,12 @@ describe('CollectionMetadataComponent', () => { describe('deleteItemTemplate', () => { beforeEach(() => { - (itemTemplateService.deleteByCollectionID as jasmine.Spy).and.returnValue(observableOf(true)); + (itemTemplateService.delete as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$({})); comp.deleteItemTemplate(); }); - it('should call ItemTemplateService.deleteByCollectionID', () => { - expect(itemTemplateService.deleteByCollectionID).toHaveBeenCalledWith(template, 'collection-id'); + it('should call ItemTemplateService.delete', () => { + expect(itemTemplateService.delete).toHaveBeenCalledWith(template.uuid); }); describe('when delete returns a success', () => { @@ -107,7 +107,7 @@ describe('CollectionMetadataComponent', () => { describe('when delete returns a failure', () => { beforeEach(() => { - (itemTemplateService.deleteByCollectionID as jasmine.Spy).and.returnValue(observableOf(false)); + (itemTemplateService.delete as jasmine.Spy).and.returnValue(createFailedRemoteDataObject$()); comp.deleteItemTemplate(); }); diff --git a/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts b/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts index d4396fce17..8e534a0829 100644 --- a/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts +++ b/src/app/collection-page/edit-collection-page/collection-metadata/collection-metadata.component.ts @@ -7,12 +7,14 @@ import { ItemTemplateDataService } from '../../../core/data/item-template-data.s import { combineLatest as combineLatestObservable, Observable } from 'rxjs'; import { RemoteData } from '../../../core/data/remote-data'; import { Item } from '../../../core/shared/item.model'; -import { getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; -import { switchMap } from 'rxjs/operators'; +import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; +import { map, switchMap } from 'rxjs/operators'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; import { RequestService } from '../../../core/data/request.service'; import { getCollectionItemTemplateRoute } from '../../collection-page-routing-paths'; +import { NoContent } from '../../../core/shared/NoContent.model'; +import { hasValue } from '../../../shared/empty.util'; /** * Component for editing a collection's metadata @@ -65,7 +67,7 @@ export class CollectionMetadataComponent extends ComcolMetadataComponent this.itemTemplateService.create(new Item(), collection.uuid).pipe( + switchMap((collection: Collection) => this.itemTemplateService.createByCollectionID(new Item(), collection.uuid).pipe( getFirstSucceededRemoteDataPayload(), )), ); @@ -83,18 +85,15 @@ export class CollectionMetadataComponent extends ComcolMetadataComponent this.itemTemplateService.findByCollectionID(collection.uuid).pipe( - getFirstSucceededRemoteDataPayload(), - )), - ); - combineLatestObservable(collection$, template$).pipe( - switchMap(([collection, template]) => { - return this.itemTemplateService.deleteByCollectionID(template, collection.uuid); - }) + switchMap((collection: Collection) => this.itemTemplateService.findByCollectionID(collection.uuid)), + getFirstSucceededRemoteDataPayload(), + switchMap((template) => { + return this.itemTemplateService.delete(template.uuid); + }), + getFirstCompletedRemoteData(), + map((response: RemoteData) => hasValue(response) && response.hasSucceeded), ).subscribe((success: boolean) => { if (success) { this.notificationsService.success(null, this.translate.get('collection.edit.template.notifications.delete.success')); diff --git a/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts index 650bbd3301..8be4e5e099 100644 --- a/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts @@ -2,23 +2,26 @@ import { BreadcrumbConfig } from '../../breadcrumbs/breadcrumb/breadcrumb-config import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { DSOBreadcrumbsService } from './dso-breadcrumbs.service'; -import { DataService } from '../data/data.service'; -import { getRemoteDataPayload, getFirstCompletedRemoteData } from '../shared/operators'; +import { getFirstCompletedRemoteData, getRemoteDataPayload } from '../shared/operators'; import { map } from 'rxjs/operators'; import { Observable } from 'rxjs'; import { DSpaceObject } from '../shared/dspace-object.model'; import { ChildHALResource } from '../shared/child-hal-resource.model'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { hasValue } from '../../shared/empty.util'; +import { IdentifiableDataService } from '../data/base/identifiable-data.service'; /** * The class that resolves the BreadcrumbConfig object for a DSpaceObject */ @Injectable({ - providedIn: 'root' + providedIn: 'root', }) export abstract class DSOBreadcrumbResolver implements Resolve> { - constructor(protected breadcrumbService: DSOBreadcrumbsService, protected dataService: DataService) { + protected constructor( + protected breadcrumbService: DSOBreadcrumbsService, + protected dataService: IdentifiableDataService, + ) { } /** @@ -36,7 +39,7 @@ export abstract class DSOBreadcrumbResolver { let service: BrowseDefinitionDataService; - const dataServiceImplSpy = jasmine.createSpyObj('dataService', { + const findAllDataSpy = jasmine.createSpyObj('findAllData', { findAll: EMPTY, - findByHref: EMPTY, - findAllByHref: EMPTY, - findById: EMPTY, }); - const hrefAll = 'https://rest.api/server/api/discover/browses'; - const hrefSingle = 'https://rest.api/server/api/discover/browses/author'; - const id = 'author'; const options = new FindListOptions(); const linksToFollow = [ followLink('entries'), @@ -21,35 +15,14 @@ describe(`BrowseDefinitionDataService`, () => { ]; beforeEach(() => { - service = new BrowseDefinitionDataService(null, null, null, null, null, null, null, null); - (service as any).dataService = dataServiceImplSpy; + service = new BrowseDefinitionDataService(null, null, null, null); + (service as any).findAllData = findAllDataSpy; }); describe(`findAll`, () => { - it(`should call findAll on DataServiceImpl`, () => { + it(`should call findAll on findAllData`, () => { service.findAll(options, true, false, ...linksToFollow); - expect(dataServiceImplSpy.findAll).toHaveBeenCalledWith(options, true, false, ...linksToFollow); - }); - }); - - describe(`findByHref`, () => { - it(`should call findByHref on DataServiceImpl`, () => { - service.findByHref(hrefSingle, true, false, ...linksToFollow); - expect(dataServiceImplSpy.findByHref).toHaveBeenCalledWith(hrefSingle, true, false, ...linksToFollow); - }); - }); - - describe(`findAllByHref`, () => { - it(`should call findAllByHref on DataServiceImpl`, () => { - service.findAllByHref(hrefAll, options, true, false, ...linksToFollow); - expect(dataServiceImplSpy.findAllByHref).toHaveBeenCalledWith(hrefAll, options, true, false, ...linksToFollow); - }); - }); - - describe(`findById`, () => { - it(`should call findById on DataServiceImpl`, () => { - service.findAllByHref(id, options, true, false, ...linksToFollow); - expect(dataServiceImplSpy.findAllByHref).toHaveBeenCalledWith(id, options, true, false, ...linksToFollow); + expect(findAllDataSpy.findAll).toHaveBeenCalledWith(options, true, false, ...linksToFollow); }); }); }); diff --git a/src/app/core/browse/browse-definition-data.service.ts b/src/app/core/browse/browse-definition-data.service.ts index 6a27bb3f7a..3c9f6d6983 100644 --- a/src/app/core/browse/browse-definition-data.service.ts +++ b/src/app/core/browse/browse-definition-data.service.ts @@ -1,125 +1,40 @@ -/* eslint-disable max-classes-per-file */ import { Injectable } from '@angular/core'; import { dataService } from '../cache/builders/build-decorators'; import { BROWSE_DEFINITION } from '../shared/browse-definition.resource-type'; -import { DataService } from '../data/data.service'; import { BrowseDefinition } from '../shared/browse-definition.model'; import { RequestService } from '../data/request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { Observable } from 'rxjs'; import { RemoteData } from '../data/remote-data'; import { PaginatedList } from '../data/paginated-list.model'; -import { CoreState } from '../core-state.model'; import { FindListOptions } from '../data/find-list-options.model'; - - -class DataServiceImpl extends DataService { - protected linkPath = 'browses'; - - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - super(); - } -} +import { IdentifiableDataService } from '../data/base/identifiable-data.service'; +import { FindAllData, FindAllDataImpl } from '../data/base/find-all-data'; @Injectable({ - providedIn: 'root' + providedIn: 'root', }) @dataService(BROWSE_DEFINITION) -export class BrowseDefinitionDataService { - /** - * A private DataService instance to delegate specific methods to. - */ - private dataService: DataServiceImpl; +export class BrowseDefinitionDataService extends IdentifiableDataService implements FindAllData { + private findAllData: FindAllDataImpl; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); + ) { + super('browses', requestService, rdbService, objectCache, halService); + + this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); } - /** - * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded - * info should be added to the objects - * - * @param options Find list options object - * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's - * no valid cached version. Defaults to true - * @param reRequestOnStale Whether or not the request should automatically be re- - * requested after the response becomes stale - * @param linksToFollow List of {@link FollowLinkConfig} that indicate which - * {@link HALLink}s should be automatically resolved - * @return {Observable>>} - * Return an observable that emits object list - */ + findAll(options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.dataService.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); - } - - /** - * Returns an observable of {@link RemoteData} of an {@link BrowseDefinition}, based on an href, with a list of {@link FollowLinkConfig}, - * to automatically resolve {@link HALLink}s of the {@link BrowseDefinition} - * @param href The url of {@link BrowseDefinition} we want to retrieve - * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's - * no valid cached version. Defaults to true - * @param reRequestOnStale Whether or not the request should automatically be re- - * requested after the response becomes stale - * @param linksToFollow List of {@link FollowLinkConfig} that indicate which - * {@link HALLink}s should be automatically resolved - */ - findByHref(href: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { - return this.dataService.findByHref(href, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); - } - - /** - * Returns a list of observables of {@link RemoteData} of {@link BrowseDefinition}s, based on an href, with a list of {@link FollowLinkConfig}, - * to automatically resolve {@link HALLink}s of the {@link BrowseDefinition} - * @param href The url of object we want to retrieve - * @param findListOptions Find list options object - * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's - * no valid cached version. Defaults to true - * @param reRequestOnStale Whether or not the request should automatically be re- - * requested after the response becomes stale - * @param linksToFollow List of {@link FollowLinkConfig} that indicate which - * {@link HALLink}s should be automatically resolved - */ - findAllByHref(href: string, findListOptions: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.dataService.findAllByHref(href, findListOptions, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); - } - - /** - * Returns an observable of {@link RemoteData} of an object, based on its ID, with a list of - * {@link FollowLinkConfig}, to automatically resolve {@link HALLink}s of the object - * @param id ID of object we want to retrieve - * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's - * no valid cached version. Defaults to true - * @param reRequestOnStale Whether or not the request should automatically be re- - * requested after the response becomes stale - * @param linksToFollow List of {@link FollowLinkConfig} that indicate which - * {@link HALLink}s should be automatically resolved - */ - findById(id: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { - return this.dataService.findById(id, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } } diff --git a/src/app/core/config/config.service.spec.ts b/src/app/core/config/config.service.spec.ts index be354ddc6f..ead7c7e005 100644 --- a/src/app/core/config/config.service.spec.ts +++ b/src/app/core/config/config.service.spec.ts @@ -9,6 +9,7 @@ import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-servic import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { getMockRemoteDataBuildService } from '../../shared/mocks/remote-data-build.service.mock'; import { FindListOptions } from '../data/find-list-options.model'; +import { ObjectCacheService } from '../cache/object-cache.service'; const LINK_NAME = 'test'; const BROWSE = 'search/findByCollection'; @@ -20,8 +21,10 @@ class TestService extends ConfigService { constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected halService: HALEndpointService) { - super(requestService, rdbService, null, null, halService, null, null, null, BROWSE); + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + ) { + super(BROWSE, requestService, rdbService, objectCache, halService); } } @@ -45,7 +48,8 @@ describe('ConfigService', () => { return new TestService( requestService, rdbService, - halService + null, + halService, ); } diff --git a/src/app/core/config/config.service.ts b/src/app/core/config/config.service.ts index 3bc87c8de0..f0b55f5351 100644 --- a/src/app/core/config/config.service.ts +++ b/src/app/core/config/config.service.ts @@ -1,59 +1,14 @@ -/* eslint-disable max-classes-per-file */ import { Observable } from 'rxjs'; -import { RequestService } from '../data/request.service'; -import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ConfigObject } from './models/config.model'; import { RemoteData } from '../data/remote-data'; -import { DataService } from '../data/data.service'; -import { Store } from '@ngrx/store'; -import { ObjectCacheService } from '../cache/object-cache.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { getFirstCompletedRemoteData } from '../shared/operators'; import { map } from 'rxjs/operators'; -import { CoreState } from '../core-state.model'; - -class DataServiceImpl extends DataService { - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer, - protected linkPath: string - ) { - super(); - } -} - -export abstract class ConfigService { - /** - * A private DataService instance to delegate specific methods to. - */ - private dataService: DataServiceImpl; - - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer, - protected linkPath: string - ) { - this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator, this.linkPath); - } +import { BaseDataService } from '../data/base/base-data.service'; +export abstract class ConfigService extends BaseDataService { public findByHref(href: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { - return this.dataService.findByHref(href, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow).pipe( + return super.findByHref(href, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow).pipe( getFirstCompletedRemoteData(), map((rd: RemoteData) => { if (rd.hasFailed) { @@ -61,7 +16,7 @@ export abstract class ConfigService { } else { return rd; } - }) + }), ); } } diff --git a/src/app/core/config/submission-accesses-config.service.ts b/src/app/core/config/submission-accesses-config.service.ts index 7c2d2046d9..4841e2e39d 100644 --- a/src/app/core/config/submission-accesses-config.service.ts +++ b/src/app/core/config/submission-accesses-config.service.ts @@ -26,14 +26,10 @@ export class SubmissionAccessesConfigService extends ConfigService { constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer ) { - super(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator, 'submissionaccessoptions'); + super('submissionaccessoptions', requestService, rdbService, objectCache, halService); } findByHref(href: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow): Observable> { diff --git a/src/app/core/config/submission-forms-config.service.ts b/src/app/core/config/submission-forms-config.service.ts index 1db5c2fa01..abd3332cae 100644 --- a/src/app/core/config/submission-forms-config.service.ts +++ b/src/app/core/config/submission-forms-config.service.ts @@ -4,11 +4,7 @@ import { ConfigService } from './config.service'; import { RequestService } from '../data/request.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { ObjectCacheService } from '../cache/object-cache.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; import { ConfigObject } from './models/config.model'; import { dataService } from '../cache/builders/build-decorators'; import { SUBMISSION_FORMS_TYPE } from './models/config-type'; @@ -16,7 +12,6 @@ import { SubmissionFormsModel } from './models/config-submission-forms.model'; import { RemoteData } from '../data/remote-data'; import { Observable } from 'rxjs'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; -import { CoreState } from '../core-state.model'; @Injectable() @dataService(SUBMISSION_FORMS_TYPE) @@ -24,14 +19,10 @@ export class SubmissionFormsConfigService extends ConfigService { constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer ) { - super(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator, 'submissionforms'); + super('submissionforms', requestService, rdbService, objectCache, halService); } public findByHref(href: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { diff --git a/src/app/core/config/submission-uploads-config.service.ts b/src/app/core/config/submission-uploads-config.service.ts index 8ad17749bd..b166b895ac 100644 --- a/src/app/core/config/submission-uploads-config.service.ts +++ b/src/app/core/config/submission-uploads-config.service.ts @@ -6,16 +6,11 @@ import { ObjectCacheService } from '../cache/object-cache.service'; import { dataService } from '../cache/builders/build-decorators'; import { SUBMISSION_UPLOADS_TYPE } from './models/config-type'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; import { ConfigObject } from './models/config.model'; import { SubmissionUploadsModel } from './models/config-submission-uploads.model'; import { RemoteData } from '../data/remote-data'; import { Observable } from 'rxjs'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; -import { CoreState } from '../core-state.model'; /** * Provides methods to retrieve, from REST server, bitstream access conditions configurations applicable during the submission process. @@ -26,14 +21,10 @@ export class SubmissionUploadsConfigService extends ConfigService { constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer ) { - super(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator, 'submissionuploads'); + super('submissionuploads', requestService, rdbService, objectCache, halService); } findByHref(href: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow): Observable> { diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index b16930e819..80576c03b7 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -178,6 +178,8 @@ import { OrcidHistoryDataService } from './orcid/orcid-history-data.service'; import { OrcidQueue } from './orcid/model/orcid-queue.model'; import { OrcidHistory } from './orcid/model/orcid-history.model'; import { OrcidAuthService } from './orcid/orcid-auth.service'; +import { VocabularyDataService } from './submission/vocabularies/vocabulary.data.service'; +import { VocabularyEntryDetailsDataService } from './submission/vocabularies/vocabulary-entry-details.data.service'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -300,6 +302,8 @@ const PROVIDERS = [ FilteredDiscoveryPageResponseParsingService, { provide: NativeWindowService, useFactory: NativeWindowFactory }, VocabularyService, + VocabularyDataService, + VocabularyEntryDetailsDataService, VocabularyTreeviewService, SequenceService, GroupDataService, diff --git a/src/app/core/data/access-status-data.service.spec.ts b/src/app/core/data/access-status-data.service.spec.ts index d81b9384f3..18b8cb5d65 100644 --- a/src/app/core/data/access-status-data.service.spec.ts +++ b/src/app/core/data/access-status-data.service.spec.ts @@ -76,6 +76,6 @@ describe('AccessStatusDataService', () => { }); halService = new HALEndpointServiceStub(url); notificationsService = new NotificationsServiceStub(); - service = new AccessStatusDataService(null, halService, null, notificationsService, objectCache, rdbService, requestService, null); + service = new AccessStatusDataService(requestService, rdbService, objectCache, halService); } }); diff --git a/src/app/core/data/access-status-data.service.ts b/src/app/core/data/access-status-data.service.ts index 09843fac9b..2b1dfd319a 100644 --- a/src/app/core/data/access-status-data.service.ts +++ b/src/app/core/data/access-status-data.service.ts @@ -1,38 +1,27 @@ -import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; import { dataService } from '../cache/builders/build-decorators'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { DataService } from './data.service'; import { RequestService } from './request.service'; -import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; -import { CoreState } from '../core-state.model'; import { AccessStatusObject } from 'src/app/shared/object-list/access-status-badge/access-status.model'; import { ACCESS_STATUS } from 'src/app/shared/object-list/access-status-badge/access-status.resource-type'; import { Observable } from 'rxjs'; import { RemoteData } from './remote-data'; import { Item } from '../shared/item.model'; +import { BaseDataService } from './base/base-data.service'; @Injectable() @dataService(ACCESS_STATUS) -export class AccessStatusDataService extends DataService { - - protected linkPath = 'accessStatus'; +export class AccessStatusDataService extends BaseDataService { constructor( - protected comparator: DefaultChangeAnalyzer, - protected halService: HALEndpointService, - protected http: HttpClient, - protected notificationsService: NotificationsService, - protected objectCache: ObjectCacheService, - protected rdbService: RemoteDataBuildService, protected requestService: RequestService, - protected store: Store, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, ) { - super(); + super('accessStatus', requestService, rdbService, objectCache, halService); } /** diff --git a/src/app/core/data/bitstream-data.service.spec.ts b/src/app/core/data/bitstream-data.service.spec.ts index df170397f8..07d02f84ae 100644 --- a/src/app/core/data/bitstream-data.service.spec.ts +++ b/src/app/core/data/bitstream-data.service.spec.ts @@ -47,7 +47,7 @@ describe('BitstreamDataService', () => { }); rdbService = getMockRemoteDataBuildService(); - service = new BitstreamDataService(requestService, rdbService, null, objectCache, halService, null, null, null, null, bitstreamFormatService); + service = new BitstreamDataService(requestService, rdbService, objectCache, halService, null, bitstreamFormatService, null, null); }); describe('when updating the bitstream\'s format', () => { diff --git a/src/app/core/data/bitstream-data.service.ts b/src/app/core/data/bitstream-data.service.ts index 16f2cc16c2..ab0a4c301c 100644 --- a/src/app/core/data/bitstream-data.service.ts +++ b/src/app/core/data/bitstream-data.service.ts @@ -1,10 +1,8 @@ -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; import { combineLatest as observableCombineLatest, Observable } from 'rxjs'; import { map, switchMap, take } from 'rxjs/operators'; import { hasValue } from '../../shared/empty.util'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { dataService } from '../cache/builders/build-decorators'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; @@ -15,8 +13,6 @@ import { Bundle } from '../shared/bundle.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { Item } from '../shared/item.model'; import { BundleDataService } from './bundle-data.service'; -import { DataService } from './data.service'; -import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; import { buildPaginatedList, PaginatedList } from './paginated-list.model'; import { RemoteData } from './remote-data'; import { PutRequest } from './request.models'; @@ -28,36 +24,43 @@ import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.util import { PageInfo } from '../shared/page-info.model'; import { RequestParam } from '../cache/models/request-param.model'; import { sendRequest } from '../shared/request.operators'; -import { CoreState } from '../core-state.model'; import { FindListOptions } from './find-list-options.model'; +import { SearchData, SearchDataImpl } from './base/search-data'; +import { PatchData, PatchDataImpl } from './base/patch-data'; +import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; +import { RestRequestMethod } from './rest-request-method'; +import { DeleteData, DeleteDataImpl } from './base/delete-data'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { NoContent } from '../shared/NoContent.model'; +import { IdentifiableDataService } from './base/identifiable-data.service'; /** * A service to retrieve {@link Bitstream}s from the REST API */ @Injectable({ - providedIn: 'root' + providedIn: 'root', }) @dataService(BITSTREAM) -export class BitstreamDataService extends DataService { - - /** - * The HAL path to the bitstream endpoint - */ - protected linkPath = 'bitstreams'; +export class BitstreamDataService extends IdentifiableDataService implements SearchData, PatchData, DeleteData { + private searchData: SearchDataImpl; + private patchData: PatchDataImpl; + private deleteData: DeleteDataImpl; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DSOChangeAnalyzer, protected bundleService: BundleDataService, - protected bitstreamFormatService: BitstreamFormatDataService + protected bitstreamFormatService: BitstreamFormatDataService, + protected comparator: DSOChangeAnalyzer, + protected notificationsService: NotificationsService, ) { - super(); + super('bitstreams', requestService, rdbService, objectCache, halService); + + this.searchData = new SearchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + this.patchData = new PatchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, comparator, this.responseMsToLive, this.constructIdEndpoint); + this.deleteData = new DeleteDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive, this.constructIdEndpoint); } /** @@ -180,8 +183,89 @@ export class BitstreamDataService extends DataService { hrefObs, useCachedVersionIfAvailable, reRequestOnStale, - ...linksToFollow + ...linksToFollow, ); } + /** + * Create the HREF for a specific object's search method with given options object + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @return {Observable} + * Return an observable that emits created HREF + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + public getSearchByHref(searchMethod: string, options?: FindListOptions, ...linksToFollow: FollowLinkConfig[]): Observable { + return this.searchData.getSearchByHref(searchMethod, options, ...linksToFollow); + } + + /** + * Make a new FindListRequest with given search method + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>} + * Return an observable that emits response from the server + */ + public searchBy(searchMethod: string, options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.searchData.searchBy(searchMethod, options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + + /** + * Commit current object changes to the server + * @param method The RestRequestMethod for which de server sync buffer should be committed + */ + public commitUpdates(method?: RestRequestMethod): void { + this.patchData.commitUpdates(method); + } + + /** + * Send a patch request for a specified object + * @param {T} object The object to send a patch request for + * @param {Operation[]} operations The patch operations to be performed + */ + public patch(object: Bitstream, operations: []): Observable> { + return this.patchData.patch(object, operations); + } + + /** + * Add a new patch to the object cache + * The patch is derived from the differences between the given object and its version in the object cache + * @param {DSpaceObject} object The given object + */ + public update(object: Bitstream): Observable> { + return this.patchData.update(object); + } + + /** + * Delete an existing object on the server + * @param objectId The id of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + */ + delete(objectId: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.delete(objectId, copyVirtualMetadata); + } + + /** + * Delete an existing object on the server + * @param href The self link of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + * Only emits once all request related to the DSO has been invalidated. + */ + deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.deleteByHref(href, copyVirtualMetadata); + } } diff --git a/src/app/core/data/bitstream-format-data.service.spec.ts b/src/app/core/data/bitstream-format-data.service.spec.ts index 30ef79ee6d..d1c48ab82e 100644 --- a/src/app/core/data/bitstream-format-data.service.spec.ts +++ b/src/app/core/data/bitstream-format-data.service.spec.ts @@ -50,8 +50,6 @@ describe('BitstreamFormatDataService', () => { } as HALEndpointService; const notificationsService = {} as NotificationsService; - const http = {} as HttpClient; - const comparator = {} as any; let rd; let rdbService: RemoteDataBuildService; @@ -65,12 +63,10 @@ describe('BitstreamFormatDataService', () => { return new BitstreamFormatDataService( requestService, rdbService, - store, objectCache, halService, notificationsService, - http, - comparator + store, ); } diff --git a/src/app/core/data/bitstream-format-data.service.ts b/src/app/core/data/bitstream-format-data.service.ts index 1af3db8103..72d14fbf68 100644 --- a/src/app/core/data/bitstream-format-data.service.ts +++ b/src/app/core/data/bitstream-format-data.service.ts @@ -1,13 +1,8 @@ -import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { createSelector, select, Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { distinctUntilChanged, map, tap } from 'rxjs/operators'; -import { - BitstreamFormatsRegistryDeselectAction, - BitstreamFormatsRegistryDeselectAllAction, - BitstreamFormatsRegistrySelectAction -} from '../../admin/admin-registries/bitstream-formats/bitstream-format.actions'; +import { BitstreamFormatsRegistryDeselectAction, BitstreamFormatsRegistryDeselectAllAction, BitstreamFormatsRegistrySelectAction } from '../../admin/admin-registries/bitstream-formats/bitstream-format.actions'; import { BitstreamFormatRegistryState } from '../../admin/admin-registries/bitstream-formats/bitstream-format.reducers'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { dataService } from '../cache/builders/build-decorators'; @@ -18,40 +13,52 @@ import { BitstreamFormat } from '../shared/bitstream-format.model'; import { BITSTREAM_FORMAT } from '../shared/bitstream-format.resource-type'; import { Bitstream } from '../shared/bitstream.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { DataService } from './data.service'; -import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; import { RemoteData } from './remote-data'; import { PostRequest, PutRequest } from './request.models'; import { RequestService } from './request.service'; import { sendRequest } from '../shared/request.operators'; import { CoreState } from '../core-state.model'; +import { IdentifiableDataService } from './base/identifiable-data.service'; +import { DeleteData, DeleteDataImpl } from './base/delete-data'; +import { FindAllData, FindAllDataImpl } from './base/find-all-data'; +import { FollowLinkConfig } from 'src/app/shared/utils/follow-link-config.model'; +import { FindListOptions } from './find-list-options.model'; +import { PaginatedList } from './paginated-list.model'; +import { NoContent } from '../shared/NoContent.model'; const bitstreamFormatsStateSelector = createSelector( coreSelector, - (state: CoreState) => state.bitstreamFormats + (state: CoreState) => state.bitstreamFormats, +); +const selectedBitstreamFormatSelector = createSelector( + bitstreamFormatsStateSelector, + (bitstreamFormatRegistryState: BitstreamFormatRegistryState) => bitstreamFormatRegistryState.selectedBitstreamFormats, ); -const selectedBitstreamFormatSelector = createSelector(bitstreamFormatsStateSelector, - (bitstreamFormatRegistryState: BitstreamFormatRegistryState) => bitstreamFormatRegistryState.selectedBitstreamFormats); /** * A service responsible for fetching/sending data from/to the REST API on the bitstreamformats endpoint */ @Injectable() @dataService(BITSTREAM_FORMAT) -export class BitstreamFormatDataService extends DataService { +export class BitstreamFormatDataService extends IdentifiableDataService implements FindAllData, DeleteData { protected linkPath = 'bitstreamformats'; + private findAllData: FindAllDataImpl; + private deleteData: DeleteDataImpl; + constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - super(); + protected store: Store, + ) { + super('bitstreamformats', requestService, rdbService, objectCache, halService); + + this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + this.deleteData = new DeleteDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive, this.constructIdEndpoint); } /** @@ -60,7 +67,7 @@ export class BitstreamFormatDataService extends DataService { */ public getUpdateEndpoint(formatId: string): Observable { return this.getBrowseEndpoint().pipe( - map((endpoint: string) => this.getIDHref(endpoint, formatId)) + map((endpoint: string) => this.getIDHref(endpoint, formatId)), ); } @@ -147,4 +154,47 @@ export class BitstreamFormatDataService extends DataService { findByBitstream(bitstream: Bitstream): Observable> { return this.findByHref(bitstream._links.format.href); } + + /** + * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded + * info should be added to the objects + * + * @param options Find list options object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>>} + * Return an observable that emits object list + */ + findAll(options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + + /** + * Delete an existing object on the server + * @param objectId The id of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + */ + delete(objectId: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.delete(objectId, copyVirtualMetadata); + } + + /** + * Delete an existing object on the server + * @param href The self link of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + * Only emits once all request related to the DSO has been invalidated. + */ + deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.deleteByHref(href, copyVirtualMetadata); + } } diff --git a/src/app/core/data/bundle-data.service.spec.ts b/src/app/core/data/bundle-data.service.spec.ts index 12eec9e33d..80bf7c281c 100644 --- a/src/app/core/data/bundle-data.service.spec.ts +++ b/src/app/core/data/bundle-data.service.spec.ts @@ -64,9 +64,6 @@ describe('BundleDataService', () => { store, objectCache, halService, - notificationsService, - http, - comparator, ); } diff --git a/src/app/core/data/bundle-data.service.ts b/src/app/core/data/bundle-data.service.ts index fa5ee51b45..bc559b4b65 100644 --- a/src/app/core/data/bundle-data.service.ts +++ b/src/app/core/data/bundle-data.service.ts @@ -1,10 +1,7 @@ -import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { map, switchMap, take } from 'rxjs/operators'; import { hasValue } from '../../shared/empty.util'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { dataService } from '../cache/builders/build-decorators'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; @@ -13,8 +10,6 @@ import { Bundle } from '../shared/bundle.model'; import { BUNDLE } from '../shared/bundle.resource-type'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { Item } from '../shared/item.model'; -import { DataService } from './data.service'; -import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; import { PaginatedList } from './paginated-list.model'; import { RemoteData } from './remote-data'; import { GetRequest } from './request.models'; @@ -22,30 +17,35 @@ import { RequestService } from './request.service'; import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; import { Bitstream } from '../shared/bitstream.model'; import { RequestEntryState } from './request-entry-state.model'; -import { CoreState } from '../core-state.model'; import { FindListOptions } from './find-list-options.model'; +import { IdentifiableDataService } from './base/identifiable-data.service'; +import { PatchData, PatchDataImpl } from './base/patch-data'; +import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; +import { RestRequestMethod } from './rest-request-method'; +import { Operation } from 'fast-json-patch'; /** * A service to retrieve {@link Bundle}s from the REST API */ @Injectable( - {providedIn: 'root'} + { providedIn: 'root' }, ) @dataService(BUNDLE) -export class BundleDataService extends DataService { - protected linkPath = 'bundles'; - protected bitstreamsEndpoint = 'bitstreams'; +export class BundleDataService extends IdentifiableDataService implements PatchData { + private bitstreamsEndpoint = 'bitstreams'; + + private patchData: PatchDataImpl; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - super(); + protected comparator: DSOChangeAnalyzer, + ) { + super('bundles', requestService, rdbService, objectCache, halService); + + this.patchData = new PatchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, comparator, this.responseMsToLive, this.constructIdEndpoint); } /** @@ -133,7 +133,7 @@ export class BundleDataService extends DataService { const hrefObs = this.getBitstreamsEndpoint(bundleId, searchOptions); hrefObs.pipe( - take(1) + take(1), ).subscribe((href) => { const request = new GetRequest(this.requestService.generateRequestId(), href); this.requestService.send(request, true); @@ -141,4 +141,30 @@ export class BundleDataService extends DataService { return this.rdbService.buildList(hrefObs, ...linksToFollow); } + + /** + * Commit current object changes to the server + * @param method The RestRequestMethod for which de server sync buffer should be committed + */ + public commitUpdates(method?: RestRequestMethod): void { + this.patchData.commitUpdates(method); + } + + /** + * Send a patch request for a specified object + * @param {T} object The object to send a patch request for + * @param {Operation[]} operations The patch operations to be performed + */ + public patch(object: Bundle, operations: Operation[]): Observable> { + return this.patchData.patch(object, operations); + } + + /** + * Add a new patch to the object cache + * The patch is derived from the differences between the given object and its version in the object cache + * @param {DSpaceObject} object The given object + */ + public update(object: Bundle): Observable> { + return this.patchData.update(object); + } } diff --git a/src/app/core/data/collection-data.service.spec.ts b/src/app/core/data/collection-data.service.spec.ts index 031e5ecf47..6d43d5475c 100644 --- a/src/app/core/data/collection-data.service.spec.ts +++ b/src/app/core/data/collection-data.service.spec.ts @@ -201,7 +201,7 @@ describe('CollectionDataService', () => { notificationsService = new NotificationsServiceStub(); translate = getMockTranslateService(); - service = new CollectionDataService(requestService, rdbService, null, null, objectCache, halService, notificationsService, null, null, null, translate); + service = new CollectionDataService(requestService, rdbService, objectCache, halService, null, notificationsService, null, null, translate); } }); diff --git a/src/app/core/data/collection-data.service.ts b/src/app/core/data/collection-data.service.ts index c243b49d3f..c9ebc0e74f 100644 --- a/src/app/core/data/collection-data.service.ts +++ b/src/app/core/data/collection-data.service.ts @@ -1,6 +1,5 @@ -import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; import { Observable } from 'rxjs'; import { filter, map, switchMap, take } from 'rxjs/operators'; @@ -33,30 +32,27 @@ import { import { RequestService } from './request.service'; import { BitstreamDataService } from './bitstream-data.service'; import { RestRequest } from './rest-request.model'; -import { CoreState } from '../core-state.model'; import { FindListOptions } from './find-list-options.model'; +import { Community } from '../shared/community.model'; @Injectable() @dataService(COLLECTION) export class CollectionDataService extends ComColDataService { - protected linkPath = 'collections'; protected errorTitle = 'collection.source.update.notifications.error.title'; protected contentSourceError = 'collection.source.update.notifications.error.content'; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, - protected cds: CommunityDataService, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, + protected comparator: DSOChangeAnalyzer, protected notificationsService: NotificationsService, - protected http: HttpClient, protected bitstreamDataService: BitstreamDataService, - protected comparator: DSOChangeAnalyzer, - protected translate: TranslateService + protected communityDataService: CommunityDataService, + protected translate: TranslateService, ) { - super(); + super('collections', requestService, rdbService, objectCache, halService, comparator, notificationsService, bitstreamDataService); } /** @@ -289,10 +285,10 @@ export class CollectionDataService extends ComColDataService { protected getScopeCommunityHref(options: FindListOptions) { - return this.cds.getEndpoint().pipe( - map((endpoint: string) => this.cds.getIDHref(endpoint, options.scopeID)), + return this.communityDataService.getEndpoint().pipe( + map((endpoint: string) => this.communityDataService.getIDHref(endpoint, options.scopeID)), filter((href: string) => isNotEmpty(href)), - take(1) + take(1), ); } } diff --git a/src/app/core/data/comcol-data.service.spec.ts b/src/app/core/data/comcol-data.service.spec.ts index dffc97f294..758cbad97a 100644 --- a/src/app/core/data/comcol-data.service.spec.ts +++ b/src/app/core/data/comcol-data.service.spec.ts @@ -47,7 +47,7 @@ class TestService extends ComColDataService { protected comparator: DSOChangeAnalyzer, protected linkPath: string ) { - super(); + super('something', requestService, rdbService, objectCache, halService, comparator, notificationsService, bitstreamDataService); } protected getFindByParentHref(parentUUID: string): Observable { diff --git a/src/app/core/data/comcol-data.service.ts b/src/app/core/data/comcol-data.service.ts index 01cd18df0c..1b1ac3b27b 100644 --- a/src/app/core/data/comcol-data.service.ts +++ b/src/app/core/data/comcol-data.service.ts @@ -4,7 +4,6 @@ import { hasValue, isEmpty, isNotEmpty } from '../../shared/empty.util'; import { ObjectCacheService } from '../cache/object-cache.service'; import { Community } from '../shared/community.model'; import { HALLink } from '../shared/hal-link.model'; -import { DataService } from './data.service'; import { PaginatedList } from './paginated-list.model'; import { RemoteData } from './remote-data'; import { HALEndpointService } from '../shared/hal-endpoint.service'; @@ -17,11 +16,44 @@ import { createFailedRemoteDataObject$ } from '../../shared/remote-data.utils'; import { URLCombiner } from '../url-combiner/url-combiner'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { FindListOptions } from './find-list-options.model'; +import { IdentifiableDataService } from './base/identifiable-data.service'; +import { PatchData, PatchDataImpl } from './base/patch-data'; +import { DeleteData, DeleteDataImpl } from './base/delete-data'; +import { FindAllData, FindAllDataImpl } from './base/find-all-data'; +import { SearchData, SearchDataImpl } from './base/search-data'; +import { RestRequestMethod } from './rest-request-method'; +import { CreateData, CreateDataImpl } from './base/create-data'; +import { RequestParam } from '../cache/models/request-param.model'; +import { RequestService } from './request.service'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; -export abstract class ComColDataService extends DataService { - protected abstract objectCache: ObjectCacheService; - protected abstract halService: HALEndpointService; - protected abstract bitstreamDataService: BitstreamDataService; +export abstract class ComColDataService extends IdentifiableDataService implements CreateData, FindAllData, SearchData, PatchData, DeleteData { + private createData: CreateData; + private findAllData: FindAllData; + private searchData: SearchData; + private patchData: PatchData; + private deleteData: DeleteData; + + protected constructor( + protected linkPath: string, + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected comparator: DSOChangeAnalyzer, + protected notificationsService: NotificationsService, + protected bitstreamDataService: BitstreamDataService, + ) { + super(linkPath, requestService, rdbService, objectCache, halService); + + this.createData = new CreateDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive); + this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + this.searchData = new SearchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + this.patchData = new PatchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, comparator, this.responseMsToLive, this.constructIdEndpoint); + this.deleteData = new DeleteDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive, this.constructIdEndpoint); + } /** * Get the scoped endpoint URL by fetching the object with @@ -129,4 +161,128 @@ export abstract class ComColDataService extend const parentCommunity = dso._links.parentCommunity; return isNotEmpty(parentCommunity) ? parentCommunity.href : null; } + + + /** + * Create a new object on the server, and store the response in the object cache + * + * @param object The object to create + * @param params Array with additional params to combine with query string + */ + create(object: T, ...params: RequestParam[]): Observable> { + return this.createData.create(object, ...params); + } + + /** + * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded + * info should be added to the objects + * + * @param options Find list options object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>>} + * Return an observable that emits object list + */ + public findAll(options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + + /** + * Create the HREF with given options object + * + * @param options The [[FindListOptions]] object + * @param linkPath The link path for the object + * @return {Observable} + * Return an observable that emits created HREF + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + public getFindAllHref(options?: FindListOptions, linkPath?: string, ...linksToFollow: FollowLinkConfig[]): Observable { + return this.findAllData.getFindAllHref(options, linkPath, ...linksToFollow); + } + + /** + * Create the HREF for a specific object's search method with given options object + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @return {Observable} + * Return an observable that emits created HREF + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + public getSearchByHref(searchMethod: string, options?: FindListOptions, ...linksToFollow: FollowLinkConfig[]): Observable { + return this.searchData.getSearchByHref(searchMethod, options, ...linksToFollow); + } + + /** + * Make a new FindListRequest with given search method + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>} + * Return an observable that emits response from the server + */ + public searchBy(searchMethod: string, options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.searchData.searchBy(searchMethod, options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + + /** + * Commit current object changes to the server + * @param method The RestRequestMethod for which de server sync buffer should be committed + */ + public commitUpdates(method?: RestRequestMethod): void { + this.patchData.commitUpdates(method); + } + + /** + * Send a patch request for a specified object + * @param {T} object The object to send a patch request for + * @param {Operation[]} operations The patch operations to be performed + */ + public patch(object: T, operations: []): Observable> { + return this.patchData.patch(object, operations); + } + + /** + * Add a new patch to the object cache + * The patch is derived from the differences between the given object and its version in the object cache + * @param {DSpaceObject} object The given object + */ + public update(object: T): Observable> { + return this.patchData.update(object); + } + + /** + * Delete an existing object on the server + * @param objectId The id of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + */ + public delete(objectId: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.delete(objectId, copyVirtualMetadata); + } + + /** + * Delete an existing object on the server + * @param href The self link of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + * Only emits once all request related to the DSO has been invalidated. + */ + public deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.deleteByHref(href, copyVirtualMetadata); + } } diff --git a/src/app/core/data/community-data.service.ts b/src/app/core/data/community-data.service.ts index 903d9bc79c..3062b15b1e 100644 --- a/src/app/core/data/community-data.service.ts +++ b/src/app/core/data/community-data.service.ts @@ -1,7 +1,5 @@ -import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { filter, map, switchMap, take } from 'rxjs/operators'; import { NotificationsService } from '../../shared/notifications/notifications.service'; @@ -19,27 +17,23 @@ import { RequestService } from './request.service'; import { BitstreamDataService } from './bitstream-data.service'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { isNotEmpty } from '../../shared/empty.util'; -import { CoreState } from '../core-state.model'; import { FindListOptions } from './find-list-options.model'; @Injectable() @dataService(COMMUNITY) export class CommunityDataService extends ComColDataService { - protected linkPath = 'communities'; protected topLinkPath = 'search/top'; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, + protected comparator: DSOChangeAnalyzer, protected notificationsService: NotificationsService, protected bitstreamDataService: BitstreamDataService, - protected http: HttpClient, - protected comparator: DSOChangeAnalyzer ) { - super(); + super('communities', requestService, rdbService, objectCache, halService, comparator, notificationsService, bitstreamDataService); } getEndpoint() { diff --git a/src/app/core/data/configuration-data.service.spec.ts b/src/app/core/data/configuration-data.service.spec.ts index 7077f098e0..7fe69c16e5 100644 --- a/src/app/core/data/configuration-data.service.spec.ts +++ b/src/app/core/data/configuration-data.service.spec.ts @@ -5,8 +5,6 @@ import { HALEndpointService } from '../shared/hal-endpoint.service'; import { GetRequest } from './request.models'; import { RequestService } from './request.service'; import { ObjectCacheService } from '../cache/object-cache.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; import { ConfigurationDataService } from './configuration-data.service'; import { ConfigurationProperty } from '../shared/configuration-property.model'; @@ -44,18 +42,12 @@ describe('ConfigurationDataService', () => { }) }); objectCache = {} as ObjectCacheService; - const notificationsService = {} as NotificationsService; - const http = {} as HttpClient; - const comparator = {} as any; service = new ConfigurationDataService( requestService, rdbService, objectCache, halService, - notificationsService, - http, - comparator ); }); diff --git a/src/app/core/data/configuration-data.service.ts b/src/app/core/data/configuration-data.service.ts index c8241aa9c7..ed62ee4933 100644 --- a/src/app/core/data/configuration-data.service.ts +++ b/src/app/core/data/configuration-data.service.ts @@ -1,55 +1,30 @@ /* eslint-disable max-classes-per-file */ -import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; import { dataService } from '../cache/builders/build-decorators'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { DataService } from './data.service'; import { RemoteData } from './remote-data'; import { RequestService } from './request.service'; import { ConfigurationProperty } from '../shared/configuration-property.model'; -import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; import { CONFIG_PROPERTY } from '../shared/config-property.resource-type'; -import { CoreState } from '../core-state.model'; - -class DataServiceImpl extends DataService { - protected linkPath = 'properties'; - - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - super(); - } -} +import { IdentifiableDataService } from './base/identifiable-data.service'; @Injectable() @dataService(CONFIG_PROPERTY) /** * Data Service responsible for retrieving Configuration properties */ -export class ConfigurationDataService { - protected linkPath = 'properties'; - private dataService: DataServiceImpl; +export class ConfigurationDataService extends IdentifiableDataService { constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); + ) { + super('properties', requestService, rdbService, objectCache, halService); } /** @@ -57,6 +32,6 @@ export class ConfigurationDataService { * @param name */ findByPropertyName(name: string): Observable> { - return this.dataService.findById(name); + return this.findById(name); } } diff --git a/src/app/core/data/dso-redirect-data.service.spec.ts b/src/app/core/data/dso-redirect-data.service.spec.ts index 3f3a799e45..6bfd8dbd2e 100644 --- a/src/app/core/data/dso-redirect-data.service.spec.ts +++ b/src/app/core/data/dso-redirect-data.service.spec.ts @@ -1,22 +1,18 @@ -import { HttpClient } from '@angular/common/http'; -import { Store } from '@ngrx/store'; import { cold, getTestScheduler } from 'jasmine-marbles'; import { TestScheduler } from 'rxjs/testing'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; import { followLink } from '../../shared/utils/follow-link-config.model'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { DsoRedirectDataService } from './dso-redirect-data.service'; +import { DsoRedirectService } from './dso-redirect.service'; import { GetRequest, IdentifierType } from './request.models'; import { RequestService } from './request.service'; import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils'; import { Item } from '../shared/item.model'; -import { CoreState } from '../core-state.model'; -describe('DsoRedirectDataService', () => { +describe('DsoRedirectService', () => { let scheduler: TestScheduler; - let service: DsoRedirectDataService; + let service: DsoRedirectService; let halService: HALEndpointService; let requestService: RequestService; let rdbService: RemoteDataBuildService; @@ -29,10 +25,6 @@ describe('DsoRedirectDataService', () => { const requestHandleURL = `https://rest.api/rest/api/pid/find?id=${encodedHandle}`; const requestUUIDURL = `https://rest.api/rest/api/pid/find?id=${dsoUUID}`; const requestUUID = '34cfed7c-f597-49ef-9cbe-ea351f0023c2'; - const store = {} as Store; - const notificationsService = {} as NotificationsService; - const http = {} as HttpClient; - const comparator = {} as any; const objectCache = {} as ObjectCacheService; beforeEach(() => { @@ -59,20 +51,16 @@ describe('DsoRedirectDataService', () => { a: remoteData }) }); - service = new DsoRedirectDataService( + service = new DsoRedirectService( requestService, rdbService, - store, objectCache, halService, - notificationsService, - http, - comparator, - router + router, ); }); - describe('findById', () => { + describe('findByIdAndIDType', () => { it('should call HALEndpointService with the path to the pid endpoint', () => { scheduler.schedule(() => service.findByIdAndIDType(dsoHandle, IdentifierType.HANDLE)); scheduler.flush(); @@ -141,7 +129,7 @@ describe('DsoRedirectDataService', () => { redir.subscribe(); scheduler.schedule(() => redir); scheduler.flush(); - expect(router.navigate).toHaveBeenCalledWith([remoteData.payload.type + 's/' + remoteData.payload.uuid]); + expect(router.navigate).toHaveBeenCalledWith(['/collections/' + remoteData.payload.uuid]); }); it('should navigate to communities route', () => { @@ -150,55 +138,58 @@ describe('DsoRedirectDataService', () => { redir.subscribe(); scheduler.schedule(() => redir); scheduler.flush(); - expect(router.navigate).toHaveBeenCalledWith(['communities/' + remoteData.payload.uuid]); + expect(router.navigate).toHaveBeenCalledWith(['/communities/' + remoteData.payload.uuid]); }); }); - describe('getIDHref', () => { - it('should return endpoint', () => { - const result = (service as any).getIDHref(pidLink, dsoUUID); - expect(result).toEqual(requestUUIDURL); - }); + describe('DataService', () => { // todo: should only test the id/uuid interpolation thingy + describe('getIDHref', () => { // todo: should be able to move this up to IdentifiableDataService? + it('should return endpoint', () => { + const result = (service as any).dataService.getIDHref(pidLink, dsoUUID); + expect(result).toEqual(requestUUIDURL); + }); - it('should include single linksToFollow as embed', () => { - const expected = `${requestUUIDURL}&embed=bundles`; - const result = (service as any).getIDHref(pidLink, dsoUUID, followLink('bundles')); - expect(result).toEqual(expected); - }); + it('should include single linksToFollow as embed', () => { + const expected = `${requestUUIDURL}&embed=bundles`; + const result = (service as any).dataService.getIDHref(pidLink, dsoUUID, followLink('bundles')); + expect(result).toEqual(expected); + }); - it('should include multiple linksToFollow as embed', () => { - const expected = `${requestUUIDURL}&embed=bundles&embed=owningCollection&embed=templateItemOf`; - const result = (service as any).getIDHref(pidLink, dsoUUID, followLink('bundles'), followLink('owningCollection'), followLink('templateItemOf')); - expect(result).toEqual(expected); - }); + it('should include multiple linksToFollow as embed', () => { + const expected = `${requestUUIDURL}&embed=bundles&embed=owningCollection&embed=templateItemOf`; + const result = (service as any).dataService.getIDHref(pidLink, dsoUUID, followLink('bundles'), followLink('owningCollection'), followLink('templateItemOf')); + expect(result).toEqual(expected); + }); - it('should not include linksToFollow with shouldEmbed = false', () => { - const expected = `${requestUUIDURL}&embed=templateItemOf`; - const result = (service as any).getIDHref( - pidLink, - dsoUUID, - followLink('bundles', { shouldEmbed: false }), - followLink('owningCollection', { shouldEmbed: false }), - followLink('templateItemOf') - ); - expect(result).toEqual(expected); - }); + it('should not include linksToFollow with shouldEmbed = false', () => { + const expected = `${requestUUIDURL}&embed=templateItemOf`; + const result = (service as any).dataService.getIDHref( + pidLink, + dsoUUID, + followLink('bundles', { shouldEmbed: false }), + followLink('owningCollection', { shouldEmbed: false }), + followLink('templateItemOf'), + ); + expect(result).toEqual(expected); + }); - it('should include nested linksToFollow 3lvl', () => { - const expected = `${requestUUIDURL}&embed=owningCollection/itemtemplate/relationships`; - const result = (service as any).getIDHref( - pidLink, - dsoUUID, - followLink('owningCollection', - {}, - followLink('itemtemplate', + it('should include nested linksToFollow 3lvl', () => { + const expected = `${requestUUIDURL}&embed=owningCollection/itemtemplate/relationships`; + const result = (service as any).dataService.getIDHref( + pidLink, + dsoUUID, + followLink( + 'owningCollection', {}, - followLink('relationships') - ) - ) - ); - expect(result).toEqual(expected); + followLink( + 'itemtemplate', + {}, + followLink('relationships'), + ), + ), + ); + expect(result).toEqual(expected); + }); }); }); - }); diff --git a/src/app/core/data/dso-redirect-data.service.ts b/src/app/core/data/dso-redirect-data.service.ts deleted file mode 100644 index 6270689f03..0000000000 --- a/src/app/core/data/dso-redirect-data.service.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; -import { tap } from 'rxjs/operators'; -import { hasValue } from '../../shared/empty.util'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; -import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { ObjectCacheService } from '../cache/object-cache.service'; -import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { DataService } from './data.service'; -import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; -import { RemoteData } from './remote-data'; -import { IdentifierType } from './request.models'; -import { RequestService } from './request.service'; -import { getFirstCompletedRemoteData } from '../shared/operators'; -import { DSpaceObject } from '../shared/dspace-object.model'; -import { Item } from '../shared/item.model'; -import { getItemPageRoute } from '../../item-page/item-page-routing-paths'; -import { CoreState } from '../core-state.model'; - -@Injectable() -export class DsoRedirectDataService extends DataService { - - // Set the default link path to the identifier lookup endpoint. - protected linkPath = 'pid'; - private uuidEndpoint = 'dso'; - - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DSOChangeAnalyzer, - private router: Router) { - super(); - } - - setLinkPath(identifierType: IdentifierType) { - // The default 'pid' endpoint for identifiers does not support uuid lookups. - // For uuid lookups we need to change the linkPath. - if (identifierType === IdentifierType.UUID) { - this.linkPath = this.uuidEndpoint; - } - } - - getIDHref(endpoint, resourceID, ...linksToFollow: FollowLinkConfig[]): string { - // Supporting both identifier (pid) and uuid (dso) endpoints - return this.buildHrefFromFindOptions( endpoint.replace(/\{\?id\}/, `?id=${resourceID}`) - .replace(/\{\?uuid\}/, `?uuid=${resourceID}`), - {}, [], ...linksToFollow); - } - - findByIdAndIDType(id: string, identifierType = IdentifierType.UUID): Observable> { - this.setLinkPath(identifierType); - return this.findById(id).pipe( - getFirstCompletedRemoteData(), - tap((response) => { - if (response.hasSucceeded) { - const dso = response.payload; - const uuid = dso.uuid; - if (hasValue(uuid)) { - let newRoute = this.getEndpointFromDSOType(response.payload.type); - if (dso.type.startsWith('item')) { - newRoute = getItemPageRoute(dso as Item); - } else if (hasValue(newRoute)) { - newRoute += '/' + uuid; - } - if (hasValue(newRoute)) { - this.router.navigate([newRoute]); - } - } - } - }) - ); - } - // Is there an existing method somewhere else that converts dso type to route? - getEndpointFromDSOType(dsoType: string): string { - // Are there other types to consider? - if (dsoType.startsWith('item')) { - return 'items'; - } else if (dsoType.startsWith('community')) { - return 'communities'; - } else if (dsoType.startsWith('collection')) { - return 'collections'; - } else { - return ''; - } - } -} diff --git a/src/app/core/data/dso-redirect.service.ts b/src/app/core/data/dso-redirect.service.ts new file mode 100644 index 0000000000..9e7277f2b1 --- /dev/null +++ b/src/app/core/data/dso-redirect.service.ts @@ -0,0 +1,90 @@ +/** + * 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/ + */ +/* eslint-disable max-classes-per-file */ +import { Injectable } from '@angular/core'; +import { Router } from '@angular/router'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { hasValue } from '../../shared/empty.util'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { RemoteData } from './remote-data'; +import { IdentifierType } from './request.models'; +import { RequestService } from './request.service'; +import { getFirstCompletedRemoteData } from '../shared/operators'; +import { DSpaceObject } from '../shared/dspace-object.model'; +import { IdentifiableDataService } from './base/identifiable-data.service'; +import { getDSORoute } from '../../app-routing-paths'; + +const ID_ENDPOINT = 'pid'; +const UUID_ENDPOINT = 'dso'; + +class DsoByIdOrUUIDService extends IdentifiableDataService { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + ) { + super( + undefined, requestService, rdbService, objectCache, halService, undefined, + // interpolate id/uuid as query parameter + (endpoint: string, resourceID: string): string => { + return endpoint.replace(/{\?id}/, `?id=${resourceID}`) + .replace(/{\?uuid}/, `?uuid=${resourceID}`); + }, + ); + } + + /** + * The default 'pid' endpoint for identifiers does not support uuid lookups. + * For uuid lookups we need to change the linkPath. + * @param identifierType + */ + setLinkPath(identifierType: IdentifierType) { + if (identifierType === IdentifierType.UUID) { + this.linkPath = UUID_ENDPOINT; + } else { + this.linkPath = ID_ENDPOINT; + } + } +} + +@Injectable() +export class DsoRedirectService { + private dataService: DsoByIdOrUUIDService; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + private router: Router, + ) { + this.dataService = new DsoByIdOrUUIDService(requestService, rdbService, objectCache, halService); + } + + findByIdAndIDType(id: string, identifierType = IdentifierType.UUID): Observable> { + this.dataService.setLinkPath(identifierType); + return this.dataService.findById(id).pipe( + getFirstCompletedRemoteData(), + tap((response) => { + if (response.hasSucceeded) { + const dso = response.payload; + if (hasValue(dso.uuid)) { + let newRoute = getDSORoute(dso); + if (hasValue(newRoute)) { + this.router.navigate([newRoute]); + } + } + } + }) + ); + } +} diff --git a/src/app/core/data/dspace-object-data.service.spec.ts b/src/app/core/data/dspace-object-data.service.spec.ts index 4b3fafa73a..0f167ea47e 100644 --- a/src/app/core/data/dspace-object-data.service.spec.ts +++ b/src/app/core/data/dspace-object-data.service.spec.ts @@ -7,8 +7,6 @@ import { GetRequest } from './request.models'; import { RequestService } from './request.service'; import { DSpaceObjectDataService } from './dspace-object-data.service'; import { ObjectCacheService } from '../cache/object-cache.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; describe('DSpaceObjectDataService', () => { let scheduler: TestScheduler; @@ -42,18 +40,12 @@ describe('DSpaceObjectDataService', () => { }) }); objectCache = {} as ObjectCacheService; - const notificationsService = {} as NotificationsService; - const http = {} as HttpClient; - const comparator = {} as any; service = new DSpaceObjectDataService( requestService, rdbService, objectCache, halService, - notificationsService, - http, - comparator ); }); diff --git a/src/app/core/data/dspace-object-data.service.ts b/src/app/core/data/dspace-object-data.service.ts index ae0d525281..7ab29506aa 100644 --- a/src/app/core/data/dspace-object-data.service.ts +++ b/src/app/core/data/dspace-object-data.service.ts @@ -1,106 +1,28 @@ -/* eslint-disable max-classes-per-file */ -import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { Observable } from 'rxjs'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { dataService } from '../cache/builders/build-decorators'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; import { DSpaceObject } from '../shared/dspace-object.model'; import { DSPACE_OBJECT } from '../shared/dspace-object.resource-type'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { DataService } from './data.service'; -import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; -import { RemoteData } from './remote-data'; import { RequestService } from './request.service'; -import { PaginatedList } from './paginated-list.model'; -import { CoreState } from '../core-state.model'; -import { FindListOptions } from './find-list-options.model'; - -class DataServiceImpl extends DataService { - protected linkPath = 'dso'; - - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DSOChangeAnalyzer) { - super(); - } - - getIDHref(endpoint, resourceID, ...linksToFollow: FollowLinkConfig[]): string { - return this.buildHrefFromFindOptions( endpoint.replace(/\{\?uuid\}/, `?uuid=${resourceID}`), - {}, [], ...linksToFollow); - } -} +import { IdentifiableDataService } from './base/identifiable-data.service'; @Injectable() @dataService(DSPACE_OBJECT) -export class DSpaceObjectDataService { - protected linkPath = 'dso'; - private dataService: DataServiceImpl; - +export class DSpaceObjectDataService extends IdentifiableDataService { constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DSOChangeAnalyzer) { - this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); + ) { + super( + 'dso', requestService, rdbService, objectCache, halService, undefined, + // interpolate uuid as query parameter + (endpoint: string, resourceID: string): string => { + return endpoint.replace(/{\?uuid}/, `?uuid=${resourceID}`); + }, + ); } - - /** - * Returns an observable of {@link RemoteData} of an object, based on its ID, with a list of {@link FollowLinkConfig}, - * to automatically resolve {@link HALLink}s of the object - * @param id ID of object we want to retrieve - * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's - * no valid cached version. Defaults to true - * @param reRequestOnStale Whether or not the request should automatically be re- - * requested after the response becomes stale - * @param linksToFollow List of {@link FollowLinkConfig} that indicate which - * {@link HALLink}s should be automatically resolved - */ - findById(id: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { - return this.dataService.findById(id, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); - - } - /** - * Returns an observable of {@link RemoteData} of an object, based on an href, with a list of {@link FollowLinkConfig}, - * to automatically resolve {@link HALLink}s of the object - * @param href The url of object we want to retrieve - * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's - * no valid cached version. Defaults to true - * @param reRequestOnStale Whether or not the request should automatically be re- - * requested after the response becomes stale - * @param linksToFollow List of {@link FollowLinkConfig} that indicate which - * {@link HALLink}s should be automatically resolved - */ - findByHref(href: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { - return this.dataService.findByHref(href, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); - } - - /** - * Returns a list of observables of {@link RemoteData} of objects, based on an href, with a list of {@link FollowLinkConfig}, - * to automatically resolve {@link HALLink}s of the object - * @param href The url of object we want to retrieve - * @param findListOptions Find list options object - * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's - * no valid cached version. Defaults to true - * @param reRequestOnStale Whether or not the request should automatically be re- - * requested after the response becomes stale - * @param linksToFollow List of {@link FollowLinkConfig} that indicate which - * {@link HALLink}s should be automatically resolved - */ - findAllByHref(href: string, findListOptions: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.dataService.findAllByHref(href, findListOptions, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); - } - } diff --git a/src/app/core/data/entity-type.service.ts b/src/app/core/data/entity-type.service.ts index d08e6d28e7..0acb4adb03 100644 --- a/src/app/core/data/entity-type.service.ts +++ b/src/app/core/data/entity-type.service.ts @@ -1,13 +1,8 @@ import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; -import { DataService } from './data.service'; import { RequestService } from './request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { ObjectCacheService } from '../cache/object-cache.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { filter, map, switchMap, take } from 'rxjs/operators'; @@ -17,27 +12,30 @@ import { PaginatedList } from './paginated-list.model'; import { ItemType } from '../shared/item-relationships/item-type.model'; import { getFirstSucceededRemoteData, getRemoteDataPayload } from '../shared/operators'; import { RelationshipTypeService } from './relationship-type.service'; -import { CoreState } from '../core-state.model'; import { FindListOptions } from './find-list-options.model'; +import { BaseDataService } from './base/base-data.service'; +import { SearchData, SearchDataImpl } from './base/search-data'; +import { FindAllData, FindAllDataImpl } from './base/find-all-data'; /** * Service handling all ItemType requests */ @Injectable() -export class EntityTypeService extends DataService { +export class EntityTypeService extends BaseDataService implements FindAllData, SearchData { + private findAllData: FindAllData; + private searchData: SearchDataImpl; - protected linkPath = 'entitytypes'; + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected relationshipTypeService: RelationshipTypeService, + ) { + super('entitytypes', requestService, rdbService, objectCache, halService); - constructor(protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected halService: HALEndpointService, - protected objectCache: ObjectCacheService, - protected notificationsService: NotificationsService, - protected relationshipTypeService: RelationshipTypeService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - super(); + this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + this.searchData = new SearchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); } getBrowseEndpoint(options, linkPath?: string): Observable { @@ -158,7 +156,43 @@ export class EntityTypeService extends DataService { return this.halService.getEndpoint(this.linkPath).pipe( take(1), switchMap((endPoint: string) => - this.findByHref(endPoint + '/label/' + label)) + this.findByHref(endPoint + '/label/' + label)), ); } + + /** + * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded + * info should be added to the objects + * + * @param options Find list options object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>>} + * Return an observable that emits object list + */ + public findAll(options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + + /** + * Make a new FindListRequest with given search method + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>} + * Return an observable that emits response from the server + */ + searchBy(searchMethod: string, options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.searchData.searchBy(searchMethod, options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } } diff --git a/src/app/core/data/eperson-registration.service.ts b/src/app/core/data/eperson-registration.service.ts index 989a401733..3b033f693a 100644 --- a/src/app/core/data/eperson-registration.service.ts +++ b/src/app/core/data/eperson-registration.service.ts @@ -13,11 +13,9 @@ import { RegistrationResponseParsingService } from './registration-response-pars import { RemoteData } from './remote-data'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -@Injectable( - { - providedIn: 'root', - } -) +@Injectable({ + providedIn: 'root', +}) /** * Service that will register a new email address and request a token */ diff --git a/src/app/core/data/external-source.service.spec.ts b/src/app/core/data/external-source.service.spec.ts index 59226197d1..8a547b69f9 100644 --- a/src/app/core/data/external-source.service.spec.ts +++ b/src/app/core/data/external-source.service.spec.ts @@ -48,9 +48,9 @@ describe('ExternalSourceService', () => { buildList: createSuccessfulRemoteDataObject$(createPaginatedList(entries)) }); halService = jasmine.createSpyObj('halService', { - getEndpoint: observableOf('external-sources-REST-endpoint') + getEndpoint: observableOf('external-sources-REST-endpoint'), }); - service = new ExternalSourceService(requestService, rdbService, undefined, undefined, halService, undefined, undefined, undefined); + service = new ExternalSourceService(requestService, rdbService, undefined, halService); } beforeEach(() => { diff --git a/src/app/core/data/external-source.service.ts b/src/app/core/data/external-source.service.ts index 6ea7e07d28..434b563191 100644 --- a/src/app/core/data/external-source.service.ts +++ b/src/app/core/data/external-source.service.ts @@ -1,13 +1,9 @@ import { Injectable } from '@angular/core'; -import { DataService } from './data.service'; import { ExternalSource } from '../shared/external-source.model'; import { RequestService } from './request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { distinctUntilChanged, map, switchMap, take } from 'rxjs/operators'; import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; @@ -15,28 +11,27 @@ import { hasValue, isNotEmptyOperator } from '../../shared/empty.util'; import { RemoteData } from './remote-data'; import { PaginatedList } from './paginated-list.model'; import { ExternalSourceEntry } from '../shared/external-source-entry.model'; -import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; -import { CoreState } from '../core-state.model'; import { FindListOptions } from './find-list-options.model'; +import { IdentifiableDataService } from './base/identifiable-data.service'; +import { SearchData, SearchDataImpl } from './base/search-data'; /** * A service handling all external source requests */ @Injectable() -export class ExternalSourceService extends DataService { - protected linkPath = 'externalsources'; +export class ExternalSourceService extends IdentifiableDataService implements SearchData { + private searchData: SearchData; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - super(); + ) { + super('externalsources', requestService, rdbService, objectCache, halService); + + this.searchData = new SearchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); } /** @@ -75,10 +70,28 @@ export class ExternalSourceService extends DataService { isNotEmptyOperator(), distinctUntilChanged(), map((endpoint: string) => hasValue(searchOptions) ? searchOptions.toRestUrl(endpoint) : endpoint), - take(1) + take(1), ); // TODO create a dedicated ExternalSourceEntryDataService and move this entire method to it. Then the "as any"s won't be necessary return this.findAllByHref(href$, undefined, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow as any) as any; } + + /** + * Make a new FindListRequest with given search method + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>} + * Return an observable that emits response from the server + */ + public searchBy(searchMethod: string, options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return undefined; + } } diff --git a/src/app/core/data/feature-authorization/authorization-data.service.spec.ts b/src/app/core/data/feature-authorization/authorization-data.service.spec.ts index df46d3f0a1..38b71a5c46 100644 --- a/src/app/core/data/feature-authorization/authorization-data.service.spec.ts +++ b/src/app/core/data/feature-authorization/authorization-data.service.spec.ts @@ -1,6 +1,5 @@ import { AuthorizationDataService } from './authorization-data.service'; import { SiteDataService } from '../site-data.service'; -import { AuthService } from '../../auth/auth.service'; import { Site } from '../../shared/site.model'; import { EPerson } from '../../eperson/models/eperson.model'; import { of as observableOf } from 'rxjs'; @@ -16,7 +15,6 @@ import { FindListOptions } from '../find-list-options.model'; describe('AuthorizationDataService', () => { let service: AuthorizationDataService; let siteService: SiteDataService; - let authService: AuthService; let site: Site; let ePerson: EPerson; @@ -37,13 +35,9 @@ describe('AuthorizationDataService', () => { uuid: 'test-eperson' }); siteService = jasmine.createSpyObj('siteService', { - find: observableOf(site) + find: observableOf(site), }); - authService = { - isAuthenticated: () => observableOf(true), - getAuthenticatedUserFromStore: () => observableOf(ePerson) - } as AuthService; - service = new AuthorizationDataService(requestService, undefined, undefined, undefined, undefined, undefined, undefined, undefined, authService, siteService); + service = new AuthorizationDataService(requestService, undefined, undefined, undefined, siteService); } beforeEach(() => { diff --git a/src/app/core/data/feature-authorization/authorization-data.service.ts b/src/app/core/data/feature-authorization/authorization-data.service.ts index f27919844d..85df98f399 100644 --- a/src/app/core/data/feature-authorization/authorization-data.service.ts +++ b/src/app/core/data/feature-authorization/authorization-data.service.ts @@ -2,17 +2,11 @@ import { Observable, of as observableOf } from 'rxjs'; import { Injectable } from '@angular/core'; import { AUTHORIZATION } from '../../shared/authorization.resource-type'; import { dataService } from '../../cache/builders/build-decorators'; -import { DataService } from '../data.service'; import { Authorization } from '../../shared/authorization.model'; import { RequestService } from '../request.service'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { ObjectCacheService } from '../../cache/object-cache.service'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { DSOChangeAnalyzer } from '../dso-change-analyzer.service'; -import { AuthService } from '../../auth/auth.service'; import { SiteDataService } from '../site-data.service'; import { followLink, FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; import { RemoteData } from '../remote-data'; @@ -24,31 +18,31 @@ import { AuthorizationSearchParams } from './authorization-search-params'; import { addSiteObjectUrlIfEmpty, oneAuthorizationMatchesFeature } from './authorization-utils'; import { FeatureID } from './feature-id'; import { getFirstCompletedRemoteData } from '../../shared/operators'; -import { CoreState } from '../../core-state.model'; import { FindListOptions } from '../find-list-options.model'; +import { BaseDataService } from '../base/base-data.service'; +import { SearchData, SearchDataImpl } from '../base/search-data'; /** * A service to retrieve {@link Authorization}s from the REST API */ @Injectable() @dataService(AUTHORIZATION) -export class AuthorizationDataService extends DataService { +export class AuthorizationDataService extends BaseDataService implements SearchData { protected linkPath = 'authorizations'; protected searchByObjectPath = 'object'; + private searchData: SearchDataImpl; + constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DSOChangeAnalyzer, - protected authService: AuthService, - protected siteService: SiteDataService + protected siteService: SiteDataService, ) { - super(); + super('authorizations', requestService, rdbService, objectCache, halService); + + this.searchData = new SearchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); } /** @@ -130,7 +124,25 @@ export class AuthorizationDataService extends DataService { params.push(new RequestParam('eperson', ePersonUuid)); } return Object.assign(new FindListOptions(), options, { - searchParams: [...params] + searchParams: [...params], }); } + + /** + * Make a new FindListRequest with given search method + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>} + * Return an observable that emits response from the server + */ + searchBy(searchMethod: string, options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.searchData.searchBy(searchMethod, options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } } diff --git a/src/app/core/data/feature-authorization/feature-data.service.ts b/src/app/core/data/feature-authorization/feature-data.service.ts index cbe8356660..bed6cd114d 100644 --- a/src/app/core/data/feature-authorization/feature-data.service.ts +++ b/src/app/core/data/feature-authorization/feature-data.service.ts @@ -1,36 +1,27 @@ import { Injectable } from '@angular/core'; import { FEATURE } from '../../shared/feature.resource-type'; import { dataService } from '../../cache/builders/build-decorators'; -import { DataService } from '../data.service'; import { Feature } from '../../shared/feature.model'; import { RequestService } from '../request.service'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { ObjectCacheService } from '../../cache/object-cache.service'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { DSOChangeAnalyzer } from '../dso-change-analyzer.service'; -import { CoreState } from '../../core-state.model'; +import { BaseDataService } from '../base/base-data.service'; /** * A service to retrieve {@link Feature}s from the REST API */ @Injectable() @dataService(FEATURE) -export class FeatureDataService extends DataService { +export class FeatureDataService extends BaseDataService { protected linkPath = 'features'; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DSOChangeAnalyzer ) { - super(); + super('features', requestService, rdbService, objectCache, halService); } } diff --git a/src/app/core/data/href-only-data.service.spec.ts b/src/app/core/data/href-only-data.service.spec.ts index 64c451837d..ed8c91399d 100644 --- a/src/app/core/data/href-only-data.service.spec.ts +++ b/src/app/core/data/href-only-data.service.spec.ts @@ -1,8 +1,8 @@ import { HrefOnlyDataService } from './href-only-data.service'; import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { DataService } from './data.service'; import { FindListOptions } from './find-list-options.model'; +import { BaseDataService } from './base/base-data.service'; describe(`HrefOnlyDataService`, () => { let service: HrefOnlyDataService; @@ -15,12 +15,12 @@ describe(`HrefOnlyDataService`, () => { href = 'https://rest.api/server/api/core/items/de7fa215-4a25-43a7-a4d7-17534a09fdfc'; followLinks = [ followLink('link1'), followLink('link2') ]; findListOptions = new FindListOptions(); - service = new HrefOnlyDataService(null, null, null, null, null, null, null, null); + service = new HrefOnlyDataService(null, null, null, null); }); it(`should instantiate a private DataService`, () => { expect((service as any).dataService).toBeDefined(); - expect((service as any).dataService).toBeInstanceOf(DataService); + expect((service as any).dataService).toBeInstanceOf(BaseDataService); }); describe(`findByHref`, () => { @@ -28,7 +28,7 @@ describe(`HrefOnlyDataService`, () => { spy = spyOn((service as any).dataService, 'findByHref').and.returnValue(createSuccessfulRemoteDataObject$(null)); }); - it(`should delegate to findByHref on the internal DataService`, () => { + it(`should forward to findByHref on the internal DataService`, () => { service.findByHref(href, false, false, ...followLinks); expect(spy).toHaveBeenCalledWith(href, false, false, ...followLinks); }); diff --git a/src/app/core/data/href-only-data.service.ts b/src/app/core/data/href-only-data.service.ts index 60c225cb34..ba5abe9340 100644 --- a/src/app/core/data/href-only-data.service.ts +++ b/src/app/core/data/href-only-data.service.ts @@ -1,13 +1,7 @@ -/* eslint-disable max-classes-per-file */ -import { DataService } from './data.service'; import { RequestService } from './request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; import { Injectable } from '@angular/core'; import { VOCABULARY_ENTRY } from '../submission/vocabularies/models/vocabularies.resource-type'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; @@ -18,25 +12,8 @@ import { PaginatedList } from './paginated-list.model'; import { ITEM_TYPE } from '../shared/item-relationships/item-type.resource-type'; import { LICENSE } from '../shared/license.resource-type'; import { CacheableObject } from '../cache/cacheable-object.model'; -import { CoreState } from '../core-state.model'; import { FindListOptions } from './find-list-options.model'; - -class DataServiceImpl extends DataService { - // linkPath isn't used if we're only searching by href. - protected linkPath = undefined; - - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - super(); - } -} +import { BaseDataService } from './base/base-data.service'; /** * A DataService with only findByHref methods. Its purpose is to be used for resources that don't @@ -46,24 +23,25 @@ class DataServiceImpl extends DataService { * an @dataService annotation can be added for any number of these resource types */ @Injectable({ - providedIn: 'root' + providedIn: 'root', }) @dataService(VOCABULARY_ENTRY) @dataService(ITEM_TYPE) @dataService(LICENSE) export class HrefOnlyDataService { - private dataService: DataServiceImpl; + /** + * Not all BaseDataService methods should be exposed, so + * @private + */ + private dataService: BaseDataService; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - this.dataService = new DataServiceImpl(requestService, rdbService, store, objectCache, halService, notificationsService, http, comparator); + ) { + this.dataService = new BaseDataService(undefined, requestService, rdbService, objectCache, halService); } /** diff --git a/src/app/core/data/item-data.service.spec.ts b/src/app/core/data/item-data.service.spec.ts index a4ed9f882f..01ccfe8c3b 100644 --- a/src/app/core/data/item-data.service.spec.ts +++ b/src/app/core/data/item-data.service.spec.ts @@ -21,7 +21,7 @@ import { HALEndpointServiceStub } from 'src/app/shared/testing/hal-endpoint-serv describe('ItemDataService', () => { let scheduler: TestScheduler; let service: ItemDataService; - let bs: BrowseService; + let browseService: BrowseService; const requestService = Object.assign(getMockRequestService(), { generateRequestId(): string { return scopeID; @@ -78,14 +78,12 @@ describe('ItemDataService', () => { return new ItemDataService( requestService, rdbService, - store, - bs, objectCache, halEndpointService, notificationsService, - http, comparator, - bundleService + browseService, + bundleService, ); } @@ -95,7 +93,7 @@ describe('ItemDataService', () => { }); it('should return the endpoint to fetch Items within the given scope and starting with the given string', () => { - bs = initMockBrowseService(true); + browseService = initMockBrowseService(true); service = initTestService(); const result = service.getBrowseEndpoint(options); @@ -106,7 +104,7 @@ describe('ItemDataService', () => { describe('if the dc.date.issue browse isn\'t configured for items', () => { beforeEach(() => { - bs = initMockBrowseService(false); + browseService = initMockBrowseService(false); service = initTestService(); }); it('should throw an error', () => { diff --git a/src/app/core/data/item-data.service.ts b/src/app/core/data/item-data.service.ts index cb5d7a3d57..ecc9e0e502 100644 --- a/src/app/core/data/item-data.service.ts +++ b/src/app/core/data/item-data.service.ts @@ -1,6 +1,13 @@ -import { HttpClient, HttpHeaders } from '@angular/common/http'; +/** + * 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/ + */ +/* eslint-disable max-classes-per-file */ +import { HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { distinctUntilChanged, filter, find, map, switchMap, take } from 'rxjs/operators'; import { hasValue, isNotEmpty, isNotEmptyOperator } from '../../shared/empty.util'; @@ -16,12 +23,10 @@ import { HALEndpointService } from '../shared/hal-endpoint.service'; import { Item } from '../shared/item.model'; import { ITEM } from '../shared/item.resource-type'; import { URLCombiner } from '../url-combiner/url-combiner'; - -import { DataService } from './data.service'; import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; import { PaginatedList } from './paginated-list.model'; import { RemoteData } from './remote-data'; -import { DeleteRequest, GetRequest, PostRequest, PutRequest} from './request.models'; +import { DeleteRequest, GetRequest, PostRequest, PutRequest } from './request.models'; import { RequestService } from './request.service'; import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; import { Bundle } from '../shared/bundle.model'; @@ -34,27 +39,41 @@ import { ResponseParsingService } from './parsing.service'; import { StatusCodeOnlyResponseParsingService } from './status-code-only-response-parsing.service'; import { sendRequest } from '../shared/request.operators'; import { RestRequest } from './rest-request.model'; -import { CoreState } from '../core-state.model'; import { FindListOptions } from './find-list-options.model'; +import { ConstructIdEndpoint, IdentifiableDataService } from './base/identifiable-data.service'; +import { PatchData, PatchDataImpl } from './base/patch-data'; +import { DeleteData, DeleteDataImpl } from './base/delete-data'; +import { RestRequestMethod } from './rest-request-method'; +import { CreateData, CreateDataImpl } from './base/create-data'; +import { RequestParam } from '../cache/models/request-param.model'; -@Injectable() -@dataService(ITEM) -export class ItemDataService extends DataService { - protected linkPath = 'items'; +/** + * An abstract service for CRUD operations on Items + * Doesn't specify an endpoint because multiple endpoints support Item-like functionality (e.g. items, itemtemplates) + * Extend this class to implement data services for Items + */ +export abstract class BaseItemDataService extends IdentifiableDataService implements CreateData, PatchData, DeleteData { + private createData: CreateData; + private patchData: PatchData; + private deleteData: DeleteData; - constructor( + protected constructor( + protected linkPath, protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, - protected bs: BrowseService, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, protected notificationsService: NotificationsService, - protected http: HttpClient, protected comparator: DSOChangeAnalyzer, - protected bundleService: BundleDataService + protected browseService: BrowseService, + protected bundleService: BundleDataService, + protected constructIdEndpoint: ConstructIdEndpoint = (endpoint, resourceID) => `${endpoint}/${resourceID}`, ) { - super(); + super(linkPath, requestService, rdbService, objectCache, halService, undefined, constructIdEndpoint); + + this.createData = new CreateDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive); + this.patchData = new PatchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, comparator, this.responseMsToLive, this.constructIdEndpoint); + this.deleteData = new DeleteDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive, this.constructIdEndpoint); } /** @@ -69,10 +88,11 @@ export class ItemDataService extends DataService { if (options.sort && options.sort.field) { field = options.sort.field; } - return this.bs.getBrowseURLFor(field, linkPath).pipe( + return this.browseService.getBrowseURLFor(field, linkPath).pipe( filter((href: string) => isNotEmpty(href)), map((href: string) => new URLCombiner(href, `?scope=${options.scopeID}`).toString()), - distinctUntilChanged(),); + distinctUntilChanged(), + ); } /** @@ -84,7 +104,7 @@ export class ItemDataService extends DataService { public getMappedCollectionsEndpoint(itemId: string, collectionId?: string): Observable { return this.halService.getEndpoint(this.linkPath).pipe( map((endpoint: string) => this.getIDHref(endpoint, itemId)), - map((endpoint: string) => `${endpoint}/mappedCollections${collectionId ? `/${collectionId}` : ''}`) + map((endpoint: string) => `${endpoint}/mappedCollections${collectionId ? `/${collectionId}` : ''}`), ); } @@ -219,7 +239,7 @@ export class ItemDataService extends DataService { public getMoveItemEndpoint(itemId: string): Observable { return this.halService.getEndpoint(this.linkPath).pipe( map((endpoint: string) => this.getIDHref(endpoint, itemId)), - map((endpoint: string) => `${endpoint}/owningCollection`) + map((endpoint: string) => `${endpoint}/owningCollection`), ); } @@ -299,4 +319,85 @@ export class ItemDataService extends DataService { this.requestService.setStaleByHrefSubstring('item/' + itemUUID); } + /** + * Commit current object changes to the server + * @param method The RestRequestMethod for which de server sync buffer should be committed + */ + public commitUpdates(method?: RestRequestMethod): void { + this.patchData.commitUpdates(method); + } + + /** + * Send a patch request for a specified object + * @param {T} object The object to send a patch request for + * @param {Operation[]} operations The patch operations to be performed + */ + public patch(object: Item, operations: Operation[]): Observable> { + return this.patchData.patch(object, operations); + } + + /** + * Add a new patch to the object cache + * The patch is derived from the differences between the given object and its version in the object cache + * @param {DSpaceObject} object The given object + */ + public update(object: Item): Observable> { + return this.patchData.update(object); + } + + /** + * Delete an existing object on the server + * @param objectId The id of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + */ + public delete(objectId: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.delete(objectId, copyVirtualMetadata); + } + + /** + * Delete an existing object on the server + * @param href The self link of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + * Only emits once all request related to the DSO has been invalidated. + */ + public deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.deleteByHref(href, copyVirtualMetadata); + } + + /** + * Create a new object on the server, and store the response in the object cache + * + * @param object The object to create + * @param params Array with additional params to combine with query string + */ + public create(object: Item, ...params: RequestParam[]): Observable> { + return this.createData.create(object, ...params); + } + +} + +/** + * A service for CRUD operations on Items + */ +@Injectable() +@dataService(ITEM) +export class ItemDataService extends BaseItemDataService { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected comparator: DSOChangeAnalyzer, + protected browseService: BrowseService, + protected bundleService: BundleDataService, + ) { + super('items', requestService, rdbService, objectCache, halService, notificationsService, comparator, browseService, bundleService); + } } diff --git a/src/app/core/data/item-request-data.service.spec.ts b/src/app/core/data/item-request-data.service.spec.ts index 0d99ca5cd4..a5d1872510 100644 --- a/src/app/core/data/item-request-data.service.spec.ts +++ b/src/app/core/data/item-request-data.service.spec.ts @@ -35,7 +35,7 @@ describe('ItemRequestDataService', () => { getEndpoint: observableOf(restApiEndpoint), }); - service = new ItemRequestDataService(requestService, rdbService, null, null, halService, null, null, null); + service = new ItemRequestDataService(requestService, rdbService, null, halService); }); describe('requestACopy', () => { diff --git a/src/app/core/data/item-request-data.service.ts b/src/app/core/data/item-request-data.service.ts index 2bab0b304f..ff6025f7ac 100644 --- a/src/app/core/data/item-request-data.service.ts +++ b/src/app/core/data/item-request-data.service.ts @@ -9,40 +9,27 @@ import { PostRequest, PutRequest } from './request.models'; import { RequestService } from './request.service'; import { ItemRequest } from '../shared/item-request.model'; import { hasValue, isNotEmpty } from '../../shared/empty.util'; -import { DataService } from './data.service'; -import { Store } from '@ngrx/store'; import { ObjectCacheService } from '../cache/object-cache.service'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; +import { HttpHeaders } from '@angular/common/http'; import { RequestCopyEmail } from '../../request-copy/email-request-copy/request-copy-email.model'; import { HttpOptions } from '../dspace-rest/dspace-rest.service'; -import { CoreState } from '../core-state.model'; import { sendRequest } from '../shared/request.operators'; +import { IdentifiableDataService } from './base/identifiable-data.service'; /** * A service responsible for fetching/sending data from/to the REST API on the itemrequests endpoint */ -@Injectable( - { - providedIn: 'root', - } -) -export class ItemRequestDataService extends DataService { - - protected linkPath = 'itemrequests'; - +@Injectable({ + providedIn: 'root', +}) +export class ItemRequestDataService extends IdentifiableDataService { constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer, ) { - super(); + super('itemrequests', requestService, rdbService, objectCache, halService); } getItemRequestEndpoint(): Observable { @@ -124,9 +111,9 @@ export class ItemRequestDataService extends DataService { suggestOpenAccess, }), options); }), - sendRequest(this.requestService)).subscribe(); + sendRequest(this.requestService), + ).subscribe(); return this.rdbService.buildFromRequestUUID(requestId); } - } diff --git a/src/app/core/data/item-template-data.service.spec.ts b/src/app/core/data/item-template-data.service.spec.ts index 4b8aa362ba..b73287f50f 100644 --- a/src/app/core/data/item-template-data.service.spec.ts +++ b/src/app/core/data/item-template-data.service.spec.ts @@ -8,17 +8,17 @@ import { BrowseService } from '../browse/browse.service'; import { cold } from 'jasmine-marbles'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; import { CollectionDataService } from './collection-data.service'; import { RestRequestMethod } from './rest-request-method'; import { Item } from '../shared/item.model'; import { RestRequest } from './rest-request.model'; import { CoreState } from '../core-state.model'; import { RequestEntry } from './request-entry.model'; +import createSpyObj = jasmine.createSpyObj; describe('ItemTemplateDataService', () => { let service: ItemTemplateDataService; - let itemService: any; + let byCollection: any; const item = new Item(); const collectionEndpoint = 'https://rest.api/core/collections/4af28e99-6a9c-4036-a199-e1b587046d39'; @@ -47,14 +47,14 @@ describe('ItemTemplateDataService', () => { } as RequestService; const rdbService = {} as RemoteDataBuildService; const store = {} as Store; - const bs = {} as BrowseService; + const browseService = {} as BrowseService; const objectCache = { getObjectBySelfLink(self) { return observableOf({}); }, addPatch(self, operations) { // Do nothing - } + }, } as any; const halEndpointService = { getEndpoint(linkPath: string): Observable { @@ -62,7 +62,6 @@ describe('ItemTemplateDataService', () => { } } as HALEndpointService; const notificationsService = {} as NotificationsService; - const http = {} as HttpClient; const comparator = { diff(first, second) { return [{}]; @@ -78,60 +77,61 @@ describe('ItemTemplateDataService', () => { service = new ItemTemplateDataService( requestService, rdbService, - store, - bs, objectCache, halEndpointService, notificationsService, - http, comparator, + browseService, undefined, - collectionService + collectionService, ); - itemService = (service as any).dataService; + byCollection = (service as any).byCollection; } beforeEach(() => { initTestService(); }); - describe('commitUpdates', () => { - it('should call commitUpdates on the item service implementation', () => { - spyOn(itemService, 'commitUpdates'); - service.commitUpdates(); - expect(itemService.commitUpdates).toHaveBeenCalled(); - }); - }); - - describe('update', () => { - it('should call update on the item service implementation', () => { - spyOn(itemService, 'update'); - service.update(item); - expect(itemService.update).toHaveBeenCalled(); - }); - }); - describe('findByCollectionID', () => { - it('should call findByCollectionID on the item service implementation', () => { - spyOn(itemService, 'findByCollectionID'); + it('should call findByCollectionID on the collection-based data service', () => { + spyOn(byCollection, 'findById'); service.findByCollectionID(scopeID); - expect(itemService.findByCollectionID).toHaveBeenCalled(); + expect(byCollection.findById).toHaveBeenCalled(); }); }); - describe('create', () => { - it('should call createTemplate on the item service implementation', () => { - spyOn(itemService, 'createTemplate'); - service.create(item, scopeID); - expect(itemService.createTemplate).toHaveBeenCalled(); + describe('createByCollectionID', () => { + it('should call createTemplate on the collection-based data service', () => { + spyOn(byCollection, 'createTemplate'); + service.createByCollectionID(item, scopeID); + expect(byCollection.createTemplate).toHaveBeenCalledWith(item, scopeID); }); }); - describe('deleteByCollectionID', () => { - it('should call deleteByCollectionID on the item service implementation', () => { - spyOn(itemService, 'deleteByCollectionID'); - service.deleteByCollectionID(item, scopeID); - expect(itemService.deleteByCollectionID).toHaveBeenCalled(); + describe('byCollection', () => { + beforeEach(() => { + byCollection.createData = createSpyObj('createData', { + createOnEndpoint: 'TEST createOnEndpoint', + }); + }); + + describe('getIDHrefObs', () => { + it('should point to the Item template of a given Collection', () => { + expect(byCollection.getIDHrefObs(scopeID)).toBeObservable(cold('a', { a: jasmine.stringMatching(`/collections/${scopeID}/itemtemplate`) })); + }); + }); + + describe('createTemplate', () => { + it('should forward to CreateDataImpl.createOnEndpoint', () => { + spyOn(byCollection, 'getIDHrefObs').and.returnValue('TEST getIDHrefObs'); + + const out = byCollection.createTemplate(item, scopeID); + + expect(byCollection.getIDHrefObs).toHaveBeenCalledWith(scopeID); + expect(byCollection.createData.createOnEndpoint).toHaveBeenCalledWith(item, 'TEST getIDHrefObs'); + expect(out).toBe('TEST createOnEndpoint'); + }); }); }); }); + diff --git a/src/app/core/data/item-template-data.service.ts b/src/app/core/data/item-template-data.service.ts index fd9f7de031..634c966dba 100644 --- a/src/app/core/data/item-template-data.service.ts +++ b/src/app/core/data/item-template-data.service.ts @@ -1,147 +1,62 @@ /* eslint-disable max-classes-per-file */ import { Injectable } from '@angular/core'; -import { ItemDataService } from './item-data.service'; -import { UpdateDataService } from './update-data.service'; +import { BaseItemDataService } from './item-data.service'; import { Item } from '../shared/item.model'; -import { RestRequestMethod } from './rest-request-method'; import { RemoteData } from './remote-data'; import { Observable } from 'rxjs'; import { DSOChangeAnalyzer } from './dso-change-analyzer.service'; import { RequestService } from './request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { ObjectCacheService } from '../cache/object-cache.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; import { BrowseService } from '../browse/browse.service'; import { CollectionDataService } from './collection-data.service'; -import { map, switchMap } from 'rxjs/operators'; +import { switchMap } from 'rxjs/operators'; import { BundleDataService } from './bundle-data.service'; import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; -import { NoContent } from '../shared/NoContent.model'; -import { hasValue } from '../../shared/empty.util'; -import { Operation } from 'fast-json-patch'; -import { getFirstCompletedRemoteData } from '../shared/operators'; -import { CoreState } from '../core-state.model'; +import { IdentifiableDataService } from './base/identifiable-data.service'; +import { CreateDataImpl } from './base/create-data'; /** - * A custom implementation of the ItemDataService, but for collection item templates - * Makes sure to change the endpoint before sending out CRUD requests for the item template + * Data service for interacting with Item templates via their Collection */ -class DataServiceImpl extends ItemDataService { - protected collectionLinkPath = 'itemtemplate'; - protected linkPath = 'itemtemplates'; - - /** - * Endpoint dynamically changing depending on what request we're sending - */ - private endpoint$: Observable; - - /** - * Is the current endpoint based on a collection? - */ - private collectionEndpoint = false; +class CollectionItemTemplateDataService extends IdentifiableDataService { + private createData: CreateDataImpl; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, - protected bs: BrowseService, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DSOChangeAnalyzer, - protected bundleService: BundleDataService, - protected collectionService: CollectionDataService) { - super(requestService, rdbService, store, bs, objectCache, halService, notificationsService, http, comparator, bundleService); + protected collectionService: CollectionDataService, + ) { + super('itemtemplates', requestService, rdbService, objectCache, halService, undefined); + + // We only intend to use createOnEndpoint, so this inner data service feature doesn't need an endpoint at all + this.createData = new CreateDataImpl(undefined, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive); } /** - * Get the endpoint based on a collection - * @param collectionID The ID of the collection to base the endpoint on + * Create an observable for the HREF of a specific object based on its identifier + * + * Overridden to ensure that {@link findById} works with Collection IDs and points to the template. + * @param collectionID the ID of a Collection */ - public getCollectionEndpoint(collectionID: string): Observable { + public getIDHrefObs(collectionID: string): Observable { return this.collectionService.getIDHrefObs(collectionID).pipe( - switchMap((href: string) => this.halService.getEndpoint(this.collectionLinkPath, href)) + switchMap((href: string) => this.halService.getEndpoint('itemtemplate', href)), ); } /** - * Set the endpoint to be based on a collection - * @param collectionID The ID of the collection to base the endpoint on - */ - private setCollectionEndpoint(collectionID: string) { - this.collectionEndpoint = true; - this.endpoint$ = this.getCollectionEndpoint(collectionID); - } - - /** - * Set the endpoint to the regular linkPath - */ - private setRegularEndpoint() { - this.collectionEndpoint = false; - this.endpoint$ = this.halService.getEndpoint(this.linkPath); - } - - /** - * Get the base endpoint for all requests - * Uses the current collectionID to assemble a request endpoint for the collection's item template - */ - protected getEndpoint(): Observable { - return this.endpoint$; - } - - /** - * If the current endpoint is based on a collection, simply return the collection's template endpoint, otherwise - * create a regular template endpoint - * @param resourceID - */ - getIDHrefObs(resourceID: string): Observable { - if (this.collectionEndpoint) { - return this.getEndpoint(); - } else { - return super.getIDHrefObs(resourceID); - } - } - - /** - * Set the collection ID and send a find by ID request - * @param collectionID - * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's - * no valid cached version. Defaults to true - * @param reRequestOnStale Whether or not the request should automatically be re- - * requested after the response becomes stale - * @param linksToFollow List of {@link FollowLinkConfig} that indicate which - * {@link HALLink}s should be automatically resolved - */ - findByCollectionID(collectionID: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { - this.setCollectionEndpoint(collectionID); - return super.findById(collectionID, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); - } - - /** - * Set the collection ID and send a create request + * Create a new item template for a Collection by ID * @param item * @param collectionID */ - createTemplate(item: Item, collectionID: string): Observable> { - this.setCollectionEndpoint(collectionID); - return super.create(item); - } - - /** - * Set the collection ID and send a delete request - * @param item - * @param collectionID - */ - deleteByCollectionID(item: Item, collectionID: string): Observable { - this.setRegularEndpoint(); - return super.delete(item.uuid).pipe( - getFirstCompletedRemoteData(), - map((response: RemoteData) => hasValue(response) && response.hasSucceeded) - ); + public createTemplate(item: Item, collectionID: string): Observable> { + return this.createData.createOnEndpoint(item, this.getIDHrefObs(collectionID)); } } @@ -149,43 +64,23 @@ class DataServiceImpl extends ItemDataService { * A service responsible for fetching/sending data from/to the REST API on a collection's itemtemplates endpoint */ @Injectable() -export class ItemTemplateDataService implements UpdateDataService { - /** - * The data service responsible for all CRUD actions on the item - */ - private dataService: DataServiceImpl; +export class ItemTemplateDataService extends BaseItemDataService { + private byCollection: CollectionItemTemplateDataService; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, - protected bs: BrowseService, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, protected notificationsService: NotificationsService, - protected http: HttpClient, protected comparator: DSOChangeAnalyzer, + protected browseService: BrowseService, protected bundleService: BundleDataService, - protected collectionService: CollectionDataService) { - this.dataService = new DataServiceImpl(requestService, rdbService, store, bs, objectCache, halService, notificationsService, http, comparator, bundleService, collectionService); - } + protected collectionService: CollectionDataService, + ) { + super('itemtemplates', requestService, rdbService, objectCache, halService, notificationsService, comparator, browseService, bundleService); - /** - * Commit current object changes to the server - */ - commitUpdates(method?: RestRequestMethod) { - this.dataService.commitUpdates(method); - } - - /** - * Add a new patch to the object cache - */ - update(object: Item): Observable> { - return this.dataService.update(object); - } - - patch(dso: Item, operations: Operation[]): Observable> { - return this.dataService.patch(dso, operations); + this.byCollection = new CollectionItemTemplateDataService(requestService, rdbService, objectCache, halService, notificationsService, collectionService); } /** @@ -199,7 +94,7 @@ export class ItemTemplateDataService implements UpdateDataService { * {@link HALLink}s should be automatically resolved */ findByCollectionID(collectionID: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { - return this.dataService.findByCollectionID(collectionID, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + return this.byCollection.findById(collectionID, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } /** @@ -207,17 +102,8 @@ export class ItemTemplateDataService implements UpdateDataService { * @param item * @param collectionID */ - create(item: Item, collectionID: string): Observable> { - return this.dataService.createTemplate(item, collectionID); - } - - /** - * Delete a template item by collection ID - * @param item - * @param collectionID - */ - deleteByCollectionID(item: Item, collectionID: string): Observable { - return this.dataService.deleteByCollectionID(item, collectionID); + createByCollectionID(item: Item, collectionID: string): Observable> { + return this.byCollection.createTemplate(item, collectionID); } /** @@ -225,6 +111,6 @@ export class ItemTemplateDataService implements UpdateDataService { * @param collectionID The ID of the collection to base the endpoint on */ getCollectionEndpoint(collectionID: string): Observable { - return this.dataService.getCollectionEndpoint(collectionID); + return this.byCollection.getIDHrefObs(collectionID); } } diff --git a/src/app/core/data/metadata-field-data.service.spec.ts b/src/app/core/data/metadata-field-data.service.spec.ts index 54a174e365..09cbcb908a 100644 --- a/src/app/core/data/metadata-field-data.service.spec.ts +++ b/src/app/core/data/metadata-field-data.service.spec.ts @@ -10,6 +10,7 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { RequestParam } from '../cache/models/request-param.model'; import { FindListOptions } from './find-list-options.model'; +import { createPaginatedList } from '../../shared/testing/utils.test'; describe('MetadataFieldDataService', () => { let metadataFieldService: MetadataFieldDataService; @@ -33,16 +34,19 @@ describe('MetadataFieldDataService', () => { generateRequestId: '34cfed7c-f597-49ef-9cbe-ea351f0023c2', send: {}, getByUUID: observableOf({ response: new RestResponse(true, 200, 'OK') }), - setStaleByHrefSubstring: {} + setStaleByHrefSubstring: {}, }); halService = Object.assign(new HALEndpointServiceStub(endpoint)); notificationsService = jasmine.createSpyObj('notificationsService', { - error: {} + error: {}, }); rdbService = jasmine.createSpyObj('rdbService', { - buildSingle: createSuccessfulRemoteDataObject$(undefined) + buildSingle: createSuccessfulRemoteDataObject$(undefined), + buildList: createSuccessfulRemoteDataObject$(createPaginatedList([])), }); - metadataFieldService = new MetadataFieldDataService(requestService, rdbService, undefined, halService, undefined, undefined, undefined, notificationsService); + metadataFieldService = new MetadataFieldDataService( + requestService, rdbService, undefined, halService, notificationsService, + ); } beforeEach(() => { diff --git a/src/app/core/data/metadata-field-data.service.ts b/src/app/core/data/metadata-field-data.service.ts index 5a78213c84..e54ccb71c3 100644 --- a/src/app/core/data/metadata-field-data.service.ts +++ b/src/app/core/data/metadata-field-data.service.ts @@ -1,17 +1,11 @@ import { Injectable } from '@angular/core'; import { hasValue } from '../../shared/empty.util'; import { dataService } from '../cache/builders/build-decorators'; -import { DataService } from './data.service'; import { PaginatedList } from './paginated-list.model'; import { RemoteData } from './remote-data'; import { RequestService } from './request.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { ObjectCacheService } from '../cache/object-cache.service'; -import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; -import { HttpClient } from '@angular/common/http'; -import { NotificationsService } from '../../shared/notifications/notifications.service'; import { METADATA_FIELD } from '../metadata/metadata-field.resource-type'; import { MetadataField } from '../metadata/metadata-field.model'; import { MetadataSchema } from '../metadata/metadata-schema.model'; @@ -19,29 +13,43 @@ import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; import { Observable } from 'rxjs'; import { take } from 'rxjs/operators'; import { RequestParam } from '../cache/models/request-param.model'; -import { CoreState } from '../core-state.model'; import { FindListOptions } from './find-list-options.model'; +import { SearchData, SearchDataImpl } from './base/search-data'; +import { PutData, PutDataImpl } from './base/put-data'; +import { CreateData, CreateDataImpl } from './base/create-data'; +import { NoContent } from '../shared/NoContent.model'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { DeleteData, DeleteDataImpl } from './base/delete-data'; +import { IdentifiableDataService } from './base/identifiable-data.service'; /** * A service responsible for fetching/sending data from/to the REST API on the metadatafields endpoint */ @Injectable() @dataService(METADATA_FIELD) -export class MetadataFieldDataService extends DataService { - protected linkPath = 'metadatafields'; +export class MetadataFieldDataService extends IdentifiableDataService implements CreateData, PutData, DeleteData, SearchData { + private createData: CreateData; + private searchData: SearchData; + private putData: PutData; + private deleteData: DeleteData; + protected searchBySchemaLinkPath = 'bySchema'; protected searchByFieldNameLinkPath = 'byFieldName'; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, - protected halService: HALEndpointService, protected objectCache: ObjectCacheService, - protected comparator: DefaultChangeAnalyzer, - protected http: HttpClient, - protected notificationsService: NotificationsService) { - super(); + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + ) { + super('metadatafields', requestService, rdbService, objectCache, halService); + + this.createData = new CreateDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive); + this.searchData = new SearchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + this.putData = new PutDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + this.deleteData = new DeleteDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive, this.constructIdEndpoint); } /** @@ -57,7 +65,7 @@ export class MetadataFieldDataService extends DataService { */ findBySchema(schema: MetadataSchema, options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]) { const optionsWithSchema = Object.assign(new FindListOptions(), options, { - searchParams: [new RequestParam('schema', schema.prefix)] + searchParams: [new RequestParam('schema', schema.prefix)], }); return this.searchBy(this.searchBySchemaLinkPath, optionsWithSchema, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } @@ -85,8 +93,8 @@ export class MetadataFieldDataService extends DataService { new RequestParam('element', hasValue(element) ? element : ''), new RequestParam('qualifier', hasValue(qualifier) ? qualifier : ''), new RequestParam('query', hasValue(query) ? query : ''), - new RequestParam('exactName', hasValue(exactName) ? exactName : '') - ] + new RequestParam('exactName', hasValue(exactName) ? exactName : ''), + ], }); return this.searchBy(this.searchByFieldNameLinkPath, optionParams, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } @@ -112,4 +120,80 @@ export class MetadataFieldDataService extends DataService { } + + /** + * Delete an existing object on the server + * @param objectId The id of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + */ + delete(objectId: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.delete(objectId, copyVirtualMetadata); + } + + /** + * Delete an existing object on the server + * @param href The self link of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + * Only emits once all request related to the DSO has been invalidated. + */ + public deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.deleteByHref(href, copyVirtualMetadata); + } + + /** + * Send a PUT request for the specified object + * + * @param object The object to send a put request for. + */ + put(object: MetadataField): Observable> { + return this.putData.put(object); + } + + /** + * Create a new object on the server, and store the response in the object cache + * + * @param object The object to create + * @param params Array with additional params to combine with query string + */ + create(object: MetadataField, ...params: RequestParam[]): Observable> { + return this.createData.create(object, ...params); + } + + /** + * Create the HREF for a specific object's search method with given options object + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @return {Observable} + * Return an observable that emits created HREF + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + */ + public getSearchByHref(searchMethod: string, options?: FindListOptions, ...linksToFollow: FollowLinkConfig[]): Observable { + return this.searchData.getSearchByHref(searchMethod, options, ...linksToFollow); + } + + /** + * Make a new FindListRequest with given search method + * + * @param searchMethod The search method for the object + * @param options The [[FindListOptions]] object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>} + * Return an observable that emits response from the server + */ + public searchBy(searchMethod: string, options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.searchData.searchBy(searchMethod, options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + } diff --git a/src/app/core/data/metadata-schema-data.service.spec.ts b/src/app/core/data/metadata-schema-data.service.spec.ts index 2e61955502..9c8fb9ca00 100644 --- a/src/app/core/data/metadata-schema-data.service.spec.ts +++ b/src/app/core/data/metadata-schema-data.service.spec.ts @@ -24,14 +24,20 @@ describe('MetadataSchemaDataService', () => { generateRequestId: '34cfed7c-f597-49ef-9cbe-ea351f0023c2', send: {}, getByUUID: observableOf({ response: new RestResponse(true, 200, 'OK') }), - removeByHrefSubstring: {} + removeByHrefSubstring: {}, }); halService = Object.assign(new HALEndpointServiceStub(endpoint)); notificationsService = jasmine.createSpyObj('notificationsService', { - error: {} + error: {}, }); rdbService = getMockRemoteDataBuildService(); - metadataSchemaService = new MetadataSchemaDataService(requestService, rdbService, undefined, halService, undefined, undefined, undefined, notificationsService); + metadataSchemaService = new MetadataSchemaDataService( + requestService, + rdbService, + null, + halService, + notificationsService, + ); } beforeEach(() => { diff --git a/src/app/core/data/metadata-schema-data.service.ts b/src/app/core/data/metadata-schema-data.service.ts index f277f6cab6..97f806d237 100644 --- a/src/app/core/data/metadata-schema-data.service.ts +++ b/src/app/core/data/metadata-schema-data.service.ts @@ -1,6 +1,4 @@ -import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { dataService } from '../cache/builders/build-decorators'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; @@ -8,33 +6,45 @@ import { ObjectCacheService } from '../cache/object-cache.service'; import { MetadataSchema } from '../metadata/metadata-schema.model'; import { METADATA_SCHEMA } from '../metadata/metadata-schema.resource-type'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { DataService } from './data.service'; -import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; import { RequestService } from './request.service'; import { Observable } from 'rxjs'; import { hasValue } from '../../shared/empty.util'; import { tap } from 'rxjs/operators'; import { RemoteData } from './remote-data'; -import { CoreState } from '../core-state.model'; +import { PutData, PutDataImpl } from './base/put-data'; +import { CreateData, CreateDataImpl } from './base/create-data'; +import { NoContent } from '../shared/NoContent.model'; +import { FindAllData, FindAllDataImpl } from './base/find-all-data'; +import { FindListOptions } from './find-list-options.model'; +import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; +import { PaginatedList } from './paginated-list.model'; +import { IdentifiableDataService } from './base/identifiable-data.service'; +import { DeleteData, DeleteDataImpl } from './base/delete-data'; /** * A service responsible for fetching/sending data from/to the REST API on the metadataschemas endpoint */ @Injectable() @dataService(METADATA_SCHEMA) -export class MetadataSchemaDataService extends DataService { - protected linkPath = 'metadataschemas'; +export class MetadataSchemaDataService extends IdentifiableDataService implements FindAllData, DeleteData { + private createData: CreateData; + private findAllData: FindAllData; + private putData: PutData; + private deleteData: DeleteData; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, - protected halService: HALEndpointService, protected objectCache: ObjectCacheService, - protected comparator: DefaultChangeAnalyzer, - protected http: HttpClient, - protected notificationsService: NotificationsService) { - super(); + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + ) { + super('metadataschemas', requestService, rdbService, objectCache, halService); + + this.createData = new CreateDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive); + this.putData = new PutDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + this.deleteData = new DeleteDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive, this.constructIdEndpoint); + this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); } /** @@ -49,9 +59,9 @@ export class MetadataSchemaDataService extends DataService { const isUpdate = hasValue(schema.id); if (isUpdate) { - return this.put(schema); + return this.putData.put(schema); } else { - return this.create(schema); + return this.createData.create(schema); } } @@ -61,8 +71,50 @@ export class MetadataSchemaDataService extends DataService { */ clearRequests(): Observable { return this.getBrowseEndpoint().pipe( - tap((href: string) => this.requestService.removeByHrefSubstring(href)) + tap((href: string) => this.requestService.removeByHrefSubstring(href)), ); } + /** + * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded + * info should be added to the objects + * + * @param options Find list options object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>>} + * Return an observable that emits object list + */ + public findAll(options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + + /** + * Delete an existing object on the server + * @param objectId The id of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + */ + public delete(objectId: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.delete(objectId, copyVirtualMetadata); + } + + /** + * Delete an existing object on the server + * @param href The self link of the object to be removed + * @param copyVirtualMetadata (optional parameter) the identifiers of the relationship types for which the virtual + * metadata should be saved as real metadata + * @return A RemoteData observable with an empty payload, but still representing the state of the request: statusCode, + * errorMessage, timeCompleted, etc + * Only emits once all request related to the DSO has been invalidated. + */ + public deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.deleteByHref(href, copyVirtualMetadata); + } } diff --git a/src/app/core/data/persistent-identifier-data.service.ts b/src/app/core/data/persistent-identifier-data.service.ts new file mode 100644 index 0000000000..661d8c044d --- /dev/null +++ b/src/app/core/data/persistent-identifier-data.service.ts @@ -0,0 +1,28 @@ +/** + * 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 { BaseDataService } from './base/base-data.service'; +import { RequestService } from './request.service'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { IdentifiableDataService } from './base/identifiable-data.service'; +import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; +import { Observable } from 'rxjs'; +import { RemoteData } from './remote-data'; +import { DSpaceObject } from '../shared/dspace-object.model'; + +export class PersistentIdentifierDataService extends IdentifiableDataService { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + ) { + super('pid', requestService, rdbService, objectCache, halService); + } +} diff --git a/src/app/core/data/processes/process-data.service.ts b/src/app/core/data/processes/process-data.service.ts index 81b4cbd503..0168ded7c9 100644 --- a/src/app/core/data/processes/process-data.service.ts +++ b/src/app/core/data/processes/process-data.service.ts @@ -1,13 +1,8 @@ import { Injectable } from '@angular/core'; -import { DataService } from '../data.service'; import { RequestService } from '../request.service'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { ObjectCacheService } from '../../cache/object-cache.service'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { DefaultChangeAnalyzer } from '../default-change-analyzer.service'; import { Process } from '../../../process-page/processes/process.model'; import { dataService } from '../../cache/builders/build-decorators'; import { PROCESS } from '../../../process-page/processes/process.resource-type'; @@ -17,24 +12,26 @@ import { PaginatedList } from '../paginated-list.model'; import { Bitstream } from '../../shared/bitstream.model'; import { RemoteData } from '../remote-data'; import { BitstreamDataService } from '../bitstream-data.service'; -import { CoreState } from '../../core-state.model'; +import { IdentifiableDataService } from '../base/identifiable-data.service'; +import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { FindAllData, FindAllDataImpl } from '../base/find-all-data'; +import { FindListOptions } from '../find-list-options.model'; @Injectable() @dataService(PROCESS) -export class ProcessDataService extends DataService { - protected linkPath = 'processes'; +export class ProcessDataService extends IdentifiableDataService implements FindAllData { + private findAllData: FindAllData; constructor( protected requestService: RequestService, protected rdbService: RemoteDataBuildService, - protected store: Store, protected objectCache: ObjectCacheService, protected halService: HALEndpointService, - protected notificationsService: NotificationsService, protected bitstreamDataService: BitstreamDataService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - super(); + ) { + super('processes', requestService, rdbService, objectCache, halService); + + this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); } /** @@ -55,4 +52,22 @@ export class ProcessDataService extends DataService { const href$ = this.getFilesEndpoint(processId); return this.bitstreamDataService.findAllByHref(href$); } + + /** + * Returns {@link RemoteData} of all object with a list of {@link FollowLinkConfig}, to indicate which embedded + * info should be added to the objects + * + * @param options Find list options object + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + * @return {Observable>>} + * Return an observable that emits object list + */ + findAll(options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } } diff --git a/src/app/core/data/processes/script-data.service.ts b/src/app/core/data/processes/script-data.service.ts index 75a66c822a..a05599c36c 100644 --- a/src/app/core/data/processes/script-data.service.ts +++ b/src/app/core/data/processes/script-data.service.ts @@ -1,18 +1,13 @@ import { Injectable } from '@angular/core'; -import { DataService } from '../data.service'; import { RemoteDataBuildService } from '../../cache/builders/remote-data-build.service'; -import { Store } from '@ngrx/store'; import { ObjectCacheService } from '../../cache/object-cache.service'; import { HALEndpointService } from '../../shared/hal-endpoint.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { HttpClient } from '@angular/common/http'; -import { DefaultChangeAnalyzer } from '../default-change-analyzer.service'; import { Script } from '../../../process-page/scripts/script.model'; import { ProcessParameter } from '../../../process-page/processes/process-parameter.model'; import { map, take } from 'rxjs/operators'; import { URLCombiner } from '../../url-combiner/url-combiner'; import { RemoteData } from '../remote-data'; -import { MultipartPostRequest} from '../request.models'; +import { MultipartPostRequest } from '../request.models'; import { RequestService } from '../request.service'; import { Observable } from 'rxjs'; import { dataService } from '../../cache/builders/build-decorators'; @@ -21,26 +16,29 @@ import { Process } from '../../../process-page/processes/process.model'; import { hasValue } from '../../../shared/empty.util'; import { getFirstCompletedRemoteData } from '../../shared/operators'; import { RestRequest } from '../rest-request.model'; -import { CoreState } from '../../core-state.model'; +import { IdentifiableDataService } from '../base/identifiable-data.service'; +import { FindAllData, FindAllDataImpl } from '../base/find-all-data'; +import { FindListOptions } from '../find-list-options.model'; +import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { PaginatedList } from '../paginated-list.model'; export const METADATA_IMPORT_SCRIPT_NAME = 'metadata-import'; export const METADATA_EXPORT_SCRIPT_NAME = 'metadata-export'; @Injectable() @dataService(SCRIPT) -export class ScriptDataService extends DataService